pax_global_header00006660000000000000000000000064132227144600014513gustar00rootroot0000000000000052 comment=b3f0932ff9772d482308366c197326a236efb81b calamares-3.1.12/000077500000000000000000000000001322271446000135275ustar00rootroot00000000000000calamares-3.1.12/.gitattributes000066400000000000000000000002661322271446000164260ustar00rootroot00000000000000.tx/* export-ignore hacking/* export-ignore HACKING.md export-ignore .editorconfig export-ignore src/modules/testmodule.py export-ignore src/modules/globalStorage.yaml export-ignore calamares-3.1.12/.github/000077500000000000000000000000001322271446000150675ustar00rootroot00000000000000calamares-3.1.12/.github/ISSUE_TEMPLATE.md000066400000000000000000000007201322271446000175730ustar00rootroot00000000000000#### Submission type - [ ] Bug report - [ ] Feature Request #### Info regarding which version of Calamares is used, which Distribution > … #### Provide information on how the disks are set up, in detail, with full logs of commands issued > … #### What do you expect to have happen when Calamares installs? > … #### Describe the issue you encountered > … #### Steps to reproduce the problem > … #### Include the installation.log: > … calamares-3.1.12/.gitignore000066400000000000000000000005651322271446000155250ustar00rootroot00000000000000# C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.dll *.dylib # Python __pycache__ # Qt-es /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.moc moc_*.cpp qrc_*.cpp ui_*.h Makefile* *-build-* *-build /build # QtCreator *.autosave qtcreator-build CMakeLists.txt.user # KDevelop *.kdev4 # PyCharm .idea # Visual Studio Code .vscode # Backup files *~ calamares-3.1.12/.gitmodules000066400000000000000000000000001322271446000156720ustar00rootroot00000000000000calamares-3.1.12/.travis.yml000066400000000000000000000006351322271446000156440ustar00rootroot00000000000000language: - cpp - python python: - 3.5 sudo: required services: - docker notifications: irc: - "chat.freenode.net#calamares" install: - docker build -t calamares . script: - docker run -v $PWD:/src --tmpfs /build:rw,size=65536k calamares bash -lc "cd /build && cmake -DWEBVIEW_FORCE_WEBKIT=1 -DKDE_INSTALL_USE_QT_SYS_PATHS=ON /src && make -j2 && make install DESTDIR=/build/INSTALL_ROOT" calamares-3.1.12/.tx/000077500000000000000000000000001322271446000142405ustar00rootroot00000000000000calamares-3.1.12/AUTHORS000066400000000000000000000000741322271446000146000ustar00rootroot00000000000000Teo Mrnjavac Adriaan de Groot calamares-3.1.12/CMakeLists.txt000066400000000000000000000320131322271446000162660ustar00rootroot00000000000000# === This file is part of Calamares - === # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . # # SPDX-License-Identifier: GPL-3.0+ # License-Filename: LICENSE # ### # # Generally, this CMakeLists.txt will find all the dependencies for Calamares # and complain appropriately. See below (later in this file) for CMake-level # options. There are some "secret" options as well: # # SKIP_MODULES : a space or semicolon-separated list of directory names # under src/modules that should not be built. # # Example usage: # # cmake . -DSKIP_MODULES="partition luksbootkeycfg" project( calamares C CXX ) cmake_minimum_required( VERSION 3.2 ) set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) set( CMAKE_CXX_STANDARD 14 ) set( CMAKE_CXX_STANDARD_REQUIRED ON ) set( CMAKE_C_STANDARD 99 ) set( CMAKE_C_STANDARD_REQUIRED ON ) if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) message( STATUS "Found Clang ${CMAKE_CXX_COMPILER_VERSION}, setting up Clang-specific compiler flags." ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) set( CMAKE_C_FLAGS_DEBUG "-g" ) set( CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" ) set( CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG" ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" ) # Clang warnings: doing *everything* is counter-productive, since it warns # about things which we can't fix (e.g. C++98 incompatibilities, but # Calamares is C++14). foreach( CLANG_WARNINGS -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded -Wno-undefined-reinterpret-cast -Wno-global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-documentation-unknown-command ) string( APPEND CMAKE_CXX_FLAGS " ${CLANG_WARNINGS}" ) endforeach() # Third-party code where we don't care so much about compiler warnings # (because it's uncomfortable to patch) get different flags; use # mark_thirdparty_code( [...] ) # to switch off warnings for those sources. set( SUPPRESS_3RDPARTY_WARNINGS "-Wno-everything" ) set( SUPPRESS_BOOST_WARNINGS " -Wno-zero-as-null-pointer-constant -Wno-disabled-macro-expansion" ) set( CMAKE_CXX_FLAGS_DEBUG "-g" ) set( CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG" ) set( CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" ) set( CMAKE_TOOLCHAIN_PREFIX "llvm-" ) set( CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined" ) else() set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--no-undefined" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--fatal-warnings -Wnon-virtual-dtor -Woverloaded-virtual -Werror=return-type" ) set( SUPPRESS_3RDPARTY_WARNINGS "" ) set( SUPPRESS_BOOST_WARNINGS "" ) endif() # Use mark_thirdparty_code() to reduce warnings from the compiler # on code that we're not going to fix. Call this with a list of files. macro(mark_thirdparty_code) set_source_files_properties( ${ARGV} PROPERTIES COMPILE_FLAGS "${SUPPRESS_3RDPARTY_WARNINGS}" COMPILE_DEFINITIONS "THIRDPARTY" ) endmacro() if( CMAKE_COMPILER_IS_GNUCXX ) if( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9 ) message( STATUS "Found GNU g++ ${CMAKE_CXX_COMPILER_VERSION}, enabling colorized error messages." ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=auto" ) endif() endif() include( FeatureSummary ) set( QT_VERSION 5.6.0 ) find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Core Gui Widgets LinguistTools Svg Quick QuickWidgets ) find_package( YAMLCPP 0.5.1 REQUIRED ) find_package( PolkitQt5-1 REQUIRED ) # Find ECM once, and add it to the module search path; Calamares # modules that need ECM can do # find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE), # no need to mess with the module path after. set( ECM_VERSION 5.10.0 ) find_package(ECM ${ECM_VERSION} NO_MODULE) if( ECM_FOUND ) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) endif() option( INSTALL_CONFIG "Install configuration files" ON ) option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." OFF ) option( BUILD_TESTING "Build the testing tree." ON ) if( BUILD_TESTING ) enable_testing() endif () find_package( PythonLibs 3.3 ) set_package_properties( PythonLibs PROPERTIES DESCRIPTION "C interface libraries for the Python 3 interpreter." URL "http://python.org" PURPOSE "Python 3 is used for Python job modules." ) if ( PYTHONLIBS_FOUND ) include( BoostPython3 ) find_boost_python3( 1.54.0 ${PYTHONLIBS_VERSION_STRING} CALAMARES_BOOST_PYTHON3_FOUND ) set_package_properties( Boost PROPERTIES PURPOSE "Boost.Python is used for Python job modules." ) find_package( PythonQt ) set_package_properties( PythonQt PROPERTIES DESCRIPTION "A Python embedding solution for Qt applications." URL "http://pythonqt.sourceforge.net" PURPOSE "PythonQt is used for Python view modules." ) endif() if( PYTHONLIBS_NOTFOUND OR NOT CALAMARES_BOOST_PYTHON3_FOUND ) set( WITH_PYTHON OFF ) endif() if( PYTHONLIBS_NOTFOUND OR NOT PYTHONQT_FOUND ) set( WITH_PYTHONQT OFF ) endif() ### ### Calamares application info ### set( CALAMARES_ORGANIZATION_NAME "Calamares" ) set( CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares" ) set( CALAMARES_APPLICATION_NAME "Calamares" ) set( CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framework" ) set( CALAMARES_TRANSLATION_LANGUAGES ar ast bg ca cs_CZ da de el en en_GB es_MX es eu fr he hr hu id is it_IT ja lt nl pl pt_BR pt_PT ro ru sk sv th tr_TR zh_CN zh_TW ) ### Bump version here set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 1 ) set( CALAMARES_VERSION_PATCH 12 ) set( CALAMARES_VERSION_RC 0 ) set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) if( CALAMARES_VERSION_RC ) set( CALAMARES_VERSION ${CALAMARES_VERSION}rc${CALAMARES_VERSION_RC} ) endif() # additional info for non-release builds if( NOT BUILD_RELEASE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/" ) include( CMakeDateStamp ) set( CALAMARES_VERSION_DATE "${CMAKE_DATESTAMP_YEAR}${CMAKE_DATESTAMP_MONTH}${CMAKE_DATESTAMP_DAY}" ) if( CALAMARES_VERSION_DATE GREATER 0 ) set( CALAMARES_VERSION ${CALAMARES_VERSION}.${CALAMARES_VERSION_DATE} ) endif() include( CMakeVersionSource ) if( CMAKE_VERSION_SOURCE ) set( CALAMARES_VERSION ${CALAMARES_VERSION}-${CMAKE_VERSION_SOURCE} ) endif() endif() # enforce using constBegin, constEnd for const-iterators add_definitions( "-DQT_STRICT_ITERATORS" ) # set paths set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) # Better default installation paths: GNUInstallDirs defines # CMAKE_INSTALL_FULL_SYSCONFDIR to be CMAKE_INSTALL_PREFIX/etc by default # but we really want /etc if( NOT DEFINED CMAKE_INSTALL_SYSCONFDIR ) set( CMAKE_INSTALL_SYSCONFDIR "/etc" ) endif() # make predefined install dirs available everywhere include( GNUInstallDirs ) # make uninstall support configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) # Early configure these files as we need them later on set( CALAMARES_CMAKE_DIR "${CMAKE_SOURCE_DIR}/CMakeModules" ) set( CALAMARES_LIBRARIES calamares ) set( THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty" ) ### Example Distro # # For testing purposes Calamares includes a very, very, limited sample # distro called "Generic". The root filesystem of "Generic" lives in # data/example-root and can be squashed up as part of the build, so # that a pure-upstream run of ./calamares -d from the build directory # (with all the default settings and configurations) can actually # do an complete example run. # # Some binaries from the build host (e.g. /bin and /lib) are also # squashed into the example filesystem. # # To build the example distro (for use by the default, example, # unsquashfs module), build the target 'example-distro', eg.: # # make example-distro # find_program( mksquashfs_PROGRAM mksquashfs ) if( mksquashfs_PROGRAM ) set( mksquashfs_FOUND ON ) set( src_fs ${CMAKE_SOURCE_DIR}/data/example-root/ ) set( dst_fs ${CMAKE_BINARY_DIR}/example.sqfs ) if( EXISTS ${src_fs} ) # based on the build host. If /lib64 exists, assume it is needed. # Collect directories needed for a minimal binary distro, # Note that the last path component is added to the root, so # if you add /usr/sbin here, it will be put into /sbin_1. # Add such paths to /etc/profile under ${src_fs}. set( candidate_fs /sbin /bin /lib /lib64 ) set( host_fs "" ) foreach( c_fs ${candidate_fs} ) if( EXISTS ${c_fs} ) list( APPEND host_fs ${c_fs} ) endif() endforeach() add_custom_command( OUTPUT ${dst_fs} COMMAND ${mksquashfs_PROGRAM} ${src_fs} ${dst_fs} -all-root COMMAND ${mksquashfs_PROGRAM} ${host_fs} ${dst_fs} -all-root ) add_custom_target(example-distro DEPENDS ${dst_fs}) endif() else() set( mksquashfs_FOUND OFF ) endif() # Doesn't list mksquashfs as an optional dep, though, because it # hasn't been sent through the find_package() scheme. # # "http://tldp.org/HOWTO/SquashFS-HOWTO/creatingandusing.html" add_feature_info( ExampleDistro ${mksquashfs_FOUND} "Create example-distro target.") # add_subdirectory( thirdparty ) add_subdirectory( src ) add_feature_info(Python ${WITH_PYTHON} "Python job modules") add_feature_info(PythonQt ${WITH_PYTHONQT} "Python view modules") add_feature_info(Config ${INSTALL_CONFIG} "Install Calamares configuration") feature_summary(WHAT ALL) # Add all targets to the build-tree export set set( CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Calamares" CACHE PATH "Installation directory for CMake files" ) set( CMAKE_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}" ) export( TARGETS calamares FILE "${PROJECT_BINARY_DIR}/CalamaresLibraryDepends.cmake" ) # Export the package for use from the build-tree # (this registers the build-tree with a global CMake-registry) export( PACKAGE Calamares ) # Create a CalamaresBuildTreeSettings.cmake file for the use from the build tree configure_file( CalamaresBuildTreeSettings.cmake.in "${PROJECT_BINARY_DIR}/CalamaresBuildTreeSettings.cmake" @ONLY ) # Create the CalamaresConfig.cmake and CalamaresConfigVersion files file( RELATIVE_PATH CONF_REL_INCLUDE_DIR "${CMAKE_INSTALL_FULL_CMAKEDIR}" "${CMAKE_INSTALL_FULL_INCLUDEDIR}" ) configure_file( CalamaresConfig.cmake.in "${PROJECT_BINARY_DIR}/CalamaresConfig.cmake" @ONLY ) configure_file( CalamaresConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/CalamaresConfigVersion.cmake" @ONLY ) # Install the cmake files install( FILES "${PROJECT_BINARY_DIR}/CalamaresConfig.cmake" "${PROJECT_BINARY_DIR}/CalamaresConfigVersion.cmake" "CMakeModules/CalamaresAddPlugin.cmake" "CMakeModules/CalamaresAddModuleSubdirectory.cmake" "CMakeModules/CalamaresAddLibrary.cmake" "CMakeModules/CalamaresAddBrandingSubdirectory.cmake" DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" ) # Install the export set for use with the install-tree install( EXPORT CalamaresLibraryDepends DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" ) if( INSTALL_CONFIG ) install( FILES settings.conf DESTINATION share/calamares ) endif() install( FILES com.github.calamares.calamares.policy DESTINATION "${POLKITQT-1_POLICY_FILES_INSTALL_DIR}" ) install( FILES calamares.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications ) install( FILES man/calamares.8 DESTINATION ${CMAKE_INSTALL_MANDIR}/man8/ ) # uninstall target configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) add_custom_target( uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake ) calamares-3.1.12/CMakeModules/000077500000000000000000000000001322271446000160405ustar00rootroot00000000000000calamares-3.1.12/CMakeModules/BoostPython3.cmake000066400000000000000000000054631322271446000214250ustar00rootroot00000000000000# On Ubuntu 14.04, the libboost-python1.54-dev package comes with one library # for each Python version: # libboost_python-py27.so # libboost_python-py33.so # libboost_python-py34.so # # Boost upstream however installs Boost.Python3 libboost_python3.so, which is # what FindBoost.cmake is looking for. It looks for a library named # "libboost_${component}.so". # # On Gentoo instead, the >=dev-libs/boost-1.54 package provides boost library # with a name like: # libboost_python-2.7.so # libboost_python-3.3.so # libboost_python-3.4.so # depending on what python's targets you selected during install # # find_boost_python3() tries to find the package with different component # names. By default it tries "python3", "python-py$suffix" and # "python-$dotsuffix", where suffix is based on the `python_version` argument. # One can supply a custom component name by setting the # `CALAMARES_BOOST_PYTHON3_COMPONENT` variable at CMake time. set( CALAMARES_BOOST_PYTHON3_COMPONENT python3 CACHE STRING "Name of the Boost.Python component. If Boost.Python is installed as libboost_python-foo.so then this variable should be set to 'python-foo'." ) include(FindPackageHandleStandardArgs) macro( _find_boost_python3_int boost_version componentname found_var ) foreach( _fbp_name ${CALAMARES_BOOST_PYTHON3_COMPONENT} ${componentname} ) find_package( Boost ${boost_version} QUIET COMPONENTS ${_fbp_name} ) string( TOUPPER ${_fbp_name} _fbp_uc_name ) if( Boost_${_fbp_uc_name}_FOUND ) set( ${found_var} ${_fbp_uc_name} ) break() endif() endforeach() endmacro() macro( find_boost_python3 boost_version python_version found_var ) set( ${found_var} OFF ) set( _fbp_found OFF ) # turns "3.4.123abc" into "34" string( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\..*" "\\1\\2" _fbp_python_short_version ${python_version} ) _find_boost_python3_int( ${boost_version} python-py${_fbp_python_short_version} _fbp_found ) if (NOT _fbp_found) # The following loop changes the searched name for Gentoo based distributions # turns "3.4.123abc" into "3.4" string( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\..*" "\\1.\\2" _fbp_python_short_version ${python_version} ) _find_boost_python3_int( ${boost_version} python-${_fbp_python_short_version} _fbp_found ) endif() set( ${found_var} ${_fbp_found} ) # This is superfluous, but allows proper reporting in the features list if ( _fbp_found ) find_package( Boost ${boost_version} COMPONENTS ${_fbp_found} ) else() find_package( Boost ${boost_version} COMPONENTS Python ) endif() set_package_properties( Boost PROPERTIES DESCRIPTION "A C++ library which enables seamless interoperability between C++ and Python 3." URL "http://www.boost.org" ) endmacro() calamares-3.1.12/CMakeModules/CMakeColors.cmake000066400000000000000000000015361322271446000212110ustar00rootroot00000000000000if(NOT WIN32) set(_use_color ON) if("0" STREQUAL "$ENV{CLICOLOR}") set(_use_color OFF) endif() if("0" STREQUAL "$ENV{CLICOLOR_FORCE}") set(_use_color OFF) endif() if(NOT CMAKE_COLOR_MAKEFILE) set(_use_color OFF) endif() if(_use_color) string(ASCII 27 Esc) set(ColorReset "${Esc}[m") set(ColorBold "${Esc}[1m") set(Red "${Esc}[31m") set(Green "${Esc}[32m") set(Yellow "${Esc}[33m") set(Blue "${Esc}[34m") set(Magenta "${Esc}[35m") set(Cyan "${Esc}[36m") set(White "${Esc}[37m") set(BoldRed "${Esc}[1;31m") set(BoldGreen "${Esc}[1;32m") set(BoldYellow "${Esc}[1;33m") set(BoldBlue "${Esc}[1;34m") set(BoldMagenta "${Esc}[1;35m") set(BoldCyan "${Esc}[1;36m") set(BoldWhite "${Esc}[1;37m") endif() endif() calamares-3.1.12/CMakeModules/CMakeDateStamp.cmake000066400000000000000000000011761322271446000216320ustar00rootroot00000000000000find_program(DATE_EXECUTABLE NAMES date) mark_as_advanced(DATE_EXECUTABLE) if(DATE_EXECUTABLE) execute_process( COMMAND ${DATE_EXECUTABLE} +%Y OUTPUT_VARIABLE CMAKE_DATESTAMP_YEAR OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) execute_process( COMMAND ${DATE_EXECUTABLE} +%m OUTPUT_VARIABLE CMAKE_DATESTAMP_MONTH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) execute_process( COMMAND ${DATE_EXECUTABLE} +%d OUTPUT_VARIABLE CMAKE_DATESTAMP_DAY OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) endif() calamares-3.1.12/CMakeModules/CMakeVersionSource.cmake000066400000000000000000000030151322271446000225500ustar00rootroot00000000000000# Try to identify the current development source version. set(CMAKE_VERSION_SOURCE "") if(EXISTS ${CMAKE_SOURCE_DIR}/.git/HEAD) find_program(GIT_EXECUTABLE NAMES git git.cmd) mark_as_advanced(GIT_EXECUTABLE) if(GIT_EXECUTABLE) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD OUTPUT_VARIABLE head OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) if(head) set(branch "") execute_process( COMMAND ${GIT_EXECUTABLE} name-rev HEAD OUTPUT_VARIABLE branch OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) string(REGEX REPLACE "HEAD " "" branch "${branch}") set(CMAKE_VERSION_SOURCE "git-${branch}-${head}") execute_process( COMMAND ${GIT_EXECUTABLE} update-index -q --refresh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) execute_process( COMMAND ${GIT_EXECUTABLE} diff-index --name-only HEAD -- OUTPUT_VARIABLE dirty OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) if(dirty) set(CMAKE_VERSION_SOURCE "${CMAKE_VERSION_SOURCE}-dirty") endif() endif() endif() elseif(EXISTS ${CMAKE_SOURCE_DIR}/CVS/Repository) file(READ ${CMAKE_SOURCE_DIR}/CVS/Repository repo) set(branch "") if("${repo}" MATCHES "\\.git/") string(REGEX REPLACE ".*\\.git/([^\r\n]*).*" "-\\1" branch "${repo}") endif() set(CMAKE_VERSION_SOURCE "cvs${branch}") endif() calamares-3.1.12/CMakeModules/CalamaresAddBrandingSubdirectory.cmake000066400000000000000000000045461322271446000254200ustar00rootroot00000000000000include( CMakeColors ) function( calamares_add_branding_subdirectory ) set( SUBDIRECTORY ${ARGV0} ) if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/CMakeLists.txt" ) add_subdirectory( $SUBDIRECTORY ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} branding component: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) elseif( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/branding.desc" ) set( BRANDING_DIR share/calamares/branding ) set( BRANDING_COMPONENT_DESTINATION ${BRANDING_DIR}/${SUBDIRECTORY} ) if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) message( "-- ${BoldYellow}Warning:${ColorReset} branding component ${BoldRed}${SUBDIRECTORY}${ColorReset} has a translations subdirectory but no CMakeLists.txt." ) message( "" ) return() endif() # We glob all the files inside the subdirectory, and we make sure they are # synced with the bindir structure and installed. file( GLOB BRANDING_COMPONENT_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*" ) foreach( BRANDING_COMPONENT_FILE ${BRANDING_COMPONENT_FILES} ) if( NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${BRANDING_COMPONENT_FILE} ) configure_file( ${SUBDIRECTORY}/${BRANDING_COMPONENT_FILE} ${SUBDIRECTORY}/${BRANDING_COMPONENT_FILE} COPYONLY ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${BRANDING_COMPONENT_FILE} DESTINATION ${BRANDING_COMPONENT_DESTINATION} ) endif() endforeach() message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} branding component: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) message( " ${Green}TYPE:${ColorReset} branding component" ) # message( " ${Green}FILES:${ColorReset} ${BRANDING_COMPONENT_FILES}" ) message( " ${Green}BRANDING_COMPONENT_DESTINATION:${ColorReset} ${BRANDING_COMPONENT_DESTINATION}" ) message( "" ) endif() else() message( "-- ${BoldYellow}Warning:${ColorReset} tried to add branding component subdirectory ${BoldRed}${SUBDIRECTORY}${ColorReset} which has no branding.desc." ) message( "" ) endif() endfunction() calamares-3.1.12/CMakeModules/CalamaresAddLibrary.cmake000066400000000000000000000107211322271446000226710ustar00rootroot00000000000000include( CMakeParseArguments ) function(calamares_add_library) # parse arguments (name needs to be saved before passing ARGN into the macro) set(NAME ${ARGV0}) set(options NO_INSTALL NO_VERSION) set(oneValueArgs NAME TYPE EXPORT_MACRO TARGET TARGET_TYPE EXPORT VERSION SOVERSION INSTALL_BINDIR RESOURCES) set(multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS QT5_MODULES) cmake_parse_arguments(LIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(LIBRARY_NAME ${NAME}) # message("*** Arguments for ${LIBRARY_NAME}") # message("Sources: ${LIBRARY_SOURCES}") # message("Link libraries: ${LIBRARY_LINK_LIBRARIES}") # message("UI: ${LIBRARY_UI}") # message("TARGET_TYPE: ${LIBRARY_TARGET_TYPE}") # message("EXPORT_MACRO: ${LIBRARY_EXPORT_MACRO}") # message("NO_INSTALL: ${LIBRARY_NO_INSTALL}") set(target ${LIBRARY_NAME}) # qt stuff include_directories(${CMAKE_CURRENT_LIST_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(LIBRARY_UI) qt5_wrap_ui(LIBRARY_UI_SOURCES ${LIBRARY_UI}) list(APPEND LIBRARY_SOURCES ${LIBRARY_UI_SOURCES}) endif() # add resources from current dir if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${LIBRARY_RESOURCES}") qt5_add_resources(LIBRARY_RC_SOURCES "${LIBRARY_RESOURCES}") list(APPEND LIBRARY_SOURCES ${LIBRARY_RC_SOURCES}) unset(LIBRARY_RC_SOURCES) endif() # add target if(LIBRARY_TARGET_TYPE STREQUAL "STATIC") add_library(${target} STATIC ${LIBRARY_SOURCES}) elseif(LIBRARY_TARGET_TYPE STREQUAL "MODULE") add_library(${target} MODULE ${LIBRARY_SOURCES}) else() # default add_library(${target} SHARED ${LIBRARY_SOURCES}) endif() # definitions - can this be moved into set_target_properties below? add_definitions(${QT_DEFINITIONS}) set_target_properties(${target} PROPERTIES AUTOMOC TRUE) if(LIBRARY_EXPORT_MACRO) set_target_properties(${target} PROPERTIES COMPILE_DEFINITIONS ${LIBRARY_EXPORT_MACRO}) endif() if(LIBRARY_COMPILE_DEFINITIONS) # Dear CMake, i hate you! Sincerely, domme # At least in CMake 2.8.8, you CANNOT set more than one COMPILE_DEFINITIONS value # only takes the first one if called multiple times or bails out with wrong number of arguments # when passing in a list, thus i redefine the export macro here in hope it won't mess up other targets add_definitions( "-D${LIBRARY_EXPORT_MACRO}" ) set_target_properties(${target} PROPERTIES COMPILE_DEFINITIONS ${LIBRARY_COMPILE_DEFINITIONS}) endif() # add link targets target_link_libraries(${target} LINK_PUBLIC ${CALAMARES_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets ${LIBRARY_QT5_MODULES} ) if(LIBRARY_LINK_LIBRARIES) target_link_libraries(${target} LINK_PUBLIC ${LIBRARY_LINK_LIBRARIES}) endif() if(LIBRARY_LINK_PRIVATE_LIBRARIES) target_link_libraries(${target} LINK_PRIVATE ${LIBRARY_LINK_PRIVATE_LIBRARIES}) endif() # add soversion if(NOT LIBRARY_NO_VERSION) set_target_properties(${target} PROPERTIES VERSION ${LIBRARY_VERSION}) if(NOT LIBRARY_SOVERSION) set(LIBRARY_SOVERSION ${LIBRARY_VERSION}) endif() set_target_properties(${target} PROPERTIES SOVERSION ${LIBRARY_SOVERSION}) endif() if(NOT LIBRARY_INSTALL_BINDIR) set(LIBRARY_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}") set(LIBRARY_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}") else() set(LIBRARY_INSTALL_LIBDIR "${LIBRARY_INSTALL_BINDIR}") endif() #message("INSTALL_BINDIR: ${LIBRARY_INSTALL_BINDIR}") #message("INSTALL_LIBDIR: ${LIBRARY_INSTALL_LIBDIR}") # make installation optional, maybe useful for dummy plugins one day if(NOT LIBRARY_NO_INSTALL) include(GNUInstallDirs) if(NOT LIBRARY_EXPORT) install( TARGETS ${target} RUNTIME DESTINATION ${LIBRARY_INSTALL_BINDIR} LIBRARY DESTINATION ${LIBRARY_INSTALL_LIBDIR} ARCHIVE DESTINATION ${LIBRARY_INSTALL_LIBDIR} ) else() install( TARGETS ${target} EXPORT ${LIBRARY_EXPORT} RUNTIME DESTINATION ${LIBRARY_INSTALL_BINDIR} LIBRARY DESTINATION ${LIBRARY_INSTALL_LIBDIR} ARCHIVE DESTINATION ${LIBRARY_INSTALL_LIBDIR} ) endif() endif() endfunction() calamares-3.1.12/CMakeModules/CalamaresAddModuleSubdirectory.cmake000066400000000000000000000106451322271446000251160ustar00rootroot00000000000000include( CMakeColors ) include( CalamaresAddTranslations ) set( MODULE_DATA_DESTINATION share/calamares/modules ) # Convenience function to indicate that a module has been skipped # (optionally also why). Call this in the module's CMakeLists.txt macro( calamares_skip_module ) set( SKIPPED_MODULES ${SKIPPED_MODULES} ${ARGV} PARENT_SCOPE ) endmacro() function( calamares_add_module_subdirectory ) set( SUBDIRECTORY ${ARGV0} ) set( SKIPPED_MODULES ) set( MODULE_CONFIG_FILES "" ) # If this subdirectory has a CMakeLists.txt, we add_subdirectory it... if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/CMakeLists.txt" ) add_subdirectory( ${SUBDIRECTORY} ) file( GLOB MODULE_CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*.conf" ) # Module has indicated it should be skipped, show that in # the calling CMakeLists (which is src/modules/CMakeLists.txt normally). if ( SKIPPED_MODULES ) set( SKIPPED_MODULES ${SKIPPED_MODULES} PARENT_SCOPE ) endif() # ...otherwise, we look for a module.desc. elseif( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/module.desc" ) set( MODULES_DIR ${CMAKE_INSTALL_LIBDIR}/calamares/modules ) set( MODULE_DESTINATION ${MODULES_DIR}/${SUBDIRECTORY} ) # We glob all the files inside the subdirectory, and we make sure they are # synced with the bindir structure and installed. file( GLOB MODULE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*" ) foreach( MODULE_FILE ${MODULE_FILES} ) if( NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${MODULE_FILE} ) configure_file( ${SUBDIRECTORY}/${MODULE_FILE} ${SUBDIRECTORY}/${MODULE_FILE} COPYONLY ) get_filename_component( FLEXT ${MODULE_FILE} EXT ) if( "${FLEXT}" STREQUAL ".conf" AND INSTALL_CONFIG) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} DESTINATION ${MODULE_DATA_DESTINATION} ) list( APPEND MODULE_CONFIG_FILES ${MODULE_FILE} ) else() install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} DESTINATION ${MODULE_DESTINATION} ) endif() endif() endforeach() message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) message( " ${Green}TYPE:${ColorReset} jobmodule" ) # message( " ${Green}FILES:${ColorReset} ${MODULE_FILES}" ) message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) if( MODULE_CONFIG_FILES ) if ( INSTALL_CONFIG ) message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${MODULE_DATA_DESTINATION}" ) else() message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Skipping installation]" ) endif() endif() message( "" ) endif() # We copy over the lang directory, if any if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) install_calamares_gettext_translations( ${SUBDIRECTORY} SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" FILENAME ${SUBDIRECTORY}.mo RENAME calamares-${SUBDIRECTORY}.mo ) endif() else() message( "-- ${BoldYellow}Warning:${ColorReset} tried to add module subdirectory ${BoldRed}${SUBDIRECTORY}${ColorReset} which has no CMakeLists.txt or module.desc." ) message( "" ) endif() # Check any config files for basic correctness if ( BUILD_TESTING AND MODULE_CONFIG_FILES ) set( _count 0 ) foreach( _config_file ${MODULE_CONFIG_FILES} ) set( _count_str "-${_count}" ) if ( _count EQUAL 0 ) set( _count_str "" ) endif() add_test( NAME config-${SUBDIRECTORY}${_count_str} COMMAND test_conf ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${_config_file} ) math( EXPR _count "${_count} + 1" ) endforeach() endif() endfunction() calamares-3.1.12/CMakeModules/CalamaresAddPlugin.cmake000066400000000000000000000123021322271446000225200ustar00rootroot00000000000000# Convenience function for creating a C++ (qtplugin) module for Calamares. # This function provides cmake-time feedback about the plugin, adds # targets for compilation and boilerplate information, and creates # a module.desc with standard values if none is provided (which only # happens for very unusual plugins). # # Usage: # # calamares_add_plugin( # module-name # TYPE # EXPORT_MACRO macro-name # SOURCES source-file... # UI ui-file... # LINK_LIBRARIES lib... # LINK_PRIVATE_LIBRARIES lib... # COMPILE_DEFINITIONS def... # RESOURCES resource-file # [NO_INSTALL] # [SHARED_LIB] # ) include( CMakeParseArguments ) include( CalamaresAddLibrary ) include( CMakeColors ) function( calamares_add_plugin ) # parse arguments ( name needs to be saved before passing ARGN into the macro ) set( NAME ${ARGV0} ) set( options NO_INSTALL SHARED_LIB ) set( oneValueArgs NAME TYPE EXPORT_MACRO RESOURCES ) set( multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS ) cmake_parse_arguments( PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) set( PLUGIN_NAME ${NAME} ) set( PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/calamares/modules/${PLUGIN_NAME} ) set( PLUGIN_DESC_FILE module.desc ) file( GLOB PLUGIN_CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.conf" ) set( PLUGIN_DATA_DESTINATION share/calamares/modules ) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${PLUGIN_NAME}${ColorReset}" ) if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" ) message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" ) message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) # message( " ${Green}SOURCES:${ColorReset} ${PLUGIN_SOURCES}" ) # message( " ${Green}UI:${ColorReset} ${PLUGIN_UI}" ) # message( " ${Green}EXPORT_MACRO:${ColorReset} ${PLUGIN_EXPORT_MACRO}" ) # message( " ${Green}NO_INSTALL:${ColorReset} ${PLUGIN_NO_INSTALL}" ) message( " ${Green}PLUGIN_DESTINATION:${ColorReset} ${PLUGIN_DESTINATION}" ) if( PLUGIN_CONFIG_FILES ) if ( INSTALL_CONFIG ) message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => ${PLUGIN_DATA_DESTINATION}" ) else() message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => [Skipping installation]" ) endif() endif() if( PLUGIN_RESOURCES ) message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" ) endif() message( "" ) endif() # create target name once for convenience set( target "calamares_${PLUGIN_TYPE}_${PLUGIN_NAME}" ) # determine target type if( NOT ${PLUGIN_SHARED_LIB} ) set( target_type "MODULE" ) else() set( target_type "SHARED" ) endif() list( APPEND calamares_add_library_args "${target}" "EXPORT_MACRO" "${PLUGIN_EXPORT_MACRO}" "TARGET_TYPE" "${target_type}" "SOURCES" "${PLUGIN_SOURCES}" ) if( PLUGIN_UI ) list( APPEND calamares_add_library_args "UI" "${PLUGIN_UI}" ) endif() if( PLUGIN_LINK_LIBRARIES ) list( APPEND calamares_add_library_args "LINK_LIBRARIES" "${PLUGIN_LINK_LIBRARIES}" ) endif() if( PLUGIN_LINK_PRIVATE_LIBRARIES ) list( APPEND calamares_add_library_args "LINK_PRIVATE_LIBRARIES" "${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) endif() if( PLUGIN_COMPILE_DEFINITIONS ) list( APPEND calamares_add_library_args "COMPILE_DEFINITIONS" ${PLUGIN_COMPILE_DEFINITIONS} ) endif() list( APPEND calamares_add_library_args "NO_VERSION" ) list( APPEND calamares_add_library_args "INSTALL_BINDIR" "${PLUGIN_DESTINATION}" ) if( PLUGIN_RESOURCES ) list( APPEND calamares_add_library_args "RESOURCES" "${PLUGIN_RESOURCES}" ) endif() calamares_add_library( ${calamares_add_library_args} ) if ( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PLUGIN_DESC_FILE} ) configure_file( ${PLUGIN_DESC_FILE} ${PLUGIN_DESC_FILE} COPYONLY ) else() set( _file ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_DESC_FILE} ) set( _type ${PLUGIN_TYPE} ) file( WRITE ${_file} "# AUTO-GENERATED metadata file\n# Syntax is YAML 1.2\n---\n" ) file( APPEND ${_file} "type: \"${_type}\"\nname: \"${PLUGIN_NAME}\"\ninterface: \"qtplugin\"\nload: \"lib${target}.so\"\n" ) endif() install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_DESC_FILE} DESTINATION ${PLUGIN_DESTINATION} ) if ( INSTALL_CONFIG ) foreach( PLUGIN_CONFIG_FILE ${PLUGIN_CONFIG_FILES} ) configure_file( ${PLUGIN_CONFIG_FILE} ${PLUGIN_CONFIG_FILE} COPYONLY ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_CONFIG_FILE} DESTINATION ${PLUGIN_DATA_DESTINATION} ) endforeach() endif() endfunction() calamares-3.1.12/CMakeModules/CalamaresAddTranslations.cmake000066400000000000000000000116561322271446000237560ustar00rootroot00000000000000include( CMakeParseArguments ) # Internal macro for adding the C++ / Qt translations to the # build and install tree. Should be called only once, from # src/calamares/CMakeLists.txt. macro(add_calamares_translations language) list( APPEND CALAMARES_LANGUAGES ${ARGV} ) set( calamares_i18n_qrc_content "\n" ) # calamares and qt language files set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}\n" ) foreach( lang ${CALAMARES_LANGUAGES} ) set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}calamares_${lang}.qm\n" ) list( APPEND TS_FILES "${CMAKE_SOURCE_DIR}/lang/calamares_${lang}.ts" ) endforeach() set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}\n" ) set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}\n" ) file( WRITE ${CMAKE_BINARY_DIR}/lang/calamares_i18n.qrc "${calamares_i18n_qrc_content}" ) qt5_add_translation(QM_FILES ${TS_FILES}) ## HACK HACK HACK - around rcc limitations to allow out of source-tree building set( trans_file calamares_i18n ) set( trans_srcfile ${CMAKE_BINARY_DIR}/lang/${trans_file}.qrc ) set( trans_infile ${CMAKE_CURRENT_BINARY_DIR}/${trans_file}.qrc ) set( trans_outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${trans_file}.cxx ) # Copy the QRC file to the output directory add_custom_command( OUTPUT ${trans_infile} COMMAND ${CMAKE_COMMAND} -E copy ${trans_srcfile} ${trans_infile} MAIN_DEPENDENCY ${trans_srcfile} ) # Run the resource compiler (rcc_options should already be set) add_custom_command( OUTPUT ${trans_outfile} COMMAND "${Qt5Core_RCC_EXECUTABLE}" ARGS ${rcc_options} -name ${trans_file} -o ${trans_outfile} ${trans_infile} MAIN_DEPENDENCY ${trans_infile} DEPENDS ${QM_FILES} ) endmacro() # Internal macro for Python translations # # Translations of the Python modules that don't have their own # lang/ subdirectories -- these are collected in top-level # lang/python//LC_MESSAGES/python.mo macro(add_calamares_python_translations language) set( CALAMARES_LANGUAGES "" ) list( APPEND CALAMARES_LANGUAGES ${ARGV} ) install_calamares_gettext_translations( python SOURCE_DIR ${CMAKE_SOURCE_DIR}/lang/python FILENAME python.mo RENAME calamares-python.mo ) endmacro() # Installs a directory containing language-code-labeled subdirectories with # gettext data into the appropriate system directory. Allows renaming the # .mo files during install to avoid namespace clashes. # # install_calamares_gettext_translations( # NAME # SOURCE_DIR path/to/lang # FILENAME # [RENAME ] # ) # # For all of the (global) translation languages enabled for Calamares, # try installing $SOURCE_DIR/$lang/LC_MESSAGES/.mo into the # system gettext data directory (e.g. share/locale/), possibly renaming # filename.mo to renamed.mo in the process. function( install_calamares_gettext_translations ) # parse arguments ( name needs to be saved before passing ARGN into the macro ) set( NAME ${ARGV0} ) set( oneValueArgs NAME SOURCE_DIR FILENAME RENAME ) cmake_parse_arguments( TRANSLATION "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) if( NOT TRANSLATION_NAME ) set( TRANSLATION_NAME ${NAME} ) endif() if( NOT TRANSLATION_FILENAME ) set( TRANSLATION_FILENAME "${TRANSLATION_NAME}.mo" ) endif() if( NOT TRANSLATION_RENAME ) set( TRANSLATION_RENAME "${TRANSLATION_FILENAME}" ) endif() message(STATUS "Installing gettext translations for ${TRANSLATION_NAME}") message(STATUS " Installing ${TRANSLATION_FILENAME} from ${TRANSLATION_SOURCE_DIR}") set( TRANSLATION_NAME "${NAME}" ) set( INSTALLED_TRANSLATIONS "" ) foreach( lang ${CALAMARES_TRANSLATION_LANGUAGES} ) # Global set( lang_mo "${TRANSLATION_SOURCE_DIR}/${lang}/LC_MESSAGES/${TRANSLATION_FILENAME}" ) if( lang STREQUAL "en" ) message( STATUS " Skipping ${TRANSLATION_NAME} translations for en_US" ) else( EXISTS ${lang_mo} ) list( APPEND INSTALLED_LANGUAGES "${lang}" ) install( FILES ${lang_mo} DESTINATION ${CMAKE_INSTALL_LOCALEDIR}/${lang}/LC_MESSAGES/ RENAME ${TRANSLATION_RENAME} ) # TODO: make translations available in build dir too, for # translation when running calamares -d from builddir. set(_build_lc ${CMAKE_BINARY_DIR}/lang/${lang}/LC_MESSAGES/) file(COPY ${lang_mo} DESTINATION ${_build_lc}) if (NOT TRANSLATION_FILENAME STREQUAL TRANSLATION_RENAME) file(RENAME ${_build_lc}${TRANSLATION_FILENAME} ${_build_lc}${TRANSLATION_RENAME}) endif() endif() endforeach() endfunction() calamares-3.1.12/CMakeModules/FindCrypt.cmake000066400000000000000000000016401322271446000207450ustar00rootroot00000000000000# - Find libcrypt # Find the libcrypt includes and the libcrypt libraries # This module defines # LIBCRYPT_INCLUDE_DIR, root crypt include dir. Include crypt with crypt.h # LIBCRYPT_LIBRARY, the path to libcrypt # LIBCRYPT_FOUND, whether libcrypt was found if( CMAKE_SYSTEM MATCHES "FreeBSD" ) # FreeBSD has crypt(3) declared in unistd.h, which lives in # libc; the libcrypt found here is not used. find_path( CRYPT_INCLUDE_DIR NAMES unistd.h ) add_definitions( -DNO_CRYPT_H ) else() find_path( CRYPT_INCLUDE_DIR NAMES crypt.h HINTS ${CMAKE_INSTALL_INCLUDEDIR} NO_CACHE ) endif() find_library( CRYPT_LIBRARIES NAMES crypt HINTS ${CMAKE_INSTALL_LIBDIR} ) include( FindPackageHandleStandardArgs ) find_package_handle_standard_args( Crypt REQUIRED_VARS CRYPT_LIBRARIES CRYPT_INCLUDE_DIR ) mark_as_advanced( CRYPT_INCLUDE_DIR CRYPT_LIBRARIES ) calamares-3.1.12/CMakeModules/FindLIBPARTED.cmake000066400000000000000000000050711322271446000211540ustar00rootroot00000000000000# Copyright (C) 2008,2010,2011 by Volker Lanz # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. include(CheckCSourceCompiles) include(CheckFunctionExists) if (LIBPARTED_INCLUDE_DIR AND LIBPARTED_LIBRARY) # Already in cache, be silent set(LIBPARTED_FIND_QUIETLY TRUE) endif (LIBPARTED_INCLUDE_DIR AND LIBPARTED_LIBRARY) FIND_PATH(LIBPARTED_INCLUDE_DIR parted.h PATH_SUFFIXES parted ) FIND_LIBRARY(LIBPARTED_LIBRARY NAMES parted) FIND_LIBRARY(LIBPARTED_FS_RESIZE_LIBRARY NAMES parted-fs-resize) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBPARTED DEFAULT_MSG LIBPARTED_LIBRARY LIBPARTED_INCLUDE_DIR) if (LIBPARTED_FS_RESIZE_LIBRARY) set(LIBPARTED_LIBS ${LIBPARTED_LIBRARY} ${LIBPARTED_FS_RESIZE_LIBRARY}) else (LIBPARTED_FS_RESIZE_LIBRARY) set(LIBPARTED_LIBS ${LIBPARTED_LIBRARY}) endif (LIBPARTED_FS_RESIZE_LIBRARY) # KDE adds -ansi to the C make flags, parted headers use GNU extensions, so # undo that unset(CMAKE_C_FLAGS) set(CMAKE_REQUIRED_INCLUDES ${LIBPARTED_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${LIBPARTED_LIBS}) CHECK_FUNCTION_EXISTS("ped_file_system_clobber" LIBPARTED_FILESYSTEM_SUPPORT) # parted < 3.0 CHECK_FUNCTION_EXISTS("ped_file_system_resize" LIBPARTED_FS_RESIZE_LIBRARY_SUPPORT) # parted != 3.0 MARK_AS_ADVANCED(LIBPARTED_LIBRARY LIBPARTED_INCLUDE_DIR LIBPARTED_FILESYSTEM_SUPPORT LIBPARTED_FS_RESIZE_LIBRARY LIBPARTED_FS_RESIZE_LIBRARY_SUPPORT) calamares-3.1.12/CMakeModules/FindPythonQt.cmake000066400000000000000000000074021322271446000214340ustar00rootroot00000000000000# Find PythonQt # # Sets PYTHONQT_FOUND, PYTHONQT_INCLUDE_DIR, PYTHONQT_LIBRARY, PYTHONQT_LIBRARIES # # Python is required find_package(PythonLibs) if(NOT PYTHONLIBS_FOUND) message(FATAL_ERROR "error: Python is required to build PythonQt") endif() if(NOT EXISTS "${PYTHONQT_INSTALL_DIR}") find_path(PYTHONQT_INSTALL_DIR include/PythonQt/PythonQt.h DOC "Directory where PythonQt was installed.") endif() # XXX Since PythonQt 3.0 is not yet cmakeified, depending # on how PythonQt is built, headers will not always be # installed in "include/PythonQt". That is why "src" # is added as an option. See [1] for more details. # [1] https://github.com/commontk/CTK/pull/538#issuecomment-86106367 find_path(PYTHONQT_INCLUDE_DIR PythonQt.h PATHS "${PYTHONQT_INSTALL_DIR}/include/PythonQt" "${PYTHONQT_INSTALL_DIR}/src" DOC "Path to the PythonQt include directory") # Minimum v3.1 is needed find_library(PYTHONQT_LIBRARY_RELEASE PythonQt PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "The PythonQt library.") find_library(PYTHONQT_LIBRARY_DEBUG NAMES PythonQt${CTK_CMAKE_DEBUG_POSTFIX} PythonQt${CMAKE_DEBUG_POSTFIX} PythonQt PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "The PythonQt library.") find_library(PYTHONQT_QTALL_LIBRARY_RELEASE PythonQt_QtAll PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "Full Qt bindings for the PythonQt library.") find_library(PYTHONQT_QTALL_LIBRARY_DEBUG NAMES PythonQt_QtAll${CTK_CMAKE_DEBUG_POSTFIX} PythonQt_QtAll${CMAKE_DEBUG_POSTFIX} PythonQt_QtAll PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "Full Qt bindings for the PythonQt library.") # Also check for v3.2+ find_library(PYTHONQT_LIBRARY_RELEASE PythonQt-Qt5-Python3 PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "The PythonQt library.") find_library(PYTHONQT_LIBRARY_DEBUG NAMES PythonQt-Qt5-Python3${CTK_CMAKE_DEBUG_POSTFIX} PythonQt-Qt5-Python3${CMAKE_DEBUG_POSTFIX} PythonQt-Qt5-Python3 PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "The PythonQt library.") find_library(PYTHONQT_QTALL_LIBRARY_RELEASE PythonQt_QtAll-Qt5-Python3 PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "Full Qt bindings for the PythonQt library.") find_library(PYTHONQT_QTALL_LIBRARY_DEBUG NAMES PythonQt_QtAll-Qt5-Python3${CTK_CMAKE_DEBUG_POSTFIX} PythonQt_QtAll-Qt5-Python3${CMAKE_DEBUG_POSTFIX} PythonQt_QtAll-Qt5-Python3 PATHS "${PYTHONQT_INSTALL_DIR}/lib" DOC "Full Qt bindings for the PythonQt library.") set(PYTHONQT_LIBRARY) if(PYTHONQT_LIBRARY_RELEASE) list(APPEND PYTHONQT_LIBRARY optimized ${PYTHONQT_LIBRARY_RELEASE}) endif() if(PYTHONQT_LIBRARY_DEBUG) list(APPEND PYTHONQT_LIBRARY debug ${PYTHONQT_LIBRARY_DEBUG}) endif() set(PYTHONQT_QTALL_LIBRARY) if(PYTHONQT_QTALL_LIBRARY_RELEASE) list(APPEND PYTHONQT_QTALL_LIBRARY optimized ${PYTHONQT_QTALL_LIBRARY_RELEASE}) endif() if(PYTHONQT_QTALL_LIBRARY_DEBUG) list(APPEND PYTHONQT_QTALL_LIBRARY debug ${PYTHONQT_QTALL_LIBRARY_DEBUG}) endif() mark_as_advanced(PYTHONQT_INSTALL_DIR) mark_as_advanced(PYTHONQT_INCLUDE_DIR) mark_as_advanced(PYTHONQT_LIBRARY_RELEASE) mark_as_advanced(PYTHONQT_LIBRARY_DEBUG) mark_as_advanced(PYTHONQT_QTALL_LIBRARY_RELEASE) mark_as_advanced(PYTHONQT_QTALL_LIBRARY_DEBUG) # On linux, also find libutil if(UNIX AND NOT APPLE) find_library(PYTHONQT_LIBUTIL util) mark_as_advanced(PYTHONQT_LIBUTIL) endif() # All upper case _FOUND variable is maintained for backwards compatibility. set(PYTHONQT_FOUND 0) set(PythonQt_FOUND 0) if(PYTHONQT_INCLUDE_DIR AND PYTHONQT_LIBRARY AND PYTHONQT_QTALL_LIBRARY) # Currently CMake'ified PythonQt only supports building against a python Release build. # This applies independently of CTK build type (Release, Debug, ...) add_definitions(-DPYTHONQT_USE_RELEASE_PYTHON_FALLBACK) set(PYTHONQT_FOUND 1) set(PythonQt_FOUND ${PYTHONQT_FOUND}) set(PYTHONQT_LIBRARIES ${PYTHONQT_LIBRARY} ${PYTHONQT_LIBUTIL} ${PYTHONQT_QTALL_LIBRARY}) endif() calamares-3.1.12/CMakeModules/FindYAMLCPP.cmake000066400000000000000000000034561322271446000207600ustar00rootroot00000000000000# Locate yaml-cpp # # This module defines # YAMLCPP_FOUND, if false, do not try to link to yaml-cpp # YAMLCPP_LIBRARY, where to find yaml-cpp # YAMLCPP_INCLUDE_DIR, where to find yaml.h # # By default, the dynamic libraries of yaml-cpp will be found. To find the static ones instead, # you must set the YAMLCPP_STATIC_LIBRARY variable to TRUE before calling find_package(YamlCpp ...). # # If yaml-cpp is not installed in a standard path, you can use the YAMLCPP_DIR CMake variable # to tell CMake where yaml-cpp is. # attempt to find static library first if this is set if(YAMLCPP_STATIC_LIBRARY) set(YAMLCPP_STATIC libyaml-cpp.a) endif() # find the yaml-cpp include directory find_path(YAMLCPP_INCLUDE_DIR yaml-cpp/yaml.h PATH_SUFFIXES include PATHS ~/Library/Frameworks/yaml-cpp/include/ /Library/Frameworks/yaml-cpp/include/ /usr/local/include/ /usr/include/ /sw/yaml-cpp/ # Fink /opt/local/yaml-cpp/ # DarwinPorts /opt/csw/yaml-cpp/ # Blastwave /opt/yaml-cpp/ ${YAMLCPP_DIR}/include/) # find the yaml-cpp library find_library(YAMLCPP_LIBRARY NAMES ${YAMLCPP_STATIC} yaml-cpp PATH_SUFFIXES lib64 lib PATHS ~/Library/Frameworks /Library/Frameworks /usr/local /usr /sw /opt/local /opt/csw /opt ${YAMLCPP_DIR}/lib) # handle the QUIETLY and REQUIRED arguments and set YAMLCPP_FOUND to TRUE if all listed variables are TRUE include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(YAMLCPP DEFAULT_MSG YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY) mark_as_advanced(YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY) calamares-3.1.12/CMakeModules/GNUInstallDirs.cmake000066400000000000000000000155571322271446000216610ustar00rootroot00000000000000# - Define GNU standard installation directories # Provides install directory variables as defined for GNU software: # http://www.gnu.org/prep/standards/html_node/Directory-Variables.html # Inclusion of this module defines the following variables: # CMAKE_INSTALL_ - destination for files of a given type # CMAKE_INSTALL_FULL_ - corresponding absolute path # where is one of: # BINDIR - user executables (bin) # SBINDIR - system admin executables (sbin) # LIBEXECDIR - program executables (libexec) # SYSCONFDIR - read-only single-machine data (etc) # SHAREDSTATEDIR - modifiable architecture-independent data (com) # LOCALSTATEDIR - modifiable single-machine data (var) # LIBDIR - object code libraries (lib or lib64) # INCLUDEDIR - C header files (include) # OLDINCLUDEDIR - C header files for non-gcc (/usr/include) # DATAROOTDIR - read-only architecture-independent data root (share) # DATADIR - read-only architecture-independent data (DATAROOTDIR) # INFODIR - info documentation (DATAROOTDIR/info) # LOCALEDIR - locale-dependent data (DATAROOTDIR/locale) # MANDIR - man documentation (DATAROOTDIR/man) # DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME) # Each CMAKE_INSTALL_ value may be passed to the DESTINATION options of # install() commands for the corresponding file type. If the includer does # not define a value the above-shown default will be used and the value will # appear in the cache for editing by the user. # Each CMAKE_INSTALL_FULL_ value contains an absolute path constructed # from the corresponding destination by prepending (if necessary) the value # of CMAKE_INSTALL_PREFIX. #============================================================================= # Copyright 2011 Nikita Krupen'ko # Copyright 2011 Kitware, Inc. # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) # Installation directories # if(NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)") endif() if(NOT DEFINED CMAKE_INSTALL_SBINDIR) set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)") endif() if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR) set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)") endif() if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR) set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)") endif() if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR) set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)") endif() if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR) set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)") endif() if(NOT DEFINED CMAKE_INSTALL_LIBDIR) set(_LIBDIR_DEFAULT "lib") # Override this default 'lib' with 'lib64' iff: # - we are on Linux system but NOT cross-compiling # - we are NOT on debian # - we are on a 64 bits system # reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf # Note that the future of multi-arch handling may be even # more complicated than that: http://wiki.debian.org/Multiarch if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT CMAKE_CROSSCOMPILING AND NOT EXISTS "/etc/debian_version") if(NOT DEFINED CMAKE_SIZEOF_VOID_P) message(AUTHOR_WARNING "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. " "Please enable at least one language before including GNUInstallDirs.") else() if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") set(_LIBDIR_DEFAULT "lib64") endif() endif() endif() set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})") endif() if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)") endif() if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR) set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)") endif() if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR) set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)") endif() #----------------------------------------------------------------------------- # Values whose defaults are relative to DATAROOTDIR. Store empty values in # the cache and store the defaults in local variables if the cache values are # not set explicitly. This auto-updates the defaults as DATAROOTDIR changes. if(NOT CMAKE_INSTALL_DATADIR) set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)") set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}") endif() if(NOT CMAKE_INSTALL_INFODIR) set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)") set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info") endif() if(NOT CMAKE_INSTALL_LOCALEDIR) set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)") set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale") endif() if(NOT CMAKE_INSTALL_MANDIR) set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)") set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man") endif() if(NOT CMAKE_INSTALL_DOCDIR) set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)") set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}") endif() #----------------------------------------------------------------------------- mark_as_advanced( CMAKE_INSTALL_BINDIR CMAKE_INSTALL_SBINDIR CMAKE_INSTALL_LIBEXECDIR CMAKE_INSTALL_SYSCONFDIR CMAKE_INSTALL_SHAREDSTATEDIR CMAKE_INSTALL_LOCALSTATEDIR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_OLDINCLUDEDIR CMAKE_INSTALL_DATAROOTDIR CMAKE_INSTALL_DATADIR CMAKE_INSTALL_INFODIR CMAKE_INSTALL_LOCALEDIR CMAKE_INSTALL_MANDIR CMAKE_INSTALL_DOCDIR ) # Result directories # foreach(dir BINDIR SBINDIR LIBEXECDIR SYSCONFDIR SHAREDSTATEDIR LOCALSTATEDIR LIBDIR INCLUDEDIR OLDINCLUDEDIR DATAROOTDIR DATADIR INFODIR LOCALEDIR MANDIR DOCDIR ) if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}}) set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}") else() set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}") endif() endforeach() calamares-3.1.12/CMakeModules/IncludeKPMCore.cmake000066400000000000000000000011401322271446000216020ustar00rootroot00000000000000# Shared CMake core for finding KPMCore # # This is wrapped into a CMake include file because there's a bunch of # pre-requisites that need searching for before looking for KPMCore. # If you just do find_package( KPMCore ) without finding the things # it links against first, you get CMake errors. # # find_package(ECM 5.10.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) include(KDEInstallDirs) include(GenerateExportHeader) find_package( KF5 REQUIRED CoreAddons ) find_package( KF5 REQUIRED Config I18n IconThemes KIO Service ) find_package( KPMcore 3.0.3 REQUIRED ) calamares-3.1.12/CalamaresBuildTreeSettings.cmake.in000066400000000000000000000001611322271446000223450ustar00rootroot00000000000000set(CALAMARES_INCLUDE_DIRS "@PROJECT_SOURCE_DIR@/src/libcalamares" "@PROJECT_BINARY_DIR@/src/libcalamares" ) calamares-3.1.12/CalamaresConfig.cmake.in000066400000000000000000000015761322271446000201650ustar00rootroot00000000000000# - Config file for the Calamares package # It defines the following variables # CALAMARES_INCLUDE_DIRS - include directories for Calamares # CALAMARES_LIBRARIES - libraries to link against # CALAMARES_EXECUTABLE - the bar executable # Compute paths get_filename_component(CALAMARES_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) if(EXISTS "${CALAMARES_CMAKE_DIR}/CMakeCache.txt") # In build tree include("${CALAMARES_CMAKE_DIR}/CalamaresBuildTreeSettings.cmake") else() set(CALAMARES_INCLUDE_DIRS "${CALAMARES_CMAKE_DIR}/@CONF_REL_INCLUDE_DIR@/libcalamares") endif() # Our library dependencies (contains definitions for IMPORTED targets) include("${CALAMARES_CMAKE_DIR}/CalamaresLibraryDepends.cmake") # These are IMPORTED targets created by CalamaresLibraryDepends.cmake set(CALAMARES_LIBRARIES calamares) set(CALAMARES_USE_FILE "${CALAMARES_CMAKE_DIR}/CalamaresUse.cmake") calamares-3.1.12/CalamaresConfigVersion.cmake.in000066400000000000000000000005761322271446000215320ustar00rootroot00000000000000set(PACKAGE_VERSION "@CALAMARES_VERSION@") # Check whether the requested PACKAGE_FIND_VERSION is compatible if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() endif() calamares-3.1.12/Dockerfile000066400000000000000000000007411322271446000155230ustar00rootroot00000000000000FROM kdeneon/all RUN sudo apt-get update && sudo apt-get -y install build-essential cmake extra-cmake-modules gettext kio-dev libatasmart-dev libboost-python-dev libkf5config-dev libkf5coreaddons-dev libkf5i18n-dev libkf5iconthemes-dev libkf5parts-dev libkf5service-dev libkf5solid-dev libkpmcore-dev libparted-dev libpolkit-qt5-1-dev libqt5svg5-dev libqt5webkit5-dev libyaml-cpp-dev os-prober pkg-config python3-dev qtbase5-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools calamares-3.1.12/LICENSE000066400000000000000000001045131322271446000145400ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . calamares-3.1.12/LICENSES/000077500000000000000000000000001322271446000147345ustar00rootroot00000000000000calamares-3.1.12/LICENSES/GPLv3+-ImageRegistry000066400000000000000000000013341322271446000203770ustar00rootroot00000000000000/* * Copyright 2012, Christian Muehlhaeuser This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ calamares-3.1.12/LICENSES/GPLv3+-QJsonModel000066400000000000000000000015311322271446000176360ustar00rootroot00000000000000/*********************************************** Copyright (C) 2014 Schutz Sacha This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). QJsonModel is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. QJsonModel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QJsonModel. If not, see . **********************************************/ calamares-3.1.12/LICENSES/LGPLv2.1-Presentation000066400000000000000000000074751322271446000205120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QML Presentation System. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QML Presentation System. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ calamares-3.1.12/LICENSES/LGPLv2.1-Presentation-Exception000066400000000000000000000022431322271446000224320ustar00rootroot00000000000000Digia Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. calamares-3.1.12/LICENSES/MIT-QtWaitingSpinner000066400000000000000000000021571322271446000205610ustar00rootroot00000000000000The MIT License (MIT) Original Work Copyright (c) 2012-2015 Alexander Turkin Modified 2014 by William Hallatt Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. calamares-3.1.12/README.md000066400000000000000000000033331322271446000150100ustar00rootroot00000000000000### Calamares: Distribution-Independent Installer Framework --------- [![GitHub release](https://img.shields.io/github/release/calamares/calamares.svg)](https://github.com/calamares/calamares/releases) [![Build Status](https://calamares.io/ci/buildStatus/icon?job=calamares-post_commit)](https://calamares.io/ci/job/calamares-post_commit/) [![Travis Build Status](https://travis-ci.org/calamares/calamares.svg?branch=master)](https://travis-ci.org/calamares/calamares) [![Coverity Scan Build Status](https://scan.coverity.com/projects/5389/badge.svg)](https://scan.coverity.com/projects/5389) [![GitHub license](https://img.shields.io/github/license/calamares/calamares.svg)](https://github.com/calamares/calamares/blob/master/LICENSE) | [Report a Bug](https://github.com/calamares/calamares/issues/new) | [Contribute](https://github.com/calamares/calamares/blob/master/ci/HACKING.md) | [Translate](https://www.transifex.com/projects/p/calamares/) | Freenode (IRC): #calamares | [Wiki](https://github.com/calamares/calamares/wiki) | |:-----------------------------------------:|:----------------------:|:-----------------------:|:--------------------------:|:--------------------------:| ### Dependencies Main: * Compiler with C++11 support: GCC >= 4.9.0 or Clang >= 3.5.1 * CMake >= 3.2 * Qt >= 5.6 * yaml-cpp >= 0.5.1 * Python >= 3.3 * Boost.Python >= 1.55.0 * dmidecode Modules: * welcome: * NetworkManager * UPower * partition: * extra-cmake-modules * KF5: KCoreAddons, KConfig, KI18n, KIconThemes, KIO, KService * KPMcore >= 3.0.3 * bootloader: * systemd-boot or GRUB * unpackfs: * squashfs-tools * rsync ### Building See [wiki](https://github.com/calamares/calamares/wiki) for up to date building and deployment instructions. calamares-3.1.12/calamares.desktop000066400000000000000000000066611322271446000170630ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=Calamares GenericName=System Installer Keywords=calamares;system;installer TryExec=calamares Exec=pkexec /usr/bin/calamares Comment=Calamares — System Installer Icon=calamares Terminal=false StartupNotify=true Categories=Qt;System; Name[ca]=Calamares Icon[ca]=calamares GenericName[ca]=Instal·lador de sistema Comment[ca]=Calamares — Instal·lador de sistema Name[da]=Calamares Icon[da]=calamares GenericName[da]=Systeminstallationsprogram Comment[da]=Calamares — Systeminstallationsprogram Name[de]=Calamares Icon[de]=calamares GenericName[de]=Installation des Betriebssystems Comment[de]=Calamares - Installation des Betriebssystems Name[en_GB]=Calamares Icon[en_GB]=calamares GenericName[en_GB]=System Installer Comment[en_GB]=Calamares — System Installer Name[es]=Calamares Icon[es]=calamares GenericName[es]=Instalador del Sistema Comment[es]=Calamares — Instalador del Sistema Name[fr]=Calamares Icon[fr]=calamares GenericName[fr]=Installateur système Comment[fr]=Calamares - Installateur système Name[he]=קלמארס Icon[he]=קלמארס GenericName[he]=אשף התקנה Comment[he]=קלמארס - אשף התקנה Name[hr]=Calamares Icon[hr]=calamares GenericName[hr]=Instalacija sustava Comment[hr]=Calamares — Instalacija sustava Name[hu]=Calamares Icon[hu]=calamares GenericName[hu]=Rendszer Telepítő Comment[hu]=Calamares — Rendszer Telepítő Name[id]=Calamares Icon[id]=calamares GenericName[id]=Pemasang Comment[id]=Calamares — Pemasang Sistem Name[is]=Calamares Icon[is]=calamares GenericName[is]=Kerfis uppsetning Comment[is]=Calamares — Kerfis uppsetning Name[ja]=Calamares Icon[ja]=calamares GenericName[ja]=システムインストーラー Comment[ja]=Calamares — システムインストーラー Name[lt]=Calamares Icon[lt]=calamares GenericName[lt]=Sistemos diegimas į kompiuterį Comment[lt]=Calamares — sistemos diegyklė Name[nl]=Calamares Icon[nl]=calamares GenericName[nl]=Installatieprogramma Comment[nl]=Calamares — Installatieprogramma Name[pl]=Calamares Icon[pl]=calamares GenericName[pl]=Instalator systemu Comment[pl]=Calamares — Instalator systemu Name[pt_BR]=Calamares Icon[pt_BR]=calamares GenericName[pt_BR]=Instalador de Sistema Comment[pt_BR]=Calamares — Instalador de Sistema Name[cs_CZ]=Calamares Icon[cs_CZ]=calamares GenericName[cs_CZ]=Instalační program systému Comment[cs_CZ]=Calamares - instalační program systému Name[ru]=Calamares Icon[ru]=calamares GenericName[ru]=Установщик системы Comment[ru]=Calamares - Установщик системы Name[sk]=Calamares Icon[sk]=calamares GenericName[sk]=Inštalátor systému Comment[sk]=Calamares — Inštalátor systému Name[sv]=Calamares Icon[sv]=calamares GenericName[sv]=Systeminstallerare Comment[sv]=Calamares — Systeminstallerare Name[zh_CN]=Calamares Icon[zh_CN]=calamares GenericName[zh_CN]=系统安装程序 Comment[zh_CN]=Calamares — 系统安装程序 Name[zh_TW]=Calamares Icon[zh_TW]=calamares GenericName[zh_TW]=系統安裝程式 Comment[zh_TW]=Calamares ── 系統安裝程式 Name[ast]=Calamares Icon[ast]=calamares GenericName[ast]=Instalador del sistema Comment[ast]=Calamares — Instalador del sistema Name[pt_PT]=Calamares Icon[pt_PT]=calamares GenericName[pt_PT]=Instalador de Sistema Comment[pt_PT]=Calamares - Instalador de Sistema Name[tr_TR]=Calamares Icon[tr_TR]=calamares GenericName[tr_TR]=Sistem Yükleyici Comment[tr_TR]=Calamares — Sistem Yükleyici calamares-3.1.12/ci/000077500000000000000000000000001322271446000141225ustar00rootroot00000000000000calamares-3.1.12/ci/RELEASE.md000066400000000000000000000046761322271446000155410ustar00rootroot00000000000000The Calamares release process ============================= #### (0) A week in advance * Run [Coverity scan][coverity], fix what's relevant. The Coverity scan runs automatically once a week on master. * Build with clang -Weverything, fix what's relevant. ``` rm -rf build ; mkdir build ; cd build CC=clang CXX=clang++ cmake .. && make ``` * Make sure all tests pass. ``` make make test ``` Note that *all* means all-that-make-sense. The partition-manager tests need an additional environment variable to be set for some tests, which will destroy an attached disk. This is not always desirable. * Notify [translators][transifex]. In the dashboard there is an *Announcements* link that you can use to send a translation announcement. [coverity]: https://scan.coverity.com/projects/calamares-calamares?tab=overview [transifex]: https://www.transifex.com/calamares/calamares/dashboard/ #### (1) Preparation * Bump version in `CMakeLists.txt`, *CALAMARES_VERSION* variables, and set RC to a non-zero value (e.g. doing -rc1, -rc2, ...). Push that. * Check `README.md` and everything in `hacking`, make sure it's all still relevant. Run `hacking/calamaresstyle` to check the C++ code style. Python code is checked as part of the Travis CI builds. * Check defaults in `settings.conf` and other configuration files. * Pull latest translations from Transifex. This is done nightly on Jenkins, so a manual pull is rarely necessary. * Update the list of enabled translation languages in `CMakeLists.txt`. Check the [translation site][transifex] for the list of languages with fairly complete translations. #### (2) Tarball * Create tarball: `git-archive-all -v calamares-1.1-rc1.tar.gz` or without the helper script, ``` V=calamares-3.1.5 git archive -o $V.tar.gz --prefix $V/ master ``` Double check that the tarball matches the version number. * Test tarball. #### (3) Tag * Set RC to zero in `CMakeLists.txt` if this is the actual release. * `git tag -s v1.1.0` Make sure the signing key is known in GitHub, so that the tag is shown as a verified tag. Do not sign -rc tags. * Generate MD5 and SHA256 checksums. * Upload tarball. * Announce on mailing list, notify packagers. * Write release article. #### (4) Release day * Publish tarball. * Update download page. * Publish release article on `calamares.io`. * Publicize on social networks. * Close associated milestone on GitHub if this is the actual release. * Publish blog post. calamares-3.1.12/ci/astylerc000066400000000000000000000003371322271446000156760ustar00rootroot00000000000000# Do not create a backup file suffix=none indent=spaces=4 # Brackets style=break remove-brackets # Remove brackets on single-line `if` and `for` (requires astyle 2.04) # Spaces pad-paren-in pad-header align-pointer=type calamares-3.1.12/ci/buildall.sh000077500000000000000000000010621322271446000162500ustar00rootroot00000000000000#!/bin/bash rm -Rf "$WORKSPACE/prefix" mkdir "$WORKSPACE/prefix" git clone git://anongit.kde.org/kpmcore "$WORKSPACE/kpmcore" cd "$WORKSPACE/kpmcore" mkdir "$WORKSPACE/kpmcore/build" cd "$WORKSPACE/kpmcore/build" cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr .. nice -n 18 make -j2 make DESTDIR="$WORKSPACE/prefix" install rm -Rf "$WORKSPACE/build" mkdir "$WORKSPACE/build" cd "$WORKSPACE/build" CMAKE_PREFIX_PATH="$WORKSPACE/prefix/usr" cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DWEBVIEW_FORCE_WEBKIT=1 .. nice -n 18 make -j2 calamares-3.1.12/ci/calamares-coverity.sh000077500000000000000000000026671322271446000202660ustar00rootroot00000000000000#!/bin/bash # Make sure we can make git operations from the Calamares Docker+Jenkins environment. cp ~/jenkins-master/.gitconfig ~ cp -R ~/jenkins-master/.ssh ~ cd "$WORKSPACE" git config --global http.sslVerify false rm -Rf "$WORKSPACE/prefix" mkdir "$WORKSPACE/prefix" git clone git://anongit.kde.org/kpmcore "$WORKSPACE/kpmcore" cd "$WORKSPACE/kpmcore" mkdir "$WORKSPACE/kpmcore/build" cd "$WORKSPACE/kpmcore/build" cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr .. nice -n 18 make -j2 make DESTDIR="$WORKSPACE/prefix" install cd "$WORKSPACE" wget https://scan.coverity.com/download/cxx/linux64 --no-check-certificate \ --post-data "token=ll90T04noQ4cORJx_zczKA&project=calamares%2Fcalamares" \ -O coverity_tool.tar.gz mkdir "$WORKSPACE/coveritytool" tar xvf coverity_tool.tar.gz -C "$WORKSPACE/coveritytool" --strip-components 2 export PATH="$WORKSPACE/coveritytool/bin:$PATH" rm -Rf "$WORKSPACE/build" mkdir "$WORKSPACE/build" cd "$WORKSPACE/build" CMAKE_PREFIX_PATH="$WORKSPACE/prefix/usr" cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DWEBVIEW_FORCE_WEBKIT=1 .. nice -n 18 cov-build --dir cov-int make -j2 tar caf calamares-ci.tar.xz cov-int curl -k --form token=ll90T04noQ4cORJx_zczKA \ --form email=teo@kde.org \ --form file=@calamares-ci.tar.xz \ --form version="master-`date -u +%Y%m%d`" \ --form description="master on `date -u`" \ https://scan.coverity.com/builds?project=calamares%2Fcalamares calamares-3.1.12/ci/calamaresstyle000077500000000000000000000002261322271446000170610ustar00rootroot00000000000000#!/bin/sh # Calls astyle with settings matching Calamares coding style # Requires astyle >= 2.04 set -e astyle --options=$(dirname $0)/astylerc "$@" calamares-3.1.12/ci/coverity-model.c000066400000000000000000000002461322271446000172320ustar00rootroot00000000000000/* Model file for Coverity checker. See https://scan.coverity.com/tune Calamares doesn't seem to geenerate any false positives, so the model-file is empty. */ calamares-3.1.12/ci/cppcheck.sh000077500000000000000000000001531322271446000162400ustar00rootroot00000000000000#!/bin/bash cd "$WORKSPACE" cppcheck --enable=all --inconclusive --xml --xml-version=2 src 2> cppcheck.xmlcalamares-3.1.12/ci/kpmcore-coverity.sh000077500000000000000000000020771322271446000177710ustar00rootroot00000000000000#!/bin/bash #Hack for Coverity build, so the compiler doesn't complain about InheritanceChecker sudo cp ~/jenkins-master/kpluginfactory.h /usr/include/KF5/KCoreAddons cd "$WORKSPACE" wget https://scan.coverity.com/download/cxx/linux64 --no-check-certificate \ --post-data "token=cyOjQZx5EOFLdhfo7ZDa4Q&project=KDE+Partition+Manager+Core+Library+-+KPMcore" \ -O coverity_tool.tar.gz mkdir "$WORKSPACE/coveritytool" tar xvf coverity_tool.tar.gz -C "$WORKSPACE/coveritytool" --strip-components 2 export PATH="$WORKSPACE/coveritytool/bin:$PATH" rm -Rf "$WORKSPACE/build" mkdir "$WORKSPACE/build" cd "$WORKSPACE/build" cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr .. nice -n 18 cov-build --dir cov-int make -j2 tar cavf kpmcore-ci.tar.xz cov-int cat cov-int/build-log.txt curl -k --form token=cyOjQZx5EOFLdhfo7ZDa4Q \ --form email=teo@kde.org \ --form file=@kpmcore-ci.tar.xz \ --form version="master-`date -u +%Y%m%d`" \ --form description="master on `date -u`" \ https://scan.coverity.com/builds?project=KDE+Partition+Manager+Core+Library+-+KPMcore calamares-3.1.12/ci/txpull.sh000077500000000000000000000062111322271446000160110ustar00rootroot00000000000000#!/bin/sh # # Fetch the Transifex translations for Calamares and incorporate them # into the source tree, adding commits of the different files. ### INITIAL SETUP # # This stuff needs to be done once; in a real CI environment where it # runs regularly in a container, the setup needs to be done when # creating the container. # # # cp ~/jenkins-master/.transifexrc ~ # Transifex user settings # cp ~/jenkins-master/.gitconfig ~ # Git config, user settings # cp -R ~/jenkins-master/.ssh ~ # SSH, presumably for github # # cd "$WORKSPACE" # git config --global http.sslVerify false test -f "CMakeLists.txt" || { echo "! Not at Calamares top-level" ; exit 1 ; } test -f ".tx/config" || { echo "! Not at Calamares top-level" ; exit 1 ; } test -f "calamares.desktop" || { echo "! Not at Calamares top-level" ; exit 1 ; } ### FETCH TRANSLATIONS # # Use Transifex client to get translations; this depends on the # .tx/config file to locate files, and overwrites them in the # filesystem with new (merged) translations. export QT_SELECT=5 tx pull --force --source --all ### COMMIT TRANSLATIONS # # Produce multiple commits (for the various parts of the i18n # infrastructure used by Calamares) of the updated translations. # Try to be a little smart about not committing trivial changes. # Who is credited with these CI commits AUTHOR="--author='Calamares CI '" # Message to put after the module name BOILERPLATE="Automatic merge of Transifex translations" git add --verbose lang/calamares*.ts git commit "$AUTHOR" --message="[core] $BOILERPLATE" | true rm -f lang/desktop*.desktop awk ' BEGIN {skip=0;} /^# Translations/ {skip=1;} {if (!skip || (length($0)>1 && $0 != "# Translations")) { skip=0; print $0; }}' < calamares.desktop > calamares.desktop.new mv calamares.desktop.new calamares.desktop git add --verbose calamares.desktop git commit "$AUTHOR" --message="[desktop] $BOILERPLATE" | true # Transifex updates the PO-Created timestamp also when nothing interesting # has happened, so drop the files which have just 1 line changed (the # PO-Created line). This applies only to modules which use po-files. git diff --numstat src/modules | awk '($1==1 && $2==1){print $3}' | xargs git checkout -- # Go through the Python modules; those with a lang/ subdir have their # own complete gettext-based setup. for MODULE_DIR in $(find src/modules -maxdepth 1 -mindepth 1 -type d) ; do FILES=$(find "$MODULE_DIR" -name "*.py" -a -type f) if test -n "$FILES" ; then MODULE_NAME=$(basename ${MODULE_DIR}) if [ -d ${MODULE_DIR}/lang ]; then # Convert PO files to MO files for POFILE in $(find ${MODULE_DIR} -name "*.po") ; do sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE msgfmt -o ${POFILE%.po}.mo $POFILE done git add --verbose ${MODULE_DIR}/lang/* git commit "$AUTHOR" --message="[${MODULE_NAME}] $BOILERPLATE" | true fi fi done for POFILE in $(find lang -name "python.po") ; do sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE msgfmt -o ${POFILE%.po}.mo $POFILE done git add --verbose lang/python* git commit "$AUTHOR" --message="[python] $BOILERPLATE" | true # git push --set-upstream origin master calamares-3.1.12/ci/txpush.sh000077500000000000000000000047711322271446000160250ustar00rootroot00000000000000#!/bin/sh # # Fetch the Transifex translations for Calamares and incorporate them # into the source tree, adding commits of the different files. ### INITIAL SETUP # # This stuff needs to be done once; in a real CI environment where it # runs regularly in a container, the setup needs to be done when # creating the container. # # # cp ~/jenkins-master/.transifexrc ~ # Transifex user settings # cp ~/jenkins-master/.gitconfig ~ # Git config, user settings # cp -R ~/jenkins-master/.ssh ~ # SSH, presumably for github # # cd "$WORKSPACE" # git config --global http.sslVerify false test -f "CMakeLists.txt" || { echo "! Not at Calamares top-level" ; exit 1 ; } test -f ".tx/config" || { echo "! Not at Calamares top-level" ; exit 1 ; } test -f "calamares.desktop" || { echo "! Not at Calamares top-level" ; exit 1 ; } if test "x$1" = "x--no-tx" ; then tx() { echo "Skipped tx $*" } fi ### CREATE TRANSLATIONS # # Use local tools (depending on type of source) to create translation # sources, then push to Transifex export QT_SELECT=5 lupdate src/ -ts -no-obsolete lang/calamares_en.ts tx push --source --no-interactive -r calamares.calamares-master tx push --source --no-interactive -r calamares.fdo ### PYTHON MODULES # # The Python tooling depends on the underlying distro to provide # gettext, and handles two cases: # # - python modules with their own lang/ subdir, for larger translations # - python modules without lang/, which use one shared catalog # PYGETTEXT="xgettext --keyword=_n:1,2 -L python" SHARED_PYTHON="" for MODULE_DIR in $(find src/modules -maxdepth 1 -mindepth 1 -type d) ; do FILES=$(find "$MODULE_DIR" -name "*.py" -a -type f) if test -n "$FILES" ; then MODULE_NAME=$(basename ${MODULE_DIR}) if [ -d ${MODULE_DIR}/lang ]; then ${PYGETTEXT} -p ${MODULE_DIR}/lang -d ${MODULE_NAME} -o ${MODULE_NAME}.pot ${MODULE_DIR}/*.py POTFILE="${MODULE_DIR}/lang/${MODULE_NAME}.pot" if [ -f "$POTFILE" ]; then sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' "$POTFILE" tx set -r calamares.${MODULE_NAME} --source -l en "$POTFILE" tx push --source --no-interactive -r calamares.${MODULE_NAME} fi else SHARED_PYTHON="$SHARED_PYTHON $FILES" fi fi done if test -n "$SHARED_PYTHON" ; then ${PYGETTEXT} -p lang -d python -o python.pot $SHARED_PYTHON POTFILE="lang/python.pot" sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' "$POTFILE" tx set -r calamares.python --source -l en "$POTFILE" tx push --source --no-interactive -r calamares.python fi calamares-3.1.12/cmake_uninstall.cmake.in000066400000000000000000000016541322271446000203150ustar00rootroot00000000000000IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") IF(EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF(NOT "${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") ENDIF(NOT "${rm_retval}" STREQUAL 0) ELSE(EXISTS "$ENV{DESTDIR}${file}") MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") ENDIF(EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH(file) calamares-3.1.12/com.github.calamares.calamares.policy000066400000000000000000000015361322271446000226720ustar00rootroot00000000000000 Calamares https://github.com/calamares Run Installer Authentication is required to run the installation program drive-harddisk no no auth_admin /usr/bin/calamares true calamares-3.1.12/data/000077500000000000000000000000001322271446000144405ustar00rootroot00000000000000calamares-3.1.12/data/example-root/000077500000000000000000000000001322271446000170545ustar00rootroot00000000000000calamares-3.1.12/data/example-root/README.md000066400000000000000000000006451322271446000203400ustar00rootroot00000000000000# Example Filesystem This is a filesystem that will be used as / in an example distro, *if* you build the `example-distro` target and use the default unpackfs configuration. It should hold files and configuration bits that need to be on the target system for example purposes. It should *not* have a bin/, lib/, sbin/ or lib64/ directory, since those are copied into the example-distro filesystem from the build host. calamares-3.1.12/data/example-root/etc/000077500000000000000000000000001322271446000176275ustar00rootroot00000000000000calamares-3.1.12/data/example-root/etc/bash.bashrc000066400000000000000000000000721322271446000217270ustar00rootroot00000000000000# Global .profile -- add /sbin_1 PATH=$PATH:/sbin_1:/xbin calamares-3.1.12/data/example-root/etc/group000066400000000000000000000000121322271446000206770ustar00rootroot00000000000000root:x:0: calamares-3.1.12/data/example-root/etc/issue000066400000000000000000000000441322271446000207000ustar00rootroot00000000000000This is an example /etc/issue file. calamares-3.1.12/data/example-root/etc/locale.gen000066400000000000000000000216751322271446000215740ustar00rootroot00000000000000# This file lists locales that you wish to have built. You can find a list # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change # this file, you need to rerun locale-gen. # aa_DJ ISO-8859-1 # aa_DJ.UTF-8 UTF-8 # aa_ER UTF-8 # aa_ER@saaho UTF-8 # aa_ET UTF-8 # af_ZA ISO-8859-1 # af_ZA.UTF-8 UTF-8 # ak_GH UTF-8 # am_ET UTF-8 # an_ES ISO-8859-15 # an_ES.UTF-8 UTF-8 # anp_IN UTF-8 # ar_AE ISO-8859-6 # ar_AE.UTF-8 UTF-8 # ar_BH ISO-8859-6 # ar_BH.UTF-8 UTF-8 # ar_DZ ISO-8859-6 # ar_DZ.UTF-8 UTF-8 # ar_EG ISO-8859-6 # ar_EG.UTF-8 UTF-8 # ar_IN UTF-8 # ar_IQ ISO-8859-6 # ar_IQ.UTF-8 UTF-8 # ar_JO ISO-8859-6 # ar_JO.UTF-8 UTF-8 # ar_KW ISO-8859-6 # ar_KW.UTF-8 UTF-8 # ar_LB ISO-8859-6 # ar_LB.UTF-8 UTF-8 # ar_LY ISO-8859-6 # ar_LY.UTF-8 UTF-8 # ar_MA ISO-8859-6 # ar_MA.UTF-8 UTF-8 # ar_OM ISO-8859-6 # ar_OM.UTF-8 UTF-8 # ar_QA ISO-8859-6 # ar_QA.UTF-8 UTF-8 # ar_SA ISO-8859-6 # ar_SA.UTF-8 UTF-8 # ar_SD ISO-8859-6 # ar_SD.UTF-8 UTF-8 # ar_SS UTF-8 # ar_SY ISO-8859-6 # ar_SY.UTF-8 UTF-8 # ar_TN ISO-8859-6 # ar_TN.UTF-8 UTF-8 # ar_YE ISO-8859-6 # ar_YE.UTF-8 UTF-8 # as_IN UTF-8 # ast_ES ISO-8859-15 # ast_ES.UTF-8 UTF-8 # ayc_PE UTF-8 # az_AZ UTF-8 # be_BY CP1251 # be_BY.UTF-8 UTF-8 # be_BY@latin UTF-8 # bem_ZM UTF-8 # ber_DZ UTF-8 # ber_MA UTF-8 # bg_BG CP1251 # bg_BG.UTF-8 UTF-8 # bhb_IN.UTF-8 UTF-8 # bho_IN UTF-8 # bn_BD UTF-8 # bn_IN UTF-8 # bo_CN UTF-8 # bo_IN UTF-8 # br_FR ISO-8859-1 # br_FR.UTF-8 UTF-8 # br_FR@euro ISO-8859-15 # brx_IN UTF-8 # bs_BA ISO-8859-2 # bs_BA.UTF-8 UTF-8 # byn_ER UTF-8 # ca_AD ISO-8859-15 # ca_AD.UTF-8 UTF-8 # ca_ES ISO-8859-1 # ca_ES.UTF-8 UTF-8 # ca_ES.UTF-8@valencia UTF-8 # ca_ES@euro ISO-8859-15 # ca_ES@valencia ISO-8859-15 # ca_FR ISO-8859-15 # ca_FR.UTF-8 UTF-8 # ca_IT ISO-8859-15 # ca_IT.UTF-8 UTF-8 # ce_RU UTF-8 # ckb_IQ UTF-8 # cmn_TW UTF-8 # crh_UA UTF-8 # cs_CZ ISO-8859-2 # cs_CZ.UTF-8 UTF-8 # csb_PL UTF-8 # cv_RU UTF-8 # cy_GB ISO-8859-14 # cy_GB.UTF-8 UTF-8 # da_DK ISO-8859-1 # da_DK.UTF-8 UTF-8 # de_AT ISO-8859-1 # de_AT.UTF-8 UTF-8 # de_AT@euro ISO-8859-15 # de_BE ISO-8859-1 # de_BE.UTF-8 UTF-8 # de_BE@euro ISO-8859-15 # de_CH ISO-8859-1 # de_CH.UTF-8 UTF-8 # de_DE ISO-8859-1 # de_DE.UTF-8 UTF-8 # de_DE@euro ISO-8859-15 # de_LI.UTF-8 UTF-8 # de_LU ISO-8859-1 # de_LU.UTF-8 UTF-8 # de_LU@euro ISO-8859-15 # doi_IN UTF-8 # dv_MV UTF-8 # dz_BT UTF-8 # el_CY ISO-8859-7 # el_CY.UTF-8 UTF-8 # el_GR ISO-8859-7 # el_GR.UTF-8 UTF-8 # en_AG UTF-8 # en_AU ISO-8859-1 # en_AU.UTF-8 UTF-8 # en_BW ISO-8859-1 # en_BW.UTF-8 UTF-8 # en_CA ISO-8859-1 en_CA.UTF-8 UTF-8 # en_DK ISO-8859-1 # en_DK.ISO-8859-15 ISO-8859-15 # en_DK.UTF-8 UTF-8 # en_GB ISO-8859-1 # en_GB.ISO-8859-15 ISO-8859-15 # en_GB.UTF-8 UTF-8 # en_HK ISO-8859-1 # en_HK.UTF-8 UTF-8 # en_IE ISO-8859-1 # en_IE.UTF-8 UTF-8 # en_IE@euro ISO-8859-15 # en_IN UTF-8 # en_NG UTF-8 # en_NZ ISO-8859-1 # en_NZ.UTF-8 UTF-8 # en_PH ISO-8859-1 # en_PH.UTF-8 UTF-8 # en_SG ISO-8859-1 # en_SG.UTF-8 UTF-8 # en_US ISO-8859-1 # en_US.ISO-8859-15 ISO-8859-15 en_US.UTF-8 UTF-8 # en_ZA ISO-8859-1 # en_ZA.UTF-8 UTF-8 # en_ZM UTF-8 # en_ZW ISO-8859-1 # en_ZW.UTF-8 UTF-8 # eo ISO-8859-3 # eo.UTF-8 UTF-8 # eo_US.UTF-8 UTF-8 # es_AR ISO-8859-1 # es_AR.UTF-8 UTF-8 # es_BO ISO-8859-1 # es_BO.UTF-8 UTF-8 # es_CL ISO-8859-1 # es_CL.UTF-8 UTF-8 # es_CO ISO-8859-1 # es_CO.UTF-8 UTF-8 # es_CR ISO-8859-1 # es_CR.UTF-8 UTF-8 # es_CU UTF-8 # es_DO ISO-8859-1 # es_DO.UTF-8 UTF-8 # es_EC ISO-8859-1 # es_EC.UTF-8 UTF-8 # es_ES ISO-8859-1 # es_ES.UTF-8 UTF-8 # es_ES@euro ISO-8859-15 # es_GT ISO-8859-1 # es_GT.UTF-8 UTF-8 # es_HN ISO-8859-1 # es_HN.UTF-8 UTF-8 # es_MX ISO-8859-1 # es_MX.UTF-8 UTF-8 # es_NI ISO-8859-1 # es_NI.UTF-8 UTF-8 # es_PA ISO-8859-1 # es_PA.UTF-8 UTF-8 # es_PE ISO-8859-1 # es_PE.UTF-8 UTF-8 # es_PR ISO-8859-1 # es_PR.UTF-8 UTF-8 # es_PY ISO-8859-1 # es_PY.UTF-8 UTF-8 # es_SV ISO-8859-1 # es_SV.UTF-8 UTF-8 # es_US ISO-8859-1 # es_US.UTF-8 UTF-8 # es_UY ISO-8859-1 # es_UY.UTF-8 UTF-8 # es_VE ISO-8859-1 # es_VE.UTF-8 UTF-8 # et_EE ISO-8859-1 # et_EE.ISO-8859-15 ISO-8859-15 # et_EE.UTF-8 UTF-8 # eu_ES ISO-8859-1 # eu_ES.UTF-8 UTF-8 # eu_ES@euro ISO-8859-15 # eu_FR ISO-8859-1 # eu_FR.UTF-8 UTF-8 # eu_FR@euro ISO-8859-15 # fa_IR UTF-8 # ff_SN UTF-8 # fi_FI ISO-8859-1 # fi_FI.UTF-8 UTF-8 # fi_FI@euro ISO-8859-15 # fil_PH UTF-8 # fo_FO ISO-8859-1 # fo_FO.UTF-8 UTF-8 # fr_BE ISO-8859-1 # fr_BE.UTF-8 UTF-8 # fr_BE@euro ISO-8859-15 # fr_CA ISO-8859-1 # fr_CA.UTF-8 UTF-8 # fr_CH ISO-8859-1 # fr_CH.UTF-8 UTF-8 # fr_FR ISO-8859-1 # fr_FR.UTF-8 UTF-8 # fr_FR@euro ISO-8859-15 # fr_LU ISO-8859-1 # fr_LU.UTF-8 UTF-8 # fr_LU@euro ISO-8859-15 # fur_IT UTF-8 # fy_DE UTF-8 # fy_NL UTF-8 # ga_IE ISO-8859-1 # ga_IE.UTF-8 UTF-8 # ga_IE@euro ISO-8859-15 # gd_GB ISO-8859-15 # gd_GB.UTF-8 UTF-8 # gez_ER UTF-8 # gez_ER@abegede UTF-8 # gez_ET UTF-8 # gez_ET@abegede UTF-8 # gl_ES ISO-8859-1 # gl_ES.UTF-8 UTF-8 # gl_ES@euro ISO-8859-15 # gu_IN UTF-8 # gv_GB ISO-8859-1 # gv_GB.UTF-8 UTF-8 # ha_NG UTF-8 # hak_TW UTF-8 # he_IL ISO-8859-8 # he_IL.UTF-8 UTF-8 # hi_IN UTF-8 # hne_IN UTF-8 # hr_HR ISO-8859-2 # hr_HR.UTF-8 UTF-8 # hsb_DE ISO-8859-2 # hsb_DE.UTF-8 UTF-8 # ht_HT UTF-8 # hu_HU ISO-8859-2 # hu_HU.UTF-8 UTF-8 # hy_AM UTF-8 # hy_AM.ARMSCII-8 ARMSCII-8 # ia_FR UTF-8 # id_ID ISO-8859-1 # id_ID.UTF-8 UTF-8 # ig_NG UTF-8 # ik_CA UTF-8 # is_IS ISO-8859-1 # is_IS.UTF-8 UTF-8 # it_CH ISO-8859-1 # it_CH.UTF-8 UTF-8 # it_IT ISO-8859-1 # it_IT.UTF-8 UTF-8 # it_IT@euro ISO-8859-15 # iu_CA UTF-8 # iw_IL ISO-8859-8 # iw_IL.UTF-8 UTF-8 # ja_JP.EUC-JP EUC-JP # ja_JP.UTF-8 UTF-8 # ka_GE GEORGIAN-PS # ka_GE.UTF-8 UTF-8 # kk_KZ PT154 # kk_KZ RK1048 # kk_KZ.UTF-8 UTF-8 # kl_GL ISO-8859-1 # kl_GL.UTF-8 UTF-8 # km_KH UTF-8 # kn_IN UTF-8 # ko_KR.EUC-KR EUC-KR # ko_KR.UTF-8 UTF-8 # kok_IN UTF-8 # ks_IN UTF-8 # ks_IN@devanagari UTF-8 # ku_TR ISO-8859-9 # ku_TR.UTF-8 UTF-8 # kw_GB ISO-8859-1 # kw_GB.UTF-8 UTF-8 # ky_KG UTF-8 # lb_LU UTF-8 # lg_UG ISO-8859-10 # lg_UG.UTF-8 UTF-8 # li_BE UTF-8 # li_NL UTF-8 # lij_IT UTF-8 # ln_CD UTF-8 # lo_LA UTF-8 # lt_LT ISO-8859-13 # lt_LT.UTF-8 UTF-8 # lv_LV ISO-8859-13 # lv_LV.UTF-8 UTF-8 # lzh_TW UTF-8 # mag_IN UTF-8 # mai_IN UTF-8 # mg_MG ISO-8859-15 # mg_MG.UTF-8 UTF-8 # mhr_RU UTF-8 # mi_NZ ISO-8859-13 # mi_NZ.UTF-8 UTF-8 # mk_MK ISO-8859-5 # mk_MK.UTF-8 UTF-8 # ml_IN UTF-8 # mn_MN UTF-8 # mni_IN UTF-8 # mr_IN UTF-8 # ms_MY ISO-8859-1 # ms_MY.UTF-8 UTF-8 # mt_MT ISO-8859-3 # mt_MT.UTF-8 UTF-8 # my_MM UTF-8 # nan_TW UTF-8 # nan_TW@latin UTF-8 # nb_NO ISO-8859-1 # nb_NO.UTF-8 UTF-8 # nds_DE UTF-8 # nds_NL UTF-8 # ne_NP UTF-8 # nhn_MX UTF-8 # niu_NU UTF-8 # niu_NZ UTF-8 # nl_AW UTF-8 # nl_BE ISO-8859-1 # nl_BE.UTF-8 UTF-8 # nl_BE@euro ISO-8859-15 # nl_NL ISO-8859-1 # nl_NL.UTF-8 UTF-8 # nl_NL@euro ISO-8859-15 # nn_NO ISO-8859-1 # nn_NO.UTF-8 UTF-8 # nr_ZA UTF-8 # nso_ZA UTF-8 # oc_FR ISO-8859-1 # oc_FR.UTF-8 UTF-8 # om_ET UTF-8 # om_KE ISO-8859-1 # om_KE.UTF-8 UTF-8 # or_IN UTF-8 # os_RU UTF-8 # pa_IN UTF-8 # pa_PK UTF-8 # pap_AN UTF-8 # pap_AW UTF-8 # pap_CW UTF-8 # pl_PL ISO-8859-2 # pl_PL.UTF-8 UTF-8 # ps_AF UTF-8 # pt_BR ISO-8859-1 # pt_BR.UTF-8 UTF-8 # pt_PT ISO-8859-1 # pt_PT.UTF-8 UTF-8 # pt_PT@euro ISO-8859-15 # quz_PE UTF-8 # raj_IN UTF-8 # ro_RO ISO-8859-2 # ro_RO.UTF-8 UTF-8 # ru_RU ISO-8859-5 # ru_RU.CP1251 CP1251 # ru_RU.KOI8-R KOI8-R # ru_RU.UTF-8 UTF-8 # ru_UA KOI8-U # ru_UA.UTF-8 UTF-8 # rw_RW UTF-8 # sa_IN UTF-8 # sat_IN UTF-8 # sc_IT UTF-8 # sd_IN UTF-8 # sd_IN@devanagari UTF-8 # sd_PK UTF-8 # se_NO UTF-8 # shs_CA UTF-8 # si_LK UTF-8 # sid_ET UTF-8 # sk_SK ISO-8859-2 # sk_SK.UTF-8 UTF-8 # sl_SI ISO-8859-2 # sl_SI.UTF-8 UTF-8 # so_DJ ISO-8859-1 # so_DJ.UTF-8 UTF-8 # so_ET UTF-8 # so_KE ISO-8859-1 # so_KE.UTF-8 UTF-8 # so_SO ISO-8859-1 # so_SO.UTF-8 UTF-8 # sq_AL ISO-8859-1 # sq_AL.UTF-8 UTF-8 # sq_MK UTF-8 # sr_ME UTF-8 # sr_RS UTF-8 # sr_RS@latin UTF-8 # ss_ZA UTF-8 # st_ZA ISO-8859-1 # st_ZA.UTF-8 UTF-8 # sv_FI ISO-8859-1 # sv_FI.UTF-8 UTF-8 # sv_FI@euro ISO-8859-15 # sv_SE ISO-8859-1 # sv_SE.ISO-8859-15 ISO-8859-15 # sv_SE.UTF-8 UTF-8 # sw_KE UTF-8 # sw_TZ UTF-8 # szl_PL UTF-8 # ta_IN UTF-8 # ta_LK UTF-8 # tcy_IN.UTF-8 UTF-8 # te_IN UTF-8 # tg_TJ KOI8-T # tg_TJ.UTF-8 UTF-8 # th_TH TIS-620 # th_TH.UTF-8 UTF-8 # the_NP UTF-8 # ti_ER UTF-8 # ti_ET UTF-8 # tig_ER UTF-8 # tk_TM UTF-8 # tl_PH ISO-8859-1 # tl_PH.UTF-8 UTF-8 # tn_ZA UTF-8 # tr_CY ISO-8859-9 # tr_CY.UTF-8 UTF-8 # tr_TR ISO-8859-9 # tr_TR.UTF-8 UTF-8 # ts_ZA UTF-8 # tt_RU UTF-8 # tt_RU@iqtelif UTF-8 # ug_CN UTF-8 # ug_CN@latin UTF-8 # uk_UA KOI8-U # uk_UA.UTF-8 UTF-8 # unm_US UTF-8 # ur_IN UTF-8 # ur_PK UTF-8 # uz_UZ ISO-8859-1 # uz_UZ.UTF-8 UTF-8 # uz_UZ@cyrillic UTF-8 # ve_ZA UTF-8 # vi_VN UTF-8 # wa_BE ISO-8859-1 # wa_BE.UTF-8 UTF-8 # wa_BE@euro ISO-8859-15 # wae_CH UTF-8 # wal_ET UTF-8 # wo_SN UTF-8 # xh_ZA ISO-8859-1 # xh_ZA.UTF-8 UTF-8 # yi_US CP1255 # yi_US.UTF-8 UTF-8 # yo_NG UTF-8 # yue_HK UTF-8 # zh_CN GB2312 # zh_CN.GB18030 GB18030 # zh_CN.GBK GBK # zh_CN.UTF-8 UTF-8 # zh_HK BIG5-HKSCS # zh_HK.UTF-8 UTF-8 # zh_SG GB2312 # zh_SG.GBK GBK # zh_SG.UTF-8 UTF-8 # zh_TW BIG5 # zh_TW.EUC-TW EUC-TW # zh_TW.UTF-8 UTF-8 # zu_ZA ISO-8859-1 # zu_ZA.UTF-8 UTF-8 calamares-3.1.12/data/example-root/etc/profile000066400000000000000000000000721322271446000212110ustar00rootroot00000000000000# Global .profile -- add /sbin_1 PATH=$PATH:/sbin_1:/xbin calamares-3.1.12/data/example-root/etc/sudoers.d/000077500000000000000000000000001322271446000215355ustar00rootroot00000000000000calamares-3.1.12/data/example-root/etc/sudoers.d/10-installer000066400000000000000000000000001322271446000236610ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/000077500000000000000000000000001322271446000176655ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/share/000077500000000000000000000000001322271446000207675ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/share/zoneinfo/000077500000000000000000000000001322271446000226165ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/share/zoneinfo/.dummy000066400000000000000000000000001322271446000237400ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/share/zoneinfo/America/000077500000000000000000000000001322271446000241575ustar00rootroot00000000000000calamares-3.1.12/data/example-root/usr/share/zoneinfo/America/New_York000066400000000000000000000067311322271446000256460ustar00rootroot00000000000000TZif2p`p`epjp5`S`3އpiRK௳4~-౜QpgJ`|3pG,`\p'`;p`p`ƴ`Ĺ𿏲o„}Ovd_/XM|p:-^pW` @p9`ˈp#p`u@U 5peމpݩ`޾kp߉d`MpiF`~/pI(`^pW.G-7'ֶƵ`p`p`op_y`Oxp?[`/Zp(wp?b@opA`BOpCda`D/vpEDC`EG-_GӊI AIlJ#KpL@`M|kpN"`O\MpP`Qp?b@opA`BOpCda`D/vpEDC`EG-_GӊI AIlJ#KpL@`M|kpN"`O\MpP`Q image/svg+xml calamares-3.1.12/data/images/bugs.svg000066400000000000000000000073501322271446000173730ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/fail.svgz000066400000000000000000000023771322271446000175440ustar00rootroot00000000000000ޑSedit-delete.svgWMo6W%5%+{Qb=n3#ѶI4$:;Էm9uXyy3GcWQ̗5D87K㟟q`R<ȥe1ZDڢK@O[v :fMYlOCXnB8Z͆ݾH+`Y"UiQZFzxٓW,yYZ@t>[Ya@+~[Ƕ2B1ԢAw[Y}5f.ΉxLgHVkXmsV$I4~m#z4N9"EEiyHqp Tjb]jxMW dU.&cyYЎo,4gYĢh]^9sI&Qћmn:j'rcy.oRf`f|lz x' mwھ/ HI@WQnaShTo[C]2^l+\XQGQ7ΈY*5n:U J7"̾1ɒ7:\%vShUrObQec8;c gE593ytQns3 OYɬ9旬YmSsx!7 Q 6. S2*gH6_iuCo6O:;:Bn6GjyZ'sV%"tx LmBlwtUm#ݓUXuSm'T AFadBCdݪQ Q2|+5:{;:ꪏFێɭgB+ޏq>1|׷陼"ſxi,0猫U/?àZ Z-D=QM*Iӷ T*jhYV+C\$)w]+BwE3g*x^j)=a%& \ͰGh̰"9>'>% sv|@Y1m!7C='O}GS? M}+O$calamares-3.1.12/data/images/help.svg000066400000000000000000000177621322271446000173730ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/information.svgz000066400000000000000000000021421322271446000211440ustar00rootroot00000000000000ޑShelp-about.svgW[o8~җM h ,<i^碕N a_Lnm7.U|wnu_h[Yzwsz5w~IEkFKQS .cr8CBEZ&n=0^erCZ,;@iKdK^ZIsFx>sm\TeKB"/0 <Ԋ(xM4}ވwTBBX@pش9_wk_O})vfՓ$״ⲡ9@7򻂩 ZbVvYv^ דZFƷD L ^rΞid,1ZW<ò:-n>SمPCWPRs~i,Zہ55 K@Z u蚼=Z/ה$*D $y=$ Ⴉ ]Β |]*/╃?NL`qه0 ;(B꠷i@Iф;(2mLh xHl5@jC+ o2ۈ'Fn0dK|3OPpBfez=b$.ӫFn(>}d 3dLz4C3r`zeTqzxبp?-zYe0g,,9cy eEբ`63 72NzJ;-NܫW~,k#6ViJ>3; .ju6J˹H.Sy2UKk׳^K}C AfjDC #/%.!>b,ȓ/, X W܉v67Z3i6%G50EẳjBڌsv޽p-j艱\h\ calamares-3.1.12/data/images/no.svgz000066400000000000000000000020721322271446000172350ustar00rootroot00000000000000Swindow-close.svgWQo8~WҗVG;I dnnO&1M7N$ F{e1󯇲@VBV C%z?Ҵb_x.G?|}9՜zQ9rtz~ d/Gz]BRu</yUHz=<.^y.RV\U6 fGaձ/Fl=cL[n"PrW|~<~>uFLAI+Zr9Wo‹fbPmZ : I&E_Q<MdnbrT<0B-7g| ]% S3>SRDhKPݪyY֌4iɄ>vMΎ/Ն#%DM4!3s%b%3YOtLA̝"p{8sյȁvX6z{7AYhigs uc$䌧ELY3 wl%=R@46,N0AI%tS㶊q2pJRϡd-@XΚg;`rڔ9z19-FNVi}w80L\ϻF3_rMմo!n&u /mygeCq-93%KQyi.B瞇lA۰5oE,/q Ѣ(~$\]P lrEhiX image/svg+xml calamares-3.1.12/data/images/partition-disk.svg000066400000000000000000000244631322271446000214000ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/partition-erase-auto.svg000066400000000000000000000325551322271446000225140ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/partition-manual.svg000066400000000000000000000316351322271446000217220ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/partition-partition.svg000066400000000000000000000301311322271446000224440ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/partition-replace-os.svg000066400000000000000000000410611322271446000224710ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/partition-table.svg000066400000000000000000000131751322271446000215330ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/release.svg000066400000000000000000000060011322271446000200430ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/squid.png000066400000000000000000000201711322271446000175410ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYsXXm7tEXtSoftwarewww.inkscape.org<IDATxy%U}ǿofce`d (}IԲRV*eECXFMRTʊAB2RRj, 00lo7ݵo}Ͻ޿xs{Yix#q["4n>|/(A B@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20Z ghu]}fzрJD2 PX>&']}fq1T*"PdP0Q2`A'H3d7e54BW]%H!tE`R]M.IHt% WXougR]EGM X D/ H>t/ H6t刎p?` $jĒ$,, $b;;`L q"0֠d0,^GAC@xyo|599 L "h#~cQ2h  KwUdaC@'oA&.d;_P+(€ phsxu-K%~FɊ5> dgmSsQcI&-~0f[eZ'(d!RX>6 Qc7jɧl02(lڅwڲ5fl}0Ŀ!7 sleGRL Bi6gPGWiI00/F&뎇0ҖdC0n$ Rmd6ȇL_I20/MdA_Sa.݁JӄD@7@L/@6@H? ~AA&+d>2r%7cgtŠ@os-@o~|ٗF@V z_y}9{7d]C3S|7Uw __{RW 2@ǐ@L )g: bIH,: @nfdKC0I5o1 :@I5O7NUD+d!4p}Pb ;d!4ڇI@ d!$HdD@L *ˏk.BTl"" &݊`A;J DIMUZ$.Sk!"e22 HAFCD#2wSbO{݁ Ą@3Ռ@ dE"an6%bF\LiƳet2V}}5r<ʮ?XۛԁA@LkESUuP{|0E?QT `d1'&t nd i& ld !)&6 tP5:80a$@Z/32WHE>iHL +J\L+&4 j)12 t-)~׊:g%h)p™z[UFOqz/j%Vb2aG$~H_f @JHh_O MW h42m t2&bw$Hr>uA!H)~@'oHh9n^2= 12ӯ !~7"\c,~ALRNc^v<>@h1ƴXt $M"/ cdSHk "( ܊b@X ~?@7g41,~IAAPA@i2/?S^ݎA) /<2_CZ7? qT!Q? 2yHG$#420Ry22&êdXy;@@4Sy*?hM hASќ&m ~>q@ͻB@2`TPaR?.~!}( L}yڞw|Q2-{˧jdĒ( v1ot[#h axGoOgW2c!wM'TN6 (Ǔ{*OejdD0C@L||,T9-ĿDzP9kMGy-hCo )KcBI6^YB@BAj)%4G]C]7 /53+GNjqٶB{)P@NNmʫsGeH )y+( DSiB/"vD2${:,T ( AmT|  BALyR(n_  3g<7 Y} a- E0r(m'lʃ`.V6ݖG^ +dDd0yP| <' 9;S<'{B@Ć bA("eaؑSZH@@Ē%Bs؉ɩEy8yԡuԪVxQ|s Er>X CEhjW'6;w:+Ckk/{KlqK=1V>(fbN r97c&椈  1s CQ7Uze aJ$~Wٹ@=9k€ř6žBu+-"<\mQſƠj ݷ}{?ݦ-1%%TEM1pywW/@t#^B~|+sBQ[MېHM @N^=oDUU'پ ^l޻IOH w~Ga nxd ) 9aH]) |aX/ҷ[ @d 0ŗ@.= 1엡.I@X(Ca u;|݁A]h22 ,I"N~ `q88ثOzl5Z 0 V.|q7Id0pd/kOS @i@~X|`֫uD]1߻t]'p7pqETJEh|q,uaF V^`Wl. Tt07;?DZs)ظi3v^x!6nI#O= >3b[`K  ~@tYFkoV@/ _y ~u V\kk׭tJ`?lw` w|oR~ʏ}|Wnoۙ~/xXWw`a;kC)H>Þ~@0&o<)ʗ|~`j`;o@y> YG W]7߂!aؙSAP{P>񯀒g?6}a-;>90 ?^ \#&&=OӀ'-@#}?4k{<c9ÿE(p̙@ϣvG 9Uh߿l@Bzam2Fz~ B=o^-߁Y[B=oT?L֪8y8ݱ#hKQ~O)R|bcP篁rw W:ǎF_LMNb޽So?.CP+;¨Cy˨Uѕ!ShhI.fg#+Cpn_ HLOM(?Nw{ ? ^OkbKN9t &'0 _ЧG0C8=s&M@Q3m<`3rxcvncH033}?u3ǾY?D]ԣԊ8am y -/_ٱ`}='67ڬj$dri}PpDrX[=yVNR%Ǐ;k`ꈟ b26hL8GZhZf,Ԭ]̎Hcl]7;/ 槁'E"G:npj#ZOx-*T+~PVQ(( e?.roFDKU1/T.M~osr2#c(Λo/j|%c{ Ԭ[|ˋH8*ȹ9mppԪryef}0֞cnDΟ{Se2epsv ˑ t+;Px9Ldյv$~ZFc]( Z<}6`aƖGi娏0_*Zk9R1'eӍ'`ǻ+4Ù Wl|~ bVE0*vv`a 8z4bج[\1]A!&Ø+0CVc5cD#Әp4Z4bƭ|ď8)9W+(wdv}ܮg#!Ua cgjs1j}.֫5^&)rfͩ?Ԯdl[g2"~R)v݁|>su1##زm' Ӡ_i -Fn~lxbx 08p[G!ڏ1ULIyQ|wFUzJ믴5hձ]?aGTQ7m}\sWhhŗ\)?j?cΐ+>JvqKrN8anV}9sGNp~g<ʍ_x'L5(֝]GQ"M uipJ7h742K/"zmb8s~ĐLA;#[X^;>a*v藍)g #+Qy_o]qVϰRg.GREĪի#9i-x@+ >S7 D&ⷿvߋ҆qOOY T1z;122ykそCTƪs B0 8qwP]c6<޽s`/o!(ӯ~.:n;p t'U} n9l\y58'AHӷ~G'0_cp+{OlvhhIP`ϻ8Dc)ۍ7 ^vS߮;fj>;.~Mtz7b>(,^)u!N͞LAmuX(0tr?| ? \tE\ b?R.~ 0p ,:K QpS`z(JlLM oZöW\C34S&Q<7F 4q,{N L.~aDşb10ROFE9W/kL"</:Jc`ظi3v+W KBjk5LNM¨ȕ0#>/B{;i}hJk.BqeX{V9fgP00}c>Sc`0WU7b,n5Z(:BƍW7(jUWc݆ غu;C]a{ Ph8IAUcQ^YfwMDh#~K}UNkӸ)~33(U;sj4< UoDk3%~}-9(~R ~7P*QQ.*\cc@uLMM¨s0ƭ&$`Q{sٹYTJe;ZUN=A|IuGNXr%8`62!hnKĒ\fQH!> "LCj"7I%Ki5+ V` X>19̢T.YmFʭ1p3~8%~>96wo&.iR&wiX|9fffNŝ7EҝRoS58}y";)ݼa5I' `T*Q~_ܭa7C07dԑ}`% Փr3.iR&R-apGV+3ۛM'ҭg$~qgcY8'kȏ5˅ 6ar||;r K)wjZO \SN@zNSr9LL,nPp~6c㤈@ɚ~'/:66AC븳VhON]ӤzMz='w5aٲeӉ4oȨ!jwC)\>0RZ*?nRh@./S\.B0@B}T0`%cW.r4V9-Q\ sLIT@FQU yįyh O w\` &pF&=f9hsg.C_z]^9L0ỉ0z(v0;9hǦ'.AA@ 2 Ad20daok\IENDB`calamares-3.1.12/data/images/squid.svg000066400000000000000000000260061322271446000175570ustar00rootroot00000000000000 image/svg+xml calamares-3.1.12/data/images/yes.svgz000066400000000000000000000021621322271446000174210ustar00rootroot00000000000000Sdialog-ok-apply.svgWr8+0%$I9$\33L@$_? Zr"@{PhU#dZWdʗֿBҪu cMq9C{7gdFz8і*w>#Wf? j,[Zz2nbǚ Lvd<[h3߂H9c9깮oB 5o@~G`U_8nW\;صf'a=XDhɛfq{;~/,-k6\= `:j>z\;H0R-dLbi1%cZ6r`||jހַz(& OrA9{!z\$jpE%A]L7tHYAȋ_Pv( Iq^:Aϭ x[ Vo29~l>WF>|kqIU.*e ^ 7'J@3ܗ %D eE} JAr 1.cmM/વ/F>y85U~Zm[Fv{6!.!,J$#J%`itg$:2o'#iA-GogԀ56[d;R;!Mddnjqb{]GjsK?R$y}բ۩#dǪ?P M5r^^Y8׷ek/j:]h8 cS,lT#B@dk5,CRR%™g`s*NAwmޏe0(dw *t'g$p۷//7ZStu5JnR2ߪ$-%ీc3zn~䯩 )5XE{kH|0Ӿh%n|,O<;-ݖ,F@'q40&A3Ʊˌ*$OЀ Q{l:@b\A3,Y+iE86@)VhGVqӆ $WL calamares-3.1.12/lang/000077500000000000000000000000001322271446000144505ustar00rootroot00000000000000calamares-3.1.12/lang/calamares_ar.ts000066400000000000000000003641661322271446000174520ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>بيئة الإقلاع</strong> لهذا النّظام.<br><br>أنظمة x86 القديمة تدعم <strong>BIOS</strong> فقط.<br>غالبًا ما تستخدم الأنظمة الجديدة <strong>EFI</strong>، ولكن ما زال بإمكانك إظهاره ك‍ BIOS إن بدأته بوضع التّوافقيّة. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. بدأ هذا النّظام ببيئة إقلاع <strong>EFI</strong>.<br><br>لضبط البدء من بيئة EFI، يجب على المثبّت وضع تطبيق محمّل إقلاع، مثل <strong>GRUB</strong> أو <strong>systemd-boot</strong> على <strong>قسم نظام EFI</strong>. هذا الأمر آليّ، إلّا إن اخترت التّقسيم يدويًّا، حيث عليك اخيتاره أو إنشاؤه بنفسك. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. بدأ هذا النّظام ببيئة إقلاع <strong>BIOS</strong>.<br><br>لضبط البدء من بيئة BIOS، يجب على المثبّت وضع تطبيق محمّل إقلاع، مثل <strong>GRUB</strong>، إمّا في بداية قسم أو في <strong>قطاع الإقلاع الرّئيس</strong> قرب بداية جدول التّقسيم (محبّذ). هذا الأمر آليّ، إلّا إن اخترت التّقسيم يدويًّا، حيث عليك اخيتاره أو إنشاؤه بنفسك. BootLoaderModel Master Boot Record of %1 قطاع الإقلاع الرئيسي ل %1 Boot Partition قسم الإقلاع System Partition قسم النظام Do not install a boot loader لا تثبّت محمّل إقلاع %1 (%2) %1 (%2) Calamares::DebugWindow Form نموذج GlobalStorage التّخزين العموميّ JobQueue صفّ المهامّ Modules الوحدا Type: النوع: none لاشيء Interface: الواجهة: Tools الأدوات Debug information معلومات التّنقيح Calamares::ExecutionViewStep Install ثبت Calamares::JobThread Done انتهى Calamares::ProcessJob Run command %1 %2 شغّل الأمر 1% 2% Running command %1 %2 يشغّل الأمر 1% 2% External command crashed انهار الأمر الخارجيّ Command %1 crashed. Output: %2 انهار الأمر %1. الخرج: %2 External command failed to start فشل الأمر الخارجي في البدء Command %1 failed to start. فشل الأمر %1 في البدء Internal error when starting command حدث خطأ داخلي أثناء بدء الأمر Bad parameters for process job call. معاملات نداء المهمة سيّئة. External command failed to finish فشل الأمر الخارجي بالانتهاء Command %1 failed to finish in %2s. Output: %3 فشل الأمر %1 بالانتهاء خلال %2 ثانية. الخرج: %3 External command finished with errors انتهى الأمر الخارجي مع وجود أخطاء Command %1 finished with exit code %2. Output: %3 انتهى الأمر %1 بشيفرة خروج %2. الخرج: %3 Calamares::PythonJob Running %1 operation. يشغّل عمليّة %1. Bad working directory path مسار سيء لمجلد العمل Working directory %1 for python job %2 is not readable. لا يمكن القراءة من مجلد العمل %1 الخاص بعملية بايثون %2. Bad main script file ملفّ السّكربت الرّئيس سيّء. Main script file %1 for python job %2 is not readable. ملفّ السّكربت الرّئيس %1 لمهمّة بايثون %2 لا يمكن قراءته. Boost.Python error in job "%1". خطأ Boost.Python في العمل "%1". Calamares::ViewManager &Back &رجوع &Next &التالي &Cancel &إلغاء Cancel installation without changing the system. الغاء الـ تثبيت من دون احداث تغيير في النظام Cancel installation? إلغاء التثبيت؟ Do you really want to cancel the current install process? The installer will quit and all changes will be lost. أتريد إلغاء عمليّة التّثبيت الحاليّة؟ سيخرج المثبّت وتضيع كلّ التّغييرات. &Yes &نعم &No &لا &Close &اغلاق Continue with setup? الإستمرار في التثبيت؟ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> مثبّت %1 على وشك بإجراء تعديلات على قرصك لتثبيت %2.<br/><strong>لن تستطيع التّراجع عن هذا.</strong> &Install now &ثبت الأن Go &back &إرجع &Done The installation is complete. Close the installer. Error خطأ Installation Failed فشل التثبيت CalamaresPython::Helper Unknown exception type نوع الاستثناء غير معروف unparseable Python error خطأ بايثون لا يمكن تحليله unparseable Python traceback تتبّع بايثون خلفيّ لا يمكن تحليله Unfetchable Python error. خطأ لا يمكن الحصول علية في بايثون. CalamaresWindow %1 Installer %1 المثبت Show debug information أظهر معلومات التّنقيح CheckFileSystemJob Checking file system on partition %1. يفحص نظام الملفّات في القسم %1. The file system check on partition %1 failed. فشل فحص نظام الملفّات في القسم %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> لا يستوفِ هذا الحاسوب أدنى متطلّبات تثبيت %1.<br/>لا يمكن متابعة التّثبيت. <a href="#details">التّفاصيل...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. لا يستوفِ هذا الحاسوب بعض المتطلّبات المستحسنة لتثبيت %1.<br/>يمكن للمثبّت المتابعة، ولكن قد تكون بعض الميزات معطّلة. This program will ask you some questions and set up %2 on your computer. سيطرح البرنامج بعض الأسئلة عليك ويعدّ %2 على حاسوبك. For best results, please ensure that this computer: لأفضل النّتائج، تحقّق من أن الحاسوب: System requirements متطلّبات النّظام ChoicePage Form نموذج After: بعد: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>تقسيم يدويّ</strong><br/>يمكنك إنشاء أو تغيير حجم الأقسام بنفسك. Boot loader location: مكان محمّل الإقلاع: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. سيتقلّص %1 إلى %2م.بايت وقسم %3م.بايت آخر جديد سيُنشأ ل‍%4. Select storage de&vice: اختر &جهاز التّخزين: Current: الحاليّ: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>اختر قسمًا لتقليصه، ثمّ اسحب الشّريط السّفليّ لتغيير حجمه </strong> <strong>Select a partition to install on</strong> <strong>اختر القسم حيث سيكون التّثبيت عليه</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. تعذّر إيجاد قسم النّظام EFI في أيّ مكان. فضلًا ارجع واستخدم التّقسيم اليدويّ لإعداد %1. The EFI system partition at %1 will be used for starting %2. قسم النّظام EFI على %1 سيُستخدم لبدء %2. EFI system partition: قسم نظام EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. لا يبدو أن في جهاز التّخزين أيّ نظام تشغيل. ما الذي تودّ فعله؟<br/>يمكنك مراجعة الاختيارات وتأكيدها قبل تطبيقها على جهاز التّخزين. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>مسح القرص</strong><br/>هذا س<font color="red">يمسح</font> كلّ البيانات الموجودة في جهاز التّخزين المحدّد. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. على جهاز التّخزين %1. ما الذي تودّ فعله؟<br/>يمكنك مراجعة الاختيارات وتأكيدها قبل تطبيقها على جهاز التّخزين. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>ثبّت جنبًا إلى جنب</strong><br/>سيقلّص المثبّت قسمًا لتفريغ مساحة لِ‍ %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>استبدل قسمًا</strong><br/>يستبدل قسمًا مع %1 . This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. على جهاز التّخزين هذا نظام تشغيل ذأصلًا. ما الذي تودّ فعله؟<br/>يمكنك مراجعة الاختيارات وتأكيدها قبل تطبيقها على جهاز التّخزين. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. على جهاز التّخزين هذا عدّة أنظمة تشغيل. ما الذي تودّ فعله؟<br/>يمكنك مراجعة الاختيارات وتأكيدها قبل تطبيقها على جهاز التّخزين. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition أنشئ قسمًا MiB Partition &Type: &نوع القسم: &Primary أ&ساسيّ E&xtended ممت&دّ Fi&le System: نظام المل&فّات: Flags: الشّارات: &Mount Point: نقطة ال&ضّمّ: Si&ze: الح&جم: En&crypt تشفير Logical منطقيّ Primary أساسيّ GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. أنشئ قسم %2م.بايت جديد على %4 (%3) بنظام الملفّات %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. أنشئ قسم <strong>%2م.بايت</strong> جديد على <strong>%4</strong> (%3) بنظام الملفّات <strong>%1</strong>. Creating new %1 partition on %2. ينشئ قسم %1 جديد على %2. The installer failed to create partition on disk '%1'. فشل المثبّت في إنشاء قسم على القرص '%1'. Could not open device '%1'. تعذّر فتح الجهاز '%1': Could not open partition table. تعذّر فتح جدول التّقسيم. The installer failed to create file system on partition %1. فشل المثبّت في إنشاء نظام ملفّات على القسم %1. The installer failed to update partition table on disk '%1'. فشل المثبّت في تحديث جدول التّقسيم على القرص '%1'. CreatePartitionTableDialog Create Partition Table أنشئ جدول تقسيم Creating a new partition table will delete all existing data on the disk. إنشاء جدول تقسيم جددي سيحذف كلّ البيانات على القرص. What kind of partition table do you want to create? ما نوع جدول التّقسيم الذي تريد إنشاءه؟ Master Boot Record (MBR) قطاع إقلاع رئيس (MBR) GUID Partition Table (GPT) جدول أقسام GUID ‏(GPT) CreatePartitionTableJob Create new %1 partition table on %2. أنشئ جدول تقسيم %1 جديد على %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). أنشئ جدول تقسيم <strong>%1</strong> جديد على <strong>%2</strong> (%3). Creating new %1 partition table on %2. ينشئ جدول التّقسيم %1 الجديد على %2. The installer failed to create a partition table on %1. فشل المثبّت في إنشاء جدول تقسيم على %1. Could not open device %1. تعذّر فتح الجهاز %1. CreateUserJob Create user %1 أنشئ المستخدم %1 Create user <strong>%1</strong>. أنشئ المستخدم <strong>%1</strong>. Creating user %1. ينشئ المستخدم %1. Sudoers dir is not writable. دليل Sudoers لا يمكن الكتابة فيه. Cannot create sudoers file for writing. تعذّر إنشاء ملفّ sudoers للكتابة. Cannot chmod sudoers file. تعذّر تغيير صلاحيّات ملفّ sudores. Cannot open groups file for reading. تعذّر فتح ملفّ groups للقراءة. Cannot create user %1. تعذّر إنشاء المستخدم %1. useradd terminated with error code %1. أُنهي useradd برمز الخطأ %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. تعذّر تعيين مالك دليل المستخدم ليكون %1. chown terminated with error code %1. أُنهي chown برمز الخطأ %1. DeletePartitionJob Delete partition %1. احذف القسم %1 Delete partition <strong>%1</strong>. احذف القسم <strong>%1</strong>. Deleting partition %1. يحذف القسم %1 . The installer failed to delete partition %1. فشل المثبّت في حذف القسم %1. Partition (%1) and device (%2) do not match. لا يتوافق القسم (%1) مع الجهاز (%2). Could not open device %1. تعذّر فتح الجهاز %1. Could not open partition table. تعذّر فتح جدول التّقسيم. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. نوع <strong>جدول التّقسيم</strong> على جهاز التّخزين المحدّد.<br><br>الطّريقة الوحيدة لتغيير النّوع هو بحذفه وإعادة إنشاء جدول التّقسيم من الصّفر، ممّا سيؤدّي إلى تدمير كلّ البيانات في جهاز التّخزين.<br>سيبقي هذا المثبّت جدول التّقسيم الحاليّ كما هو إلّا إن لم ترد ذلك.<br>إن لم تكن متأكّدًا، ف‍ GPT مستحسن للأنظمة الحديثة. This device has a <strong>%1</strong> partition table. للجهاز جدول تقسيم <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <strong>تعذّر اكتشاف جدول تقسيم</strong> على جهاز التّخزين المحدّد.<br><br>إمّا أن لا جدول تقسيم في الجهاز، أو أنه معطوب أو نوعه مجهول.<br>يمكن لهذا المثبّت إنشاء جدول تقسيم جديد، آليًّا أ, عبر صفحة التّقسيم اليدويّ. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>هذا هو نوع جدول التّقسيم المستحسن للأنظمة الحديثة والتي تبدأ ببيئة إقلاع <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition حرّر قسمًا موجودًا Content: المحتوى: &Keep Format هيّئ Warning: Formatting the partition will erase all existing data. تحذير: تهيئة القسم ستمسح بياناته كلّها. &Mount Point: نقطة ال&ضّمّ: Si&ze: الح&جم: MiB Fi&le System: نظام المل&فّات: Flags: الشّارات: Mountpoint already in use. Please select another one. EncryptWidget Form نموذج En&crypt system ع&مِّ النّظام Passphrase عبارة المرور Confirm passphrase أكّد عبارة المرور Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information اضبط معلومات القسم Install %1 on <strong>new</strong> %2 system partition. ثبّت %1 على قسم نظام %2 <strong>جديد</strong>. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. اضطب قسم %2 <strong>جديد</strong> بنقطة الضّمّ <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. ثبّت %2 على قسم النّظام %3 ‏<strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. اضبط القسم %3 <strong>%1</strong> بنقطة الضّمّ <strong>%2</strong>. Install boot loader on <strong>%1</strong>. ثبّت محمّل الإقلاع على <strong>%1</strong>. Setting up mount points. يضبط نقاط الضّمّ. FinishedPage Form نموذج &Restart now أ&عد التّشغيل الآن <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>انتهينا.</h1><br/>لقد ثُبّت %1 على حاسوبك.<br/>يمكنك إعادة التّشغيل وفتح النّظام الجديد، أو متابعة استخدام بيئة %2 الحيّة. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish أنهِ Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. هيّء القسم %1 (نظام الملفّات: %2، الحجم: %3 م.بايت) على %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. هيّء قسم <strong>%3م.بايت</strong> <strong>%1</strong> بنظام الملفّات <strong>%2</strong>. Formatting partition %1 with file system %2. يهيّء القسم %1 بنظام الملفّات %2. The installer failed to format partition %1 on disk '%2'. فشل المثبّت في تهيئة القسم %1 على القرص '%2'. Could not open device '%1'. تعذّر فتح الجهاز '%2': Could not open partition table. تعذّر فتح جدول التّقسيم. The installer failed to create file system on partition %1. فشل المثبّت في إنشاء نظام ملفّات في القسم %1. The installer failed to update partition table on disk '%1'. فشل المثبّت في تحديث جدول التّقسيم على القرص '%1'. InteractiveTerminalPage Konsole not installed كونسول غير مثبّت Please install the kde konsole and try again! فضلًا ثبّت كونسول كدي وجرّب مجدّدًا! Executing script: &nbsp;<code>%1</code> ينفّذ السّكربت: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script سكربت KeyboardPage Set keyboard model to %1.<br/> اضبط طراز لوحة المفتاتيح ليكون %1.<br/> Set keyboard layout to %1/%2. اضبط تخطيط لوحة المفاتيح إلى %1/%2. KeyboardViewStep Keyboard لوحة المفاتيح LCLocaleDialog System locale setting إعداد محليّة النّظام The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. إعداد محليّة النّظام يؤثّر على لغة بعض عناصر واجهة مستخدم سطر الأوامر وأطقم محارفها.<br/>الإعداد الحاليّ هو <strong>%1</strong>. &Cancel &OK LicensePage Form نموذج I accept the terms and conditions above. أقبل الشّروط والأحكام أعلاه. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>اتّفاقيّة التّرخيص</h1>عمليّة الإعداد هذه ستثبّت برمجيّات مملوكة تخضع لشروط ترخيص. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. فضلًا راجع اتّفاقيّات رخص المستخدم النّهائيّ (EULA) أعلاه.<br/>إن لم تقبل الشّروط، فلن تتابع عمليّة الإعداد. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>اتّفاقيّة التّرخيص</h1>يمكن لعمليّة الإعداد تثبيت برمجيّات مملوكة تخضع لشروط ترخيص وذلك لتوفير مزايا إضافيّة وتحسين تجربة المستخدم. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. فضلًا راجع اتّفاقيّات رخص المستخدم النّهائيّ (EULA) أعلاه.<br/>إن لم تقبل الشّروط، فلن تُثبّت البرمجيّات المملوكة وستُستخدم تلك مفتوحة المصدر بدلها. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>مشغّل %1</strong><br/>من%2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>مشغّل %1 للرّسوميّات</strong><br/><font color="Grey">من %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>ملحقة %1 للمتصّفح</strong><br/><font color="Grey">من %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>مرماز %1</strong><br/><font color="Grey">من %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>حزمة %1</strong><br/><font color="Grey">من %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">من %2</font> <a href="%1">view license agreement</a> <a href="%1">اعرض اتّفاقيّة التّرخيص</a> LicenseViewStep License الرّخصة LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... &غيّر... Set timezone to %1/%2.<br/> اضبط المنطقة الزّمنيّة إلى %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... يحمّل بيانات المواقع... Location الموقع MoveFileSystemJob Move file system of partition %1. انقل نظام ملفّات القسم %1. Could not open file system on partition %1 for moving. تعذّر فتح نظام الملفّات على القسم %1 للنّقل. Could not create target for moving file system on partition %1. تعذّر إنشاء هدف لنقل نظام الملفّات على القسم %1 إليه. Moving of partition %1 failed, changes have been rolled back. فشل نقل القسم %1، استُعيدت التّغييرات. Moving of partition %1 failed. Roll back of the changes have failed. فشل نقل القسم %1. فشلت استعادة التّغييرات. Updating boot sector after the moving of partition %1 failed. فشل تحديث قطاع الإقلاع بعد نقل القسم %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. أحجام القطاعات المنطقيّة في المصدر والهدف ليسا متطابقين. هذا ليس مدعومًا حاليًّا. Source and target for copying do not overlap: Rollback is not required. لا يتداخل مصدر النّسخ وهدفه. الاستعادة غير ضروريّة. Could not open device %1 to rollback copying. NetInstallPage Name الاسم Description الوصف Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form نموذج Keyboard Model: طراز لوحة المفاتيح: Type here to test your keyboard اكتب هنا لتجرّب لوحة المفاتيح Page_UserSetup Form نموذج What is your name? ما اسمك؟ What name do you want to use to log in? ما الاسم الذي تريده لتلج به؟ font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>إن كان عدد مستخدمي هذا الحاسوب أكثر من واحد، يمكنك إعداد عدّة حسابات بعد التّبثيت.</small> Choose a password to keep your account safe. اختر كلمة مرور لإبقاء حسابك آمنًا. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>أدخل ذات كلمة المرور مرّتين، للتأكّد من عدم وجود أخطاء طباعيّة. تتكوّن كلمة المرور الجيّدة من خليط أحرف وأرقام وعلامات ترقيم، وطول لا يقلّ عن 8 محارف. كذلك يحبّذ تغييرها دوريًّا لزيادة الأمان.</small> What is the name of this computer? ما اسم هذا الحاسوب؟ <small>This name will be used if you make the computer visible to others on a network.</small> <small>سيُستخدم الاسم لإظهار الحاسوب للآخرين عبر الشّبكة.</small> Log in automatically without asking for the password. لِج آليًّا بدون طلب كلمة مرور. Use the same password for the administrator account. استخدم نفس كلمة المرور لحساب المدير. Choose a password for the administrator account. اختر كلمة مرور لحساب المدير. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>أدخل ذات كلمة المرور مرّتين، للتّأكد من عدم وجود أخطاء طباعيّة.</small> PartitionLabelsView Root الجذر Home المنزل Boot الإقلاع EFI system نظام EFI Swap التّبديل New partition for %1 قسم جديد ل‍ %1 New partition قسم جديد %1 %2 %1 %2 PartitionModel Free Space المساحة الحرّة New partition قسم جديد Name الاسم File System نظام الملفّات Mount Point نقطة الضّمّ Size الحجم PartitionPage Form نموذج Storage de&vice: ج&هاز التّخزين: &Revert All Changes ا&عكس كلّ التّغييرات New Partition &Table &جدول تقسيم جديد &Create أ&نشئ &Edit ح&رّر &Delete ا&حذف Install boot &loader on: ثبّت م&حمّل الإقلاع على: Are you sure you want to create a new partition table on %1? أمتأكّد من إنشاء جدول تقسيم جديد على %1؟ PartitionViewStep Gathering system information... جاري جمع معلومات عن النظام... Partitions الأقسام Install %1 <strong>alongside</strong> another operating system. ثبّت %1 <strong>جنبًا إلى جنب</strong> مع نظام تشغيل آخر. <strong>Erase</strong> disk and install %1. <strong>امسح</strong> القرص وثبّت %1. <strong>Replace</strong> a partition with %1. <strong>استبدل</strong> قسمًا ب‍ %1. <strong>Manual</strong> partitioning. تقسيم <strong>يدويّ</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>امسح</strong> القرص <strong>%2</strong> (%3) وثبّت %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>استبدل</strong> قسمًا على القرص <strong>%2</strong> (%3) ب‍ %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: الحاليّ: After: بعد: No EFI system partition configured لم يُضبط أيّ قسم نظام EFI An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set راية قسم نظام EFI غير مضبوطة An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model نوع لوحة المفاتيح الافتراضي Default الافتراضي unknown مجهول extended ممتدّ unformatted غير مهيّأ swap Unpartitioned space or unknown partition table مساحة غير مقسّمة أو جدول تقسيم مجهول ReplaceWidget Form نموذج Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. اختر مكان تثبيت %1.<br/><font color="red">تحذير: </font>سيحذف هذا كلّ الملفّات في القسم المحدّد. The selected item does not appear to be a valid partition. لا يبدو العنصر المحدّد قسمًا صالحًا. %1 cannot be installed on empty space. Please select an existing partition. لا يمكن تثبيت %1 في مساحة فارغة. فضلًا اختر قسمًا موجودًا. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. لا يمكن تثبيت %1 على قسم ممتدّ. فضلًا اختر قسمًا أساسيًّا أو ثانويًّا. %1 cannot be installed on this partition. لا يمكن تثبيت %1 على هذا القسم. Data partition (%1) قسم البيانات (%1) Unknown system partition (%1) قسم نظام مجهول (%1) %1 system partition (%2) قسم نظام %1 ‏(%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>القسم %1 صغير جدًّا ل‍ %2. فضلًا اختر قسمًا بحجم %3 غ.بايت على الأقلّ. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>تعذّر إيجاد قسم النّظام EFI في أيّ مكان. فضلًا ارجع واستخدم التّقسيم اليدويّ لإعداد %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>سيُثبّت %1 على %2.<br/><font color="red">تحذير: </font>ستفقد كلّ البيانات على القسم %2. The EFI system partition at %1 will be used for starting %2. سيُستخدم قسم نظام EFI على %1 لبدء %2. EFI system partition: قسم نظام EFI: RequirementsChecker Gathering system information... يجمع معلومات النّظام... has at least %1 GB available drive space فيه على الأقل مساحة بحجم %1 غ.بايت حرّة There is not enough drive space. At least %1 GB is required. ليست في القرص مساحة كافية. المطلوب هو %1 غ.بايت على الأقلّ. has at least %1 GB working memory فيه ذاكرة شاغرة بحجم %1 غ.بايت على الأقلّ The system does not have enough working memory. At least %1 GB is required. ليس في النّظام ذاكرة شاغرة كافية. المطلوب هو %1 غ.بايت على الأقلّ. is plugged in to a power source موصول بمصدر للطّاقة The system is not plugged in to a power source. النّظام ليس متّصلًا بمصدر للطّاقة. is connected to the Internet موصول بالإنترنت The system is not connected to the Internet. النّظام ليس موصولًا بالإنترنت The installer is not running with administrator rights. المثبّت لا يعمل بصلاحيّات المدير. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. غيّر حجم نظام الملفّات على القسم %1. Parted failed to resize filesystem. فشل Parted في تغيير حجم نظام الملفّات. Failed to resize filesystem. فشل تغيير حجم نظام الملفّات. ResizePartitionJob Resize partition %1. غيّر حجم القسم %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. غيّر حجم قسم <strong>%2م.بايت</strong> <strong>%1</strong> إلى <strong>%3م.بايت</strong>. Resizing %2MB partition %1 to %3MB. يغيّر حجم قسم %2م.بايت %1 إلى %3م.بايت. The installer failed to resize partition %1 on disk '%2'. فشل المثبّت في تغيير حجم القسم %1 على القرص '%2'. Could not open device '%1'. تعذّر فتح الجهاز '%1'. ScanningDialog Scanning storage devices... يفحص أجهزة التّخزين... Partitioning يقسّم SetHostNameJob Set hostname %1 اضبط اسم المضيف %1 Set hostname <strong>%1</strong>. اضبط اسم المضيف <strong>%1</strong> . Setting hostname %1. يضبط اسم المضيف 1%. Internal Error خطأ داخلي Cannot write hostname to target system تعذّرت كتابة اسم المضيف إلى النّظام الهدف SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 اضبك طراز لوحة المفتايح إلى %1، والتّخطيط إلى %2-%3 Failed to write keyboard configuration for the virtual console. فشلت كتابة ضبط لوحة المفاتيح للطرفيّة الوهميّة. Failed to write to %1 فشلت الكتابة إلى %1 Failed to write keyboard configuration for X11. فشلت كتابة ضبط لوحة المفاتيح ل‍ X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. اضبط رايات القسم %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. يمحي رايات القسم <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. يمحي رايات القسم <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. يضبط رايات <strong>%2</strong> القسم<strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. فشل المثبّت في ضبط رايات القسم %1. Could not open device '%1'. تعذّر فتح الجهاز '%1'. Could not open partition table on device '%1'. تعذّر فتح جدول التّقسيم على الجهاز '%1'. Could not find partition '%1'. تعذّر إيجاد القسم '%1'. SetPartGeometryJob Update geometry of partition %1. حدّث هندسة القسم %1. Failed to change the geometry of the partition. فشل تغيير هندسة القسم. SetPasswordJob Set password for user %1 اضبط كلمة مرور للمستخدم %1 Setting password for user %1. يضبط كلمة مرور للمستخدم %1. Bad destination system path. مسار النّظام المقصد سيّء. rootMountPoint is %1 rootMountPoint هو %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. تعذّر ضبط كلمة مرور للمستخدم %1. usermod terminated with error code %1. أُنهي usermod برمز الخطأ %1. SetTimezoneJob Set timezone to %1/%2 اضبط المنطقة الزّمنيّة إلى %1/%2 Cannot access selected timezone path. لا يمكن الدخول إلى مسار المنطقة الزمنية المختارة. Bad path: %1 المسار سيّء: %1 Cannot set timezone. لا يمكن تعيين المنطقة الزمنية. Link creation failed, target: %1; link name: %2 فشل إنشاء الوصلة، الهدف: %1، اسم الوصلة: %2 Cannot set timezone, تعذّر ضبط المنطقة الزّمنيّة، Cannot open /etc/timezone for writing تعذّر فتح ‎/etc/timezone للكتابة SummaryPage This is an overview of what will happen once you start the install procedure. هذه نظرة عامّة عمّا سيحصل ما إن تبدأ عمليّة التّثبيت. SummaryViewStep Summary الخلاصة UsersPage Your username is too long. اسم المستخدم طويل جدًّا. Your username contains invalid characters. Only lowercase letters and numbers are allowed. يحوي اسم المستخدم محارف غير صالح. المسموح هو الأحرف الصّغيرة والأرقام فقط. Your hostname is too short. اسم المضيف قصير جدًّا. Your hostname is too long. اسم المضيف طويل جدًّا. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. يحوي اسم المضيف محارف غير صالحة. المسموح فقط الأحرف والأرقام والشُّرط. Your passwords do not match! لا يوجد تطابق في كلمات السر! UsersViewStep Users المستخدمين WelcomePage Form الصيغة &Language: &اللغة: &Release notes &ملاحظات الإصدار &Known issues &مشاكل معروفة &Support &الدعم &About &حول <h1>Welcome to the %1 installer.</h1> <h1>مرحبًا بك في مثبّت %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer حول 1% المثبت <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support 1% الدعم WelcomeViewStep Welcome مرحبا بك calamares-3.1.12/lang/calamares_ast.ts000066400000000000000000003601601322271446000176250ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. L'<strong>entornu d'arranque</strong> d'esti sistema.<br><br>Sistemes x86 más vieyos namái sofiten <strong>BIOS</strong>.<br>Los sistemes modernos usen davezu <strong>EFI</strong>, pero quiciabes d'amuesen como BIOS si s'anicien nel mou compatibilidá. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Esti sistema anicióse con un entornu d'arranque <strong>EFI</strong>.<br><br>Pa configurar l'aniciu d'un entornu EFI, esti instalador ha instalar una aplicación de xestión d'arranque, como <strong>GRUB</strong> o <strong>systemd-boot</strong> nuna <strong>partición del sistema EFI</strong>. Esto ye automático, a nun ser qu'escueyas el particionáu manual, que nesi casu has escoyer creala tu mesmu. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partición d'arranque System Partition Partición del sistema Do not install a boot loader Nun instalar un cargador d'arranque %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulariu GlobalStorage Almacenamientu global JobQueue Cola de trabayu Modules Módulos Type: Triba: none Interface: Interfaz: Tools Ferramientes Debug information Información de depuración Calamares::ExecutionViewStep Install Instalación Calamares::JobThread Done Fecho Calamares::ProcessJob Run command %1 %2 Executar comandu %1 %2 Running command %1 %2 Executando'l comandu %1 %2 External command crashed Cascó'l comandu esternu Command %1 crashed. Output: %2 Cascó'l comandu %1. Salida: %2 External command failed to start El comandu esternu falló al aniciase Command %1 failed to start. El comandu %1 falló al aniciase. Internal error when starting command Fallu internu al aniciar el comandu Bad parameters for process job call. Parámetros incorreutos pa la llamada del trabayu del procesu. External command failed to finish El comandu esternu fallo al finar Command %1 failed to finish in %2s. Output: %3 El comandu %1 falló al finar en %2. Salida: %3 External command finished with errors El comandu esternu finó con fallos Command %1 finished with exit code %2. Output: %3 El comandu %1 finó col códigu salida %2. Salida: %3 Calamares::PythonJob Running %1 operation. Executando operación %1. Bad working directory path Camín incorreutu del direutoriu de trabayu Working directory %1 for python job %2 is not readable. El direutoriu de trabayu %1 pal trabayu python %2 nun ye lleible. Bad main script file Ficheru incorreutu del script principal Main script file %1 for python job %2 is not readable. El ficheru de script principal %1 pal trabayu python %2 nun ye lleible. Boost.Python error in job "%1". Fallu Boost.Python nel trabayu «%1». Calamares::ViewManager &Back &Atrás &Next &Siguiente &Cancel &Encaboxar Cancel installation without changing the system. Cancel installation? ¿Encaboxar instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿De xuru que quies encaboxar el procesu actual d'instalación? L'instalador colará y perderánse toles camudancies. &Yes &Sí &No &Non &Close &Zarrar Continue with setup? ¿Siguir cola configuración? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> L'instalador %1 ta a piques de facer camudancies al to discu pa instalar %2.<br/><strong>Nun sedrás capaz a desfacer estes camudancies.</strong> &Install now &Instalar agora Go &back &Dir p'atrás &Done &Fecho The installation is complete. Close the installer. Completóse la operación. Zarra l'instalador. Error Fallu Installation Failed Instalación fallida CalamaresPython::Helper Unknown exception type Tiba d'esceición desconocida unparseable Python error fallu non analizable de Python unparseable Python traceback rastexu non analizable de Python Unfetchable Python error. Fallu non algamable de Python CalamaresWindow %1 Installer Instalador %1 Show debug information Amosar información de depuración CheckFileSystemJob Checking file system on partition %1. Comprobando'l sistema ficheros na partición %1. The file system check on partition %1 failed. Falló la comprobación del sistema de ficheros na partición %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Esti ordenador nun satifaz los requirimientos mínimos pa la instalación de %1.<br/>La instalación nun pue siguir. <a href="#details">Detalles...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Esti ordenador nun satifaz dellos requirimientos aconseyaos pa la instalación de %1.<br/>La instalación pue siguir pero podríen deshabilitase delles carauterístiques. This program will ask you some questions and set up %2 on your computer. Esti programa fadráte delles entrugues y configurará %2 nel to ordenador. For best results, please ensure that this computer: Pa los meyores resultaos, por favor asegúrate qu'esti ordenador: System requirements Requirimientos del sistema ChoicePage Form After: Dempués: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionáu manual</strong><br/>Pues crear o redimensionar particiones tu mesmu. Boot loader location: Allugamientu del xestor d'arranque: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 redimensionaráse a %2MB y crearáse la partición nueva de %3MB pa %4. Select storage de&vice: Esbillar preséu d'almacenamientu: Current: Anguaño: Reuse %1 as home partition for %2. Reusar %1 como partición home pa %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Nun pue alcontrase una partición EFI nesti sistema. Torna y usa'l particionáu a mano pa configurar %1, por favor. The EFI system partition at %1 will be used for starting %2. La partición del sistema EFI en %1 usaráse p'aniciar %2. EFI system partition: Partición EFI del sistema: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esti preséu d'almacenamientu nun paez tener un sistema operativu nelli. ¿Qué te prestaría facer?<br/>Sedrás capaz a revisar y confirmar les tos escoyetes enantes de facer cualesquier camudancia al preséu d'almacenamientu. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Desaniciar discu</strong><br/>Esto <font color="red">desaniciará</font> tolos datos anguaño presentes nel preséu d'almacenamientu esbilláu. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esti preséu d'almacenamientu tien %1 nelli. ¿Qué te prestaría facer?<br/>Sedrás capaz a revisar y confirmar les tos escoyetes enantes de facer cualesquier camudancia al preséu d'almacenamientu. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Tocar una partición</strong><br/>Troca una partición con %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esti preséu d'almacenamientu yá tien un sistema operativu nelli. ¿Qué te prestaría facer?<br/>Sedrás capaz a revisar y confirmar les tos escoyetes enantes de facer cualesquier camudancia al preséu d'almacenamientu. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esti preséu d'almacenamientu tien múltiples sistemes operativos nelli. ¿Qué te prestaría facer?<br/>Sedrás capaz a revisar y confirmar les tos escoyetes enantes de facer cualesquier camudancia al preséu d'almacenamientu. ClearMountsJob Clear mounts for partitioning operations on %1 Llimpiar montaxes pa les opciones de particionáu en %1 Clearing mounts for partitioning operations on %1. Llimpiando los montaxes pa les opciones de particionáu en %1. Cleared all mounts for %1 Llimpiáronse tolos montaxes pa %1 ClearTempMountsJob Clear all temporary mounts. Llimpiar tolos montaxes temporales. Clearing all temporary mounts. Llimpiando tolos montaxes temporales. Cannot get list of temporary mounts. Nun pue consiguise la llista de montaxes temporales. Cleared all temporary mounts. Llimpiáronse tolos montaxes temporales. CreatePartitionDialog Create a Partition Crear una partición MiB Partition &Type: &Triba de partición: &Primary &Primaria E&xtended E&stendida Fi&le System: Sistema de f&icheros: Flags: Banderes: &Mount Point: &Puntu montaxe: Si&ze: Tama&ñu: En&crypt &Cifrar Logical Llóxica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. Puntu de montaxe yá n'usu. Esbilla otru, por favor. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Crearáse la partición nueva de %2MB en %4 (%3) col sistema de ficheros %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Crearáse la partición nueva de <strong>%2MB</strong> en <strong>%4</strong> (%3) col sistema de ficheros <strong>%1</strong>. Creating new %1 partition on %2. Creando la partición nueva %1 en %2. The installer failed to create partition on disk '%1'. L'instalador falló al crear la partición nel discu «%1». Could not open device '%1'. Nun pudo abrise'l preséu «%1». Could not open partition table. Nun pudo abrise la tabla particiones. The installer failed to create file system on partition %1. L'instalador falló al crear el sistema ficheros na partición «%1». The installer failed to update partition table on disk '%1'. L'instalador falló al anovar la tabla particiones nel discu «%1». CreatePartitionTableDialog Create Partition Table Crear tabla de particiones Creating a new partition table will delete all existing data on the disk. Crear una tabla de particiones nueva desaniciará tolos datos nel discu. What kind of partition table do you want to create? ¿Qué triba de tabla de partición quies crear? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crearáse la tabla de particiones nueva %1 en %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crearáse la tabla de particiones nueva <strong>%1</strong> en <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creando la tabla de particiones nueva %1 en %2. The installer failed to create a partition table on %1. L'instalador falló al crear una tabla de particiones en %1. Could not open device %1. Nun pudo abrise'l preséu %1. CreateUserJob Create user %1 Crear l'usuariu %1 Create user <strong>%1</strong>. Crearáse l'usuariu <strong>%1</strong>. Creating user %1. Creando l'usuariu %1. Sudoers dir is not writable. Nun pue escribise nel direutoriu sudoers. Cannot create sudoers file for writing. Nun pue crease'l ficheru sudoers pa escritura. Cannot chmod sudoers file. Nun pue facese chmod al ficheru sudoers. Cannot open groups file for reading. Nun pue abrise'l ficheru de grupos pa escritura. Cannot create user %1. Nun pue crease l'usuariu %1. useradd terminated with error code %1. useradd finó col códigu de fallu %1. Cannot add user %1 to groups: %2. Nun pue amestase l'usuariu %1 a los grupos: %2 usermod terminated with error code %1. usermod finó col códigu de fallu %1. Cannot set home directory ownership for user %1. Nun pue afitase la propiedá del direutoriu Home al usuariu %1. chown terminated with error code %1. chown finó col códigu de fallu %1. DeletePartitionJob Delete partition %1. Desaniciaráse la partición %1. Delete partition <strong>%1</strong>. Desaniciaráse la partición <strong>%1</strong>. Deleting partition %1. Desaniciando la partición %1. The installer failed to delete partition %1. L'instalador falló al desaniciar la partición %1. Partition (%1) and device (%2) do not match. La partición (%1) y el preséu (%2) nun concasen. Could not open device %1. Nun pudo abrise'l preséu %1. Could not open partition table. Nun pudo abrise la tabla particiones. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. Esti preséu tiene una tabla de particiones <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. L'instalador <strong>nun pue deteutar una tabla de particiones</strong> nel preséu d'almacenamientu esbilláu.<br><br>El preséu o nun tien denguna , o ta toyida o ye d'una triba desconocida.<br>Esti instalador pue crear una tabla de particiones por ti, o automáticamente o pente la páxina de particionáu manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Esta ye la triba de tabla de particiones pa sistemes modernos qu'anicien dende l'entornu d'arranque <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Saltar escritura de configuración LUKS pa Dracut: nun se cifró la partición «/» Failed to open %1 Fallu al abrir %1 DummyCppJob Dummy C++ Job Trabayu C++ maniquín EditExistingPartitionDialog Edit Existing Partition Editar partición esistente Content: Conteníu: &Keep &Caltener Format Formatiar Warning: Formatting the partition will erase all existing data. Avisu: Formatiar la partición desaniciará tolos datos esistentes. &Mount Point: &Puntu montaxe: Si&ze: Tama&ñu: MiB MiB Fi&le System: Sistema de fic&heros: Flags: Banderes: Mountpoint already in use. Please select another one. Puntu de montaxe yá n'usu. Esbilla otru, por favor. EncryptWidget Form En&crypt system &Cifrar sistema Passphrase Fras de pasu Confirm passphrase Confirmar fras de pasu Please enter the same passphrase in both boxes. Introduz la mesma fras de pasu n'entrabes caxes, por favor. FillGlobalStorageJob Set partition information Afitar información de partición Install %1 on <strong>new</strong> %2 system partition. Instalaráse %1 na <strong>nueva</strong> partición del sistema %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configuraráse la partición <strong>nueva</strong> %2 col puntu montaxe <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalaráse %2 na partición del sistema %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configuraráse la partición %3 de <strong>%1</strong> col puntu montaxe <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalaráse'l cargador d'arranque en <strong>%1</strong>. Setting up mount points. Configurando puntos de montaxe. FinishedPage Form Formulariu &Restart now &Reaniciar agora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Too fecho.</h1><br/>%1 instalóse nel to ordenador.<br/>Quiciabes quieras reaniciar agora al to sistema nuevu, o siguir usando l'entornu live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Finar Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatiar partición %1 (sistema de ficheros: %2, tamañu: %3 MB) en %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatiaráse la partición <strong>%3MB</strong> de <strong>%1</strong> col sistema de ficheros <strong>%2</strong>. Formatting partition %1 with file system %2. Formatiando la partición %1 col sistema de ficheros %2. The installer failed to format partition %1 on disk '%2'. L'instalador falló al formatiar la partición %1 nel discu «%2». Could not open device '%1'. Nun pudo abrise'l preséu «%1». Could not open partition table. Nun pudo abrise la tabla particiones. The installer failed to create file system on partition %1. L'instalador falló al crear el sistema ficheros na partición «%1». The installer failed to update partition table on disk '%1'. L'instalador falló al anovar la tabla particiones nel discu «%1». InteractiveTerminalPage Konsole not installed Konsole nun ta instaláu Please install the kde konsole and try again! ¡Instala konsole ya inténtalo de nueves, por favor! Executing script: &nbsp;<code>%1</code> Executando'l script &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Afitóse'l modelu de tecláu a %1.<br/> Set keyboard layout to %1/%2. Afitóse la distribución de tecláu a %1/%2. KeyboardViewStep Keyboard Tecláu LCLocaleDialog System locale setting Axuste de locale del sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. L'axustes de locale del sistema afeuta a la llingua y al conxuntu de caráuteres afitáu pa dellos elementos de la interfaz d'usuaru de llinia comandos.<br/>L'axuste actual ye <strong>%1</strong>. &Cancel &OK LicensePage Form Formulariu I accept the terms and conditions above. Aceuto los términos y condiciones d'enriba. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Alcuerdu de llicencia</h1>Esti procedimientu d'instalación instalará software propietariu que ta suxetu a términos de llicenciamientu. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Revisa los Alcuerdos de Llicencia del Usuariu Final (EULAs) d'enriba, por favor.<br/>Si nun tas acordies colos términos, el procedimientu nun pue siguir. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Alcuerdu de llicencia</h1>Esti procedimientu d'instalación pue instalar software propietariu que ta suxetu a términos de llicenciamientu p'apurrir carauterístiques adicionales y ameyorar la esperiencia d'usuariu. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Revisa los Alcuerdos de Llicencia del Usuariu Final (EULAs) d'enriba, por favor.<br/>Si nun tas acordies colos términos, nun s'instalará'l software propietariu y usaránse, nel so llugar, alternatives de códigu abiertu. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>Controlador %1 driver</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>Controlador gráficu %1</strong><br/><font color="Grey">por %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>Complementu %1 del restolador</strong><br/><font color="Grey">por %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>Códec %1</strong><br/><font color="Grey">por %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>Paquete %1</strong><br/><font color="Grey">per %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">por %2</font> <a href="%1">view license agreement</a> <a href="%1">ver alcuerdu de llicencia</a> LicenseViewStep License Llicencia LocalePage The system language will be set to %1. Afitaráse la llingua'l sistema a %1. The numbers and dates locale will be set to %1. Los númberos y dates afitaránse a %1. Region: Rexón: Zone: Zona: &Change... &Cambiar... Set timezone to %1/%2.<br/> Afitóse'l fusu horariu a %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Cargando datos d'allugamientu... Location Allugamientu MoveFileSystemJob Move file system of partition %1. Moviendo'l sistema de ficheros de la partción %1 Could not open file system on partition %1 for moving. Nun pudo abrise'l sistema de ficheros na partición %1 pa moción. Could not create target for moving file system on partition %1. Nun pudo crease l'oxetivu pa mover el sistema ficheros na partición %1. Moving of partition %1 failed, changes have been rolled back. Fallu al mover la partición %1, desfixéronse les camudancies. Moving of partition %1 failed. Roll back of the changes have failed. Fallu moviendo la partición %1. Desfaciendo les camudancies que fallaron. Updating boot sector after the moving of partition %1 failed. Fallu anovando'l sector d'arranque dempués del movimientu de la partición 1%. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Los sectores llóxicos na fonte y l'oxetivu pa copiar nun son los mesmos. Esto anguaño nun ta sofitao. Source and target for copying do not overlap: Rollback is not required. Nun puen solapase pa la copia la fuente y l'oxetivu: Nun se rique la defechura. Could not open device %1 to rollback copying. Nun pudo abrise'l preséu %1 pa desfacer la copia. NetInstallPage Name Nome Description Descripción Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalación de rede. (Deshabilitáu: Nun pue dise en cata del llistáu de paquetes, comprueba la conexón de rede) NetInstallViewStep Package selection Esbilla de paquetes Page_Keyboard Form Formulariu Keyboard Model: Modelu de tecláu: Type here to test your keyboard Teclexa equí pa comprobar el to tecláu Page_UserSetup Form Formulariu What is your name? ¿Cuál ye'l to nome? What name do you want to use to log in? ¿Qué nome quies usar p'aniciar sesión? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Si usen l'ordenador más persones, pues configurar delles cuentes más dempués de la instalación.</small> Choose a password to keep your account safe. Escueyi una contraseña pa caltener la to cuenta segura. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Introduz la mesma contraseña dos vegaes pa qu'asina pueas comprobar fallos d'escritura. Una bona contraseña tien un mestu de lletres, númberos y signos de puntuación, debería camudase davezu y ser polo menos de 8 caráuteres de llargor</small> What is the name of this computer? ¿Cuál ye'l nome d'esti ordendor? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Esti ye'l nome que s'usará si faes visible esti ordenador nuna rede.</small> Log in automatically without asking for the password. Aniciar sesión automáticamente entrugando pola contraseña. Use the same password for the administrator account. Usar la misma contraseña pa la cuenta del alministrador. Choose a password for the administrator account. Escueyi una contraseña pa la cuenta d'alministrador. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Introduz la mesma contraseña dos vegaes, pa qu'asina pueas comprobar fallos d'escritura.</small> PartitionLabelsView Root Raigañu Home Home Boot Arranque EFI system Sistema EFI: Swap Intercambéu New partition for %1 Partición nueva pa %1 New partition Partición nueva %1 %2 %1 %2 PartitionModel Free Space Espaciu llibre New partition Partición nueva Name Nome File System Sistema de ficheros Mount Point Puntu montaxe Size Tamañu PartitionPage Form Formulariu Storage de&vice: Pr&eséu d'almacenamientu: &Revert All Changes &Desfacer toles camudancies New Partition &Table &Tabla de particiones nueva &Create &Crear &Edit &Editar &Delete &Desaniciar Install boot &loader on: &Instalar xestor d'arranque en: Are you sure you want to create a new partition table on %1? ¿De xuru que quies crear una tabla particiones nueva en %1? PartitionViewStep Gathering system information... Axuntando información del sistema... Partitions Particiones Install %1 <strong>alongside</strong> another operating system. Instalaráse %1 <strong>cabo</strong> otru sistema operativu. <strong>Erase</strong> disk and install %1. <strong>Desaniciaráse</strong>'l discu ya instalaráse %1. <strong>Replace</strong> a partition with %1. <strong>Trocaráse</strong> una partición con %1. <strong>Manual</strong> partitioning. Particionáu <strong>Manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalaráse %1 <strong>cabo</strong> otru sistema operativu nel discu <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Desaniciaráse</strong>'l discu <strong>%2</strong> (%3) ya instalaráse %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Trocaráse</strong> una partición nel discu <strong>%2</strong> (%3) con %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionáu <strong>manual</strong> nel discu <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Discu <strong>%1</strong> (%2) Current: Anguaño: After: Dempués: No EFI system partition configured Nun hai dengún sistema EFI configuráu An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set Nun s'afitó la bandera del sistema EFI An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Precísase una partición del sistema EFI p'aniciar %1.<br/><br/>Configuróse una partición col puntu montaxe <strong>%2</strong> pero nun s'afitó la so bandera <strong>esp</strong>.<br/>P'afitar la bandera, volvi y edita la partición.<br/><br/>Pues siguir ensin afitar la bandera pero'l to sistema pue fallar al aniciase. Boot partition not encrypted /boot non cifráu A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Modelu del tecláu por defeutu Default Por defeutu unknown extended unformatted ensin formatiar swap intercambéu Unpartitioned space or unknown partition table Espaciu non particionáu o tabla de particiones desconocida ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Esbilla u instalar %1.<br/><font color="red">Alvertencia: </font> esto desaniciará tolos ficheros na partición esbillada. The selected item does not appear to be a valid partition. L'ementu esbilláu nun paez ser una partición válida. %1 cannot be installed on empty space. Please select an existing partition. %1 nun pue instalase nel espaciu baleru. Esbilla una partición esistente, por favor. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 nun pue instalase nuna partición estendida. Esbilla una partición llóxica o primaria esistente, por favor. %1 cannot be installed on this partition. %1 nun pue instalase nesta partición. Data partition (%1) Partición de datos (%1) Unknown system partition (%1) Partición del sistema desconocida (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/> La partición %1 ye perpequeña pa %2. Esbilla una cola capacidá de polo menos %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Nun pue alcontrase una partición EFI nesti sistema. Volvi atrás y usa'l particionáu manual pa configurar %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>Instalaráse %1 en %2.<br/><font color="red">Alvertencia: </font>perderánse tolos datos na partición %2. The EFI system partition at %1 will be used for starting %2. La partición del sistema EFI en %1 usaráse p'aniciar %2. EFI system partition: Partición del sistema EFI: RequirementsChecker Gathering system information... Axuntando información del sistema... has at least %1 GB available drive space tien polo menos %1 GB disponibles d'espaciu en discu There is not enough drive space. At least %1 GB is required. Nun hai espaciu abondu na unidá. Ríquense polo menos %1 GB. has at least %1 GB working memory polo menos %1 GB de memoria de trabayu The system does not have enough working memory. At least %1 GB is required. El sistema nun tien abonda memoria de trabayu. Ríquense polo menos %1 GB. is plugged in to a power source ta enchufáu a una fonte d'enerxía The system is not plugged in to a power source. El sistema nun ta enchufáu a una fonte d'enerxía. is connected to the Internet ta coneutáu a internet The system is not connected to the Internet. El sistema nun ta coneutáu a internet. The installer is not running with administrator rights. L'instalador nun ta executándose con drechos alministrativos. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Redimensionar el sistema de ficheros na partición %1. Parted failed to resize filesystem. Particionáu fallíu al redimensionar el sistema de ficheros. Failed to resize filesystem. Fallu al redimensionar el sistema de ficheros. ResizePartitionJob Resize partition %1. Redimensionaráse la partición %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionaráse la partición <strong>%2MB</strong> de <strong>%1</strong> a <strong>%3MB</strong> Resizing %2MB partition %1 to %3MB. Redimensionando %2MB de la partición %1 a %3MB. The installer failed to resize partition %1 on disk '%2'. L'instalador falló al redimensionar la partición %1 nel discu «%2». Could not open device '%1'. Nun pudo abrise'l preséu %1. ScanningDialog Scanning storage devices... Escaniando preseos d'almacenamientu... Partitioning Particionáu SetHostNameJob Set hostname %1 Afitar nome d'agospiu %1 Set hostname <strong>%1</strong>. Afitaráse'l nome d'agospiu a <strong>%1</strong>. Setting hostname %1. Afitando'l nome d'agospiu %1. Internal Error Fallu internu Cannot write hostname to target system Nun pue escribise'l nome d'agospiu al sistema destín SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Afitar modelu de tecláu a %1, distribución a %2-%3 Failed to write keyboard configuration for the virtual console. Fallu al escribir la configuración de tecláu pa la consola virtual. Failed to write to %1 Fallu al escribir a %1 Failed to write keyboard configuration for X11. Fallu al escribir la configuración de tecláu pa X11. Failed to write keyboard configuration to existing /etc/default directory. Fallu al escribir la configuración del tecláu nel direutoriu /etc/default esistente. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Llimpiando banderes na partición <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Llimpiando banderes na partición <strong>%2</strong> de %1MB Clearing flags on new partition. Llimpiando banderes na partición nueva. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Axustando banderes <strong>%2</strong> na partición <strong>%1</strong> Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Afitando banderes <strong>%3</strong> na partición <strong>%2</strong> de %1MB Setting flags <strong>%1</strong> on new partition. Afitando banderes <strong>%1</strong> na partición nueva. The installer failed to set flags on partition %1. L'instalador falló al afitar les banderes na partición %1. Could not open device '%1'. Nun pudo abrise'l preséu «%1». Could not open partition table on device '%1'. Nun pudo abrise la tabla de particiones nel preséu «%1». Could not find partition '%1'. Nun pudo alcontrase la partición «%1». SetPartGeometryJob Update geometry of partition %1. Anovar la xeometría de la partición %1. Failed to change the geometry of the partition. Fallu al camudar la xeometría de la partición. SetPasswordJob Set password for user %1 Afitar la contraseña pal usuariu %1 Setting password for user %1. Afitando la contraseña pal usuariu %1. Bad destination system path. Camín incorreutu del destín del sistema. rootMountPoint is %1 rootMountPoint ye %1 Cannot disable root account. Nun pue deshabilitase la cuenta root. passwd terminated with error code %1. passwd finó col códigu de fallu %1. Cannot set password for user %1. Nun pue afitase la contraseña pal usuariu %1. usermod terminated with error code %1. usermod finó col códigu de fallu %1. SetTimezoneJob Set timezone to %1/%2 Afitóse'l fusu horariu a %1/%2 Cannot access selected timezone path. Nun pue accedese al camín del fusu horariu esbilláu. Bad path: %1 Camín incorreutu: %1 Cannot set timezone. Nun pue afitase'l fusu horariu Link creation failed, target: %1; link name: %2 Fallu na creación del enllaz, oxetivu: %1; nome d'enllaz: %2 Cannot set timezone, Nun pue afitase'l fusu horariu, Cannot open /etc/timezone for writing Nun pue abrise /etc/timezone pa escritura SummaryPage This is an overview of what will happen once you start the install procedure. Esta ye una vista previa de lo qu'asocederá namái qu'anicies el procedimientu d'instalación. SummaryViewStep Summary Sumariu UsersPage Your username is too long. El to nome d'usuariu ye perllargu. Your username contains invalid characters. Only lowercase letters and numbers are allowed. El to nome d'usuariu contién caráuteres non válidos. Almítense namái lletres en minúscula y númberos. Your hostname is too short. El to nome d'agospiu ye percurtiu. Your hostname is too long. El to nome d'agospiu ye perllargu. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. El to nome d'agospiu contién caráuteres non válidos. Almítense namái lletres en minúscula y númberos. Your passwords do not match! ¡Les tos contraseñes nun concasen! UsersViewStep Users Usuarios WelcomePage Form Formulariu &Language: &Llingua: &Release notes &Notes de llanzamientu &Known issues &Torgues conocíes &Support &Sofitu &About &Tocante a <h1>Welcome to the %1 installer.</h1> <h1>Bienllegáu al instalador %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Afáyate nel instalador Calamares pa %1.</h1> About %1 installer Tocante al instaldor %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support Sofitu %1 WelcomeViewStep Welcome Bienllegáu calamares-3.1.12/lang/calamares_bg.ts000066400000000000000000004103611322271446000174250ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Среда за начално зареждане</strong> на тази система.<br><br>Старите x86 системи поддържат само <strong>BIOS</strong>.<br>Модерните системи обикновено използват <strong>EFI</strong>, но може също така да използват BIOS, ако са стартирани в режим на съвместимост. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Тази система беше стартирана с <strong>EFI</strong> среда за начално зареждане.<br><br>За да се настрои стартирането от EFI, инсталаторът трябва да разположи програма за начално зареждане като <strong>GRUB</strong> или <strong>systemd-boot</strong> на <strong>EFI Системен Дял</strong>. Това се прави автоматично, освен ако не се избере ръчно поделяне, в такъв случай вие трябва да свършите тази работа. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Тази система беше стартирана с <strong>BIOS</strong> среда за начално зареждане.<br><br>За да се настрои стартирането от BIOS, инсталаторът трябва да разположи програма за начално зареждане като <strong>GRUB</strong> в началото на дяла или на <strong>Сектора за Начално Зареждане</strong> близо до началото на таблицата на дяловете (предпочитано). Това се прави автоматично, освен ако не се избере ръчно поделяне, в такъв случай вие трябва да свършите тази работа. BootLoaderModel Master Boot Record of %1 Сектор за начално зареждане на %1 Boot Partition Дял за начално зареждане System Partition Системен дял Do not install a boot loader Не инсталирай програма за начално зареждане %1 (%2) %1 (%2) Calamares::DebugWindow Form Форма GlobalStorage Глобално съхранение JobQueue Опашка от задачи Modules Модули Type: Вид: none Interface: Интерфейс: Tools Инструменти Debug information Информация за отстраняване на грешки Calamares::ExecutionViewStep Install Инсталирай Calamares::JobThread Done Готово Calamares::ProcessJob Run command %1 %2 Изпълни команда %1 %2 Running command %1 %2 Изпълняване на команда %1 %2 External command crashed Външна команда се провали Command %1 crashed. Output: %2 Команда %1 се провали. Резултат: %2 External command failed to start Външна команда не успя да стартира Command %1 failed to start. Команда %1 не успя да стартира. Internal error when starting command Вътрешна грешка при стартиране на команда Bad parameters for process job call. Невалидни параметри за извикване на задача за процес. External command failed to finish Външна команда не успя да завърши Command %1 failed to finish in %2s. Output: %3 Команда %1 не можа да завърши в рамките на %2 сек. Резултат: %3 External command finished with errors Външна команда приключи с грешки Command %1 finished with exit code %2. Output: %3 Команда %1 завърши с код за изход %2. Резултат: %3 Calamares::PythonJob Running %1 operation. Изпълнение на %1 операция. Bad working directory path Невалиден път на работната директория Working directory %1 for python job %2 is not readable. Работна директория %1 за python задача %2 не се чете. Bad main script file Невалиден файл на главен скрипт Main script file %1 for python job %2 is not readable. Файлът на главен скрипт %1 за python задача %2 не се чете. Boost.Python error in job "%1". Boost.Python грешка в задача "%1". Calamares::ViewManager &Back &Назад &Next &Напред &Cancel &Отказ Cancel installation without changing the system. Cancel installation? Отмяна на инсталацията? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Наистина ли искате да отмените текущият процес на инсталиране? Инсталатора ще прекъсне и всичките промени ще бъдат загубени. &Yes &No &Close Continue with setup? Продължаване? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Инсталатора на %1 ще направи промени по вашия диск за да инсталира %2. <br><strong>Промените ще бъдат окончателни.</strong> &Install now &Инсталирай сега Go &back В&ръщане &Done The installation is complete. Close the installer. Error Грешка Installation Failed Неуспешна инсталация CalamaresPython::Helper Unknown exception type Неизвестен тип изключение unparseable Python error неанализируема Python грешка unparseable Python traceback неанализируемо Python проследяване Unfetchable Python error. Недостъпна Python грешка. CalamaresWindow %1 Installer %1 Инсталатор Show debug information Покажи информация за отстраняване на грешки CheckFileSystemJob Checking file system on partition %1. Проверка на файловата система на дял %1. The file system check on partition %1 failed. Проверката на файловата система на дял %1 се провали. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Този компютър не отговаря на минималните изисквания за инсталиране %1.<br/>Инсталацията не може да продължи. <a href="#details">Детайли...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Този компютър не отговаря на някои от препоръчителните изисквания за инсталиране %1.<br/>Инсталацията може да продължи, но някои свойства могат да бъдат недостъпни. This program will ask you some questions and set up %2 on your computer. Тази програма ще ви зададе няколко въпроса и ще конфигурира %2 на вашия компютър. For best results, please ensure that this computer: За най-добри резултати, моля бъдете сигурни че този компютър: System requirements Системни изисквания ChoicePage Form Форма After: След: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Самостоятелно поделяне</strong><br/>Можете да създадете или преоразмерите дяловете сами. Boot loader location: Локация на програмата за начално зареждане: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 ще се смали до %2МБ и нов %3МБ дял ще бъде създаден за %4. Select storage de&vice: Изберете ус&тройство за съхранение: Current: Сегашен: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Изберете дял за смаляване, после влачете долната лента за преоразмеряване</strong> <strong>Select a partition to install on</strong> <strong>Изберете дял за инсталацията</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. EFI системен дял не е намерен. Моля, опитайте пак като използвате ръчно поделяне за %1. The EFI system partition at %1 will be used for starting %2. EFI системен дял в %1 ще бъде използван за стартиране на %2. EFI system partition: EFI системен дял: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Това устройство за съхранение няма инсталирана операционна система. Какво ще правите?<br/>Ще може да прегледате и потвърдите избора си, преди да се направят промени по устройството за съхранение. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Изтриване на диска</strong><br/>Това ще <font color="red">изтрие</font> всички данни върху устройството за съхранение. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Това устройство за съхранение има инсталиран %1. Какво ще правите?<br/>Ще може да прегледате и потвърдите избора си, преди да се направят промени по устройството за съхранение. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Инсталирайте покрай</strong><br/>Инсталатора ще раздроби дяла за да направи място за %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Замени дял</strong><br/>Заменя този дял с %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Това устройство за съхранение има инсталирана операционна система. Какво ще правите?<br/>Ще може да прегледате и потвърдите избора си, преди да се направят промени по устройството за съхранение. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Това устройство за съхранение има инсталирани операционни системи. Какво ще правите?<br/>Ще може да прегледате и потвърдите избора си, преди да се направят промени по устройството за съхранение. ClearMountsJob Clear mounts for partitioning operations on %1 Разчисти монтиранията за операциите на подялбата на %1 Clearing mounts for partitioning operations on %1. Разчистване на монтиранията за операциите на подялбата на %1 Cleared all mounts for %1 Разчистени всички монтирания за %1 ClearTempMountsJob Clear all temporary mounts. Разчисти всички временни монтирания. Clearing all temporary mounts. Разчистване на всички временни монтирания. Cannot get list of temporary mounts. Не може да се вземе лист от временни монтирания. Cleared all temporary mounts. Разчистени всички временни монтирания. CreatePartitionDialog Create a Partition Създай дял MiB Partition &Type: &Тип на дяла: &Primary &Основен E&xtended Р&азширен Fi&le System: Фа&йлова система: Flags: Флагове: &Mount Point: Точка на &монтиране: Si&ze: Раз&мер: En&crypt Logical Логическа Primary Главна GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Създай нов %2МБ дял върху %4 (%3) със файлова система %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Създай нов <strong>%2МБ</strong> дял върху <strong>%4</strong> (%3) със файлова система <strong>%1</strong>. Creating new %1 partition on %2. Създаване на нов %1 дял върху %2. The installer failed to create partition on disk '%1'. Инсталатора не успя да създаде дял върху диск '%1'. Could not open device '%1'. Не можа да се отвори устройство '%1'. Could not open partition table. Не можа да се отвори таблица на дяловете. The installer failed to create file system on partition %1. Инсталатора не успя да създаде файлова система върху дял %1. The installer failed to update partition table on disk '%1'. Инсталатора не успя да актуализира таблица на дяловете на диск '%1'. CreatePartitionTableDialog Create Partition Table Създай таблица на дяловете Creating a new partition table will delete all existing data on the disk. Създаването на нова таблица на дяловете ще изтрие всички съществуващи данни на диска. What kind of partition table do you want to create? Какъв тип таблица на дяловете искате да създадете? Master Boot Record (MBR) Сектор за начално зареждане (MBR) GUID Partition Table (GPT) GUID Таблица на дяловете (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Създай нова %1 таблица на дяловете върху %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Създай нова <strong>%1</strong> таблица на дяловете върху <strong>%2</strong> (%3). Creating new %1 partition table on %2. Създаване на нова %1 таблица на дяловете върху %2. The installer failed to create a partition table on %1. Инсталатора не можа да създаде таблица на дяловете върху %1. Could not open device %1. Не можа да се отвори устройство '%1'. CreateUserJob Create user %1 Създай потребител %1 Create user <strong>%1</strong>. Създай потребител <strong>%1</strong>. Creating user %1. Създаване на потребител %1. Sudoers dir is not writable. Директорията sudoers е незаписваема. Cannot create sudoers file for writing. Не може да се създаде sudoers файл за записване. Cannot chmod sudoers file. Не може да се изпълни chmod върху sudoers файла. Cannot open groups file for reading. Не може да се отвори файла на групите за четене. Cannot create user %1. Не може да се създаде потребител %1. useradd terminated with error code %1. useradd прекратен с грешка, код %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Не може да се постави притежанието на домашната директория за потребител %1. chown terminated with error code %1. chown прекратен с грешка, код %1. DeletePartitionJob Delete partition %1. Изтрий дял %1. Delete partition <strong>%1</strong>. Изтриване на дял <strong>%1</strong>. Deleting partition %1. Изтриване на дял %1. The installer failed to delete partition %1. Инсталатора не успя да изтрие дял %1. Partition (%1) and device (%2) do not match. Дял (%1) и устройство (%2) не съвпадат. Could not open device %1. Не можа да се отвори устройство %1. Could not open partition table. Не можа да се отвори таблица на дяловете. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Типа на <strong>таблицата на дяловете</strong> на избраното устройство за съхранение.<br><br>Единствения начин да се промени е като се изчисти и пресъздаде таблицата на дяловете, като по този начин всички данни върху устройството ще бъдат унищожени.<br>Инсталатора ще запази сегашната таблица на дяловете, освен ако не изберете обратното.<br>Ако не сте сигурни - за модерни системи се препоръчва GPT. This device has a <strong>%1</strong> partition table. Устройството има <strong>%1</strong> таблица на дяловете. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Това е <strong>loop</strong> устройство.<br><br>Представлява псевдо-устройство, без таблица на дяловете, което прави файловете достъпни като блок устройства. Обикновено съдържа само една файлова система. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Инсталатора <strong>не може да открие таблица на дяловете</strong> на избраното устройство за съхранение.<br><br>Таблицата на дяловете липсва, повредена е или е от неизвестен тип.<br>Инсталатора може да създаде нова таблица на дяловете автоматично или ръчно, чрез програмата за подялба. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Това е препоръчаният тип на таблицата на дяловете за модерни системи, които стартират от <strong>EFI</strong> среда за начално зареждане. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Тази таблица на дяловете е препоръчителна само за стари системи, които стартират с <strong>BIOS</strong> среда за начално зареждане. GPT е препоръчителна в повечето случаи.<br><br><strong>Внимание:</strong> MBR таблица на дяловете е остарял стандарт от времето на MS-DOS.<br>Само 4 <em>главни</em> дяла могат да бъдат създадени и от тях само един може да е <em>разширен</em> дял, който може да съдържа много <em>логически</em> дялове. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Редактирай съществуващ дял Content: Съдържание: &Keep &Запази Format Форматирай Warning: Formatting the partition will erase all existing data. Предупреждение: Форматирането на дялът ще изтрие всички съществуващи данни. &Mount Point: &Точка на монтиране: Si&ze: Раз&мер: MiB Fi&le System: Фа&йлова система: Flags: Флагове: Mountpoint already in use. Please select another one. EncryptWidget Form Форма En&crypt system Крип&тиране на системата Passphrase Парола Confirm passphrase Потвърди паролата Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Постави информация за дял Install %1 on <strong>new</strong> %2 system partition. Инсталирай %1 на <strong>нов</strong> %2 системен дял. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Създай <strong>нов</strong> %2 дял със точка на монтиране <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Инсталирай %2 на %3 системен дял <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Създай %3 дял <strong>%1</strong> с точка на монтиране <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Инсталиране на зареждач върху <strong>%1</strong>. Setting up mount points. Настройка на точките за монтиране. FinishedPage Form Форма &Restart now &Рестартирай сега <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Завършено.</h1><br/>%1 беше инсталирана на вашият компютър.<br/>Вече можете да рестартирате в новата си система или да продължите да използвате %2 Живата среда. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Завърши Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Форматирай дял %1 (файлова система: %2, размер: %3 МБ) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Форматирай <strong>%3МБ</strong> дял <strong>%1</strong> с файлова система <strong>%2</strong>. Formatting partition %1 with file system %2. Форматирай дял %1 с файлова система %2. The installer failed to format partition %1 on disk '%2'. Инсталатора не успя да форматира дял %1 на диск '%2'. Could not open device '%1'. Не можа да се отвори устройство '%1'. Could not open partition table. Не можа да се отвори таблица на дяловете. The installer failed to create file system on partition %1. Инсталатора не успя да създаде файлова система върху дял %1. The installer failed to update partition table on disk '%1'. Инсталатора не успя да актуализира файлова система върху дял %1. InteractiveTerminalPage Konsole not installed Konsole не е инсталиран Please install the kde konsole and try again! Моля инсталирайте kde konsole и опитайте отново! Executing script: &nbsp;<code>%1</code> Изпълняване на скрипт: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Скрипт KeyboardPage Set keyboard model to %1.<br/> Постави модел на клавиатурата на %1.<br/> Set keyboard layout to %1/%2. Постави оформлението на клавиатурата на %1/%2. KeyboardViewStep Keyboard Клавиатура LCLocaleDialog System locale setting Настройка на локацията на системата The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Локацията на системата засяга езика и символите зададени за някои елементи на командния ред.<br/>Текущата настройка е <strong>%1</strong>. &Cancel &OK LicensePage Form Форма I accept the terms and conditions above. Приемам лицензионните условия. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Лицензионно Споразумение</h1>Тази процедура ще инсталира несвободен софтуер, който е обект на лицензионни условия. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Моля погледнете Лицензионните Условия за Крайния Потребител (ЛУКП).<br/>Ако не сте съгласни с условията, процедурата не може да продължи. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Лицензионно Споразумение</h1>Тази процедура може да инсталира несвободен софтуер, който е обект на лицензионни условия, за да предостави допълнителни функции и да подобри работата на потребителя. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Моля погледнете Лицензионните Условия за Крайния Потребител (ЛУКП).<br/>Ако не сте съгласни с условията, несвободния софтуер няма да бъде инсталиран и ще бъдат използвани безплатни алтернативи. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 драйвър</strong><br/>от %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 графичен драйвър</strong><br/><font color="Grey">от %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 плъгин за браузър</strong><br/><font color="Grey">от %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 кодек</strong><br/><font color="Grey">от %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 пакет</strong><br/><font color="Grey">от %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">от %2</font> <a href="%1">view license agreement</a> <a href="%1">виж лицензионното споразумение</a> LicenseViewStep License Лиценз LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Регион: Zone: Зона: &Change... &Промени... Set timezone to %1/%2.<br/> Постави часовата зона на %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Зареждане на данните за местоположение Location Местоположение MoveFileSystemJob Move file system of partition %1. Премести файлова система на дял %1. Could not open file system on partition %1 for moving. Не можа да се отвори файлова система на дял %1 за преместване. Could not create target for moving file system on partition %1. Не можа да се създаде цел за преместване на файлова система върху дял %1. Moving of partition %1 failed, changes have been rolled back. Преместването на дял %1 се провали, промените са върнати обратно. Moving of partition %1 failed. Roll back of the changes have failed. Преместването на дял %1 се провали. Връщането на промените се провали. Updating boot sector after the moving of partition %1 failed. Актуализирането на зареждащия сектор след преместването на дял %1 беше неуспешно. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Размерите на логическия сектор в източника и целта за копиране не са еднакви. Това в момента не се поддържа. Source and target for copying do not overlap: Rollback is not required. Източника и целта за копиране не се припокриват: Възвръщане не е необходимо. Could not open device %1 to rollback copying. Не можа да се отвори устройство %1 за обратно копиране. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Форма Keyboard Model: Модел на клавиатура: Type here to test your keyboard Пишете тук за да тествате вашата клавиатура Page_UserSetup Form Форма What is your name? Какво е вашето име? What name do you want to use to log in? Какво име искате да използвате за влизане? font-weight: normal font-weight: нормална <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ако повече от един човек ще използва този компютър, можете да поставите неколкократни акаунти след инсталацията.</small> Choose a password to keep your account safe. Изберете парола за да държите вашият акаунт в безопасност. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Внесете същата парола два пъти, за да може да бъде проверена за правописни грешки. Добра парола ще съдържа смесица от букви, цифри и пунктуационни знаци, трябва да бъде поне с осем знака и да бъде променяна често.</small> What is the name of this computer? Какво е името на този компютър? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Това име ще бъде използвано ако направите компютъра видим за други при мрежа.</small> Log in automatically without asking for the password. Влизайте автоматично, без питане за паролата. Use the same password for the administrator account. Използвайте същата парола за администраторския акаунт. Choose a password for the administrator account. Изберете парола за администраторския акаунт. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Внесете същата парола два пъти, за да може да бъде проверена за правописни грешки.</small> PartitionLabelsView Root Основен Home Домашен Boot Зареждане EFI system EFI система Swap Swap New partition for %1 Нов дял за %1 New partition %1 %2 %1 %2 PartitionModel Free Space Свободно пространство New partition Нов дял Name Име File System Файлова система Mount Point Точка на монтиране Size Размер PartitionPage Form Форма Storage de&vice: Ус&тройство за съхранение" &Revert All Changes &Възвърни всички промени New Partition &Table Нова &таблица на дяловете &Create &Създай &Edit &Редактирай &Delete &Изтрий Install boot &loader on: Инсталирай &устройството за начално зареждане върху: Are you sure you want to create a new partition table on %1? Сигурни ли сте че искате да създадете нова таблица на дяловете върху %1? PartitionViewStep Gathering system information... Събиране на системна информация... Partitions Дялове Install %1 <strong>alongside</strong> another operating system. Инсталирай %1 <strong>заедно</strong> с друга операционна система. <strong>Erase</strong> disk and install %1. <strong>Изтрий</strong> диска и инсталирай %1. <strong>Replace</strong> a partition with %1. <strong>Замени</strong> дял с %1. <strong>Manual</strong> partitioning. <strong>Ръчно</strong> поделяне. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Инсталирай %1 <strong>заедно</strong> с друга операционна система на диск <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Изтрий</strong> диск <strong>%2</strong> (%3) и инсталирай %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Замени</strong> дял на диск <strong>%2</strong> (%3) с %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ръчно</strong> поделяне на диск <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Диск <strong>%1</strong> (%2) Current: Сегашен: After: След: No EFI system partition configured Няма конфигуриран EFI системен дял An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI системен дял е нужен за стартиране на %1.<br/><br/>За настройка на EFI системен дял се върнете назад и изберете или създайте FAT32 файлова система с включен <strong>esp</strong> флаг и точка на монтиране <strong>%2</strong>.<br/><br/>Може да продължите без EFI системен дял, но системата може да не успее да стартира. EFI system partition flag not set Не е зададен флаг на EFI системен дял An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. EFI системен дял е нужен за стартиране на %1.<br/><br/>Дялът беше конфигуриран с точка на монтиране <strong>%2</strong>, но неговия <strong>esp</strong> флаг не е включен.<br/>За да включите флага се върнете назад и редактирайте дяла.<br/><br/>Може да продължите без флага, но системата може да не успее да стартира. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Модел на клавиатура по подразбиране Default По подразбиране unknown неизвестна extended разширена unformatted неформатирана swap swap Unpartitioned space or unknown partition table Неразделено пространство или неизвестна таблица на дяловете ReplaceWidget Form Форма Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Изберете къде да инсталирате %1.<br/><font color="red">Предупреждение: </font>това ще изтрие всички файлове върху избраният дял. The selected item does not appear to be a valid partition. Избраният предмет не изглежда да е валиден дял. %1 cannot be installed on empty space. Please select an existing partition. %1 не може да бъде инсталиран на празно пространство. Моля изберете съществуващ дял. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 не може да бъде инсталиран върху разширен дял. Моля изберете съществуващ основен или логически дял. %1 cannot be installed on this partition. %1 не може да бъде инсталиран върху този дял. Data partition (%1) Дял на данните (%1) Unknown system partition (%1) Непознат системен дял (%1) %1 system partition (%2) %1 системен дял (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Дялът %1 е твърде малък за %2. Моля изберете дял с капацитет поне %3 ГБ. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>EFI системен дял не е намерен. Моля, опитайте пак като използвате ръчно поделяне за %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 ще бъде инсталиран върху %2.<br/><font color="red">Предупреждение: </font>всички данни на дял %2 ще бъдат изгубени. The EFI system partition at %1 will be used for starting %2. EFI системен дял в %1 ще бъде използван за стартиране на %2. EFI system partition: EFI системен дял: RequirementsChecker Gathering system information... Събиране на системна информация... has at least %1 GB available drive space има поне %1 ГБ свободено дисково пространство There is not enough drive space. At least %1 GB is required. Няма достатъчно дисково пространство. Необходимо е поне %1 ГБ. has at least %1 GB working memory има поне %1 ГБ работна памет The system does not have enough working memory. At least %1 GB is required. Системата не разполага с достатъчно работна памет. Необходима е поне %1 ГБ. is plugged in to a power source е включен към източник на захранване The system is not plugged in to a power source. Системата не е включена към източник на захранване. is connected to the Internet е свързан към интернет The system is not connected to the Internet. Системата не е свързана с интернет. The installer is not running with administrator rights. Инсталаторът не е стартиран с права на администратор. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Преоразмери файловата система на дял %1. Parted failed to resize filesystem. Parted не успя да преоразмери файлова система. Failed to resize filesystem. Неуспешно преоразмеряване на файлова система. ResizePartitionJob Resize partition %1. Преоразмери дял %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Преоразмери <strong>%2МБ</strong> дял <strong>%1</strong> на <strong>%3МБ</strong>. Resizing %2MB partition %1 to %3MB. Преоразмеряване от %2МБ дял %1 на %3МБ. The installer failed to resize partition %1 on disk '%2'. Инсталатора не успя да преоразмери дял %1 върху диск '%2'. Could not open device '%1'. Не можа да се отвори устройство '%1'. ScanningDialog Scanning storage devices... Сканиране на устройствата за съхранение Partitioning Разделяне SetHostNameJob Set hostname %1 Поставете име на хоста %1 Set hostname <strong>%1</strong>. Поставете име на хост <strong>%1</strong>. Setting hostname %1. Задаване името на хоста %1 Internal Error Вътрешна грешка Cannot write hostname to target system Не може да се запише името на хоста на целевата система SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Постави модела на клавиатурата на %1, оформлението на %2-%3 Failed to write keyboard configuration for the virtual console. Неуспешно записването на клавиатурна конфигурация за виртуалната конзола. Failed to write to %1 Неуспешно записване върху %1 Failed to write keyboard configuration for X11. Неуспешно записване на клавиатурна конфигурация за X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Задай флагове на дял %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Изчисти флаговете на дял <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Сложи флаг на дял <strong>%1</strong> като <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Изчистване на флаговете на дял <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Задаване на флагове <strong>%2</strong> на дял <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Инсталатора не успя да зададе флагове на дял %1. Could not open device '%1'. Не можа да се отвори устройство '%1'. Could not open partition table on device '%1'. Не можа да се отвори таблица на дяловете в устройство '%1'. Could not find partition '%1'. Не може да се намери дял '%1'. SetPartGeometryJob Update geometry of partition %1. Обнови геометрията на дял %1. Failed to change the geometry of the partition. Неуспешна промяна на геометрията на дяла. SetPasswordJob Set password for user %1 Задай парола за потребител %1 Setting password for user %1. Задаване на парола за потребител %1 Bad destination system path. Лоша дестинация за системен път. rootMountPoint is %1 root точка на монтиране е %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. Не може да се постави парола за потребител %1. usermod terminated with error code %1. usermod е прекратен с грешка %1. SetTimezoneJob Set timezone to %1/%2 Постави часовата зона на %1/%2 Cannot access selected timezone path. Няма достъп до избрания път за часова зона. Bad path: %1 Лош път: %1 Cannot set timezone. Не може да се зададе часова зона. Link creation failed, target: %1; link name: %2 Неуспешно създаване на връзка: %1; име на връзка: %2 Cannot set timezone, Не може да се зададе часова зона, Cannot open /etc/timezone for writing Не може да се отвори /etc/timezone за записване SummaryPage This is an overview of what will happen once you start the install procedure. Това е преглед на промените, които ще се извършат, след като започнете процедурата по инсталиране. SummaryViewStep Summary Обобщение UsersPage Your username is too long. Вашето потребителско име е твърде дълго. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Потребителското ви име съдържа непозволени символи! Само малки букви и числа са позволени. Your hostname is too short. Вашето име на хоста е твърде кратко. Your hostname is too long. Вашето име на хоста е твърде дълго. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Вашето име на хоста съдържа непозволени символи! Само букви, цифри и тирета са позволени. Your passwords do not match! Паролите Ви не съвпадат! UsersViewStep Users Потребители WelcomePage Form Форма &Language: &Език: &Release notes &Бележки по изданието &Known issues &Съществуващи проблеми &Support &Поддръжка &About &Относно <h1>Welcome to the %1 installer.</h1> <h1>Добре дошли при инсталатора на %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Относно инсталатор %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 поддръжка WelcomeViewStep Welcome Добре дошли calamares-3.1.12/lang/calamares_ca.ts000066400000000000000000003740231322271446000174240ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. L'<strong>entorn d'arrencada</strong> d'aquest sistema.<br><br>Els sistemes antics x86 només tenen suport per a <strong>BIOS</strong>.<br>Els moderns normalment usen <strong>EFI</strong>, però també poden mostrar-se com a BIOS si l'entorn d'arrencada s'executa en mode de compatibilitat. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Aquest sistema s'ha iniciat amb un entorn d'arrencada <strong>EFI</strong>. <br><br> Per configurar una arrencada des d'un entorn EFI, aquest instal·lador ha de desplegar una aplicació de càrrega d'arrencada, com ara el <strong>GRUB</strong> o el <strong>systemd-boot</strong> en una <strong>partició EFI del sistema</strong>. Això és automàtic, llevat que trieu un partiment manual, en què caldrà que ho configureu vosaltres mateixos. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Aquest sistema s'ha iniciat amb un entorn d'arrencada <strong>BIOS </strong>. Per configurar una arrencada des d'un entorn BIOS, aquest instal·lador ha d'instal·lar un carregador d'arrencada, com ara el <strong>GRUB</strong>, ja sigui al començament d'una partició o al <strong>Registre d'Arrencada Mestre</strong>, a prop del començament de la taula de particions (millor). Això és automàtic, llevat que trieu un partiment manual, en què caldrà que ho configureu pel vostre compte. BootLoaderModel Master Boot Record of %1 Registre d'inici mestre (MBR) de %1 Boot Partition Partició d'arrencada System Partition Partició del sistema Do not install a boot loader No instal·lis cap carregador d'arrencada %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulari GlobalStorage Emmagatzematge global JobQueue Cua de tasques Modules Mòduls Type: Tipus: none cap Interface: Interfície: Tools Eines Debug information Informació de depuració Calamares::ExecutionViewStep Install Instal·la Calamares::JobThread Done Fet Calamares::ProcessJob Run command %1 %2 Executa l'ordre %1 %2 Running command %1 %2 Executant l'ordre %1 %2 External command crashed L'ordre externa ha fallat Command %1 crashed. Output: %2 L'ordre %1 ha fallat. Sortida: %2 External command failed to start L'ordre externa no s'ha pogut iniciar Command %1 failed to start. L'ordre %1 no s'ha pogut iniciar. Internal error when starting command Error intern en iniciar l'ordre Bad parameters for process job call. Paràmetres incorrectes per a la crida del procés. External command failed to finish L'ordre externa no ha acabat correctament Command %1 failed to finish in %2s. Output: %3 L'ordre %1 no s'ha pogut acabar en %2s. Sortida: %3 External command finished with errors L'ordre externa ha acabat amb errors Command %1 finished with exit code %2. Output: %3 L'ordre %1 ha acabat amb el codi de sortida %2. Sortida: %3 Calamares::PythonJob Running %1 operation. Executant l'operació %1. Bad working directory path Ruta errònia del directori de treball Working directory %1 for python job %2 is not readable. El directori de treball %1 per a la tasca python %2 no és llegible. Bad main script file Fitxer erroni d'script principal Main script file %1 for python job %2 is not readable. El fitxer de script principal %1 per a la tasca de python %2 no és llegible. Boost.Python error in job "%1". Error de Boost.Python a la tasca "%1". Calamares::ViewManager &Back &Enrere &Next &Següent &Cancel &Cancel·la Cancel installation without changing the system. Cancel·leu la instal·lació sense canviar el sistema. Cancel installation? Cancel·lar la instal·lació? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Voleu cancel·lar el procés d'instal·lació actual? L'instal·lador es tancarà i tots els canvis es perdran. &Yes &Sí &No &No &Close Tan&ca Continue with setup? Voleu continuar la configuració? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> L'instal·lador de %1 està a punt de fer canvis al disc per tal d'instal·lar-hi %2.<br/><strong>No podreu desfer aquests canvis.</strong> &Install now &Instal·la ara Go &back Vés &enrere &Done &Fet The installation is complete. Close the installer. La instal·lació s'ha acabat. Tanqueu l'instal·lador. Error Error Installation Failed La instal·lació ha fallat CalamaresPython::Helper Unknown exception type Tipus d'excepció desconeguda unparseable Python error Error de Python no analitzable unparseable Python traceback Traceback de Python no analitzable Unfetchable Python error. Error de Python irrecuperable. CalamaresWindow %1 Installer Instal·lador de %1 Show debug information Mostra la informació de depuració CheckFileSystemJob Checking file system on partition %1. Comprovant el sistema de fitxers de la partició %1. The file system check on partition %1 failed. La comprovació del sistema de fitxers de la partició %1 ha fallat. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Aquest ordinador no satisfà els requisits mínims per instal·lar-hi %1.<br/> La instal·lació no pot continuar. <a href="#details">Detalls...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Aquest ordinador no satisfà alguns dels requisits recomanats per instal·lar-hi %1.<br/>La instal·lació pot continuar, però algunes característiques podrien estar desactivades. This program will ask you some questions and set up %2 on your computer. Aquest programa us farà unes quantes preguntes i instal·larà %2 al vostre ordinador. For best results, please ensure that this computer: Per obtenir els millors resultats, assegureu-vos, si us plau, que aquest ordinador: System requirements Requisits del sistema ChoicePage Form Formulari After: Després: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Partiment manual</strong><br/>Podeu crear o redimensionar les particions vosaltres mateixos. Boot loader location: Ubicació del carregador d'arrencada: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 s'encongirà a %2MB i es crearà una partició nova de %3MB per a %4. Select storage de&vice: Seleccioneu un dispositiu d'e&mmagatzematge: Current: Actual: Reuse %1 as home partition for %2. Reutilitza %1 com a partició de l'usuari per a %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Seleccioneu una partició per encongir i arrossegueu-la per redimensinar-la</strong> <strong>Select a partition to install on</strong> <strong>Seleccioneu una partició per fer-hi la instal·lació</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. No s'ha pogut trobar enlloc una partició EFI en aquest sistema. Si us plau, torneu enrere i useu el partiment manual per configurar %1. The EFI system partition at %1 will be used for starting %2. La partició EFI de sistema a %1 s'usarà per iniciar %2. EFI system partition: Partició EFI del sistema: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Aquest dispositiu d'emmagatzematge no sembla que tingui un sistema operatiu. Què voleu fer?<br/>Podreu revisar i confirmar la tria abans que es faci cap canvi al dispositiu. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Esborra el disc</strong><br/>Això <font color="red">esborrarà</font> totes les dades del dispositiu seleccionat. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Aquest dispositiu d'emmagatzematge té %1. Què voleu fer?<br/>Podreu revisar i confirmar la tria abans que es faci cap canvi al dispositiu. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instal·la al costat</strong><br/>L'instal·lador reduirà una partició per fer espai per a %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Reemplaça una partició</strong><br/>Reemplaça una partició per %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Aquest dispositiu d'emmagatzematge ja té un sistema operatiu. Què voleu fer?<br/>Podreu revisar i confirmar la tria abans que es faci cap canvi al dispositiu. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Aquest dispositiu d'emmagatzematge ja múltiples sistemes operatius. Què voleu fer?<br/>Podreu revisar i confirmar la tria abans que es faci cap canvi al dispositiu. ClearMountsJob Clear mounts for partitioning operations on %1 Neteja els muntatges per les operacions de partició a %1 Clearing mounts for partitioning operations on %1. Netejant els muntatges per a les operacions del particionament de %1. Cleared all mounts for %1 S'han netejat tots els muntatges de %1 ClearTempMountsJob Clear all temporary mounts. Neteja tots els muntatges temporals Clearing all temporary mounts. Netejant tots els muntatges temporals. Cannot get list of temporary mounts. No es pot obtenir la llista dels muntatges temporals. Cleared all temporary mounts. S'han netejat tots els muntatges temporals. CreatePartitionDialog Create a Partition Crea una partició MiB MB Partition &Type: Partició & tipus: &Primary &Primària E&xtended &Ampliada Fi&le System: S&istema de fitxers: Flags: Banderes: &Mount Point: Punt de &muntatge: Si&ze: Mi&da: En&crypt En&cripta Logical Lògica Primary Primària GPT GPT Mountpoint already in use. Please select another one. El punt de muntatge ja s'usa. Si us plau, seleccioneu-ne un altre. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Crea una partició nova de %2MB a %4 (%3) amb el sistema de fitxers %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Crea una partició nova de <strong>%2MB</strong> a <strong>%4</strong> (%3) amb el sistema de fitxers <strong>%1</strong>. Creating new %1 partition on %2. Creant la partició nova %1 a %2. The installer failed to create partition on disk '%1'. L'instal·lador no ha pogut crear la partició al disc '%1'. Could not open device '%1'. No s'ha pogut obrir el dispositiu '%1'. Could not open partition table. No s'ha pogut obrir la taula de particions. The installer failed to create file system on partition %1. L'instal·lador no ha pogut crear el sistema de fitxers a la partició '%1'. The installer failed to update partition table on disk '%1'. L'instal·lador no ha pogut actualitzar la taula de particions del disc '%1'. CreatePartitionTableDialog Create Partition Table Crea la taula de particions Creating a new partition table will delete all existing data on the disk. La creació d'una nova taula de particions esborrarà totes les dades existents al disc. What kind of partition table do you want to create? Quin tipus de taula de particions voleu crear? Master Boot Record (MBR) Registre d'inici mestre (MBR) GUID Partition Table (GPT) Taula de particions GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crea una taula de particions %1 nova a %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crea una taula de particions <strong>%1</strong> nova a <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creant la nova taula de particions %1 a %2. The installer failed to create a partition table on %1. L'instal·lador no ha pogut crear la taula de particions a %1. Could not open device %1. No s'ha pogut obrir el dispositiu %1. CreateUserJob Create user %1 Crea l'usuari %1 Create user <strong>%1</strong>. Crea l'usuari <strong>%1</strong>. Creating user %1. Creant l'usuari %1. Sudoers dir is not writable. El directori de sudoers no té permisos d'escriptura. Cannot create sudoers file for writing. No es pot crear el fitxer sudoers a escriure. Cannot chmod sudoers file. No es pot fer chmod al fitxer sudoers. Cannot open groups file for reading. No es pot obrir el fitxer groups per ser llegit. Cannot create user %1. No es pot crear l'usuari %1. useradd terminated with error code %1. useradd ha acabat amb el codi d'error %1. Cannot add user %1 to groups: %2. No es pot afegir l'usuari %1 als grups: %2. usermod terminated with error code %1. usermod ha acabat amb el codi d'error %1. Cannot set home directory ownership for user %1. No es pot establir la propietat del directori personal a l'usuari %1. chown terminated with error code %1. chown ha acabat amb el codi d'error %1. DeletePartitionJob Delete partition %1. Suprimeix la partició %1. Delete partition <strong>%1</strong>. Suprimeix la partició <strong>%1</strong>. Deleting partition %1. Eliminant la partició %1. The installer failed to delete partition %1. L'instal·lador no ha pogut eliminar la partició %1. Partition (%1) and device (%2) do not match. La partició (%1) i el dispositiu (%2) no concorden. Could not open device %1. No s'ha pogut obrir el dispositiu %1. Could not open partition table. No s'ha pogut obrir la taula de particions. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. El tipus de <strong>taula de particions</strong> actualment present al dispositiu d'emmagatzematge seleccionat. L'única manera de canviar el tipus de taula de particions és esborrar i tornar a crear la taula de particions des de zero, fet que destrueix totes les dades del dispositiu d'emmagatzematge. <br> Aquest instal·lador mantindrà la taula de particions actual llevat que decidiu expressament el contrari. <br>Si no n'esteu segur, als sistemes moderns es prefereix GPT. This device has a <strong>%1</strong> partition table. Aquest dispositiu té una taula de particions <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Aquest dispositiu és un dispositu <strong>de bucle</strong>.<br><br>Això és un pseudodispositiu sense taula de particions que fa que un fitxer sigui accessible com un dispositiu de bloc. Aquest tipus de configuració normalment només conté un sol sistema de fitxers. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Aquest instal·lador <strong>no pot detectar una taula de particions</strong> al dispositiu d'emmagatzematge seleccionat.<br><br>O bé el dispositiu no té taula de particions o la taula de particions és corrupta o d'un tipus desconegut.<br>Aquest instal·lador pot crear una nova taula de particions, o bé automàticament o a través de la pàgina del partidor manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Aquest és el tipus de taula de particions recomanat per als sistemes moderns que s'inicien des d'un entorn d'arrencada <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Aquest tipus de taula de particions és només recomanable en sistemes més antics que s'iniciïn des d'un entorn d'arrencada <strong>BIOS</strong>. Per a la majoria d'altres usos, es recomana fer servir GPT.<br><strong>Avís:</strong> la taula de particions MBR és un estàndard obsolet de l'era MSDOS. <br>Només es poden crear 4 particions <em>primàries</em> i d'aquestes 4, una pot ser una partició <em>ampliada</em>, que pot contenir algunes particions <em>lògiques</em>.<br> DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Escriu la configuració de LUKS per a Dracut a %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Omet l'escriptura de la configuració de LUKS per a Dracut: la partició "/" no està encriptada Failed to open %1 Ha fallat obrir %1 DummyCppJob Dummy C++ Job Tasca C++ fictícia EditExistingPartitionDialog Edit Existing Partition Edita la partició existent Content: Contingut: &Keep &Mantén Format Formatar Warning: Formatting the partition will erase all existing data. Advertència: formatar la partició esborrarà totes les dades existents. &Mount Point: &Punt de muntatge: Si&ze: Mi&da: MiB MB Fi&le System: S&istema de fitxers: Flags: Banderes: Mountpoint already in use. Please select another one. El punt de muntatge ja s'usa. Si us plau, seleccioneu-ne un altre. EncryptWidget Form Formulari En&crypt system En&cripta el sistema Passphrase Contrasenya: Confirm passphrase Confirmeu la contrasenya Please enter the same passphrase in both boxes. Si us plau, escriviu la mateixa constrasenya a les dues caselles. FillGlobalStorageJob Set partition information Estableix la informació de la partició Install %1 on <strong>new</strong> %2 system partition. Instal·la %1 a la partició de sistema <strong>nova</strong> %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Estableix la partició <strong>nova</strong> %2 amb el punt de muntatge <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instal·la %2 a la partició de sistema %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Estableix la partició %3 <strong>%1</strong> amb el punt de muntatge <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instal·la el carregador d'arrencada a <strong>%1</strong>. Setting up mount points. Establint els punts de muntatge. FinishedPage Form Formulari &Restart now &Reinicia ara <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Tot fet.</h1><br/>%1 s'ha instal·lat al vostre ordinador.<br/>Ara podeu reiniciar-lo per tal d'accedir al sistema operatiu nou o bé continuar utilitzant l'entorn Live de %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>La instal·lació ha fallat</h1><br/>No s'ha instal·lat %1 a l'ordinador.<br/>El missatge d'error ha estat el següent: %2. FinishedViewStep Finish Acaba Installation Complete Instal·lació acabada The installation of %1 is complete. La instal·lació de %1 ha acabat. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formata la partició %1 (sistema de fitxers: %2, mida: %3 MB) de %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formata la partició de <strong>%3MB</strong> <strong>%1</strong> amb el sistema de fitxers <strong>%2</strong>. Formatting partition %1 with file system %2. Formatant la partició %1 amb el sistema d'arxius %2. The installer failed to format partition %1 on disk '%2'. L'instal·lador no ha pogut formatar la partició %1 del disc '%2'. Could not open device '%1'. No s'ha pogut obrir el dispositiu '%1'. Could not open partition table. No s'ha pogut obrir la taula de particions. The installer failed to create file system on partition %1. L'instal·lador no ha pogut crear el sistema de fitxers de la partició %1. The installer failed to update partition table on disk '%1'. L'instal·lador no ha pogut actualitzar la taula de particions del disc '%1'. InteractiveTerminalPage Konsole not installed El Konsole no està instal·lat Please install the kde konsole and try again! Si us plau, instal·leu el konsole del kde i torneu-ho a intentar! Executing script: &nbsp;<code>%1</code> Executant l'script &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Assigna el model del teclat a %1.<br/> Set keyboard layout to %1/%2. Assigna la distribució del teclat a %1/%2. KeyboardViewStep Keyboard Teclat LCLocaleDialog System locale setting Configuració de la llengua del sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. La configuració local del sistema afecta la llengua i el joc de caràcters d'alguns elements de la interície de línia d'ordres. <br/>La configuració actual és <strong>%1</strong>. &Cancel &Cancel·la &OK D'ac&ord LicensePage Form Formulari I accept the terms and conditions above. Accepto els termes i les condicions anteriors. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acord de llicència</h1> Aquest procediment de configuració instal·larà programari de propietat subjecte a termes de llicència. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Si us plau, reviseu l'acord de llicència End User License Agreements (EULAs) anterior.<br/>Si no esteu d'acord en els termes, el procediment de configuració no pot continuar. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acord de llicència</h1> Aquest procediment de configuració instal·larà programari de propietat subjecte a termes de llicència per tal de proporcionar característiques addicionals i millorar l'experiència de l'usuari. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Si us plau, reviseu l'acord de llicència End User License Agreements (EULAs) anterior.<br/>Si no esteu d'acord en els termes, no s'instal·larà el programari de propietat i es faran servir les alternatives de codi lliure. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 controlador</strong><br/>de %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 controlador gràfic</strong><br/><font color="Grey">de %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 connector del navegador</strong><br/><font color="Grey">de %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 còdec</strong><br/><font color="Grey">de %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paquet</strong><br/><font color="Grey">de %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">de %2</font> <a href="%1">view license agreement</a> <a href="%1">mostra l'acord de llicència</a> LicenseViewStep License Llicència LocalePage The system language will be set to %1. La llengua del sistema s'establirà a %1. The numbers and dates locale will be set to %1. Els números i les dates de la configuració local s'establiran a %1. Region: Regió: Zone: Zona: &Change... &Canvi... Set timezone to %1/%2.<br/> Estableix la zona horària a %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Carregant les dades de la ubicació... Location Ubicació MoveFileSystemJob Move file system of partition %1. Mou el sistema de fitxers de la partició %1. Could not open file system on partition %1 for moving. No s'ha pogut obrir el sistema de fitxers de la partició %1 per a ser mogut. Could not create target for moving file system on partition %1. No s'ha pogut crear l'objectiu per a moure el sistema de fitxers de la partició %1. Moving of partition %1 failed, changes have been rolled back. El desplaçament de la partició %1 ha fallat, els canvis s'han restablert. Moving of partition %1 failed. Roll back of the changes have failed. El desplaçament de la partició %1 ha fallat. El restabliment dels canvis ha fallat. Updating boot sector after the moving of partition %1 failed. L'actualització del sector d'arrencada després de moure la partició %1 ha fallat. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Les mides dels sectors lògics de la font i de la destinació no coincideixen. Això de moment no té suport. Source and target for copying do not overlap: Rollback is not required. La font i la destinació de la còpia no es superposen: no se'n requereix el restabliment. Could not open device %1 to rollback copying. No s'ha pogut obrir el dispositiu %1 per a restablir la còpia. NetInstallPage Name Nom Description Descripció Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instal·lació per xarxa. (Inhabilitada: no es poden obtenir les llistes de paquets, comproveu la connexió.) NetInstallViewStep Package selection Selecció de paquets Page_Keyboard Form Formulari Keyboard Model: Model del teclat: Type here to test your keyboard Escriviu aquí per comprovar el teclat Page_UserSetup Form Formulari What is your name? Com us dieu? What name do you want to use to log in? Quin nom voleu utilitzar per iniciar la sessió d'usuari? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Podeu afegir múltiples comptes d'usuari després de la instal·lació, si més d'una persona ha de fer servir aquest ordinador.</small> Choose a password to keep your account safe. Trieu una contrasenya per tal de mantenir el compte d'usuari segur. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Introduïu la mateixa contrasenya dues vegades, de manera que se'n puguin comprovar els errors de mecanografia. Una bona contrasenya contindrà una barreja de lletres, nombres i signes de puntuació, hauria de tenir un mínim de 8 caràcters i s'hauria de modificar a intervals regulars de temps.</small> What is the name of this computer? Com es diu aquest ordinador? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Aquest nom s'utilitzarà en cas que feu visible per a altres aquest ordinador en una xarxa.</small> Log in automatically without asking for the password. Entra automàticament sense demanar la contrasenya. Use the same password for the administrator account. Usa la mateixa contrasenya per al compte d'administració. Choose a password for the administrator account. Trieu una contrasenya per al compte d'administració. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Introduïu la mateixa contrasenya dues vegades, per tal de poder-ne comprovar els errors de mecanografia.</small> PartitionLabelsView Root Arrel Home Inici Boot Arrencada EFI system Sistema EFI Swap Intercanvi New partition for %1 Partició nova per a %1 New partition Partició nova %1 %2 %1 %2 PartitionModel Free Space Espai lliure New partition Partició nova Name Nom File System Sistema de fitxers Mount Point Punt de muntatge Size Mida PartitionPage Form Formulari Storage de&vice: Dispositiu d'e&mmagatzematge: &Revert All Changes &Desfés tots els canvis New Partition &Table Nova &taula de particions &Create &Crea &Edit &Edita &Delete &Suprimeix Install boot &loader on: &Instal·la el carregador d'arrencada a: Are you sure you want to create a new partition table on %1? Esteu segurs que voleu crear una nova taula de particions a %1? PartitionViewStep Gathering system information... Recopilant informació del sistema... Partitions Particions Install %1 <strong>alongside</strong> another operating system. Instal·la %1 <strong>al costat</strong> d'un altre sistema operatiu. <strong>Erase</strong> disk and install %1. <strong>Esborra</strong> el disc i instal·la-hi %1. <strong>Replace</strong> a partition with %1. <strong>Reemplaça</strong> una partició amb %1. <strong>Manual</strong> partitioning. Partiment <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instal·la %1 <strong>al costat</strong> d'un altre sistema operatiu al disc <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Esborra</strong> el disc <strong>%2</strong> (%3) i instal·la-hi %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Reemplaça</strong> una partició del disc <strong>%2</strong> (%3) amb %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Partiment <strong>manual</strong> del disc <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disc <strong>%1</strong> (%2) Current: Actual: After: Després: No EFI system partition configured No hi ha cap partició EFI de sistema configurada An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Cal una partició EFI de sistema per iniciar %1. <br/><br/>Per configurar una partició EFI de sistema, torneu enrere i seleccioneu o creeu un sistema de fitxers FAT32 amb la bandera <strong>esp</strong> habilitada i el punt de muntatge <strong>%2</strong>. <br/><br/>Podeu continuar sense la creació d'una partició EFI de sistema, però el sistema podria no iniciar-se. EFI system partition flag not set No s'ha establert la bandera de la partició EFI del sistema An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Cal una partició EFI de sistema per iniciar %1. <br/><br/> Ja s'ha configurat una partició amb el punt de muntatge <strong>%2</strong> però no se n'ha establert la bandera <strong>esp</strong>. Per establir-la-hi, torneu enrere i editeu la partició. <br/><br/>Podeu continuar sense establir la bandera, però el sistema podria no iniciar-se. Boot partition not encrypted Partició d'arrel no encriptada A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. S'ha establert una partició d'arrencada separada conjuntament amb una partició d'arrel encriptada, però la partició d'arrencada no està encriptada.<br/><br/>Hi ha aspectes de seguretat amb aquest tipus de configuració, perquè hi ha fitxers del sistema importants en una partició no encriptada.<br/>Podeu continuar, si així ho desitgeu, però el desbloqueig del sistema de fitxers succeirà després, durant l'inici del sistema.<br/>Per encriptar la partició d'arrencada, torneu enrere i torneu-la a crear seleccionant <strong>Encripta</strong> a la finestra de creació de la partició. QObject Default Keyboard Model Model de teclat per defecte Default Per defecte unknown desconeguda extended ampliada unformatted sense format swap Intercanvi Unpartitioned space or unknown partition table Espai sense partir o taula de particions desconeguda ReplaceWidget Form Formulari Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Seleccioneu on instal·lar %1.<br/><font color="red">Atenció: </font>això esborrarà tots els fitxers de la partició seleccionada. The selected item does not appear to be a valid partition. L'element seleccionat no sembla que sigui una partició vàlida. %1 cannot be installed on empty space. Please select an existing partition. %1 no es pot instal·lar en un espai buit. Si us plau, seleccioneu una partició existent. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 no es pot instal·lar en un partició ampliada. Si us plau, seleccioneu una partició existent primària o lògica. %1 cannot be installed on this partition. %1 no es pot instal·lar en aquesta partició. Data partition (%1) Partició de dades (%1) Unknown system partition (%1) Partició de sistema desconeguda (%1) %1 system partition (%2) %1 partició de sistema (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>La partició %1 és massa petita per a %2. Si us plau, seleccioneu una partició amb capacitat d'almenys %3 GB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>No es pot trobar cap partició EFI enlloc del sistema. Si us plau, torneu enrere i useu el partiment manual per establir %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 s'instal·larà a %2.<br/><font color="red">Atenció: </font>totes les dades de la partició %2 es perdran. The EFI system partition at %1 will be used for starting %2. La partició EFI de sistema a %1 s'usarà per iniciar %2. EFI system partition: Partició EFI del sistema: RequirementsChecker Gathering system information... Recopilant informació del sistema... has at least %1 GB available drive space té com a mínim %1 GB d'espai de disc disponible. There is not enough drive space. At least %1 GB is required. No hi ha prou espai de disc disponible. Com a mínim hi ha d'haver %1 GB. has at least %1 GB working memory té com a mínim %1 GB de memòria de treball The system does not have enough working memory. At least %1 GB is required. El sistema no té prou memòria de treball. Com a mínim es necessita %1 GB. is plugged in to a power source està connectat a una font de corrent The system is not plugged in to a power source. El sistema no està connectat a una font de corrent. is connected to the Internet està connectat a Internet The system is not connected to the Internet. El sistema no està connectat a Internet. The installer is not running with administrator rights. L'instal·lador no s'ha executat amb privilegis d'administrador. The screen is too small to display the installer. La pantalla és massa petita per mostrar l'instal·lador. ResizeFileSystemJob Resize file system on partition %1. Redimensionar el sistema de fitxers de la partició %1. Parted failed to resize filesystem. El Parted no ha pogut redimensionar el sistema de fitxers. Failed to resize filesystem. No s'ha pogut redimensionar el sistema de fitxers. ResizePartitionJob Resize partition %1. Redimensiona la partició %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensiona la partició de <strong>%2MB</strong> <strong>%1</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Canviant la mida de la partició %1 de %2MB a %3MB. The installer failed to resize partition %1 on disk '%2'. L'instal·lador no ha pogut redimensionar la partició %1 del disc '%2'. Could not open device '%1'. No s'ha pogut obrir el dispositiu '%1'. ScanningDialog Scanning storage devices... Escanejant els dispositius d'emmagatzematge... Partitioning Particions SetHostNameJob Set hostname %1 Assigna el nom de l'equip %1 Set hostname <strong>%1</strong>. Establir el nom de l'hoste <strong>%1</strong>. Setting hostname %1. Establint el nom de l'hoste %1. Internal Error Error intern Cannot write hostname to target system No s'ha pogut escriure el nom de l'equip al sistema de destinació SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Canvia el model de teclat a %1, la disposició de teclat a %2-%3 Failed to write keyboard configuration for the virtual console. No s'ha pogut escriure la configuració del teclat per a la consola virtual. Failed to write to %1 No s'ha pogut escriure a %1 Failed to write keyboard configuration for X11. No s'ha pogut escriure la configuració del teclat per X11. Failed to write keyboard configuration to existing /etc/default directory. Ha fallat escriure la configuració del teclat al directori existent /etc/default. SetPartFlagsJob Set flags on partition %1. Estableix les banderes a la partició %1. Set flags on %1MB %2 partition. Estableix les banderes a la partició %1MB %2. Set flags on new partition. Estableix les banderes a la partició nova. Clear flags on partition <strong>%1</strong>. Neteja les banderes de la partició <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Neteja les banderes de la partició %1MB <strong>%2</strong>. Clear flags on new partition. Neteja les banderes de la partició nova. Flag partition <strong>%1</strong> as <strong>%2</strong>. Estableix la bandera <strong>%2</strong> a la partició <strong>%1</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Estableix la bandera de la partició %1MB <strong>%2</strong> com a <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Estableix la bandera de la partició nova com a <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Netejant les banderes de la partició <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Es netegen les banderes de la partició %1MB <strong>%2</strong>. Clearing flags on new partition. Es netegen les banderes de la partició nova. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Establint les banderes <strong>%2</strong> a la partició <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. S'estableixen les banderes <strong>%3</strong> a la partició %1MB <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. S'estableixen les banderes <strong>%1</strong> a la partició nova. The installer failed to set flags on partition %1. L'instal·lador ha fallat en establir les banderes a la partició %1. Could not open device '%1'. No s'ha pogut obrir el dispositiu "%1". Could not open partition table on device '%1'. No s'ha pogut obrir la taula de particions del dispositiu "%1". Could not find partition '%1'. No s'ha pogut trobar la partició "%1". SetPartGeometryJob Update geometry of partition %1. Actualitza la geometria de la partició %1. Failed to change the geometry of the partition. No s'ha pogut canviar la geometria de la partició. SetPasswordJob Set password for user %1 Assigneu una contrasenya per a l'usuari %1 Setting password for user %1. Establint la contrasenya de l'usuari %1. Bad destination system path. Destinació errònia de la ruta del sistema. rootMountPoint is %1 El punt de muntatge rootMountPoint és %1 Cannot disable root account. No es pot inhabilitar el compte d'arrel. passwd terminated with error code %1. El procés passwd ha acabat amb el codi d'error %1. Cannot set password for user %1. No s'ha pogut assignar la contrasenya de l'usuari %1. usermod terminated with error code %1. usermod ha terminat amb el codi d'error %1. SetTimezoneJob Set timezone to %1/%2 Assigna la zona horària a %1/%2 Cannot access selected timezone path. No es pot accedir a la ruta de la zona horària seleccionada. Bad path: %1 Ruta errònia: %1 Cannot set timezone. No es pot assignar la zona horària. Link creation failed, target: %1; link name: %2 Ha fallat la creació del vincle; destinació: %1, nom del vincle: %2 Cannot set timezone, No es pot establir la zona horària, Cannot open /etc/timezone for writing No es pot obrir /etc/timezone per escriure-hi SummaryPage This is an overview of what will happen once you start the install procedure. Això és un resum del que passarà quan s'iniciï el procés d'instal·lació. SummaryViewStep Summary Resum UsersPage Your username is too long. El nom d'usuari és massa llarg. Your username contains invalid characters. Only lowercase letters and numbers are allowed. El nom d'usuari conté caràcters no vàlids. Només s'hi admeten lletres i números. Your hostname is too short. El nom d'usuari és massa curt. Your hostname is too long. El nom d'amfitrió és massa llarg. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. El nom d'amfitrió conté caràcters no vàlids. Només s'hi admeten lletres, números i guions. Your passwords do not match! Les contrasenyes no coincideixen! UsersViewStep Users Usuaris WelcomePage Form Formulari &Language: &Llengua: &Release notes &Notes de la versió &Known issues &Problemes coneguts &Support &Suport &About &Quant a <h1>Welcome to the %1 installer.</h1> <h1>Benvinguts a l'instal·lador %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Us donem la benvinguda a l'instal·lador Calamares per a %1.</h1> About %1 installer Quant a l'instal·lador %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Agraïments: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Equip de traducció del Calamares</a>.<br/><br/><a href="http://calamares.io/">El desenvolupament </a> del Calamares està patrocinat per <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 suport WelcomeViewStep Welcome Benvinguts calamares-3.1.12/lang/calamares_cs_CZ.ts000066400000000000000000003664251322271446000200510ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Zaváděcí prostředí</strong> tohoto systému.<br><br>Starší x86 systémy podporují pouze <strong>BIOS</strong>.<br>Moderní systémy většinou využívají <strong>EFI</strong>, někdy lze toto prostředí přepnout do módu kompatibility a může se jevit jako BIOS. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Systém byl spuštěn se zaváděcím prostředím <strong>EFI</strong>.<br><br>Abyste zaváděli systém prostředím EFI, instalátor musí zavést aplikaci pro zavádění systému, jako <strong>GRUB</strong> nebo <strong>systemd-boot</strong> na <strong>systémovém oddílu EFI</strong>. Proběhne to automaticky, pokud si nezvolíte ruční dělení disku, v tom případě si aplikaci pro zavádění musíte sami zvolit. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Systém byl spuštěn se zaváděcím prostředím <strong>BIOS</strong>.<br><br>Abyste zaváděli systém prostředím BIOS, instalátor musí umístit zavaděč systému, jako <strong>GRUB</strong>, buď na začátek oddílu nebo (lépe) do <strong>Master Boot Record</strong> na začátku tabulky oddílů. Proběhne to automaticky, pokud si nezvolíte ruční dělení disku, v tom případě si zavádění musíte nastavit sami. BootLoaderModel Master Boot Record of %1 Master Boot Record %1 Boot Partition Zaváděcí oddíl System Partition Systémový oddíl Do not install a boot loader Neinstalovat boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulář GlobalStorage Globální úložiště JobQueue Zpracovává se Modules Moduly Type: Typ: none žádný Interface: Rozhraní: Tools Nástroje Debug information Ladící informace Calamares::ExecutionViewStep Install Instalovat Calamares::JobThread Done Hotovo Calamares::ProcessJob Run command %1 %2 Spustit příkaz %1 %2 Running command %1 %2 Spouštím příkaz %1 %2 External command crashed Externí příkaz selhal Command %1 crashed. Output: %2 Příkaz %1 selhal. Výstup: %2 External command failed to start Start externího příkazu selhal Command %1 failed to start. Spuštění příkazu %1 selhalo. Internal error when starting command Vnitřní chyba při spouštění příkazu Bad parameters for process job call. Špatné parametry příkazu. External command failed to finish Dokončení externího příkazu selhalo. Command %1 failed to finish in %2s. Output: %3 Dokončení příkazu %1 selhalo v %2s. Výstup: %3 External command finished with errors Externí příkaz skončil s chybami. Command %1 finished with exit code %2. Output: %3 Příkaz %1 skončil s chybovým kódem %2. Výstup: %3 Calamares::PythonJob Running %1 operation. Spouštím %1 operaci. Bad working directory path Špatná cesta k pracovnímu adresáři. Working directory %1 for python job %2 is not readable. Pracovní adresář %1 pro Python skript %2 není čitelný. Bad main script file Špatný hlavní soubor skriptu. Main script file %1 for python job %2 is not readable. Hlavní soubor %1 pro Python skript %2 není čitelný. Boost.Python error in job "%1". Boost.Python chyba ve skriptu "%1". Calamares::ViewManager &Back &Zpět &Next &Další &Cancel &Zrušit Cancel installation without changing the system. Zrušení instalace bez změny systému. Cancel installation? Přerušit instalaci? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Opravdu chcete přerušit instalaci? Instalační program bude ukončen a všechny změny ztraceny. &Yes &Ano &No &Ne &Close &Zavřít Continue with setup? Pokračovat s instalací? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Instalační program %1 provede změny na disku, aby se nainstaloval %2.<br/><strong>Změny nebude možné vrátit zpět.</strong> &Install now &Spustit instalaci Go &back Jít &zpět &Done &Hotovo The installation is complete. Close the installer. Instalace dokončena. Zavřete instalátor. Error Chyba Installation Failed Instalace selhala CalamaresPython::Helper Unknown exception type Neznámý typ výjimky unparseable Python error Chyba při parsování Python skriptu. unparseable Python traceback Chyba při parsování Python skriptu. Unfetchable Python error. Chyba při načítání Python skriptu. CalamaresWindow %1 Installer %1 Instalátor Show debug information Ukázat ladící informace CheckFileSystemJob Checking file system on partition %1. Kontroluji souborový systém na oddílu %1. The file system check on partition %1 failed. Kontrola souborového systému na oddílu %1 selhala. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Počítač nesplňuje minimální požadavky pro instalaci %1.<br/>Instalace nemůže pokračovat <a href="#details">Detaily...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Počítač nesplňuje některé doporučené požadavky pro instalaci %1.<br/>Instalace může pokračovat, ale některé funkce mohou být vypnuty. This program will ask you some questions and set up %2 on your computer. Tento program Vám bude pokládat otázky a pomůže nainstalovat %2 na Váš počítač. For best results, please ensure that this computer: Proces proběhne nejlépe, když tento počítač: System requirements Požadavky na systém ChoicePage Form Formulář After: Po: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ruční rozdělení disku</strong><br/>Můžete si vytvořit a upravit oddíly sami. Boot loader location: Umístění zaváděcího oddílu: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 bude zmenšen na %2MB a nový %3MB oddíl pro %4 bude vytvořen. Select storage de&vice: Zvolte paměťové zařízení: Current: Aktuální: Reuse %1 as home partition for %2. Opakované použití %1 jako domovský oddíl pro %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Vyberte, který oddíl chcete zmenšit, poté tažením spodní lišty můžete změnit jeho velikost.</strong> <strong>Select a partition to install on</strong> <strong>Vyberte oddíl pro provedení instalace</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Nebyl nalezen žádný systémový EFI oddíl. Prosím, vraťte se zpět a zkuste pro nastavení %1 použít ruční rozdělení disku. The EFI system partition at %1 will be used for starting %2. Pro zavedení %2 se využije systémový oddíl EFI %1. EFI system partition: Systémový oddíl EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Zdá se, že na tomto úložném zařízení není žádný operační systém. Jak chcete postupovat?<br/>Než se provedou jakékoliv změny nastavení Vašich úložných zařízení, ukáže se Vám přehled změn a budete požádáni o jejich potvrzení. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Vymazat disk</strong><br/>Touto volbou <font color="red">smažete</font> všechna data, která se nyní nachází na vybraném úložišti. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Na tomto úložném zařízení jsem našel %1. Jak chcete postupovat?<br/>Než se provedou jakékoliv změny nastavení Vašich úložných zařízení, ukáže se Vám přehled změn a budete požádáni o jejich potvrzení. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalovat vedle</strong><br/>Instalační program zmenší oddíl a vytvoří místo pro %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Nahradit oddíl</strong><br/>Původní oddíl nahradí %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Na tomto úložném zařízení již je operační systém. Jak chcete postupovat?<br/>Než se provedou jakékoliv změny nastavení Vašich úložných zařízení, ukáže se Vám přehled změn a budete požádáni o jejich potvrzení. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Na tomto úložném zařízení již je několik operačních systémů. Jak chcete postupovat?<br/>Než se provedou jakékoliv změny nastavení Vašich úložných zařízení, ukáže se Vám přehled změn a budete požádáni o jejich potvrzení. ClearMountsJob Clear mounts for partitioning operations on %1 Odpojit připojené svazky pro potřeby rozdělení oddílů na %1 Clearing mounts for partitioning operations on %1. Odpojuji připojené svazky pro potřeby rozdělení oddílů na %1 Cleared all mounts for %1 Odpojeny všechny připojené svazky pro %1 ClearTempMountsJob Clear all temporary mounts. Odpojit všechny dočasné přípojné body. Clearing all temporary mounts. Odpojuji všechny dočasné přípojné body. Cannot get list of temporary mounts. Nelze zjistit dočasné přípojné body. Cleared all temporary mounts. Vyčištěno od všech dočasných přípojných bodů. CreatePartitionDialog Create a Partition Vytvořit oddíl MiB MiB Partition &Type: &Typ oddílu: &Primary &Primární E&xtended &Rozšířený Fi&le System: &Souborový systém: Flags: Příznaky: &Mount Point: &Bod připojení: Si&ze: &Velikost: En&crypt Š&ifrovat Logical Logický Primary Primární GPT GPT Mountpoint already in use. Please select another one. Bod připojení je už používán. Prosím vyberte jiný. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Vytvořit nový %2MB oddíl na %4 (%3) se souborovým systémem %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Vytvořit nový <strong>%2MB</strong> oddíl na <strong>%4</strong> (%3) se souborovým systémem <strong>%1</strong>. Creating new %1 partition on %2. Vytvářím nový %1 oddíl na %2. The installer failed to create partition on disk '%1'. Instalátor selhal při vytváření oddílu na disku '%1'. Could not open device '%1'. Nelze otevřít zařízení '%1'. Could not open partition table. Nelze otevřít tabulku oddílů. The installer failed to create file system on partition %1. Instalátor selhal při vytváření souborového systému na oddílu %1. The installer failed to update partition table on disk '%1'. Instalátor selhal při aktualizaci tabulky oddílů na disku '%1'. CreatePartitionTableDialog Create Partition Table Vytvořit tabulku oddílů Creating a new partition table will delete all existing data on the disk. Vytvoření nové tabulky oddílů vymaže všechna data na disku. What kind of partition table do you want to create? Jaký typ tabulky oddílů si přejete vytvořit? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Vytvořit novou %1 tabulku oddílů na %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Vytvořit novou <strong>%1</strong> tabulku oddílů na <strong>%2</strong> (%3). Creating new %1 partition table on %2. Vytvářím novou %1 tabulku oddílů na %2. The installer failed to create a partition table on %1. Instalátor selhal při vytváření tabulky oddílů na %1. Could not open device %1. Nelze otevřít zařízení %1. CreateUserJob Create user %1 Vytvořit uživatele %1 Create user <strong>%1</strong>. Vytvořit uživatele <strong>%1</strong>. Creating user %1. Vytvářím uživatele %1. Sudoers dir is not writable. Nelze zapisovat do adresáře Sudoers. Cannot create sudoers file for writing. Nelze vytvořit soubor sudoers pro zápis. Cannot chmod sudoers file. Nelze použít chmod na soubor sudoers. Cannot open groups file for reading. Nelze otevřít soubor groups pro čtení. Cannot create user %1. Nelze vytvořit uživatele %1. useradd terminated with error code %1. Příkaz useradd ukončen s chybovým kódem %1. Cannot add user %1 to groups: %2. Nelze přidat uživatele %1 do skupin: %2. usermod terminated with error code %1. usermod ukončen s chybovým kódem %1. Cannot set home directory ownership for user %1. Nelze nastavit vlastnictví domovského adresáře pro uživatele %1. chown terminated with error code %1. Příkaz chown ukončen s chybovým kódem %1. DeletePartitionJob Delete partition %1. Smazat oddíl %1. Delete partition <strong>%1</strong>. Smazat oddíl <strong>%1</strong>. Deleting partition %1. Odstraňuje se oddíl %1. The installer failed to delete partition %1. Instalátor selhal při odstraňování oddílu %1. Partition (%1) and device (%2) do not match. Oddíl (%1) a zařížení (%2) si neodpovídají. Could not open device %1. Nelze otevřít zařízení %1. Could not open partition table. Nelze otevřít tabulka oddílů. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Typ <strong>tabulky oddílů</strong>, který je na vybraném úložném zařízení.<br><br>Jedinou možností změnit typ tabulky oddílů je smazání a znovu vytvoření nové tabulky oddílů, tím se smažou všechna data na daném úložném zařízení.<br>Instalační program zanechá stávající typ tabulky oddílů, pokud si sami nenavolíte jeho změnu.<br>Pokud si nejste jisti, na moderních systémech se upřednostňuje GPT. This device has a <strong>%1</strong> partition table. Zařízení má tabulku oddílů <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Vybrané úložné zařízení je <strong>loop</strong> zařízení.<br><br> Nejedná se o vlastní tabulku oddílů, je to pseudo zařízení, které zpřístupňuje soubory blokově. Tento typ nastavení většinou obsahuje jediný systém souborů. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Instalační program <strong>nedetekoval žádnou tabulku oddílů</strong> na vybraném úložném zařízení.<br><br>Toto zařízení buď žádnou tabulku nemá nebo je porušená nebo neznámeho typu.<br> Instalátor Vám může vytvořit novou tabulku oddílů - buď automaticky nebo přes ruční dělení disku. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Tohle je doporučený typ tabulky oddílů pro moderní systémy, které se spouští pomocí <strong>EFI</strong> spouštěcího prostředí. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Tento typ tabulky oddílů je vhodný pro starší systémy, které jsou spouštěny z prostředí <strong>BIOS</strong>. Více se dnes využívá GPT.<br><strong>Upozornění:</strong> Tabulka oddílů MBR je zastaralý standard z dob MS-DOS.<br>Lze vytvořit pouze 4 <em>primární</em> oddíly, a z těchto 4, jeden může být <em>rozšířeným</em> oddílem, který potom může obsahovat více <em>logických</em> oddílů. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Zapsat nastavení LUKS pro Dracut do %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Přeskočit zápis nastavení LUKS pro Dracut: oddíl "/" není šifovaný Failed to open %1 Selhalo čtení %1 DummyCppJob Dummy C++ Job Slepá úloha C++ EditExistingPartitionDialog Edit Existing Partition Upravit existující oddíl Content: Obsah: &Keep &Zachovat Format Formátovat Warning: Formatting the partition will erase all existing data. Varování: Formátování oddílu vymaže všechna data. &Mount Point: &Bod připojení: Si&ze: &Velikost: MiB MiB Fi&le System: &Souborový systém: Flags: Příznaky: Mountpoint already in use. Please select another one. Bod připojení je už používán. Prosím vyberte jiný. EncryptWidget Form Formulář En&crypt system Z&ašifrovat systém Passphrase Heslo: Confirm passphrase Potvrď heslo Please enter the same passphrase in both boxes. Zadejte prosím stejné heslo do obou polí. FillGlobalStorageJob Set partition information Nastavit informace oddílu Install %1 on <strong>new</strong> %2 system partition. Instalovat %1 na <strong>nový</strong> %2 systémový oddíl. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Nastavit <strong>nový</strong> %2 oddíl s přípojným bodem <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalovat %2 na %3 systémový oddíl <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Nastavit %3 oddíl <strong>%1</strong> s přípojným bodem <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalovat zavaděč na <strong>%1</strong>. Setting up mount points. Nastavuji přípojné body. FinishedPage Form Formulář &Restart now &Restartovat nyní <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Instalace je u konce.</h1><br/>%1 byl nainstalován na Váš počítač.<br/>Teď můžete počítač restartovat a přejít do čerstvě naistalovaného systému, nebo můžete pokračovat v práci s živým prostředím %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Instalace selhala</h1><br/>%1 nebyl instalován na váš počítač.<br/>Hlášení o chybě: %2. FinishedViewStep Finish Dokončit Installation Complete Instalace dokončena The installation of %1 is complete. Instalace %1 je dokončena. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formátovat oddíl %1 (souborový systém: %2, velikost %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Naformátovat <strong>%3MB</strong> oddíl <strong>%1</strong> souborovým systémem <strong>%2</strong>. Formatting partition %1 with file system %2. Formátuji oddíl %1 souborovým systémem %2. The installer failed to format partition %1 on disk '%2'. Instalátor selhal při formátování oddílu %1 na disku '%2'. Could not open device '%1'. Nelze otevřít zařízení '%1'. Could not open partition table. Nelze otevřít tabulku oddílů. The installer failed to create file system on partition %1. Instalátor selhal při vytváření systému souborů na oddílu %1. The installer failed to update partition table on disk '%1'. Instalátor selhal při aktualizaci tabulky oddílů na disku '%1'. InteractiveTerminalPage Konsole not installed Konsole není nainstalována. Please install the kde konsole and try again! Prosím naistalujte kde konsoli a zkuste to znovu! Executing script: &nbsp;<code>%1</code> Spouštím skript: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skript KeyboardPage Set keyboard model to %1.<br/> Nastavit model klávesnice na %1.<br/> Set keyboard layout to %1/%2. Nastavit rozložení klávesnice na %1/%2. KeyboardViewStep Keyboard Klávesnice LCLocaleDialog System locale setting Nastavení locale systému The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Nastavené locale systému ovlivňuje jazyk a znakovou sadu pro UI příkazové řádky.<br/>Současné nastavení je <strong>%1</strong>. &Cancel &Zrušit &OK &OK LicensePage Form Formulář I accept the terms and conditions above. Souhlasím s podmínkami uvedenými výše. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licenční ujednání</h1>Tato instalace nainstaluje některý proprietární software, který podléhá licenčním podmínkám. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Prosím projděte si End User License Agreements (EULAs) výše.<br/> Pokud s nimi nesouhlasíte, ukončete instalační proces. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licenční ujednání</h1>Tato instalace může nainstalovat některý proprietární software, který podléhá licenčním podmínkám, aby navíc poskytnul některé funkce a zajistil uživatelskou přivětivost. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Prosím projděte si End User License Agreements (EULAs) výše.<br/> Pokud s nimi nesouhlasíte, místo proprietárního software budou použity open source alternativy. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 ovladač</strong><br/> %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 graphický ovladač</strong><br/><font color="Grey"> %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 doplněk prohlížeče</strong><br/><font color="Grey"> %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 kodek</strong><br/><font color="Grey"> %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 balíček</strong><br/><font color="Grey"> %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey"> %2</font> <a href="%1">view license agreement</a> <a href="%1">zobrazit licenční ujednání</a> LicenseViewStep License Licence LocalePage The system language will be set to %1. Jazyk systému bude nastaven na 1%. The numbers and dates locale will be set to %1. Čísla a data národního prostředí budou nastavena na %1. Region: Oblast: Zone: Pásmo: &Change... &Změnit... Set timezone to %1/%2.<br/> Nastavit časové pásmo na %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Načítání informací o poloze... Location Poloha MoveFileSystemJob Move file system of partition %1. Posunout souborový systém na oddílu %1. Could not open file system on partition %1 for moving. Nelze otevřít souborový systém na oddílu %1 pro přesun. Could not create target for moving file system on partition %1. Nelze vytvořit cíl pro přesouvaný soubor na oddílu %1. Moving of partition %1 failed, changes have been rolled back. Posun oddílu %1 selhalo, změny byly vráceny zpět. Moving of partition %1 failed. Roll back of the changes have failed. Posun oddílu %1 selhalo. Změny nelze vrátit zpět. Updating boot sector after the moving of partition %1 failed. Aktualizace zaváděcího sektoru po přesunu oddílu %1 selhala. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Výchozí a koncová velikost logického sektoru si neodpovídají. Tato operace není v současnosti podporovaná. Source and target for copying do not overlap: Rollback is not required. Zdroj a cíl kopírování se nepřekrývají: Není nutné vracet změny. Could not open device %1 to rollback copying. Nelze otevřít zařízení %1 pro zpětné kopírování. NetInstallPage Name Jméno Description Popis Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Síťová instalace. (Zakázáno: Nelze načíst seznamy balíků, zkontrolujte připojení k síti) NetInstallViewStep Package selection Výběr balíků Page_Keyboard Form Form Keyboard Model: Model klávesnice: Type here to test your keyboard Pište sem pro test klávesnice Page_UserSetup Form Form What is your name? Jak se jmenujete? What name do you want to use to log in? Jaké jméno chcete používat pro přihlašování do systému? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Pokud bude tento počítač používat více lidí, můžete přidat uživatelské účty po dokončení instalace.</small> Choose a password to keep your account safe. Zvolte si heslo pro ochranu svého účtu. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Vložte stejné heslo dvakrát pro kontrolu překlepů. Dobré heslo se bude skládat z písmen, čísel a interpunkce a mělo by být alespoň osm znaků dlouhé. Heslo byste měli pravidelně měnit.</small> What is the name of this computer? Jaké je jméno tohoto počítače? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Tímto jménem se bude počítač zobrazovat ostatním počítačům v síti.</small> Log in automatically without asking for the password. Po spuštění systému se přihlásit automaticky bez hesla. Use the same password for the administrator account. Použít stejné heslo i pro účet administrátora. Choose a password for the administrator account. Zvolte si heslo pro účet administrátora. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Vložte stejné heslo dvakrát pro kontrolu překlepů.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI systém Swap Swap New partition for %1 Nový oddíl pro %1 New partition Nový oddíl %1 %2 %1 %2 PartitionModel Free Space Volné místo New partition Nový oddíl Name Jméno File System Souborový systém Mount Point Přípojný bod Size Velikost PartitionPage Form Form Storage de&vice: Úložné zařízení &Revert All Changes V&rátit všechny změny New Partition &Table Nová &tabulka oddílů &Create &Vytvořit &Edit &Upravit &Delete &Smazat Install boot &loader on: Nainstalovat &zavaděč na: Are you sure you want to create a new partition table on %1? Opravdu si přejete vytvořit novou tabulku oddílů na %1? PartitionViewStep Gathering system information... Shromažďuji informace o systému... Partitions Oddíly Install %1 <strong>alongside</strong> another operating system. Instalovat %1 <strong>vedle</strong> dalšího operačního systému. <strong>Erase</strong> disk and install %1. <strong>Smazat</strong> disk a nainstalovat %1. <strong>Replace</strong> a partition with %1. <strong>Nahradit</strong> oddíl %1. <strong>Manual</strong> partitioning. <strong>Ruční</strong> dělení disku. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalovat %1 <strong>vedle</strong> dalšího operačního systému na disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Smazat</strong> disk <strong>%2</strong> (%3) a instalovat %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Nahradit</strong> oddíl na disku <strong>%2</strong> (%3) %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ruční</strong> dělení disku <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Současný: After: Potom: No EFI system partition configured Není nakonfigurován žádný EFI systémový oddíl An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Pro spuštění %1 je potřeba systémový oddíl.<br/><br/>Pro nastavení EFI systémového oddílu se vraťte zpět a vyberte nebo vytvořte oddíl typu FAT32 s příznakem <strong>esp</strong> a přípojným bodem <strong>%2</strong>.<br/><br/>Je možné pokračovat bez nastavení systémového oddílu EFI, ale váš systém nemusí jít spustit. EFI system partition flag not set Příznak EFI systémového oddílu není nastaven An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Pro spuštění %1 je potřeba systémový oddíl.<br/><br/>Byl nakonfigurován oddíl s přípojným bodem <strong>%2</strong> ale nemá nastaven příznak <strong>esp</strong>.<br/>Pro nastavení příznaku se vraťte zpět a upravte oddíl.<br/><br/>Je možné pokračovat bez nastavení příznaku, ale váš systém nemusí jít spustit. Boot partition not encrypted Zaváděcí oddíl není šifrován A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Kromě šifrovaného kořenového oddílu byl vytvořen i nešifrovaný oddíl zavaděče.<br/><br/>To by mohl být bezpečnostní problém, protože na nešifrovaném oddílu jsou důležité soubory systému.<br/>Pokud chcete, můžete pokračovat, ale odemykání souborového systému bude probíhat později při startu systému.<br/>Pro zašifrování oddílu zavaděče se vraťte a vytvořte ho vybráním možnosti <strong>Šifrovat</strong> v okně při vytváření oddílu. QObject Default Keyboard Model Výchozí model klávesnice Default Výchozí unknown neznámý extended rozšířený unformatted nenaformátovaný swap odkládací oddíl Unpartitioned space or unknown partition table Nerozdělené prázné místo nebo neznámá tabulka oddílů ReplaceWidget Form Formulář Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Vyberte, kam nainstalovat %1.<br/><font color="red">Upozornění: </font>tímto smažete všechny soubory ve vybraném oddílu. The selected item does not appear to be a valid partition. Vybraná položka není platným oddílem. %1 cannot be installed on empty space. Please select an existing partition. %1 nemůže být instalován na místo bez oddílu. Prosím vyberte existující oddíl. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 nemůže být instalován na rozšířený oddíl. Prosím vyberte existující primární nebo logický oddíl. %1 cannot be installed on this partition. %1 nemůže být instalován na tento oddíl. Data partition (%1) Datový oddíl (%1) Unknown system partition (%1) Neznámý systémový oddíl (%1) %1 system partition (%2) %1 systémový oddíl (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Oddíl %1 je příliš malý pro %2. Prosím vyberte oddíl s kapacitou alespoň %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Systémový oddíl EFI nenalezen. Prosím vraťte se a zvolte ruční rozdělení disku pro nastavení %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 bude instalován na %2.<br/><font color="red">Upozornění: </font>všechna data v oddílu %2 budou ztracena. The EFI system partition at %1 will be used for starting %2. Pro zavedení %2 se využije systémový oddíl EFI %1. EFI system partition: Systémový oddíl EFI: RequirementsChecker Gathering system information... Shromažďuji informace o systému... has at least %1 GB available drive space má minimálně %1 GB dostupného místa na disku. There is not enough drive space. At least %1 GB is required. Nedostatek místa na disku. Je potřeba nejméně %1 GB. has at least %1 GB working memory má alespoň %1 GB operační paměti The system does not have enough working memory. At least %1 GB is required. Systém nemá dostatek paměti. Je potřeba nejméně %1 GB. is plugged in to a power source je připojený ke zdroji napájení The system is not plugged in to a power source. Systém není připojen ke zdroji napájení. is connected to the Internet je připojený k Internetu The system is not connected to the Internet. Systém není připojený k Internetu. The installer is not running with administrator rights. Instalační program není spuštěn s právy administrátora. The screen is too small to display the installer. Obrazovka je příliš malá pro zobrazení instalátoru. ResizeFileSystemJob Resize file system on partition %1. Změnit velikost systému souborů na oddílu %1. Parted failed to resize filesystem. Parted selhal při změně velikosti systému souborů. Failed to resize filesystem. Selhala změna velikosti souborového systému. ResizePartitionJob Resize partition %1. Změnit velikost oddílu %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Změnit velikost <strong>%2MB</strong> oddílu <strong>%1</strong> na <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Měním velikost %2MB oddílu %1 na %3MB. The installer failed to resize partition %1 on disk '%2'. Instalátor selhal při změně velikosti oddílu %1 na disku '%2'. Could not open device '%1'. Nelze otevřít zařízení '%1'. ScanningDialog Scanning storage devices... Skenuji úložná zařízení... Partitioning Dělení disku SetHostNameJob Set hostname %1 Nastavit jméno počítače %1 Set hostname <strong>%1</strong>. Nastavit hostname <strong>%1</strong>. Setting hostname %1. Nastavuji hostname %1. Internal Error Vnitřní chyba Cannot write hostname to target system Nelze zapsat jméno počítače na cílový systém SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Nastavit model klávesnice na %1, rozložení na %2-%3 Failed to write keyboard configuration for the virtual console. Selhal zápis konfigurace klávesnice do virtuální konzole. Failed to write to %1 Selhal zápis do %1 Failed to write keyboard configuration for X11. Selhal zápis konfigurace klávesnice pro X11. Failed to write keyboard configuration to existing /etc/default directory. Selhal zápis nastavení klávesnice do existující složky /etc/default. SetPartFlagsJob Set flags on partition %1. Nastavit příznak oddílu %1. Set flags on %1MB %2 partition. Nastavit příznaky na %1MB %2 oddílu. Set flags on new partition. Nastavit příznak na novém oddílu. Clear flags on partition <strong>%1</strong>. Smazat příznaky oddílu <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Smazat příznaky na %1MB <strong>%2</strong> oddílu. Clear flags on new partition. Smazat příznaky na novém oddílu. Flag partition <strong>%1</strong> as <strong>%2</strong>. Nastavit příznak oddílu <strong>%1</strong> jako <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Nastavit příznak %1MB <strong>%2</strong> oddílu jako <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Nastavit příznak <strong>%1</strong> na novém oddílu. Clearing flags on partition <strong>%1</strong>. Mazání příznaků oddílu <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Mazání příznaků na %1MB <strong>%2</strong> oddílu. Clearing flags on new partition. Mazání příznaků na novém oddílu. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Nastavování příznaků <strong>%2</strong> na oddíle <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Nastavování příznaků <strong>%3</strong> na %1MB <strong>%2</strong> oddílu. Setting flags <strong>%1</strong> on new partition. Nastavování příznaků <strong>%1</strong> na novém oddílu. The installer failed to set flags on partition %1. Instalátor selhal při nastavení příznaku oddílu %1. Could not open device '%1'. Nelze otevřít zařízení '%1'. Could not open partition table on device '%1'. Nelze otevřít tabulku oddílů na zařízení '%1'. Could not find partition '%1'. Oddíl '%1' nebyl nalezen. SetPartGeometryJob Update geometry of partition %1. Aktualizovat geometrii oddílu %1. Failed to change the geometry of the partition. Selhala změna geometrie oddílu. SetPasswordJob Set password for user %1 Nastavit heslo pro uživatele %1 Setting password for user %1. Nastavuji heslo pro uživatele %1. Bad destination system path. Špatná cílová systémová cesta. rootMountPoint is %1 rootMountPoint je %1 Cannot disable root account. Nelze zakázat účet root. passwd terminated with error code %1. Příkaz passwd ukončen s chybovým kódem %1. Cannot set password for user %1. Nelze nastavit heslo uživatele %1. usermod terminated with error code %1. usermod ukončen s chybovým kódem %1. SetTimezoneJob Set timezone to %1/%2 Nastavit časové pásmo na %1/%2 Cannot access selected timezone path. Není přístup k vybrané cestě časové zóny. Bad path: %1 Špatná cesta: %1 Cannot set timezone. Nelze nastavit časovou zónu. Link creation failed, target: %1; link name: %2 Vytváření odkazu selhalo, cíl: %1; jméno odkazu: %2 Cannot set timezone, Nelze nastavit časovou zónu. Cannot open /etc/timezone for writing Nelze otevřít /etc/timezone pro zápis SummaryPage This is an overview of what will happen once you start the install procedure. Tohle je přehled událostí instalačního procesu. SummaryViewStep Summary Shrnutí UsersPage Your username is too long. Vaše uživatelské jméno je příliš dlouhé. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Vaše uživatelské jméno obsahuje neplatné znaky. Jsou povolena pouze malá písmena a čísla. Your hostname is too short. Vaše hostname je příliš krátké. Your hostname is too long. Vaše hostname je příliš dlouhé. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Vaše hostname obsahuje neplatné znaky. Jsou povoleny pouze písmena, čísla a pomlčky. Your passwords do not match! Zadaná hesla se neshodují! UsersViewStep Users Uživatelé WelcomePage Form Formulář &Language: &Jazyk &Release notes &Poznámky k vydání &Known issues &Známé problémy &Support &Podpora &About &O nás <h1>Welcome to the %1 installer.</h1> <h1>Vítejte v instalačním programu %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Vítá vás instalační program Calamares pro %1.</h1> About %1 installer O instalačním programu %1. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Překladatelský tým Calamares</a>.<br/><br/>Vývoj <a href="http://calamares.io/">Calamares</a> je podporován <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 podpora WelcomeViewStep Welcome Vítejte calamares-3.1.12/lang/calamares_da.ts000066400000000000000000003652221322271446000174260ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Bootmiljøet</strong> for dette system.<br><br>Ældre x86-systemer understøtter kun <strong>BIOS</strong>.<br>Moderne systemer bruger normalt <strong>EFI</strong>, men kan også vises som BIOS hvis det startes i kompatibilitetstilstand. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Dette system blev startet med et <strong>EFI</strong>-bootmiljø.<br><br>For at konfigurere opstart fra et EFI-miljø, bliver installationsprogrammet nødt til at installere et bootloaderprogram, såsom <strong>GRUB</strong> eller <strong>systemd-boot</strong> på en <strong>EFI-systempartition</strong>. Dette vil ske automatisk, med mindre du vælger manuel partitionering, hvor du i så fald skal vælge eller oprette den selv. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Dette system blev startet med et <strong>BIOS</strong>-bootmiljø.<br><br>For at konfigurere opstart fra et BIOS-miljø, bliver installationsprogrammet nødt til at installere en bootloader, såsom <strong>GRUB</strong>, enten i begyndelsen af en partition eller på <strong>Master Boot Record</strong> nær begyndelsen af partitionstabellen (foretrukket). Dette sker automatisk, med mindre du vælger manuel partitionering, hvor du i så fald skal opsætte den selv. BootLoaderModel Master Boot Record of %1 Master Boot Record af %1 Boot Partition Bootpartition System Partition Systempartition Do not install a boot loader Installér ikke en bootloader %1 (%2) %1 (%2) Calamares::DebugWindow Form Formular GlobalStorage Globalt lager JobQueue Jobkø Modules Moduler Type: Type: none ingen Interface: Grænseflade: Tools Værktøjer Debug information Fejlretningsinformation Calamares::ExecutionViewStep Install Installation Calamares::JobThread Done Færdig Calamares::ProcessJob Run command %1 %2 Kør kommando %1 %2 Running command %1 %2 Kører kommando %1 %2 External command crashed Ekstern kommando holdt op med at virke Command %1 crashed. Output: %2 Kommando %1 holdt op med at virke. Output: %2 External command failed to start Start af ekstern kommando mislykkedes Command %1 failed to start. Start af kommando %1 mislykkedes. Internal error when starting command Intern fejl ved start af kommando Bad parameters for process job call. Ugyldige parametre til kald af procesjob. External command failed to finish Ekstern kommando kunne ikke færdiggøres Command %1 failed to finish in %2s. Output: %3 Kommando %1 kunne ikke færdiggøres på %2 s. Output: %3 External command finished with errors Ekstern kommando blev færdiggjort med fejl Command %1 finished with exit code %2. Output: %3 Kommando %1 blev færdiggjort med afslutningskode %2. Output: %3 Calamares::PythonJob Running %1 operation. Kører %1-handling. Bad working directory path Ugyldig arbejdsmappesti Working directory %1 for python job %2 is not readable. Arbejdsmappe %1 for python-job %2 er ikke læsbar. Bad main script file Ugyldig primær skriptfil Main script file %1 for python job %2 is not readable. Primær skriptfil %1 for python-job %2 er ikke læsbar. Boost.Python error in job "%1". Boost.Python-fejl i job "%1". Calamares::ViewManager &Back &Tilbage &Next &Næste &Cancel &Annullér Cancel installation without changing the system. Annullér installation uden at ændre systemet. Cancel installation? Annullér installationen? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Vil du virkelig annullere den igangværende installationsproces? Installationsprogrammet vil stoppe og alle ændringer vil gå tabt. &Yes &Ja &No &Nej &Close &Luk Continue with setup? Fortsæt med installation? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1-installationsprogrammet er ved at lave ændringer til din disk for at installere %2. <br/><strong>Det vil ikke være muligt at fortryde disse ændringer.</strong> &Install now &Installér nu Go &back Gå &tilbage &Done &Færdig The installation is complete. Close the installer. Installationen er fuldført. Luk installationsprogrammet. Error Fejl Installation Failed Installation mislykkedes CalamaresPython::Helper Unknown exception type Ukendt undtagelsestype unparseable Python error Python-fejl som ikke kan fortolkes unparseable Python traceback Python-traceback som ikke kan fortolkes Unfetchable Python error. Python-fejl som ikke kan hentes. CalamaresWindow %1 Installer %1-installationsprogram Show debug information Vis fejlretningsinformation CheckFileSystemJob Checking file system on partition %1. Tjekker filsystem på partition %1. The file system check on partition %1 failed. Filsystemtjek på partition %1 mislykkedes. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Denne computer møder ikke minimumsystemkravene for at installere %1.<br/>Installationen kan ikke fortsætte. <a href="#details">Detaljer...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Denne computer møder ikke nogle af de anbefalede systemkrav for at installere %1.<br/>Installationen kan fortsætte, men nogle funktionaliteter kan være deaktiveret. This program will ask you some questions and set up %2 on your computer. Dette program vil stille dig nogle spørgsmål og opsætte %2 på din computer. For best results, please ensure that this computer: For det bedste resultat sørg venligst for at denne computer: System requirements Systemkrav ChoicePage Form Formular After: Efter: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Manuel partitionering</strong><br/>Du kan selv oprette og ændre størrelse på partitioner. Boot loader location: Bootloaderplacering: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 vil blive skrumpet til %2 MB og en ny %3 MB partition vil blive oprettet for %4. Select storage de&vice: Vælg lageren&hed: Current: Nuværende: Reuse %1 as home partition for %2. Genbrug %1 som hjemmepartition til %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Vælg en partition der skal mindskes, træk herefter den nederste bjælke for at ændre størrelsen</strong> <strong>Select a partition to install on</strong> <strong>Vælg en partition at installere på</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. En EFI-partition blev ikke fundet på systemet. Gå venligst tilbage og brug manuel partitionering til at opsætte %1. The EFI system partition at %1 will be used for starting %2. EFI-systempartitionen ved %1 vil blive brugt til at starte %2. EFI system partition: EFI-systempartition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denne lagerenhed ser ikke ud til at indeholde et styresystem. Hvad ønsker du at gøre?<br/>Du vil få mulighed for at se og bekræfte dine valg før der sker ændringer til lagerenheden. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Slet disk</strong><br/>Dette vil <font color="red">slette</font> alt data der er på den valgte lagerenhed. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denne lagerenhed har %1 på sig. Hvad ønsker du at gøre?<br/>Du vil få mulighed for at se og bekræfte dine valg før det sker ændringer til lagerenheden. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Installér ved siden af</strong><br/>Installationsprogrammet vil mindske en partition for at gøre plads til %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Erstat en partition</strong><br/>Erstatter en partition med %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denne lagerenhed indeholder allerede et styresystem. Hvad ønsker du at gøre?<br/>Du vil få mulighed for at se og bekræfte dine valg før der sker ændringer til lagerenheden. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denne lagerenhed indeholder flere styresystemer. Hvad ønsker du at gøre?<br/>Du vil få mulighed for at se og bekræfte dine valg før der sker ændringer til lagerenheden. ClearMountsJob Clear mounts for partitioning operations on %1 Ryd monteringspunkter for partitioneringshandlinger på %1 Clearing mounts for partitioning operations on %1. Rydder monteringspunkter for partitioneringshandlinger på %1. Cleared all mounts for %1 Ryddede alle monteringspunkter til %1 ClearTempMountsJob Clear all temporary mounts. Ryd alle midlertidige monteringspunkter. Clearing all temporary mounts. Rydder alle midlertidige monteringspunkter. Cannot get list of temporary mounts. Kan ikke få liste over midlertidige monteringspunkter. Cleared all temporary mounts. Rydder alle midlertidige monteringspunkter. CreatePartitionDialog Create a Partition Opret en partition MiB MiB Partition &Type: Partitions&type: &Primary &Primær E&xtended &Udvidet Fi&le System: Fi&lsystem: Flags: Flag: &Mount Point: &Monteringspunkt: Si&ze: &Størrelse: En&crypt Kryp&tér Logical Logisk Primary Primær GPT GPT Mountpoint already in use. Please select another one. Monteringspunktet er allerede i brug. Vælg venligst et andet. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Opret en ny %2 MB partition på %4 (%3) med %1-filsystem. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Opret en ny <strong>%2 MB</strong> partition på <strong>%4</strong> (%3) med <strong>%1</strong>-filsystem. Creating new %1 partition on %2. Opretter ny %1 partition på %2. The installer failed to create partition on disk '%1'. Installationsprogrammet kunne ikke oprette partition på disk '%1'. Could not open device '%1'. Kunne ikke åbne enhed '%1'. Could not open partition table. Kunne ikke åbne partitionstabel. The installer failed to create file system on partition %1. Installationsprogrammet kunne ikke oprette filsystem på partition %1. The installer failed to update partition table on disk '%1'. Installationsprogrammet kunne ikke opdatere partitionstabel på disk '%1'. CreatePartitionTableDialog Create Partition Table Opret partitionstabel Creating a new partition table will delete all existing data on the disk. Oprettelse af en ny partitionstabel vil slette alle data på disken. What kind of partition table do you want to create? Hvilken slags partitionstabel vil du oprette? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID-partitiontabel (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Opret en ny %1 partitionstabel på %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Opret en ny <strong>%1</strong> partitionstabel på <strong>%2</strong> (%3). Creating new %1 partition table on %2. Opretter ny %1-partitionstabel på %2. The installer failed to create a partition table on %1. Installationsprogrammet kunne ikke oprette en partitionstabel på %1. Could not open device %1. Kunne ikke åbne enhed %1. CreateUserJob Create user %1 Opret bruger %1 Create user <strong>%1</strong>. Opret bruger <strong>%1</strong>. Creating user %1. Opretter bruger %1. Sudoers dir is not writable. Sudoers mappe er skrivebeskyttet. Cannot create sudoers file for writing. Kan ikke oprette sudoers fil til skrivning. Cannot chmod sudoers file. Kan ikke chmod sudoers fil. Cannot open groups file for reading. Kan ikke åbne gruppernes fil til læsning. Cannot create user %1. Kan ikke oprette bruger %1. useradd terminated with error code %1. useradd stoppet med fejlkode %1. Cannot add user %1 to groups: %2. Kan ikke tilføje bruger %1 til grupperne: %2. usermod terminated with error code %1. usermod stoppet med fejlkode %1. Cannot set home directory ownership for user %1. Kan ikke sætte hjemmemappens ejerskab for bruger %1. chown terminated with error code %1. chown stoppet med fejlkode %1. DeletePartitionJob Delete partition %1. Slet partition %1. Delete partition <strong>%1</strong>. Slet partition <strong>%1</strong>. Deleting partition %1. Sletter partition %1. The installer failed to delete partition %1. Installationsprogrammet kunne ikke slette partition %1. Partition (%1) and device (%2) do not match. Partition (%1) og enhed (%2) matcher ikke. Could not open device %1. Kunne ikke åbne enhed %1. Could not open partition table. Kunne ikke åbne partitionstabel. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Typen af <strong>partitionstabel</strong> på den valgte lagerenhed.<br><br>Den eneste måde at ændre partitionstabeltypen, er at slette og oprette partitionstabellen igen, hvilket vil destruere al data på lagerenheden.<br>Installationsprogrammet vil beholde den nuværende partitionstabel medmindre du specifikt vælger andet.<br>Hvis usikker, er GPT foretrukket på moderne systemer. This device has a <strong>%1</strong> partition table. Denne enhed har en <strong>%1</strong> partitionstabel. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Dette er en <strong>loop</strong>-enhed.<br><br>Det er en pseudo-enhed uden en partitionstabel, der gør en fil tilgængelig som en blokenhed. Denne type opsætning indeholder typisk kun et enkelt filsystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Installationsprogrammet <strong>kan ikke finde en partitionstabel</strong> på den valgte lagerenhed.<br><br>Enten har enheden ikke nogen partitionstabel, eller partitionstabellen er ødelagt eller også er den af en ukendt type.<br>Installationsprogrammet kan oprette en ny partitionstabel for dig, enten automatisk, eller igennem den manuelle partitioneringsside. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Dette er den anbefalede partitionstabeltype til moderne systemer som starter fra et <strong>EFI</strong>-bootmiljø. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Denne partitionstabeltype er kun anbefalet på ældre systemer der starter fra et <strong>BIOS</strong>-bootmiljø. GPT anbefales i de fleste tilfælde.<br><br><strong>Advarsel:</strong> MBR-partitionstabeltypen er en forældet MS-DOS-æra standard.<br>Kun 4 <em>primære</em> partitioner var tilladt, og ud af de fire kan én af dem være en <em>udvidet</em> partition, som igen må indeholde mange <em>logiske</em> partitioner. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skriv LUKS-konfiguration for Dracut til %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Spring skrivning af LUKS-konfiguration over for Dracut: "/"-partitionen er ikke krypteret Failed to open %1 Kunne ikke åbne %1 DummyCppJob Dummy C++ Job Dummy C++-job EditExistingPartitionDialog Edit Existing Partition Redigér eksisterende partition Content: Indhold: &Keep &Behold Format Formatér Warning: Formatting the partition will erase all existing data. Advarsel: Formatering af partitionen vil slette alle eksisterende data. &Mount Point: &Monteringspunkt: Si&ze: Stø&rrelse: MiB MiB Fi&le System: Fi&lsystem: Flags: Flag: Mountpoint already in use. Please select another one. Monteringspunktet er allerede i brug. Vælg venligst et andet. EncryptWidget Form Formular En&crypt system Kryp&tér system Passphrase Adgangskode Confirm passphrase Bekræft adgangskode Please enter the same passphrase in both boxes. Indtast venligst samme adgangskode i begge bokse. FillGlobalStorageJob Set partition information Sæt partitionsinformation Install %1 on <strong>new</strong> %2 system partition. Installér %1 på <strong>nye</strong> %2-systempartition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Opsæt den <strong>nye</strong> %2 partition med monteringspunkt <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Installér %2 på %3-systempartition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Opsæt %3 partition <strong>%1</strong> med monteringspunkt <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installér bootloader på <strong>%1</strong>. Setting up mount points. Opsætter monteringspunkter. FinishedPage Form Formular &Restart now &Genstart nu <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Færdig.</h1><br/>%1 er blevet installeret på din computer.<br/>Du kan nu genstarte for at komme ind i dit nye system eller fortsætte med at bruge %2 live-miljøet. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installation mislykkede</h1><br/>%1 er ikke blevet installeret på din computer.<br/>Fejlmeddelelsen var: %2. FinishedViewStep Finish Færdig Installation Complete Installation fuldført The installation of %1 is complete. Installationen af %1 er fuldført. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatér partition %1 (filsystem: %2, størrelse: %3 MB) på %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatér <strong>%3 MB</strong> partition <strong>%1</strong> med <strong>%2</strong>-filsystem. Formatting partition %1 with file system %2. Formatterer partition %1 med %2-filsystem. The installer failed to format partition %1 on disk '%2'. Installationsprogrammet kunne ikke formatere partition %1 på disk '%2'. Could not open device '%1'. Kunne ikke åbne enhed '%1'. Could not open partition table. Kunne ikke åbne partitionstabel. The installer failed to create file system on partition %1. Installationsprogrammet kunne ikke oprette filsystem på partition %1. The installer failed to update partition table on disk '%1'. Installationsprogrammet kunne ikke opdatere partitionstabel på disk '%1'. InteractiveTerminalPage Konsole not installed Konsole er ikke installeret Please install the kde konsole and try again! Installér venligst kde-konsolen og prøv igen! Executing script: &nbsp;<code>%1</code> Eksekverer skript: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skript KeyboardPage Set keyboard model to %1.<br/> Sæt tastaturmodel til %1.<br/> Set keyboard layout to %1/%2. Sæt tastaturlayout til %1/%2. KeyboardViewStep Keyboard Tastatur LCLocaleDialog System locale setting Systemets lokalitetsindstilling The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Systemets lokalitetsindstilling har indflydelse på sproget og tegnsættet for nogle kommandolinje-brugerelementer.<br/>Den nuværende indstilling er <strong>%1</strong>. &Cancel &Annullér &OK &OK LicensePage Form Formular I accept the terms and conditions above. Jeg accepterer de ovenstående vilkår og betingelser. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licensaftale</h1>Denne installationsprocedure vil installere proprietær software der er underlagt licenseringsvilkår. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Gennemgå venligst slutbrugerlicensaftalerne (EULA'er) ovenfor.<br/>Hvis du ikke er enig med disse vilkår, kan installationen ikke fortsætte. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licensaftale</h1>Denne installationsprocedure kan installere proprietær software der er underlagt licenseringsvilkår, for at kunne tilbyde yderligere funktionaliteter og forbedre brugeroplevelsen. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Gennemgå venligst slutbrugerlicensaftalerne (EULA'er) ovenfor.<br/>Hvis du ikke er enig med disse vilkår vil der ikke blive installeret proprietær software, og open source-alternativer vil blive brugt i stedet. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>af %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafikdriver</strong><br/><font color="Grey">af %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 browser-plugin</strong><br/><font color="Grey">af %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">af %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pakke</strong><br/><font color="Grey">af %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">af %2</font> <a href="%1">view license agreement</a> <a href="%1">vis licensaftalen</a> LicenseViewStep License Licens LocalePage The system language will be set to %1. Systemsproget vil blive sat til %1. The numbers and dates locale will be set to %1. Lokalitet for tal og datoer vil blive sat til %1. Region: Region: Zone: Zone: &Change... &Skift... Set timezone to %1/%2.<br/> Sæt tidszone til %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Indlæser placeringsdata... Location Placering MoveFileSystemJob Move file system of partition %1. Flyt filsystem af partition %1. Could not open file system on partition %1 for moving. Kunne ikke åbne filsystem på partition %1 til flytning. Could not create target for moving file system on partition %1. Kunne ikke oprette destination til flytning af filsystem på partition %1. Moving of partition %1 failed, changes have been rolled back. Flytning af partition %1 mislykkedes, ændringer er tilbageført. Moving of partition %1 failed. Roll back of the changes have failed. Flytning af partition %1 mislykkedes. Tilbageføring af ændringerne mislykkedes. Updating boot sector after the moving of partition %1 failed. Opdatering af bootsektor efter flytning af partition %1 mislykkedes. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. De logiske sektorstørrelser for kilden og destination for kopiering er ikke ens. Det understøttes ikke på nuværende tidspunkt. Source and target for copying do not overlap: Rollback is not required. Kilde og destination for kopiering overlapper ikke: Tilbageføring ikke påkrævet. Could not open device %1 to rollback copying. Kunne ikke åbne enhed %1 til tilbageføring af kopiering. NetInstallPage Name Navn Description Beskrivelse Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Netværksinstallation. (Deaktiveret: Kunne ikke hente pakkelister, tjek din netværksforbindelse) NetInstallViewStep Package selection Valg af pakke Page_Keyboard Form Formular Keyboard Model: Tastaturmodel: Type here to test your keyboard Skriv her for at teste dit tastatur Page_UserSetup Form Formular What is your name? Hvad er dit navn? What name do you want to use to log in? Hvilket navn vil du bruge til at logge ind med? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Hvis mere end én person vil bruge denne computer, kan du opsætte flere konti efter installationen.</small> Choose a password to keep your account safe. Vælg en adgangskode for at beskytte din konto. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Skriv den samme adgangskode to gange, så det kan blive tjekket for skrivefejl. En god adgangskode indeholder en blanding af bogstaver, tal og specialtegn, og bør være mindst 8 tegn langt og bør skiftes jævnligt.</small> What is the name of this computer? Hvad er navnet på denne computer? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Dette navn vil blive brugt, hvis du gør computeren synlig for andre på netværket.</small> Log in automatically without asking for the password. Log ind automatisk uden at spørge om adgangskoden. Use the same password for the administrator account. Brug den samme adgangskode til administratorkontoen. Choose a password for the administrator account. Vælg en adgangskode til administratorkontoen. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Skriv den samme adgangskode to gange, så det kan blive tjekket for skrivefejl.</small> PartitionLabelsView Root Rod Home Hjem Boot Boot EFI system EFI-system Swap Swap New partition for %1 Ny partition til %1 New partition Ny partition %1 %2 %1 %2 PartitionModel Free Space Ledig plads New partition Ny partition Name Navn File System Filsystem Mount Point Monteringspunkt Size Størrelse PartitionPage Form Formular Storage de&vice: Lageren&hed: &Revert All Changes &Tilbagefør alle ændringer New Partition &Table Ny partitions&tabel &Create &Opret &Edit &Redigér &Delete &Slet Install boot &loader on: Installér boot&loader på: Are you sure you want to create a new partition table on %1? Er du sikker på, at du vil oprette en ny partitionstabel på %1? PartitionViewStep Gathering system information... Indsamler systeminformation... Partitions Partitioner Install %1 <strong>alongside</strong> another operating system. Installér %1 <strong>ved siden af</strong> et andet styresystem. <strong>Erase</strong> disk and install %1. <strong>Slet</strong> disk og installér %1. <strong>Replace</strong> a partition with %1. <strong>Erstat</strong> en partition med %1. <strong>Manual</strong> partitioning. <strong>Manuel</strong> partitionering. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Installér %1 <strong>ved siden af</strong> et andet styresystem på disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Slet</strong> disk <strong>%2</strong> (%3) og installér %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Erstat</strong> en partition på disk <strong>%2</strong> (%3) med %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manuel</strong> partitionering på disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Nuværende: After: Efter: No EFI system partition configured Ingen EFI-systempartition konfigureret An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. En EFI-systempartition er nødvendig for at starte %1.<br/><br/>For at konfigurere en EFI-systempartition skal du gå tilbage og vælge eller oprette et FAT32-filsystem med <strong>esp</strong>-flaget aktiveret og monteringspunkt <strong>%2</strong>.<br/><br/>Du kan fortsætte uden at opsætte en EFI-systempartition, men dit system vil muligvis ikke kunne starte. EFI system partition flag not set EFI-systempartitionsflag ikke sat An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. En EFI-systempartition er nødvendig for at starte %1.<br/><br/>En partition var konfigureret med monteringspunkt <strong>%2</strong>, men dens <strong>esp</strong>-flag var ikke sat.<br/>For at sætte flaget skal du gå tilbage og redigere partitionen.<br/><br/>Du kan fortsætte uden at konfigurere flaget, men dit system vil muligvis ikke kunne starte. Boot partition not encrypted Bootpartition ikke krypteret A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. En separat bootpartition blev opsat sammen med en krypteret rodpartition, men bootpartitionen er ikke krypteret.<br/><br/>Der er sikkerhedsmæssige bekymringer med denne type opsætning, da vigtige systemfiler er gemt på en ikke-krypteret partition.<br/>Du kan fortsætte hvis du vil, men oplåsning af filsystemet sker senere under systemets opstart.<br/>For at kryptere bootpartitionen skal du gå tilbage og oprette den igen, vælge <strong>Kryptér</strong> i partitionsoprettelsesvinduet. QObject Default Keyboard Model Standardtastaturmodel Default Standard unknown ukendt extended udvidet unformatted uformatteret swap swap Unpartitioned space or unknown partition table Upartitioneret plads eller ukendt partitionstabel ReplaceWidget Form Formular Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Vælg hvor %1 skal installeres.<br/><font color="red">Advarsel: </font>Dette vil slette alle filer på den valgte partition. The selected item does not appear to be a valid partition. Det valgte emne ser ikke ud til at være en gyldig partition. %1 cannot be installed on empty space. Please select an existing partition. %1 kan ikke installeres på tom plads. Vælg venligst en eksisterende partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 kan ikke installeres på en udvidet partition. Vælg venligst en eksisterende primær eller logisk partition. %1 cannot be installed on this partition. %1 kan ikke installeres på denne partition. Data partition (%1) Datapartition (%1) Unknown system partition (%1) Ukendt systempartition (%1) %1 system partition (%2) %1-systempartition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partitionen %1 er for lille til %2. Vælg venligst en partition med mindst %3 GiB plads. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>En EFI-systempartition kunne ikke findes på systemet. Gå venligst tilbage og brug manuel partitionering til at opsætte %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 vil blive installeret på %2.<br/><font color="red">Advarsel: </font>Al data på partition %2 vil gå tabt. The EFI system partition at %1 will be used for starting %2. EFI-systempartitionen ved %1 vil blive brugt til at starte %2. EFI system partition: EFI-systempartition: RequirementsChecker Gathering system information... Indsamler systeminformation... has at least %1 GB available drive space har mindst %1 GB ledig plads på drevet There is not enough drive space. At least %1 GB is required. Der er ikke nok ledig plads på drevet. Mindst %1 GB er påkrævet. has at least %1 GB working memory har mindst %1 GB arbejdshukommelse The system does not have enough working memory. At least %1 GB is required. Systemet har ikke nok arbejdshukommelse. Mindst %1 GB er påkrævet. is plugged in to a power source er tilsluttet en strømkilde The system is not plugged in to a power source. Systemet er ikke tilsluttet en strømkilde. is connected to the Internet er forbundet til internettet The system is not connected to the Internet. Systemet er ikke forbundet til internettet. The installer is not running with administrator rights. Installationsprogrammet kører ikke med administratorrettigheder. The screen is too small to display the installer. Skærmen er for lille til at vise installationsprogrammet. ResizeFileSystemJob Resize file system on partition %1. Ændr størrelse af filsystem på partition %1. Parted failed to resize filesystem. Parted kunne ikke ændre størrelse på filsystem. Failed to resize filesystem. Kunne ikke ændre størrelse på filsystem. ResizePartitionJob Resize partition %1. Ændr størrelse på partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Ændr størrelse af <strong>%2 MB</strong> partition <strong>%1</strong> til <strong>%3 MB</strong>. Resizing %2MB partition %1 to %3MB. Ændrer nu størrelsen af %2 MB partition %1 til %3 MB. The installer failed to resize partition %1 on disk '%2'. Installationsprogrammet kunne ikke ændre størrelse på partition %1 på disk '%2'. Could not open device '%1'. Kunne ikke åbne enhed '%1'. ScanningDialog Scanning storage devices... Skanner lagerenheder... Partitioning Partitionering SetHostNameJob Set hostname %1 Sæt værtsnavn %1 Set hostname <strong>%1</strong>. Sæt værtsnavn <strong>%1</strong>. Setting hostname %1. Sætter værtsnavn %1. Internal Error Intern fejl Cannot write hostname to target system Kan ikke skrive værtsnavn til destinationssystem SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Sæt tastaturmodel til %1, layout til %2-%3 Failed to write keyboard configuration for the virtual console. Kunne ikke skrive tastaturkonfiguration for den virtuelle konsol. Failed to write to %1 Kunne ikke skrive til %1 Failed to write keyboard configuration for X11. Kunne ikke skrive tastaturkonfiguration for X11. Failed to write keyboard configuration to existing /etc/default directory. Kunne ikke skrive tastaturkonfiguration til eksisterende /etc/default-mappe. SetPartFlagsJob Set flags on partition %1. Sæt flag på partition %1. Set flags on %1MB %2 partition. Sæt flag på %1 MB %2 partition. Set flags on new partition. Sæt flag på ny partition. Clear flags on partition <strong>%1</strong>. Ryd flag på partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Ryd flag på %1 MB <strong>%2</strong> partition. Clear flags on new partition. Ryd flag på ny partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag partition <strong>%1</strong> som <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag %1 MB <strong>%2</strong> partition som <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Flag ny partition som <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Rydder flag på partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Rydder flag på %1 MB <strong>%2</strong> partition. Clearing flags on new partition. Rydder flag på ny partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Sætter flag <strong>%2</strong> på partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Sætter flag <strong>%3</strong> på %1 MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. Sætter flag <strong>%1</strong> på ny partition. The installer failed to set flags on partition %1. Installationsprogrammet kunne ikke sætte flag på partition %1. Could not open device '%1'. Kunne ikke åbne enhed '%1'. Could not open partition table on device '%1'. Kunne ikke åbne partitionstabel på enhed '%1'. Could not find partition '%1'. Kunne ikke finde partition '%1'. SetPartGeometryJob Update geometry of partition %1. Opdatér %1-partitions geometri. Failed to change the geometry of the partition. Kunne ikke ændre partitionens geometri. SetPasswordJob Set password for user %1 Sæt adgangskode for bruger %1 Setting password for user %1. Sætter adgangskode for bruger %1. Bad destination system path. Ugyldig destinationssystemsti. rootMountPoint is %1 rodMonteringsPunkt er %1 Cannot disable root account. Kan ikke deaktivere root-konto. passwd terminated with error code %1. passwd stoppet med fejlkode %1. Cannot set password for user %1. Kan ikke sætte adgangskode for bruger %1. usermod terminated with error code %1. usermod stoppet med fejlkode %1. SetTimezoneJob Set timezone to %1/%2 Sæt tidszone til %1/%2 Cannot access selected timezone path. Kan ikke tilgå den valgte tidszonesti. Bad path: %1 Ugyldig sti: %1 Cannot set timezone. Kan ikke sætte tidszone. Link creation failed, target: %1; link name: %2 Oprettelse af link mislykkedes, destination: %1; linknavn: %2 Cannot set timezone, Kan ikke sætte tidszone, Cannot open /etc/timezone for writing Kan ikke åbne /etc/timezone til skrivning SummaryPage This is an overview of what will happen once you start the install procedure. Dette er et overblik over hvad der vil ske når du starter installationsprocessen. SummaryViewStep Summary Opsummering UsersPage Your username is too long. Dit brugernavn er for langt. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Dit brugernavn indeholder ugyldige tegn. Kun små bogstaver og tal er tilladt. Your hostname is too short. Dit værtsnavn er for kort. Your hostname is too long. Dit værtsnavn er for langt. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Dit værtsnavn indeholder ugyldige tegn. Kun bogstaver, tal og tankestreger er tilladt. Your passwords do not match! Dine adgangskoder er ikke ens! UsersViewStep Users Brugere WelcomePage Form Formular &Language: &Sprog: &Release notes &Udgivelsesnoter &Known issues &Kendte problemer &Support &Support &About &Om <h1>Welcome to the %1 installer.</h1> <h1>Velkommen til %1-installationsprogrammet.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Velkommen til Calamares-installationsprogrammet for %1.</h1> About %1 installer Om %1-installationsprogrammet <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Ophavsret 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Ophavsret 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Tak til: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg og <a href="https://www.transifex.com/calamares/calamares/">Calamares-oversætterteam</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> udvikling er sponsoreret af <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 support WelcomeViewStep Welcome Velkommen calamares-3.1.12/lang/calamares_de.ts000066400000000000000000003722551322271446000174360ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. Die <strong>Boot-Umgebung</strong> dieses Systems.<br><br>Ältere x86-Systeme unterstützen nur <strong>BIOS</strong>.<br>Moderne Systeme verwenden normalerweise <strong>EFI</strong>, können jedoch auch als BIOS angezeigt werden, wenn sie im Kompatibilitätsmodus gestartet werden. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Dieses System wurde mit einer <strong>EFI</strong> Boot-Umgebung gestartet.<br><br>Um den Start von einer EFI-Umgebung zu konfigurieren, muss dieser Installer eine Bootloader-Anwendung nutzen , wie <strong>GRUB</strong> oder <strong>systemd-boot</strong> auf einer <strong>EFI System-Partition</strong>. Dies passiert automatisch, außer Sie wählen die maunuelle Partitionierung. In diesem Fall müssen Sie sie selbst auswählen oder erstellen. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Dieses System wurde mit einer <strong>BIOS</strong> Boot-Umgebung gestartet.<br><br>Um den Systemstart aus einer BIOS-Umgebung zu konfigurieren, muss dieses Installationsprogramm einen Boot-Loader installieren, wie <strong>GRUB</strong>, entweder am Anfang einer Partition oder im <strong>Master Boot Record</strong> nahe am Anfang der Partitionstabelle (bevorzugt). Dies passiert automatisch, außer Sie wählen die manuelle Partitionierung. In diesem Fall müssen Sie ihn selbst aufsetzen. BootLoaderModel Master Boot Record of %1 Master Boot Record von %1 Boot Partition Boot Partition System Partition Systempartition Do not install a boot loader Installiere keinen Bootloader %1 (%2) %1 (%2) Calamares::DebugWindow Form Form GlobalStorage Globale Einstellungen JobQueue Job-Queue Modules Module Type: Typ: none keiner Interface: Schnittstelle: Tools Werkzeuge Debug information Debug-Information Calamares::ExecutionViewStep Install Installieren Calamares::JobThread Done Fertig Calamares::ProcessJob Run command %1 %2 Führe Befehl %1%2 aus Running command %1 %2 Befehl %1 %2 wird ausgeführt External command crashed Ausführung des externen Befehls gescheitert Command %1 crashed. Output: %2 Befehl %1 ist abgestürzt. Ausgabe: %2 External command failed to start Externer Befehl konnte nicht gestartet werden Command %1 failed to start. Befehl %1 konnte nicht gestartet werden Internal error when starting command Interner Fehler beim Ausführen des Befehls Bad parameters for process job call. Ungültige Parameter für Prozessaufruf. External command failed to finish Externer Befehl konnte nicht abgeschlossen werden Command %1 failed to finish in %2s. Output: %3 Befehl %1 wurde nicht innerhalb %2s beendet. Ausgabe: %3 External command finished with errors Externer Befehl schloss mit Fehlern ab Command %1 finished with exit code %2. Output: %3 Befehl %1 wurde mit Code %2 beendet. Ausgabe: %3 Calamares::PythonJob Running %1 operation. Operation %1 wird ausgeführt. Bad working directory path Fehlerhafter Arbeitsverzeichnis-Pfad Working directory %1 for python job %2 is not readable. Arbeitsverzeichnis %1 für Python-Job %2 ist nicht lesbar. Bad main script file Fehlerhaftes Hauptskript Main script file %1 for python job %2 is not readable. Hauptskript-Datei %1 für Python-Job %2 ist nicht lesbar. Boost.Python error in job "%1". Boost.Python-Fehler in Job "%1". Calamares::ViewManager &Back &Zurück &Next &Weiter &Cancel &Abbrechen Cancel installation without changing the system. Lösche die Installation ohne das System zu ändern. Cancel installation? Installation abbrechen? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Wollen Sie wirklich die aktuelle Installation abbrechen? Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. &Yes &Ja &No &Nein &Close &Schließen Continue with setup? Setup fortsetzen? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Das %1 Installationsprogramm wird Änderungen an Ihrer Festplatte vornehmen, um %2 zu installieren.<br/><strong>Diese Änderungen können nicht rückgängig gemacht werden.</strong> &Install now Jetzt &installieren Go &back Gehe &zurück &Done &Erledigt The installation is complete. Close the installer. Die Installation ist abgeschlossen. Schließe das Installationsprogramm. Error Fehler Installation Failed Installation gescheitert CalamaresPython::Helper Unknown exception type Unbekannter Ausnahmefehler unparseable Python error Nicht analysierbarer Python-Fehler unparseable Python traceback Nicht analysierbarer Python-Traceback Unfetchable Python error. Nicht zuzuordnender Python-Fehler CalamaresWindow %1 Installer %1 Installationsprogramm Show debug information Debug-Information anzeigen CheckFileSystemJob Checking file system on partition %1. Das Dateisystem auf Partition %1 wird überprüft. The file system check on partition %1 failed. Die Überprüfung des Dateisystems auf Partition %1 scheiterte. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Dieser Computer erfüllt nicht die Mindestvoraussetzungen für die Installation von %1.<br/>Die Installation kann nicht fortgesetzt werden. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Dieser Computer erfüllt nicht alle Voraussetzungen für die Installation von %1.<br/>Die Installation wird fortgesetzt, aber es werden eventuell nicht alle Funktionen verfügbar sein. This program will ask you some questions and set up %2 on your computer. Dieses Programm wird Ihnen einige Fragen stellen, um %2 auf Ihrem Computer zu installieren. For best results, please ensure that this computer: Für das beste Ergebnis stellen Sie bitte sicher, dass dieser Computer: System requirements Systemanforderungen ChoicePage Form Form After: Nachher: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Manuelle Partitionierung</strong><br/>Sie können Partitionen eigenhändig erstellen oder in der Grösse verändern. Boot loader location: Installationsziel des Bootloaders: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 wird auf %2MB verkleinert und eine neue Partition mit einer Größe von %3MB wird für %4 erstellt werden. Select storage de&vice: Speichermedium auswählen Current: Aktuell: Reuse %1 as home partition for %2. %1 als Home-Partition für %2 wiederverwenden. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Wählen Sie die zu verkleinernde Partition, dann ziehen Sie den Regler, um die Größe zu ändern</strong> <strong>Select a partition to install on</strong> <strong>Wählen Sie eine Partition für die Installation</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Es wurde keine EFI-Systempartition auf diesem System gefunden. Bitte gehen Sie zurück und nutzen Sie die manuelle Partitionierung für das Einrichten von %1. The EFI system partition at %1 will be used for starting %2. Die EFI-Systempartition %1 wird benutzt, um %2 zu starten. EFI system partition: EFI-Systempartition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Auf diesem Speichermedium scheint kein Betriebssystem installiert zu sein. Was möchten Sie tun?<br/>Sie können Ihre Auswahl überprüfen und bestätigen, bevor Änderungen auf diesem Speichermedium vorgenommen werden. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Festplatte löschen</strong><br/>Dies wird alle vorhandenen Daten auf dem gewählten Speichermedium <font color="red">löschen</font>. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Auf diesem Speichermedium ist %1 installiert. Was möchten Sie tun?<br/>Sie können Ihre Auswahl überprüfen und bestätigen, bevor Änderungen an dem Speichermedium vorgenommen werden. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Parallel dazu installieren</strong><br/>Das Installationsprogramm wird eine Partition verkleinern, um Platz für %1 zu schaffen. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Ersetze eine Partition</strong><br/>Ersetzt eine Partition durch %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Dieses Speichermedium enthält bereits ein Betriebssystem. Was möchten Sie tun?<br/>Sie können Ihre Auswahl überprüfen und bestätigen, bevor Änderungen an dem Speichermedium vorgenommen wird. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Auf diesem Speichermedium sind mehrere Betriebssysteme installiert. Was möchten Sie tun?<br/>Sie können Ihre Auswahl überprüfen und bestätigen, bevor Änderungen an dem Speichermedium vorgenommen werden. ClearMountsJob Clear mounts for partitioning operations on %1 Leere Mount-Points für Partitioning-Operation auf %1 Clearing mounts for partitioning operations on %1. Löse eingehängte Laufwerke für die Partitionierung von %1 Cleared all mounts for %1 Alle Mount-Points für %1 geleert ClearTempMountsJob Clear all temporary mounts. Alle temporären Mount-Points leeren. Clearing all temporary mounts. Löse alle temporär eingehängten Laufwerke. Cannot get list of temporary mounts. Konnte keine Liste von temporären Mount-Points einlesen. Cleared all temporary mounts. Alle temporären Mount-Points geleert. CreatePartitionDialog Create a Partition Partition erstellen MiB MiB Partition &Type: Partitions&typ: &Primary &Primär E&xtended Er&weitert Fi&le System: Fi&le System: Flags: Markierungen: &Mount Point: Ein&hängepunkt: Si&ze: Grö&sse: En&crypt Ver&schlüsseln Logical Logisch Primary Primär GPT GPT Mountpoint already in use. Please select another one. Dieser Einhängepunkt wird schon benuztzt. Bitte wählen Sie einen anderen. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Erstelle eine neue Partition mit einer Größe von %2MB auf %4 (%3) mit dem Dateisystem %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Erstelle eine neue Partition mit einer Größe von <strong>%2MB</strong> auf <strong>%4</strong> (%3) mit dem Dateisystem <strong>%1</strong>. Creating new %1 partition on %2. Erstelle eine neue %1 Partition auf %2. The installer failed to create partition on disk '%1'. Das Installationsprogramm scheiterte beim Erstellen der Partition auf Datenträger '%1'. Could not open device '%1'. Konnte Gerät '%1' nicht öffnen. Could not open partition table. Konnte Partitionstabelle nicht öffnen. The installer failed to create file system on partition %1. Das Installationsprogramm scheiterte beim Erstellen des Dateisystems auf Partition %1. The installer failed to update partition table on disk '%1'. Das Installationsprogramm scheiterte beim Aktualisieren der Partitionstabelle auf Datenträger '%1'. CreatePartitionTableDialog Create Partition Table Partitionstabelle erstellen Creating a new partition table will delete all existing data on the disk. Beim Erstellen einer neuen Partitionstabelle werden alle Daten auf dem Datenträger gelöscht. What kind of partition table do you want to create? Welchen Partitionstabellen-Typ möchten Sie erstellen? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partitions-Tabelle (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Erstelle eine neue %1 Partitionstabelle auf %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Erstelle eine neue <strong>%1</strong> Partitionstabelle auf <strong>%2</strong> (%3). Creating new %1 partition table on %2. Erstelle eine neue %1 Partitionstabelle auf %2. The installer failed to create a partition table on %1. Das Installationsprogramm konnte die Partitionstabelle auf %1 nicht erstellen. Could not open device %1. Konnte Gerät %1 nicht öffnen. CreateUserJob Create user %1 Erstelle Benutzer %1 Create user <strong>%1</strong>. Erstelle Benutzer <strong>%1</strong>. Creating user %1. Erstelle Benutzer %1. Sudoers dir is not writable. Sudoers-Verzeichnis ist nicht beschreibbar. Cannot create sudoers file for writing. Kann sudoers-Datei nicht zum Schreiben erstellen. Cannot chmod sudoers file. Kann chmod nicht auf sudoers-Datei anwenden. Cannot open groups file for reading. Kann groups-Datei nicht zum Lesen öffnen. Cannot create user %1. Kann Benutzer %1 nicht erstellen. useradd terminated with error code %1. useradd wurde mit Fehlercode %1 beendet. Cannot add user %1 to groups: %2. Folgenden Gruppen konnte Benutzer %1 nicht hinzugefügt werden: %2. usermod terminated with error code %1. Usermod beendet mit Fehlercode %1. Cannot set home directory ownership for user %1. Kann Besitzrechte des Home-Verzeichnisses von Benutzer %1 nicht setzen. chown terminated with error code %1. chown wurde mit Fehlercode %1 beendet. DeletePartitionJob Delete partition %1. Lösche Partition %1. Delete partition <strong>%1</strong>. Lösche Partition <strong>%1</strong>. Deleting partition %1. Partition %1 wird gelöscht. The installer failed to delete partition %1. Das Installationsprogramm konnte Partition %1 nicht löschen. Partition (%1) and device (%2) do not match. Partition (%1) und Gerät (%2) stimmen nicht überein. Could not open device %1. Kann Gerät %1 nicht öffnen. Could not open partition table. Kann Partitionstabelle nicht öffnen. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Die Art von <strong>Partitionstabelle</strong> auf dem gewählten Speichermedium.<br><br>Die einzige Möglichkeit die Art der Partitionstabelle zu ändern ist sie zu löschen und sie von Grund auf neu aufzusetzen, was alle Daten auf dem Speichermedium vernichtet.<br>Dieses Installationsprogramm wird die aktuelle Partitionstabelle behalten außer Sie wählen ausdrücklich etwas anderes..<br>Falls Sie unsicher sind: auf modernen Systemen wird GPT bevorzugt. This device has a <strong>%1</strong> partition table. Dieses Gerät hat eine <strong>%1</strong> Partitionstabelle. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Dies ist ein <strong>loop</strong> Gerät.<br><br>Es ist ein Pseudo-Gerät ohne Partitionstabelle die eine Datei als Blockgerät zugänglich macht. Diese Art der Einstellung enthält in der Regel nur ein einziges Dateisystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Auf dem ausgewählten Speichermedium konnte <strong>keine Partitionstabelle gefunden</strong> werden.<br><br>Die Partitionstabelle dieses Gerätes ist nicht vorhanden, beschädigt oder von einem unbekannten Typ.<br>Dieses Installationsprogramm kann eine neue Partitionstabelle für Sie erstellen, entweder automatisch oder nach Auswahl der manuellen Partitionierung. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Dies ist die empfohlene Partitionstabelle für moderne Systeme, die von einer <strong>EFI</ strong> Boot-Umgebung starten. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Diese Art von Partitionstabelle ist nur für ältere Systeme ratsam welche von einer <strong>BIOS</strong> Boot-Umgebung starten. GPT wird in den meisten anderen Fällen empfohlen.<br><br><strong>Achtung:</strong> die MBR Partitionstabelle ist ein veralteterStandard aus der MS-DOS Ära.<br>Nur 4 <em>primäre</em> Partitionen können erstellt werden, und von diesen 4, eine kann eine <em>erweiterte</em> Partition sein welche an sich wieder viele <em>logische</em> Partitionen enthalten kann. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Schreibe LUKS-Konfiguration für Dracut nach %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Überspringe das Schreiben der LUKS-Konfiguration für Dracut: die Partition "/" ist nicht verschlüsselt Failed to open %1 Konnte %1 nicht öffnen DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editiere bestehende Partition Content: Inhalt: &Keep &Beibehalten Format Formatieren Warning: Formatting the partition will erase all existing data. Warnung: Beim Formatieren der Partition werden alle Daten gelöscht. &Mount Point: Einhängepun&kt: Si&ze: Grö&sse: MiB MiB Fi&le System: Datei&system: Flags: Markierungen: Mountpoint already in use. Please select another one. Der Einhängepunkt wird schon benutzt. Bitte wählen Sie einen anderen. EncryptWidget Form Formular En&crypt system Ver&schlüssele System Passphrase Passwort Confirm passphrase Passwort wiederholen Please enter the same passphrase in both boxes. Bitte tragen Sie dasselbe Passwort in beide Felder ein. FillGlobalStorageJob Set partition information Setze Partitionsinformationen Install %1 on <strong>new</strong> %2 system partition. Installiere %1 auf <strong>neuer</strong> %2 Systempartition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Erstelle <strong>neue</strong> %2 Partition mit Einhängepunkt <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Installiere %2 auf %3 Systempartition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Erstelle %3 Partition <strong>%1</strong> mit Einhängepunkt <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installiere Bootloader auf <strong>%1</strong>. Setting up mount points. Richte Einhängepunkte ein. FinishedPage Form Form &Restart now Jetzt &Neustarten <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Alles erledigt.</h1><br/>%1 wurde auf Ihrem Computer installiert.<br/>Sie können nun in Ihr neues System neustarten oder mit der %2 Live-Umgebung fortfahren. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installation fehlgeschlagen</h1><br/>%1 wurde nicht auf deinem Computer installiert.<br/>Die Fehlermeldung lautet: %2. FinishedViewStep Finish Beenden Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatiere Partition %1 (Dateisystem: %2, Grösse: %3 MB) auf %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatiere <strong>%3MB</strong> Partition <strong>%1</strong> mit Dateisystem strong>%2</strong>. Formatting partition %1 with file system %2. Formatiere Partition %1 mit Dateisystem %2. The installer failed to format partition %1 on disk '%2'. Das Formatieren von Partition %1 auf Datenträger '%2' ist fehlgeschlagen. Could not open device '%1'. Gerät '%1' konnte nicht geöffnet werden. Could not open partition table. Partitionstabelle konnte nicht geöffnet werden. The installer failed to create file system on partition %1. Das Dateisystem auf Partition %1 konnte nicht erstellt werden. The installer failed to update partition table on disk '%1'. Das Aktualisieren der Partitionstabelle auf Datenträger '%1' ist fehlgeschlagen. InteractiveTerminalPage Konsole not installed Konsole nicht installiert Please install the kde konsole and try again! Bitte installieren Sie das KDE-Programm namens Konsole und probieren Sie es erneut! Executing script: &nbsp;<code>%1</code> Führe Skript aus: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skript KeyboardPage Set keyboard model to %1.<br/> Setze Tastaturmodell auf %1.<br/> Set keyboard layout to %1/%2. Setze Tastaturbelegung auf %1/%2. KeyboardViewStep Keyboard Tastatur LCLocaleDialog System locale setting Regions- und Spracheinstellungen The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Die Lokalisierung des Systems beeinflusst die Sprache und den Zeichensatz einiger Elemente der Kommandozeile.<br/>Die derzeitige Einstellung ist <strong>%1</strong>. &Cancel &OK LicensePage Form Form I accept the terms and conditions above. Ich akzeptiere die obigen Allgemeinen Geschäftsbedingungen. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Lizenzvereinbarung</h1>Dieses Installationsprogramm wird proprietäre Software installieren, welche Lizenzbedingungen unterliegt. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Bitte überprüfen Sie die obigen Lizenzvereinbarungen für Endbenutzer (EULAs).<br/>Wenn Sie mit diesen Bedingungen nicht einverstanden sind, kann das Installationsprogramm nicht fortgesetzt werden. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1> Lizenzvereinbarung </ h1> Dieses Installationsprogramm kann proprietäre Software installieren, welche Lizenzbedingungen unterliegt, um zusätzliche Funktionen bereitzustellen und die Benutzerfreundlichkeit zu verbessern. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Bitte überprüfen Sie die obigen Lizenzvereinbarungen für Endbenutzer (EULAs).<br/>Wenn Sie mit diesen Bedingungen nicht einverstanden sind, wird keine proprietäre Software installiert werden. Stattdessen werden quelloffene Alternativen verwendet. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 Treiber</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 Grafiktreiber</strong><br/><font color="Grey">von %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 Browser-Plugin</strong><br/><font color="Grey">von %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 Codec</strong><br/><font color="Grey">von %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 Paket</strong><br/><font color="Grey">von %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">von %2</font> <a href="%1">view license agreement</a> <a href="%1">Lizenzvereinbarung anzeigen</a> LicenseViewStep License Lizenz LocalePage The system language will be set to %1. Die Systemsprache wird auf %1 gestellt. The numbers and dates locale will be set to %1. Das Format für Zahlen und Datum wird auf %1 gesetzt. Region: Region: Zone: Zeitzone: &Change... &Ändern... Set timezone to %1/%2.<br/> Setze Zeitzone auf %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Lade Standortdaten... Location Standort MoveFileSystemJob Move file system of partition %1. Verschiebe Dateisystem von Partition %1. Could not open file system on partition %1 for moving. Kann Dateisystem auf Partition %1 nicht zum Verschieben öffnen. Could not create target for moving file system on partition %1. Konnte das Ziel für das Verschieben des Dateisystems auf Partition %1 nicht erstellen. Moving of partition %1 failed, changes have been rolled back. Verschieben der Partition %1 ist fehlgeschlagen, Änderungen wurden zurückgesetzt. Moving of partition %1 failed. Roll back of the changes have failed. Verschieben der Partition %1 ist fehlgeschlagen. Zurücksetzen der Änderungen ist fehlgeschlagen. Updating boot sector after the moving of partition %1 failed. Erneuern des Bootsektors nach dem Verschieben der Partition %1 ist fehlgeschlagen. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Die logischen Sektorgrössen von Quelle und Ziel des Kopiervorgangs sind nicht identisch. Dies wird zur Zeit nicht unterstützt. Source and target for copying do not overlap: Rollback is not required. Quelle und Ziel für den Kopiervorgang überlappen nicht: Ein Zurücksetzen ist nicht erforderlich. Could not open device %1 to rollback copying. Kann Gerät %1 nicht öffnen, um den Kopiervorgang rückgängig zu machen. NetInstallPage Name Name Description Beschreibung Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Netzwerk-Installation. (Deaktiviert: Paketlisten nicht erreichbar, prüfe deine Netzwerk-Verbindung) NetInstallViewStep Package selection Paketauswahl Page_Keyboard Form Form Keyboard Model: Tastaturmodell: Type here to test your keyboard Tippen Sie hier, um die Tastaturbelegung zu testen Page_UserSetup Form Form What is your name? Wie ist Ihr Vor- und Nachname? What name do you want to use to log in? Welchen Namen möchten Sie zum Anmelden benutzen? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Falls dieser Computer von mehr als einer Person benutzt werden soll, können weitere Benutzerkonten nach der Installation eingerichtet werden.</small> Choose a password to keep your account safe. Wählen Sie ein Passwort, um Ihr Konto zu sichern. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Bitte geben Sie Ihr Passwort zweimal ein, um Tippfehler auszuschliessen. Ein gutes Passwort enthält Buchstaben, Zahlen und Sonderzeichen. Ferner sollte es mindestens acht Zeichen umfassen und regelmässig geändert werden.</small> What is the name of this computer? Wie ist der Name dieses Computers? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Dieser Name wird benutzt, wenn Sie den Computer im Netzwerk sichtbar machen.</small> Log in automatically without asking for the password. Automatisches Einloggen ohne Passwortabfrage. Use the same password for the administrator account. Nutze das gleiche Passwort auch für das Administratorkonto. Choose a password for the administrator account. Wählen Sie ein Passwort für das Administrationskonto. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Geben Sie das Passwort zweimal ein, um es auf Tippfehler zu prüfen.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI-System Swap Swap New partition for %1 Neue Partition für %1 New partition Neue Partition %1 %2 %1 %2 PartitionModel Free Space Freier Platz New partition Neue Partition Name Name File System Dateisystem Mount Point Einhängepunkt Size Grösse PartitionPage Form Form Storage de&vice: Speicher&medium: &Revert All Changes Alle Änderungen &rückgängig machen New Partition &Table Neue Partitions&tabelle &Create &Erstellen &Edit Ä&ndern &Delete Lösc&hen Install boot &loader on: Installiere Boot&loader auf: Are you sure you want to create a new partition table on %1? Sind Sie sicher, dass Sie eine neue Partitionstabelle auf %1 erstellen möchten? PartitionViewStep Gathering system information... Sammle Systeminformationen... Partitions Partitionen Install %1 <strong>alongside</strong> another operating system. Installiere %1 <strong>neben</strong> einem anderen Betriebssystem. <strong>Erase</strong> disk and install %1. <strong>Lösche</strong> Festplatte und installiere %1. <strong>Replace</strong> a partition with %1. <strong>Ersetze</strong> eine Partition durch %1. <strong>Manual</strong> partitioning. <strong>Manuelle</strong> Partitionierung. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). %1 <strong>parallel</strong> zu einem anderen Betriebssystem auf der Festplatte <strong>%2</strong> (%3) installieren. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. Festplatte <strong>%2</strong> <strong>löschen</strong> (%3) und %1 installieren. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. Eine Partition auf Festplatte <strong>%2</strong> (%3) durch %1 <strong>ersetzen</strong>. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manuelle</strong> Partitionierung auf Festplatte <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Festplatte <strong>%1</strong> (%2) Current: Aktuell: After: Nachher: No EFI system partition configured Keine EFI-Systempartition konfiguriert An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Eine EFI Systempartition wird benötigt um %1 zu starten.<br/><br/>Um eine EFI Systempartition zu konfigurieren, gehen Sie zurück und wählen oder erstellen Sie ein FAT32 Dateisystem mit einer aktivierten <strong>esp</strong> Markierung sowie Einhängepunkt <strong>%2</strong>.<br/><br/>Sie können ohne die Einrichtung einer EFI-Systempartition weitermachen aber ihr System wird unter Umständen nicht starten können. EFI system partition flag not set Die Markierung als EFI-Systempartition wurde nicht gesetzt An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Eine EFI Systempartition wird benötigt um %1 zu starten.<br/><br/>Eine Partition wurde mit dem Einhängepunkt <strong>%2</strong> konfiguriert jedoch wurde dort keine <strong>esp</strong> Markierung gesetzt.<br/>Um diese Markierung zu setzen, gehen Sie zurück und bearbeiten Sie die Partition.<br/><br/>Sie können ohne die Markierung fortfahren aber ihr System wird unter Umständen nicht starten können. Boot partition not encrypted Bootpartition nicht verschlüsselt A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Eine saparate Bootpartition wurde zusammen mit einer verschlüsselten Rootpartition erstellt, die Bootpartition ist aber unverschlüsselt.<br/><br/>. Dies begnet Sicherheitsbedenken, weil wichtige Systemdateien auf einer unverschlüsselten Partition gespeichert werden.<br/>Wenn Sie wollen, können Sie fortfahren, aber das entschlüsseln des Filesystems wird später während des Systemstarts erfolgen.<br/>Um die Bootpartition zu verschlüsseln, gehen Sie zurück und erstellen Sie sie neu, indem Sie <strong>Verschlüsseln</strong> im Partitionserstellungs-Fenster wählen. QObject Default Keyboard Model Standard-Tastaturmodell Default Standard unknown unbekannt extended erweitert unformatted unformatiert swap Swap Unpartitioned space or unknown partition table Nicht zugeteilter Speicherplatz oder unbekannte Partitionstabelle ReplaceWidget Form Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Wählen Sie den Installationsort für %1.<br/><font color="red">Warnung: </font>Dies wird alle Daten auf der ausgewählten Partition löschen. The selected item does not appear to be a valid partition. Die aktuelle Auswahl scheint keine gültige Partition zu sein. %1 cannot be installed on empty space. Please select an existing partition. %1 kann nicht in einem unpartitionierten Bereich installiert werden. Bitte wählen Sie eine existierende Partition aus. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 kann nicht auf einer erweiterten Partition installiert werden. Bitte wählen Sie eine primäre oder logische Partition aus. %1 cannot be installed on this partition. %1 kann auf dieser Partition nicht installiert werden. Data partition (%1) Datenpartition (%1) Unknown system partition (%1) Unbekannte Systempartition (%1) %1 system partition (%2) %1 Systempartition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Die Partition %1 ist zu klein für %2. Bitte wählen Sie eine Partition mit einer Kapazität von mindestens %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Es wurde keine EFI-Systempartition auf diesem System gefunden. Bitte gehen Sie zurück, und nutzen Sie die manuelle Partitionierung, um %1 aufzusetzen. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 wird installiert auf %2.<br/><font color="red">Warnung: </font> Alle Daten auf der Partition %2 werden gelöscht. The EFI system partition at %1 will be used for starting %2. Die EFI-Systempartition auf %1 wird benutzt, um %2 zu starten. EFI system partition: EFI-Systempartition: RequirementsChecker Gathering system information... Sammle Systeminformationen... has at least %1 GB available drive space mindestens %1 GB freien Festplattenplatz hat There is not enough drive space. At least %1 GB is required. Der Speicherplatz auf der Festplatte ist unzureichend. Es wird mindestens %1 GB benötigt. has at least %1 GB working memory hat mindestens %1 GB Arbeitsspeicher The system does not have enough working memory. At least %1 GB is required. Das System hat nicht genug Arbeitsspeicher. Es wird mindestens %1GB benötigt. is plugged in to a power source ist an eine Stromquelle angeschlossen The system is not plugged in to a power source. Das System ist an keine Stromquelle angeschlossen. is connected to the Internet ist mit dem Internet verbunden The system is not connected to the Internet. Das System ist nicht mit dem Internet verbunden. The installer is not running with administrator rights. Das Installationsprogramm wird nicht mit Administratorrechten ausgeführt. The screen is too small to display the installer. Der Bildschirm ist zu klein um das Installationsprogramm anzuzeigen. ResizeFileSystemJob Resize file system on partition %1. Ändere Dateisystemgrösse auf Partition %1. Parted failed to resize filesystem. Parted konnte die Dateisystemgrösse nicht ändern. Failed to resize filesystem. Ändern der Dateisystemgrösse fehlgeschlagen. ResizePartitionJob Resize partition %1. Ändere die Grösse von Partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Partition <strong>%1</strong> von <strong>%2MB</strong> auf <strong>%3MB</strong> vergrößern. Resizing %2MB partition %1 to %3MB. Ändere die Größe der Partition %1 von %2MB auf %3MB. The installer failed to resize partition %1 on disk '%2'. Das Installationsprogramm konnte die Grösse von Partition %1 auf Datenträger '%2' nicht ändern. Could not open device '%1'. Kann Gerät '%1' nicht öffnen. ScanningDialog Scanning storage devices... Scanne Speichermedien... Partitioning Partitionierung SetHostNameJob Set hostname %1 Setze Computername auf %1 Set hostname <strong>%1</strong>. Setze Computernamen <strong>%1</strong>. Setting hostname %1. Setze Computernamen %1. Internal Error Interner Fehler Cannot write hostname to target system Kann den Computernamen nicht auf das Zielsystem schreiben SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Definiere Tastaturmodel zu %1, Layout zu %2-%3 Failed to write keyboard configuration for the virtual console. Konnte keine Tastatur-Konfiguration für die virtuelle Konsole schreiben. Failed to write to %1 Konnte nicht auf %1 schreiben Failed to write keyboard configuration for X11. Konnte keine Tastatur-Konfiguration für X11 schreiben. Failed to write keyboard configuration to existing /etc/default directory. Die Konfiguration der Tastatur konnte nicht in das bereits existierende Verzeichnis /etc/default geschrieben werden. SetPartFlagsJob Set flags on partition %1. Setze Markierungen für Partition %1. Set flags on %1MB %2 partition. Setze Markierungen für %1MB %2 Partition. Set flags on new partition. Setze Markierungen für neue Partition. Clear flags on partition <strong>%1</strong>. Markierungen für Partition <strong>%1</strong> entfernen. Clear flags on %1MB <strong>%2</strong> partition. Markierungen für %1MB <strong>%2</strong> Partition entfernen. Clear flags on new partition. Markierungen für neue Partition entfernen. Flag partition <strong>%1</strong> as <strong>%2</strong>. Partition markieren <strong>%1</strong> als <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Markiere %1MB <strong>%2</strong> Partition als <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Markiere neue Partition als <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Lösche Markierungen für Partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Lösche Markierungen für %1MB <strong>%2</strong> Partition. Clearing flags on new partition. Lösche Markierungen für neue Partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setze Markierungen <strong>%2</strong> für Partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setze Markierungen <strong>%3</strong> für %1MB <strong>%2</strong> Partition. Setting flags <strong>%1</strong> on new partition. Setze Markierungen <strong>%1</strong> für neue Partition. The installer failed to set flags on partition %1. Das Installationsprogramm konnte keine Markierungen für Partition %1 setzen. Could not open device '%1'. Gerät '%1' konnte nicht geöffnet werden. Could not open partition table on device '%1'. Partitionstabelle auf Gerät '%1' konnte nicht geöffnet werden. Could not find partition '%1'. Partition '%1' konnte nicht gefunden werden. SetPartGeometryJob Update geometry of partition %1. Aktualisiere Struktur von Partition %1. Failed to change the geometry of the partition. Kann Struktur der Partition nicht ändern. SetPasswordJob Set password for user %1 Setze Passwort für Benutzer %1 Setting password for user %1. Setze Passwort für Benutzer %1. Bad destination system path. Ungültiger System-Zielpfad. rootMountPoint is %1 root-Einhängepunkt ist %1 Cannot disable root account. Das Root-Konto kann nicht deaktiviert werden. passwd terminated with error code %1. Passwd beendet mit Fehlercode %1. Cannot set password for user %1. Passwort für Benutzer %1 kann nicht gesetzt werden. usermod terminated with error code %1. usermod wurde mit Fehlercode %1 beendet. SetTimezoneJob Set timezone to %1/%2 Setze Zeitzone auf %1/%2 Cannot access selected timezone path. Zugriff auf den Pfad der gewählten Zeitzone fehlgeschlagen. Bad path: %1 Ungültiger Pfad: %1 Cannot set timezone. Zeitzone kann nicht gesetzt werden. Link creation failed, target: %1; link name: %2 Erstellen der Verknüpfung fehlgeschlagen, Ziel: %1; Verknüpfung: %2 Cannot set timezone, Kann die Zeitzone nicht setzen, Cannot open /etc/timezone for writing Kein Schreibzugriff auf /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. Dies ist eine Übersicht der Aktionen, die nach dem Starten des Installationsprozesses durchgeführt werden. SummaryViewStep Summary Zusammenfassung UsersPage Your username is too long. Ihr Nutzername ist zu lang. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Ihr Nutzername enthält ungültige Zeichen. Nur Kleinbuchstaben und Ziffern sind erlaubt. Your hostname is too short. Ihr Hostname ist zu kurz. Your hostname is too long. Ihr Hostname ist zu lang. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Ihr Hostname enthält ungültige Zeichen. Nur Buchstaben, Ziffern und Striche sind erlaubt. Your passwords do not match! Ihre Passwörter stimmen nicht überein! UsersViewStep Users Benutzer WelcomePage Form Form &Language: &Sprache: &Release notes &Veröffentlichungshinweise &Known issues &Bekannte Probleme &Support &Unterstützung &About &Über <h1>Welcome to the %1 installer.</h1> <h1>Willkommen im %1 Installationsprogramm.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Willkommen beim Calamares-Installationsprogramm für %1. About %1 installer Über das %1 Installationsprogramm <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Danke an: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg und das <a href="https://www.transifex.com/calamares/calamares/">Calamares Übersetzungs-Team</a>.<br/><br/><a href="http://calamares.io/">Die Calamares Entwicklung wird gefördert von<br/><a href="http://www.blue-systems.com/"> Blue Systems</a> - Liberating Software. %1 support Unterstützung für %1 WelcomeViewStep Welcome Willkommen calamares-3.1.12/lang/calamares_el.ts000066400000000000000000003737631322271446000174530ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. Το <strong> περιβάλλον εκκίνησης <strong> αυτού του συστήματος.<br><br>Παλαιότερα συστήματα x86 υποστηρίζουν μόνο <strong>BIOS</strong>.<br> Τα σύγχρονα συστήματα συνήθως χρησιμοποιούν <strong>EFI</strong>, αλλά ίσως επίσης να φαίνονται ως BIOS εάν εκκινήθηκαν σε λειτουργία συμβατότητας. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Αυτό το σύστημα εκκινήθηκε με ένα <strong>EFI</strong> περιβάλλον εκκίνησης.<br><br>Για να ρυθμιστεί η εκκίνηση από ένα περιβάλλον EFI, αυτός ο εγκαταστάτης πρέπει να αναπτυχθεί ένα πρόγραμμα φορτωτή εκκίνησης, όπως <strong>GRUB</strong> ή <strong>systemd-boot</strong> σε ένα <strong>EFI Σύστημα Διαμερισμού</strong>. Αυτό είναι αυτόματο, εκτός εάν επιλέξεις χειροκίνητο διαμερισμό, στην οποία περίπτωση οφείλεις να το επιλέξεις ή να το δημιουργήσεις από μόνος σου. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record του %1 Boot Partition Κατάτμηση εκκίνησης System Partition Κατάτμηση συστήματος Do not install a boot loader Να μην εγκατασταθεί το πρόγραμμα εκκίνησης %1 (%2) %1 (%2) Calamares::DebugWindow Form Τύπος GlobalStorage GlobalStorage JobQueue JobQueue Modules Αρθρώματα Type: Τύπος: none κανένα Interface: Tools Εργαλεία Debug information Πληροφορίες αποσφαλμάτωσης Calamares::ExecutionViewStep Install Εγκατάσταση Calamares::JobThread Done Ολοκληρώθηκε Calamares::ProcessJob Run command %1 %2 Εκτέλεση εντολής %1 %2 Running command %1 %2 Εκτελείται η εντολή %1 %2 External command crashed Η εξωτερική εντολή κατέρρευσε Command %1 crashed. Output: %2 Η εντολή %1 κατέρρευσε. Έξοδος: %2 External command failed to start Η εξωτερική εντολή απέτυχε να ξεκινήσει Command %1 failed to start. Η εντολή %1 απέτυχε να εκκινήσει. Internal error when starting command Εσωτερικό σφάλμα κατά την εκκίνηση της εντολής Bad parameters for process job call. Λανθασμένοι παράμετροι για την κλήση διεργασίας. External command failed to finish Η εξωτερική εντολή απέτυχε να τελειώσει Command %1 failed to finish in %2s. Output: %3 Η εντολή %1 απέτυχε να ολοκληρώσει σε %2s. Έξοδος: %3 External command finished with errors Η εξωτερική εντολή ολοκληρώθηκε με σφάλματα Command %1 finished with exit code %2. Output: %3 Η εντολή %1 ολοκληρώθηκε με σφάλμα εξόδου %2. Έξοδος: %3 Calamares::PythonJob Running %1 operation. Εκτελείται η λειτουργία %1. Bad working directory path Λανθασμένη διαδρομή καταλόγου εργασίας Working directory %1 for python job %2 is not readable. Ο ενεργός κατάλογος %1 για την εργασία python %2 δεν είναι δυνατόν να διαβαστεί. Bad main script file Λανθασμένο κύριο αρχείο δέσμης ενεργειών Main script file %1 for python job %2 is not readable. Η κύρια δέσμη ενεργειών %1 για την εργασία python %2 δεν είναι δυνατόν να διαβαστεί. Boost.Python error in job "%1". Σφάλμα Boost.Python στην εργασία "%1". Calamares::ViewManager &Back &Προηγούμενο &Next &Επόμενο &Cancel &Ακύρωση Cancel installation without changing the system. Cancel installation? Ακύρωση της εγκατάστασης; Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Θέλετε πραγματικά να ακυρώσετε τη διαδικασία εγκατάστασης; Το πρόγραμμα εγκατάστασης θα τερματιστεί και όλες οι αλλαγές θα χαθούν. &Yes &No &Close Continue with setup? Συνέχεια με την εγκατάσταση; The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Το πρόγραμμα εγκατάστασης %1 θα κάνει αλλαγές στον δίσκο για να εγκαταστήσετε το %2.<br/><strong>Δεν θα είστε σε θέση να αναιρέσετε τις αλλαγές.</strong> &Install now Ε&γκατάσταση τώρα Go &back Μετάβαση πί&σω &Done The installation is complete. Close the installer. Error Σφάλμα Installation Failed Η εγκατάσταση απέτυχε CalamaresPython::Helper Unknown exception type Άγνωστος τύπος εξαίρεσης unparseable Python error Μη αναγνώσιμο σφάλμα Python unparseable Python traceback Μη αναγνώσιμη ανίχνευση Python Unfetchable Python error. Μη ανακτήσιµο σφάλμα Python. CalamaresWindow %1 Installer Εφαρμογή εγκατάστασης του %1 Show debug information Εμφάνιση πληροφοριών απασφαλμάτωσης CheckFileSystemJob Checking file system on partition %1. Ελέγχεται το σύστημα αρχείων στην κατάτμηση %1. The file system check on partition %1 failed. Απέτυχε ο έλεγχος του συστήματος αρχείων στην κατάτμηση %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Ο υπολογιστής δεν ικανοποιεί τις ελάχιστες απαιτήσεις για την εγκατάσταση του %1.<br/>Η εγκατάσταση δεν μπορεί να συνεχιστεί. <a href="#details">Λεπτομέριες...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Αυτός ο υπολογιστής δεν ικανοποιεί μερικές από τις συνιστώμενες απαιτήσεις για την εγκατάσταση του %1.<br/>Η εγκατάσταση μπορεί να συνεχιστεί, αλλά ορισμένες λειτουργίες μπορεί να απενεργοποιηθούν. This program will ask you some questions and set up %2 on your computer. Το πρόγραμμα θα σας κάνει μερικές ερωτήσεις και θα ρυθμίσει το %2 στον υπολογιστή σας. For best results, please ensure that this computer: Για καλύτερο αποτέλεσμα, παρακαλώ βεβαιωθείτε ότι ο υπολογιστής: System requirements Απαιτήσεις συστήματος ChoicePage Form Τύπος After: Μετά: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Χειροκίνητη τμηματοποίηση</strong><br/>Μπορείτε να δημιουργήσετε κατατμήσεις ή να αλλάξετε το μέγεθός τους μόνοι σας. Boot loader location: Τοποθεσία προγράμματος εκκίνησης: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Το %1 θα συρρικνωθεί σε %2MB και μία νέα κατάτμηση %3MB θα δημιουργηθεί για το %4. Select storage de&vice: Επιλέξτε συσκευή απ&οθήκευσης: Current: Τρέχον: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Επιλέξτε ένα διαμέρισμα για σμίκρυνση, και μετά σύρετε το κάτω τμήμα της μπάρας για αλλαγή του μεγέθους</strong> <strong>Select a partition to install on</strong> <strong>Επιλέξτε διαμέρισμα για την εγκατάσταση</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Πουθενά στο σύστημα δεν μπορεί να ανιχθευθεί μία κατάτμηση EFI. Παρακαλώ επιστρέψτε πίσω και χρησιμοποιήστε τη χειροκίνητη τμηματοποίηση για την εγκατάσταση του %1. The EFI system partition at %1 will be used for starting %2. Η κατάτμηση συστήματος EFI στο %1 θα χρησιμοποιηθεί για την εκκίνηση του %2. EFI system partition: Κατάτμηση συστήματος EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Η συσκευή αποθήκευσης δεν φαίνεται να διαθέτει κάποιο λειτουργικό σύστημα. Τί θα ήθελες να κάνεις;<br/>Θα έχεις την δυνατότητα να επιβεβαιώσεις και αναθεωρήσεις τις αλλαγές πριν γίνει οποιαδήποτε αλλαγή στην συσκευή αποθήκευσης. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Διαγραφή του δίσκου</strong><br/>Αυτό θα <font color="red">διαγράψει</font> όλα τα αρχεία στην επιλεγμένη συσκευή αποθήκευσης. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Εγκατάσταση σε επαλληλία</strong><br/>Η εγκατάσταση θα συρρικνώσει μία κατάτμηση για να κάνει χώρο για το %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Αντικατάσταση μίας κατάτμησης</strong><br/>Αντικαθιστά μία κατάτμηση με το %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Καθαρίστηκαν όλες οι προσαρτήσεις για %1 ClearTempMountsJob Clear all temporary mounts. Καθάρισε όλες τις προσωρινές προσαρτήσεις. Clearing all temporary mounts. Καθάρισμα όλων των προσωρινών προσαρτήσεων. Cannot get list of temporary mounts. Η λίστα των προσωρινών προσαρτήσεων δεν μπορεί να ληφθεί. Cleared all temporary mounts. Καθαρίστηκαν όλες οι προσωρινές προσαρτήσεις. CreatePartitionDialog Create a Partition Δημιουργία κατάτμησης MiB Partition &Type: Τύ&πος κατάτμησης: &Primary Π&ρωτεύουσα E&xtended Ε&κτεταμένη Fi&le System: Σύστημα Αρχ&είων: Flags: Σημαίες: &Mount Point: Σ&ημείο προσάρτησης: Si&ze: &Μέγεθος: En&crypt Logical Λογική Primary Πρωτεύουσα GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Δημιουργία νέας κατάτμησης %2MB στο %4 (%3) με σύστημα αρχείων %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Δημιουργία νέας κατάτμησης <strong>%2MB</strong> στο <strong>%4</strong> (%3) με σύστημα αρχείων <strong>%1</strong>. Creating new %1 partition on %2. Δημιουργείται νέα %1 κατάτμηση στο %2. The installer failed to create partition on disk '%1'. Η εγκατάσταση απέτυχε να δημιουργήσει μία κατάτμηση στον δίσκο '%1'. Could not open device '%1'. Δεν είναι δυνατό το άνοιγμα της συσκευής '%1'. Could not open partition table. Δεν είναι δυνατό το άνοιγμα του πίνακα κατατμήσεων. The installer failed to create file system on partition %1. Η εγκατάσταση απέτυχε να δημιουργήσει το σύστημα αρχείων στην κατάτμηση %1. The installer failed to update partition table on disk '%1'. Η εγκατάσταση απέτυχε να αναβαθμίσει τον πίνακα κατατμήσεων στον δίσκο '%1'. CreatePartitionTableDialog Create Partition Table Δημιούργησε πίνακα κατατμήσεων Creating a new partition table will delete all existing data on the disk. Με τη δημιουργία ενός νέου πίνακα κατατμήσεων θα διαγραφούν όλα τα δεδομένα στον δίσκο. What kind of partition table do you want to create? Τι είδους πίνακα κατατμήσεων θέλετε να δημιουργήσετε; Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Δημιουργία νέου πίνακα κατατμήσεων %1 στο %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Δημιουργία νέου πίνακα κατατμήσεων <strong>%1</strong> στο <strong>%2</strong> (%3). Creating new %1 partition table on %2. Δημιουργείται νέα %1 κατάτμηση στο %2. The installer failed to create a partition table on %1. Η εγκατάσταση απέτυχε να δημιουργήσει ένα πίνακα κατατμήσεων στο %1. Could not open device %1. Δεν είναι δυνατό το άνοιγμα της συσκευής %1. CreateUserJob Create user %1 Δημιουργία χρήστη %1 Create user <strong>%1</strong>. Δημιουργία χρήστη <strong>%1</strong>. Creating user %1. Δημιουργείται ο χρήστης %1. Sudoers dir is not writable. Ο κατάλογος sudoers δεν είναι εγγράψιμος. Cannot create sudoers file for writing. Δεν είναι δυνατή η δημιουργία του αρχείου sudoers για εγγραφή. Cannot chmod sudoers file. Δεν είναι δυνατό το chmod στο αρχείο sudoers. Cannot open groups file for reading. Δεν είναι δυνατό το άνοιγμα του αρχείου ομάδων για ανάγνωση. Cannot create user %1. Δεν είναι δυνατή η δημιουργία του χρήστη %1. useradd terminated with error code %1. Το useradd τερματίστηκε με κωδικό σφάλματος %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Δεν είναι δυνατός ο ορισμός της ιδιοκτησία του προσωπικού καταλόγου για τον χρήστη %1. chown terminated with error code %1. Το chown τερματίστηκε με κωδικό σφάλματος %1. DeletePartitionJob Delete partition %1. Διαγραφή της κατάτμησης %1. Delete partition <strong>%1</strong>. Διαγραφή της κατάτμησης <strong>%1</strong>. Deleting partition %1. Διαγράφεται η κατάτμηση %1. The installer failed to delete partition %1. Απέτυχε η διαγραφή της κατάτμησης %1. Partition (%1) and device (%2) do not match. Η κατάτμηση (%1) και η συσκευή (%2) δεν ταιριάζουν. Could not open device %1. Δεν είναι δυνατό το άνοιγμα της συσκευής %1. Could not open partition table. Δεν είναι δυνατό το άνοιγμα του πίνακα κατατμήσεων. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. Αυτή η συσκευή έχει ένα <strong>%1</strong> πίνακα διαμερισμάτων. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Αυτός είναι ο προτεινόμενος τύπος πίνακα διαμερισμάτων για σύγχρονα συστήματα τα οποία εκκινούν από ένα <strong>EFI</strong> περιβάλλον εκκίνησης. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Επεξεργασία υπάρχουσας κατάτμησης Content: Περιεχόμενο: &Keep &Διατήρηση Format Μορφοποίηση Warning: Formatting the partition will erase all existing data. Προειδοποίηση: Η μορφοποίηση της κατάτμησης θα διαγράψει όλα τα δεδομένα. &Mount Point: Σ&ημείο προσάρτησης: Si&ze: &Μέγεθος: MiB Fi&le System: &Σύστημα αρχείων: Flags: Σημαίες: Mountpoint already in use. Please select another one. EncryptWidget Form Τύπος En&crypt system Passphrase Λέξη Κλειδί Confirm passphrase Επιβεβαίωση λέξης κλειδί Please enter the same passphrase in both boxes. Παρακαλώ εισάγετε την ίδια λέξη κλειδί και στα δύο κουτιά. FillGlobalStorageJob Set partition information Ορισμός πληροφοριών κατάτμησης Install %1 on <strong>new</strong> %2 system partition. Εγκατάσταση %1 στο <strong>νέο</strong> %2 διαμέρισμα συστήματος. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Εγκατάσταση φορτωτή εκκίνησης στο <strong>%1</strong>. Setting up mount points. FinishedPage Form Τύπος &Restart now Ε&πανεκκίνηση τώρα <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Η εγκατάσταση ολοκληρώθηκε.</h1><br/>Το %1 εγκαταστήθηκε στον υπολογιστή.<br/>Τώρα, μπορείτε να επανεκκινήσετε τον υπολογιστή σας ή να συνεχίσετε να δοκιμάζετε το %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Τέλος Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Δεν είναι δυνατό το άνοιγμα της συσκευής '%1'. Could not open partition table. Δεν είναι δυνατό το άνοιγμα του πίνακα κατατμήσεων. The installer failed to create file system on partition %1. Η εγκατάσταση απέτυχε να δημιουργήσει το σύστημα αρχείων στην κατάτμηση %1. The installer failed to update partition table on disk '%1'. Η εγκατάσταση απέτυχε να αναβαθμίσει τον πίνακα κατατμήσεων στον δίσκο '%1'. InteractiveTerminalPage Konsole not installed Το Konsole δεν είναι εγκατεστημένο Please install the kde konsole and try again! Παρακαλώ εγκαταστήστε το kde konsole και δοκιμάστε ξανά! Executing script: &nbsp;<code>%1</code> Εκτελείται το σενάριο: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Σενάριο KeyboardPage Set keyboard model to %1.<br/> Ορισμός του μοντέλου πληκτρολογίου σε %1.<br/> Set keyboard layout to %1/%2. Ορισμός της διάταξης πληκτρολογίου σε %1/%2. KeyboardViewStep Keyboard Πληκτρολόγιο LCLocaleDialog System locale setting Τοπική ρύθμιση συστήματος The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Η τοπική ρύθμιση του συστήματος επηρεάζει τη γλώσσα και το σύνολο χαρακτήρων για ορισμένα στοιχεία διεπαφής χρήστη της γραμμής εντολών.<br/>Η τρέχουσα ρύθμιση είναι <strong>%1</strong>. &Cancel &OK LicensePage Form Τύπος I accept the terms and conditions above. Δέχομαι τους παραπάνω όρους και προϋποθέσεις. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Άδεια χρήσης</h1>Η διαδικασία ρύθμισης θα εγκαταστήσει ιδιόκτητο λογισμικό που υπόκειται στους όρους αδειών. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Άδεια χρήσης</h1>Η διαδικασία ρύθμισης θα εγκαταστήσει ιδιόκτητο λογισμικό που υπόκειται στους όρους αδειών προκειμένου να παρέχει πρόσθετες δυνατότητες και να ενισχύσει την εμπειρία του χρήστη. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>οδηγός %1</strong><br/>από %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 οδηγός κάρτας γραφικών</strong><br/><font color="Grey">από %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 πρόσθετο περιηγητή</strong><br/><font color="Grey">από %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>κωδικοποιητής %1</strong><br/><font color="Grey">από %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>πακέτο %1</strong><br/><font color="Grey">από %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">από %2</font> <a href="%1">view license agreement</a> <a href="%1">εμφάνιση άδειας χρήσης</a> LicenseViewStep License Άδεια LocalePage The system language will be set to %1. Η τοπική γλώσσα του συστήματος έχει οριστεί σε %1. The numbers and dates locale will be set to %1. Region: Περιοχή: Zone: Ζώνη: &Change... &Αλλαγή... Set timezone to %1/%2.<br/> Ορισμός της ζώνης ώρας σε %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Γίνεται φόρτωση των δεδομένων τοποθεσίας... Location Τοποθεσία MoveFileSystemJob Move file system of partition %1. Μετακίνηση μεγέθους του συστήματος αρχείων στην κατάτμηση %1. Could not open file system on partition %1 for moving. Δεν μπορούσε να ανοιχτή το σύστημα αρχείων στη κατάτμηση %1 για μετακίνηση. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. Δεν είναι δυνατό το άνοιγμα της συσκευής '%1' για την αναίρεση της αντιγραφής. NetInstallPage Name Όνομα Description Περιγραφή Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Επιλογή πακέτου Page_Keyboard Form Τύπος Keyboard Model: Μοντέλο πληκτρολογίου: Type here to test your keyboard Πληκτρολογείστε εδώ για να δοκιμάσετε το πληκτρολόγιο σας Page_UserSetup Form Τύπος What is your name? Ποιο είναι το όνομά σας; What name do you want to use to log in? Ποιο όνομα θα θέλατε να χρησιμοποιείτε για σύνδεση; font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Αν ο υπολογιστής χρησιμοποιείται από περισσότερα από ένα άτομα, τότε μπορείτε να δημιουργήσετε πολλαπλούς λογαριασμούς μετά την εγκατάσταση.</small> Choose a password to keep your account safe. Επιλέξτε ένα κωδικό για να διατηρήσετε το λογαριασμό σας ασφαλή. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Εισάγετε τον ίδιο κωδικό δύο φορές, ώστε να γίνει έλεγχος για τυπογραφικά σφάλματα. Ένας καλός κωδικός περιέχει γράμματα, αριθμούς και σημεία στίξης, έχει μήκος τουλάχιστον οκτώ χαρακτήρες, και θα πρέπει να τον αλλάζετε σε τακτά χρονικά διαστήματα.</small> What is the name of this computer? Ποιο είναι το όνομά του υπολογιστή; <small>This name will be used if you make the computer visible to others on a network.</small> <small>Αυτό το όνομα θα χρησιμοποιηθεί αν κάνετε τον υπολογιστή ορατό στους άλλους σε ένα δίκτυο.</small> Log in automatically without asking for the password. Σύνδεση αυτόματα χωρίς να ζητείται κωδικός πρόσβασης. Use the same password for the administrator account. Χρησιμοποιήστε τον ίδιο κωδικό πρόσβασης για τον λογαριασμό διαχειριστή. Choose a password for the administrator account. Επιλέξτε ένα κωδικό για τον λογαριασμό διαχειριστή. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Εισάγετε τον ίδιο κωδικό δύο φορές, ώστε να γίνει έλεγχος για τυπογραφικά σφάλματα.</small> PartitionLabelsView Root Ριζική Home Home Boot Εκκίνηση EFI system Σύστημα EFI Swap Swap New partition for %1 Νέα κατάτμηση για το %1 New partition Νέα κατάτμηση %1 %2 %1 %2 PartitionModel Free Space Ελεύθερος χώρος New partition Νέα κατάτμηση Name Όνομα File System Σύστημα αρχείων Mount Point Σημείο προσάρτησης Size Μέγεθος PartitionPage Form Τύπος Storage de&vice: Συσκευή απ&οθήκευσης: &Revert All Changes Επ&αναφορά όλων των αλλαγών New Partition &Table Νέος πίνακας κα&τατμήσεων &Create &Δημιουργία &Edit &Επεξεργασία &Delete &Διαγραφή Install boot &loader on: Εγκατάσταση προγράμματος ε&κκίνησης στο: Are you sure you want to create a new partition table on %1? Θέλετε σίγουρα να δημιουργήσετε έναν νέο πίνακα κατατμήσεων στο %1; PartitionViewStep Gathering system information... Συλλογή πληροφοριών συστήματος... Partitions Κατατμήσεις Install %1 <strong>alongside</strong> another operating system. Εγκατάσταση του %1 <strong>παράλληλα με</strong> ένα άλλο λειτουργικό σύστημα στον δίσκο. <strong>Erase</strong> disk and install %1. <strong>Διαγραφή</strong> του δίσκου και εγκατάσταση του %1. <strong>Replace</strong> a partition with %1. <strong>Αντικατάσταση</strong> μιας κατάτμησης με το %1. <strong>Manual</strong> partitioning. <strong>Χειροκίνητη</strong> τμηματοποίηση. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Εγκατάσταση του %1 <strong>παράλληλα με</strong> ένα άλλο λειτουργικό σύστημα στον δίσκο<strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Διαγραφή</strong> του δίσκου <strong>%2</strong> (%3) και εγκατάσταση του %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Αντικατάσταση</strong> μιας κατάτμησης στον δίσκο <strong>%2</strong> (%3) με το %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Χειροκίνητη</strong> τμηματοποίηση του δίσκου <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Δίσκος <strong>%1</strong> (%2) Current: Τρέχον: After: Μετά: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Προκαθορισμένο μοντέλο πληκτρολογίου Default Προκαθορισμένο unknown άγνωστη extended εκτεταμένη unformatted μη μορφοποιημένη swap Unpartitioned space or unknown partition table Μη κατανεμημένος χώρος ή άγνωστος πίνακας κατατμήσεων ReplaceWidget Form Τύπος Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. Το επιλεγμένο στοιχείο φαίνεται να μην είναι ένα έγκυρο διαμέρισμα. %1 cannot be installed on empty space. Please select an existing partition. %1 δεν μπορεί να εγκατασταθεί σε άδειο χώρο. Παρακαλώ επίλεξε ένα υφιστάμενο διαμέρισμα. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 δεν μπορεί να εγκατασταθεί σε ένα εκτεταμένο διαμέρισμα. Παρακαλώ επίλεξε ένα υφιστάμενο πρωτεύον ή λογικό διαμέρισμα. %1 cannot be installed on this partition. %1 δεν μπορεί να εγκατασταθεί σ' αυτό το διαμέρισμα. Data partition (%1) Κατάτμηση δεδομένων (%1) Unknown system partition (%1) Άγνωστη κατάτμηση συστήματος (%1) %1 system partition (%2) %1 κατάτμηση συστήματος (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Πουθενά στο σύστημα δεν μπορεί να ανιχθευθεί μία κατάτμηση EFI. Παρακαλώ επιστρέψτε πίσω και χρησιμοποιήστε τη χειροκίνητη τμηματοποίηση για την εγκατάσταση του %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. Η κατάτμηση συστήματος EFI στο %1 θα χρησιμοποιηθεί για την εκκίνηση του %2. EFI system partition: Κατάτμηση συστήματος EFI: RequirementsChecker Gathering system information... Συλλογή πληροφοριών συστήματος... has at least %1 GB available drive space έχει τουλάχιστον %1 GB διαθέσιμου χώρου στον δίσκο There is not enough drive space. At least %1 GB is required. Δεν υπάρχει αρκετός χώρος στον δίσκο. Απαιτείται τουλάχιστον %1 GB. has at least %1 GB working memory έχει τουλάχιστον %1 GB μνημης The system does not have enough working memory. At least %1 GB is required. Το σύστημα δεν έχει αρκετή μνήμη. Απαιτείται τουλάχιστον %1 GB. is plugged in to a power source είναι συνδεδεμένος σε πηγή ρεύματος The system is not plugged in to a power source. Το σύστημα δεν είναι συνδεδεμένο σε πηγή ρεύματος. is connected to the Internet είναι συνδεδεμένος στο διαδίκτυο The system is not connected to the Internet. Το σύστημα δεν είναι συνδεδεμένο στο διαδίκτυο. The installer is not running with administrator rights. Το πρόγραμμα εγκατάστασης δεν εκτελείται με δικαιώματα διαχειριστή. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Αλλαγή μεγέθους του συστήματος αρχείων στην κατάτμηση %1. Parted failed to resize filesystem. Το Parted απέτυχε να αλλάξει το μέγεθος του συστήματος αρχείων. Failed to resize filesystem. Απέτυχε η αλλαγή του μεγέθους του συστήματος αρχείων. ResizePartitionJob Resize partition %1. Αλλαγή μεγέθους κατάτμησης %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Αλλαγή μεγέθους κατάτμησης <strong>%1</strong> από <strong>%2MB</strong> σε <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Αλλαγή μεγέθους κατάτμησης %1 από %2MB σε %3MB. The installer failed to resize partition %1 on disk '%2'. Η εγκατάσταση απέτυχε να αλλάξει το μέγεθος της κατάτμησης %1 στον δίσκο '%2'. Could not open device '%1'. Δεν είναι δυνατό το άνοιγμα της συσκευής '%1'. ScanningDialog Scanning storage devices... Σάρωση των συσκευών αποθήκευσης... Partitioning Τμηματοποίηση SetHostNameJob Set hostname %1 Ορισμός ονόματος υπολογιστή %1 Set hostname <strong>%1</strong>. Ορισμός ονόματος υπολογιστή <strong>%1</strong>. Setting hostname %1. Ορίζεται το όνομα υπολογιστή %1. Internal Error Εσωτερικό σφάλμα Cannot write hostname to target system Δεν είναι δυνατή η εγγραφή του ονόματος υπολογιστή στο σύστημα SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Ο εγκαταστάτης απέτυχε να θέσει τις σημαίες στο διαμέρισμα %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. Δεν μπόρεσε να βρει το διαμέρισμα '%1'. SetPartGeometryJob Update geometry of partition %1. Εκσυγχρονισμός γεωμετρίας του διαμερίσματος %1. Failed to change the geometry of the partition. Απέτυχε η αλλαγή της γεωμετρίας του διαμερίσματος. SetPasswordJob Set password for user %1 Ορισμός κωδικού για τον χρήστη %1 Setting password for user %1. Ορίζεται κωδικός για τον χρήστη %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Αδυναμία ορισμού ζώνης ώρας. Link creation failed, target: %1; link name: %2 Cannot set timezone, Αδυναμία ορισμού ζώνης ώρας, Cannot open /etc/timezone for writing Αδυναμία ανοίγματος /etc/timezone για εγγραφή SummaryPage This is an overview of what will happen once you start the install procedure. Αυτή είναι μια επισκόπηση του τι θα συμβεί μόλις ξεκινήσετε τη διαδικασία εγκατάστασης. SummaryViewStep Summary Σύνοψη UsersPage Your username is too long. Το όνομα χρήστη είναι πολύ μακρύ. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Το όνομα χρήστη περιέχει μη έγκυρους χαρακτήρες. Επιτρέπονται μόνο πεζά γράμματα και αριθμητικά ψηφία. Your hostname is too short. Το όνομα υπολογιστή είναι πολύ σύντομο. Your hostname is too long. Το όνομα υπολογιστή είναι πολύ μακρύ. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Το όνομα υπολογιστή περιέχει μη έγκυρους χαρακτήρες. Επιτρέπονται μόνο γράμματα, αριθμητικά ψηφία και παύλες. Your passwords do not match! Οι κωδικοί πρόσβασης δεν ταιριάζουν! UsersViewStep Users Χρήστες WelcomePage Form Τύπος &Language: Γ&λώσσα: &Release notes Ση&μειώσεις έκδοσης &Known issues &Γνωστά προβλήματα &Support &Υποστήριξη &About Σ&χετικά με <h1>Welcome to the %1 installer.</h1> <h1>Καλώς ήλθατε στην εγκατάσταση του %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Σχετικά με το πρόγραμμα εγκατάστασης %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support Υποστήριξη %1 WelcomeViewStep Welcome Καλώς ήλθατε calamares-3.1.12/lang/calamares_en.ts000066400000000000000000003624771322271446000174550ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record of %1 Boot Partition Boot Partition System Partition System Partition Do not install a boot loader Do not install a boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form Form GlobalStorage GlobalStorage JobQueue JobQueue Modules Modules Type: Type: none none Interface: Interface: Tools Tools Debug information Debug information Calamares::ExecutionViewStep Install Install Calamares::JobThread Done Done Calamares::ProcessJob Run command %1 %2 Run command %1 %2 Running command %1 %2 Running command %1 %2 External command crashed External command crashed Command %1 crashed. Output: %2 Command %1 crashed. Output: %2 External command failed to start External command failed to start Command %1 failed to start. Command %1 failed to start. Internal error when starting command Internal error when starting command Bad parameters for process job call. Bad parameters for process job call. External command failed to finish External command failed to finish Command %1 failed to finish in %2s. Output: %3 Command %1 failed to finish in %2s. Output: %3 External command finished with errors External command finished with errors Command %1 finished with exit code %2. Output: %3 Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Running %1 operation. Bad working directory path Bad working directory path Working directory %1 for python job %2 is not readable. Working directory %1 for python job %2 is not readable. Bad main script file Bad main script file Main script file %1 for python job %2 is not readable. Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Boost.Python error in job "%1". Calamares::ViewManager &Back &Back &Next &Next &Cancel &Cancel Cancel installation without changing the system. Cancel installation without changing the system. Cancel installation? Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &Yes &No &No &Close &Close Continue with setup? Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Install now Go &back Go &back &Done &Done The installation is complete. Close the installer. The installation is complete. Close the installer. Error Error Installation Failed Installation Failed CalamaresPython::Helper Unknown exception type Unknown exception type unparseable Python error unparseable Python error unparseable Python traceback unparseable Python traceback Unfetchable Python error. Unfetchable Python error. CalamaresWindow %1 Installer %1 Installer Show debug information Show debug information CheckFileSystemJob Checking file system on partition %1. Checking file system on partition %1. The file system check on partition %1 failed. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: For best results, please ensure that this computer: System requirements System requirements ChoicePage Form Form After: After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Select storage de&vice: Current: Current: Reuse %1 as home partition for %2. Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. The EFI system partition at %1 will be used for starting %2. EFI system partition: EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clear all temporary mounts. Clearing all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Create a Partition MiB MiB Partition &Type: Partition &Type: &Primary &Primary E&xtended E&xtended Fi&le System: Fi&le System: Flags: Flags: &Mount Point: &Mount Point: Si&ze: Si&ze: En&crypt En&crypt Logical Logical Primary Primary GPT GPT Mountpoint already in use. Please select another one. Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open device '%1'. Could not open partition table. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Create Partition Table Creating a new partition table will delete all existing data on the disk. Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? What kind of partition table do you want to create? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creating new %1 partition table on %2. The installer failed to create a partition table on %1. The installer failed to create a partition table on %1. Could not open device %1. Could not open device %1. CreateUserJob Create user %1 Create user %1 Create user <strong>%1</strong>. Create user <strong>%1</strong>. Creating user %1. Creating user %1. Sudoers dir is not writable. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot open groups file for reading. Cannot create user %1. Cannot create user %1. useradd terminated with error code %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. Cannot add user %1 to groups: %2. usermod terminated with error code %1. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition %1. Delete partition <strong>%1</strong>. Delete partition <strong>%1</strong>. Deleting partition %1. Deleting partition %1. The installer failed to delete partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open device %1. Could not open partition table. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 Failed to open %1 DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Edit Existing Partition Content: Content: &Keep &Keep Format Format Warning: Formatting the partition will erase all existing data. Warning: Formatting the partition will erase all existing data. &Mount Point: &Mount Point: Si&ze: Si&ze: MiB MiB Fi&le System: Fi&le System: Flags: Flags: Mountpoint already in use. Please select another one. Mountpoint already in use. Please select another one. EncryptWidget Form Form En&crypt system En&crypt system Passphrase Passphrase Confirm passphrase Confirm passphrase Please enter the same passphrase in both boxes. Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Set partition information Install %1 on <strong>new</strong> %2 system partition. Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. Setting up mount points. FinishedPage Form Form &Restart now &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Finish Installation Complete Installation Complete The installation of %1 is complete. The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open device '%1'. Could not open partition table. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Konsole not installed Please install the kde konsole and try again! Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Keyboard LCLocaleDialog System locale setting System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &Cancel &OK &OK LicensePage Form Form I accept the terms and conditions above. I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> <a href="%1">view license agreement</a> LicenseViewStep License License LocalePage The system language will be set to %1. The system language will be set to %1. The numbers and dates locale will be set to %1. The numbers and dates locale will be set to %1. Region: Region: Zone: Zone: &Change... &Change... Set timezone to %1/%2.<br/> Set timezone to %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Loading location data... Location Location MoveFileSystemJob Move file system of partition %1. Move file system of partition %1. Could not open file system on partition %1 for moving. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. Could not open device %1 to rollback copying. NetInstallPage Name Name Description Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Package selection Page_Keyboard Form Form Keyboard Model: Keyboard Model: Type here to test your keyboard Type here to test your keyboard Page_UserSetup Form Form What is your name? What is your name? What name do you want to use to log in? What name do you want to use to log in? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Log in automatically without asking for the password. Use the same password for the administrator account. Use the same password for the administrator account. Choose a password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI system Swap Swap New partition for %1 New partition for %1 New partition New partition %1 %2 %1 %2 PartitionModel Free Space Free Space New partition New partition Name Name File System File System Mount Point Mount Point Size Size PartitionPage Form Form Storage de&vice: Storage de&vice: &Revert All Changes &Revert All Changes New Partition &Table New Partition &Table &Create &Create &Edit &Edit &Delete &Delete Install boot &loader on: Install boot &loader on: Are you sure you want to create a new partition table on %1? Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Gathering system information... Partitions Partitions Install %1 <strong>alongside</strong> another operating system. Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Current: After: After: No EFI system partition configured No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default Keyboard Model Default Default unknown unknown extended extended unformatted unformatted swap swap Unpartitioned space or unknown partition table Unpartitioned space or unknown partition table ReplaceWidget Form Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. %1 cannot be installed on this partition. Data partition (%1) Data partition (%1) Unknown system partition (%1) Unknown system partition (%1) %1 system partition (%2) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. The EFI system partition at %1 will be used for starting %2. EFI system partition: EFI system partition: RequirementsChecker Gathering system information... Gathering system information... has at least %1 GB available drive space has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source is plugged in to a power source The system is not plugged in to a power source. The system is not plugged in to a power source. is connected to the Internet is connected to the Internet The system is not connected to the Internet. The system is not connected to the Internet. The installer is not running with administrator rights. The installer is not running with administrator rights. The screen is too small to display the installer. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Resize file system on partition %1. Parted failed to resize filesystem. Parted failed to resize filesystem. Failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. Could not open device '%1'. ScanningDialog Scanning storage devices... Scanning storage devices... Partitioning Partitioning SetHostNameJob Set hostname %1 Set hostname %1 Set hostname <strong>%1</strong>. Set hostname <strong>%1</strong>. Setting hostname %1. Setting hostname %1. Internal Error Internal Error Cannot write hostname to target system Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on %1MB %2 partition. Set flags on new partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open device '%1'. Could not open partition table on device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Update geometry of partition %1. Failed to change the geometry of the partition. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Set password for user %1 Setting password for user %1. Setting password for user %1. Bad destination system path. Bad destination system path. rootMountPoint is %1 rootMountPoint is %1 Cannot disable root account. Cannot disable root account. passwd terminated with error code %1. passwd terminated with error code %1. Cannot set password for user %1. Cannot set password for user %1. usermod terminated with error code %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Set timezone to %1/%2 Cannot access selected timezone path. Cannot access selected timezone path. Bad path: %1 Bad path: %1 Cannot set timezone. Cannot set timezone. Link creation failed, target: %1; link name: %2 Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot set timezone, Cannot open /etc/timezone for writing Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Summary UsersPage Your username is too long. Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too short. Your hostname is too long. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Your passwords do not match! UsersViewStep Users Users WelcomePage Form Form &Language: &Language: &Release notes &Release notes &Known issues &Known issues &Support &Support &About &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 support WelcomeViewStep Welcome Welcome calamares-3.1.12/lang/calamares_en_GB.ts000066400000000000000000003315601322271446000200120ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record of %1 Boot Partition Boot Partition System Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form Form GlobalStorage GlobalStorage JobQueue JobQueue Modules Modules Type: none Interface: Tools Debug information Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Done Calamares::ProcessJob Run command %1 %2 Run command %1 %2 Running command %1 %2 External command crashed External command crashed Command %1 crashed. Output: %2 Command %1 crashed. Output: %2 External command failed to start External command failed to start Command %1 failed to start. Command %1 failed to start. Internal error when starting command Internal error when starting command Bad parameters for process job call. Bad parameters for process job call. External command failed to finish External command failed to finish Command %1 failed to finish in %2s. Output: %3 Command %1 failed to finish in %2s. Output: %3 External command finished with errors External command finished with errors Command %1 finished with exit code %2. Output: %3 Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Bad working directory path Working directory %1 for python job %2 is not readable. Working directory %1 for python job %2 is not readable. Bad main script file Bad main script file Main script file %1 for python job %2 is not readable. Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Boost.Python error in job "%1". Calamares::ViewManager &Back &Back &Next &Next &Cancel &Cancel Cancel installation without changing the system. Cancel installation? Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Install now Go &back Go &back &Done The installation is complete. Close the installer. Error Error Installation Failed Installation Failed CalamaresPython::Helper Unknown exception type Unknown exception type unparseable Python error unparseable Python error unparseable Python traceback unparseable Python traceback Unfetchable Python error. Unfetchable Python error. CalamaresWindow %1 Installer %1 Installer Show debug information Show debug information CheckFileSystemJob Checking file system on partition %1. Checking file system on partition %1. The file system check on partition %1 failed. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Create a Partition MiB Partition &Type: Partition &Type: &Primary &Primary E&xtended E&xtended Fi&le System: Flags: &Mount Point: &Mount Point: Si&ze: Si&ze: En&crypt Logical Logical Primary Primary GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open device '%1'. Could not open partition table. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Create Partition Table Creating a new partition table will delete all existing data on the disk. Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? What kind of partition table do you want to create? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. The installer failed to create a partition table on %1. Could not open device %1. Could not open device %1. CreateUserJob Create user %1 Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot open groups file for reading. Cannot create user %1. Cannot create user %1. useradd terminated with error code %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition %1. Delete partition <strong>%1</strong>. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open device %1. Could not open partition table. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Edit Existing Partition Content: Content: &Keep Format Format Warning: Formatting the partition will erase all existing data. Warning: Formatting the partition will erase all existing data. &Mount Point: &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Set partition information Install %1 on <strong>new</strong> %2 system partition. Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form Form &Restart now &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open device '%1'. Could not open partition table. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Keyboard LCLocaleDialog System locale setting System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Region: Zone: Zone: &Change... &Change... Set timezone to %1/%2.<br/> Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Loading location data... Location Location MoveFileSystemJob Move file system of partition %1. Move file system of partition %1. Could not open file system on partition %1 for moving. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Form Keyboard Model: Keyboard Model: Type here to test your keyboard Type here to test your keyboard Page_UserSetup Form Form What is your name? What is your name? What name do you want to use to log in? What name do you want to use to log in? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Free Space New partition New partition Name Name File System File System Mount Point Mount Point Size Size PartitionPage Form Form Storage de&vice: &Revert All Changes &Revert All Changes New Partition &Table New Partition &Table &Create &Create &Edit &Edit &Delete &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Gathering system information... Partitions Partitions Install %1 <strong>alongside</strong> another operating system. Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default Keyboard Model Default Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Resize file system on partition %1. Parted failed to resize filesystem. Parted failed to resize filesystem. Failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Internal Error Cannot write hostname to target system Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Update geometry of partition %1. Failed to change the geometry of the partition. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Set password for user %1 Setting password for user %1. Bad destination system path. Bad destination system path. rootMountPoint is %1 rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. Cannot set password for user %1. usermod terminated with error code %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Set timezone to %1/%2 Cannot access selected timezone path. Cannot access selected timezone path. Bad path: %1 Bad path: %1 Cannot set timezone. Cannot set timezone. Link creation failed, target: %1; link name: %2 Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Summary UsersPage Your username is too long. Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too short. Your hostname is too long. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Your passwords do not match! UsersViewStep Users Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_es.ts000066400000000000000000003723651322271446000174570ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. El <strong>entorno de arranque<strong> de este sistema.<br><br>Los sistemas x86 sólo soportan <strong>BIOS</strong>.<br>Los sistemas modernos habitualmente usan <strong>EFI</strong>, pero también pueden mostrarse como BIOS si se inician en modo de compatibildiad. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Este sistema se inició con un entorno de arranque <strong>EFI</strong>.<br><br>Para configurar el arranque desde un entorno EFI, este instalador debe desplegar una aplicación de gestor de arranque, como <strong>GRUB</strong> o <strong>systemd-boot</strong> en una <strong>Partición de Sistema EFI</strong>. Esto es automático, a menos que escoja particionamiento manual, en cuyo caso debe escogerlo o crearlo usted mismo. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Este sistema fue iniciado con un entorno de arranque <strong>BIOS</strong>.<br><br> Para configurar el arranque desde un entorno BIOS, este instalador debe instalar un gestor de arranque, como <strong>GRUB</strong>, tanto al principio de una partición o en el <strong>Master Boot Record</strong> (registro maestro de arranque) cerca del principio de la tabla de partición (preferentemente). Esto es automático, a menos que escoja particionamiento manual, en cuayo caso debe establecerlo usted mismo. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partición de Arranque System Partition Partición del Sistema Do not install a boot loader No instalar el gestor de arranque %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulario GlobalStorage Almacenamiento Global JobQueue Lista de trabajos pendientes Modules Módulos Type: Tipo: none ninguno Interface: Interfaz: Tools Herramientas Debug information Información de depuración. Calamares::ExecutionViewStep Install Instalar Calamares::JobThread Done Hecho Calamares::ProcessJob Run command %1 %2 Ejecutar comando %1 %2 Running command %1 %2 Ejecutando comando %1 %2 External command crashed El comando externo ha fallado Command %1 crashed. Output: %2 El comando %1 ha fallado. Salida: %2 External command failed to start El comando externo no ha podido iniciarse Command %1 failed to start. El comando %1 no se pudo iniciar. Internal error when starting command Error interno al iniciar el comando Bad parameters for process job call. Parámetros erróneos para el trabajo en proceso. External command failed to finish El comando externo falló al finalizar Command %1 failed to finish in %2s. Output: %3 El comando %1 falló al finalizar en %2s. Salida: %3 External command finished with errors El comando externo finalizó con errores Command %1 finished with exit code %2. Output: %3 El comando %1 finalizó con el código de salida %2. Salida: %3 Calamares::PythonJob Running %1 operation. Ejecutando %1 operación. Bad working directory path Error en la ruta del directorio de trabajo Working directory %1 for python job %2 is not readable. El directorio de trabajo %1 para el script de python %2 no se puede leer. Bad main script file Script principal erróneo Main script file %1 for python job %2 is not readable. El script principal %1 del proceso python %2 no es accesible. Boost.Python error in job "%1". Error Boost.Python en el proceso "%1". Calamares::ViewManager &Back &Atrás &Next &Siguiente &Cancel &Cancelar Cancel installation without changing the system. Cancelar instalación sin cambiar el sistema. Cancel installation? ¿Cancelar la instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿Realmente quiere cancelar el proceso de instalación? Saldrá del instalador y se perderán todos los cambios. &Yes &Sí &No &No &Close &Cerrar Continue with setup? ¿Continuar con la configuración? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> El instalador %1 va a realizar cambios en su disco para instalar %2.<br/><strong>No podrá deshacer estos cambios.</strong> &Install now &Instalar ahora Go &back Regresar &Done &Hecho The installation is complete. Close the installer. La instalación se ha completado. Cierre el instalador. Error Error Installation Failed Error en la Instalación CalamaresPython::Helper Unknown exception type Excepción desconocida unparseable Python error error unparseable Python unparseable Python traceback rastreo de Python unparseable Unfetchable Python error. Error de Python Unfetchable. CalamaresWindow %1 Installer %1 Instalador Show debug information Mostrar información de depuración. CheckFileSystemJob Checking file system on partition %1. Verificando sistema de archivos en la partición %1. The file system check on partition %1 failed. La verificación del sistema de archivos en la partición %1 ha fallado. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Este ordenador no cumple los requisitos mínimos para la instalación. %1.<br/>La instalación no puede continuar. <a href="#details">Detalles...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Este ordenador no cumple alguno de los requisitos recomendados para la instalación %1.<br/>La instalación puede continuar, pero algunas funcionalidades podrían ser deshabilitadas. This program will ask you some questions and set up %2 on your computer. El programa le preguntará algunas cuestiones y configurará %2 en su ordenador. For best results, please ensure that this computer: Para obtener los mejores resultados, por favor asegúrese que este ordenador: System requirements Requisitos del sistema ChoicePage Form Formulario After: Despues: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionado manual </strong><br/> Usted puede crear o cambiar el tamaño de las particiones usted mismo. Boot loader location: Ubicación del cargador de arranque: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 se contraerá a %2 MB y se creará una nueva partición de %3 MB para %4. Select storage de&vice: Seleccionar dispositivo de almacenamiento: Current: Corriente Reuse %1 as home partition for %2. Volver a usar %1 como partición home para %2 <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Seleccione una partición para reducir el tamaño, a continuación, arrastre la barra inferior para cambiar el tamaño</strong> <strong>Select a partition to install on</strong> <strong>Seleccione una partición para instalar en</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. No se puede encontrar una partición de sistema EFI en ningún lugar de este sistema. Por favor, vuelva y use el particionamiento manual para establecer %1. The EFI system partition at %1 will be used for starting %2. La partición de sistema EFI en %1 se usará para iniciar %2. EFI system partition: Partición del sistema EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de almacenamiento no parece tener un sistema operativo en él. ¿Qué quiere hacer?<br/>Podrá revisar y confirmar sus elecciones antes de que se haga cualquier cambio en el dispositivo de almacenamiento. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Borrar disco</strong><br/>Esto <font color="red">borrará</font> todos los datos presentes actualmente en el dispositivo de almacenamiento. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. %1 se encuentra instalado en este dispositivo de almacenamiento. ¿Qué desea hacer?<br/>Podrá revisar y confirmar su elección antes de que cualquier cambio se haga efectivo en el dispositivo de almacenamiento. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalar junto al otro SO</strong><br/>El instalador reducirá la partición del SO existente para tener espacio para instalar %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Reemplazar una partición</strong><br/>Reemplazar una partición con %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de almacenamiento parece que ya tiene un sistema operativo instalado en él. ¿Qué desea hacer?<br/>Podrá revisar y confirmar su elección antes de que cualquier cambio se haga efectivo en el dispositivo de almacenamiento. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de almacenamiento contiene múltiples sistemas operativos instalados en él. ¿Qué desea hacer?<br/>Podrá revisar y confirmar su elección antes de que cualquier cambio se haga efectivo en el dispositivo de almacenamiento. ClearMountsJob Clear mounts for partitioning operations on %1 Limpiar puntos de montaje para operaciones de particionamiento en %1 Clearing mounts for partitioning operations on %1. Limpiando puntos de montaje para operaciones de particionamiento en %1. Cleared all mounts for %1 Limpiados todos los puntos de montaje para %1 ClearTempMountsJob Clear all temporary mounts. Limpiar todos los puntos de montaje temporales. Clearing all temporary mounts. Limpiando todos los puntos de montaje temporales. Cannot get list of temporary mounts. No se puede obtener la lista de puntos de montaje temporales. Cleared all temporary mounts. Limpiado todos los puntos de montaje temporales. CreatePartitionDialog Create a Partition Crear partición MiB MiB Partition &Type: &Tipo de partición: &Primary &Primaria E&xtended E&xtendida Fi&le System: Sistema de archivos: Flags: Banderas: &Mount Point: Punto de &montaje: Si&ze: &Tamaño: En&crypt &Cifrar Logical Lógica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. Punto de montaje ya en uso. Por favor, seleccione otro. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Crear nueva %2MB partición en %4 (%3) con el sistema de archivos %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Crear nueva <strong>%2MB</strong> partición en <strong>%4</strong> (%3) con el sistema de ficheros <strong>%1</strong>. Creating new %1 partition on %2. Creando nueva %1 partición en %2 The installer failed to create partition on disk '%1'. El instalador fallo al crear la partición en el disco '%1'. Could not open device '%1'. No se puede abrir el dispositivo '%1'. Could not open partition table. No se puede abrir la tabla de partición. The installer failed to create file system on partition %1. El instalador fallo al crear el sistema de archivos en la partición %1. The installer failed to update partition table on disk '%1'. El instalador fallo al actualizar la tabla de partición sobre el disco '%1'. CreatePartitionTableDialog Create Partition Table Crear Tabla de Particiones Creating a new partition table will delete all existing data on the disk. Crear una nueva tabla de particiones borrara todos los datos existentes en el disco. What kind of partition table do you want to create? ¿Qué tipo de tabla de particiones desea crear? Master Boot Record (MBR) Registro de arranque principal (MBR) GUID Partition Table (GPT) Tabla de Particiones GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crear nueva %1 tabla de particiones en %2 Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crear nueva <strong>%1</strong> tabla de particiones en <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creando nueva %1 tabla de particiones en %2. The installer failed to create a partition table on %1. El instalador fallo al crear la tabla de partición en %1. Could not open device %1. No se puede abrir el dispositivo %1. CreateUserJob Create user %1 Crear usuario %1 Create user <strong>%1</strong>. Crear usuario <strong>%1</strong>. Creating user %1. Creando usuario %1. Sudoers dir is not writable. El directorio de sudoers no dispone de permisos de escritura. Cannot create sudoers file for writing. No es posible crear el archivo de escritura para sudoers. Cannot chmod sudoers file. No es posible modificar los permisos de sudoers. Cannot open groups file for reading. No es posible abrir el archivo de grupos del sistema. Cannot create user %1. No se puede crear el usuario %1. useradd terminated with error code %1. useradd terminó con código de error %1. Cannot add user %1 to groups: %2. No se puede añadir al usuario %1 a los grupos: %2. usermod terminated with error code %1. usermod finalizó con un código de error %1. Cannot set home directory ownership for user %1. No se puede dar la propiedad del directorio home al usuario %1 chown terminated with error code %1. chown terminó con código de error %1. DeletePartitionJob Delete partition %1. Eliminar partición %1. Delete partition <strong>%1</strong>. Eliminar partición <strong>%1</strong>. Deleting partition %1. Eliminando partición %1. The installer failed to delete partition %1. El instalador falló al eliminar la partición %1. Partition (%1) and device (%2) do not match. La partición (%1) y el dispositivo (%2) no coinciden. Could not open device %1. No se puede abrir el dispositivo %1. Could not open partition table. No se pudo abrir la tabla de particiones. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. El tipo de <strong>tabla de particiones</strong> en el dispositivo de almacenamiento seleccionado.<br/><br/>La única forma de cambiar el tipo de la tabla de particiones es borrando y creando la tabla de particiones de nuevo, lo cual destruirá todos los datos almacenados en el dispositivo de almacenamiento.<br/>Este instalador mantendrá la tabla de particiones actual salvo que explícitamente se indique lo contrario.<br/>En caso de dudas, GPT es preferible en sistemas modernos. This device has a <strong>%1</strong> partition table. Este dispositivo tiene un <strong>% 1 </ strong> tabla de particiones. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Este es un dispositivo <strong>loop</strong>.<br/><br/>Se trata de un pseudo-dispositivo sin tabla de particiones que permite el acceso a los archivos como un dispositivo orientado a bloques. Este tipo de configuración normalmente solo contiene un único sistema de archivos. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Este instalador <strong>no puede detectar una tabla de particiones</strong> en el dispositivo de almacenamiento seleccionado.<br><br> El dispositivo no tiene una tabla de particiones o la tabla de particiones está corrupta o es de un tipo desconocido.<br> Este instalador puede crearte una nueva tabla de particiones automáticamente o mediante la página de particionamiento manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Este es el tipo de tabla de particiones recomendado para sistemas modernos que arrancan mediante un entorno de arranque <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Este tipo de tabla de partición sólo es aconsejable en sistemas antiguos que se inician desde un entorno de arranque <strong>BIOS</strong>. La tabla GPT está recomendada en la mayoría de los demás casos.<br><br><strong>Advertencia:</strong> La tabla de partición MBR es un estándar obsoleto de la era MS-DOS.<br>Sólo se pueden crear 4 particiones <em>primarias</em>, y de esas 4, una puede ser una partición <em>extendida</em> que, en cambio, puede contener varias particiones <em>lógicas</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Escribir la configuración de LUKS para Dracut en %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Omitir la escritura de la configuración de LUKS para Dracut: La partición "/" no está cifrada Failed to open %1 No se pudo abrir %1 DummyCppJob Dummy C++ Job Tarea C++ ficticia EditExistingPartitionDialog Edit Existing Partition Editar Partición Existente Content: Contenido: &Keep &Mantener Format Formato Warning: Formatting the partition will erase all existing data. Advertencia: Formatear la partición borrará todos los datos existentes. &Mount Point: Punto de &montaje: Si&ze: &Tamaño: MiB MiB Fi&le System: S&istema de archivo: Flags: Banderas: Mountpoint already in use. Please select another one. Punto de montaje ya en uso. Por favor, seleccione otro. EncryptWidget Form Formulario En&crypt system &Cifrar sistema Passphrase Frase-contraseña Confirm passphrase Confirmar frase-contraseña Please enter the same passphrase in both boxes. Por favor, introduzca la misma frase-contraseña en ambos recuadros. FillGlobalStorageJob Set partition information Establecer la información de la partición Install %1 on <strong>new</strong> %2 system partition. Instalar %1 en <strong>nuevo</strong> %2 partición del sistema. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configurar <strong>nueva</strong> %2 partición con punto de montaje <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalar %2 en %3 partición del sistema <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configurar %3 partición <strong>%1</strong> con punto de montaje <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar gestor de arranque en <strong>%1</strong>. Setting up mount points. Configurando puntos de montaje. FinishedPage Form Formulario &Restart now &Reiniciar ahora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Listo.</h1><br/>%1 ha sido instalado en su equipo.<br/>Ahora puede reiniciar hacia su nuevo sistema, o continuar utilizando %2 Live. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>La instalación falló</h1><br/>%1 no se ha instalado en su equipo.<br/>El mensaje de error fue: %2. FinishedViewStep Finish Finalizar Installation Complete Instalación completada The installation of %1 is complete. Se ha completado la instalación de %1. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatear la partición %1 (sistema de archivos: %2, tamaño: %3 MB) en %4 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatear <strong>%3MB</strong> partición <strong>%1</strong> con sistema de ficheros <strong>%2</strong>. Formatting partition %1 with file system %2. Formateando partición %1 con sistema de ficheros %2. The installer failed to format partition %1 on disk '%2'. El instalador falló al formatear la partición %1 del disco '%2'. Could not open device '%1'. No se pudo abrir el dispositivo '%1'. Could not open partition table. No se pudo abrir la tabla de particiones. The installer failed to create file system on partition %1. El instalador falló al crear el sistema de archivos en la partición %1. The installer failed to update partition table on disk '%1'. El instalador falló al actualizar la tabla de particiones del disco '%1'. InteractiveTerminalPage Konsole not installed Konsole no está instalada Please install the kde konsole and try again! Por favor, instale Konsole kde y vuelva a intentarlo! Executing script: &nbsp;<code>%1</code> Ejecutando script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Establecer el modelo de teclado a %1.<br/> Set keyboard layout to %1/%2. Configurar la disposición de teclado a %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Configuración regional del sistema. The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. La configuración regional del sistema afecta al idioma y a al conjunto de caracteres para algunos elementos de interfaz de la linea de comandos.<br/>La configuración actual es <strong>%1</strong>. &Cancel &Cancelar &OK &Aceptar LicensePage Form Formulario I accept the terms and conditions above. Acepto los términos y condiciones anteriores. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acuerdo de licencia</ h1> Este procedimiento de instalación instalará el software propietario que está sujeto a los términos de licencia. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Por favor, revise los acuerdos de licencia de usuario final (EULAs) anterior. <br/>Si usted no está de acuerdo con los términos, el procedimiento de instalación no puede continuar. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acuerdo de licencia</ h1> Este procedimiento de configuración se puede instalar el software propietario que está sujeta a condiciones de licencia con el fin de proporcionar características adicionales y mejorar la experiencia del usuario. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Por favor, revise los acuerdos de licencia de usuario final (EULAs) anterior.<br/>Si usted no está de acuerdo con los términos, el software propietario no se instalará, y las alternativas de código abierto se utilizarán en su lugar. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 driver gráficos</strong><br/><font color="Grey">por %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 plugin del navegador</strong><br/><font color="Grey">por %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">por %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paquete</strong><br/><font color="Grey">por %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">por %2</font> <a href="%1">view license agreement</a> <a href="%1">vista contrato de licencia</a> LicenseViewStep License Licencia LocalePage The system language will be set to %1. El idioma del sistema se establecerá a %1. The numbers and dates locale will be set to %1. La localización de números y fechas se establecerá a %1. Region: Región: Zone: Zona: &Change... &Cambiar... Set timezone to %1/%2.<br/> Configurar zona horaria a %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Detectando ubicación... Location Ubicación MoveFileSystemJob Move file system of partition %1. Mover el sistema de archivos de la partición %1. Could not open file system on partition %1 for moving. No se puede abrir el sistema de archivos de la partición %1 para moverlo. Could not create target for moving file system on partition %1. No se puede crear el destino para mover el sistema de archivos a la partición %1. Moving of partition %1 failed, changes have been rolled back. Error al mover la partición %1. Los cambios han sido revertidos. Moving of partition %1 failed. Roll back of the changes have failed. Error al mover la partición %1. No se ha podido recuperar la situación inicial. Updating boot sector after the moving of partition %1 failed. Error al actualizar el sector de arranque después de mover la partición %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. El tamaño de los sectores lógicos de origen y destino de la copia no son iguales. Este tipo de operación no está soportada. Source and target for copying do not overlap: Rollback is not required. El origen y el destino no se superponen: No hace falta deshacer los cambios. Could not open device %1 to rollback copying. No se puede abrir el dispositivo %1 para deshacer la copia. NetInstallPage Name Nombre Description Descripción Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalación a través de la Red. (Desactivada: no se ha podido obtener una lista de paquetes, comprueba tu conexión a la red) NetInstallViewStep Package selection Selección de paquetes Page_Keyboard Form Formulario Keyboard Model: Modelo de teclado: Type here to test your keyboard Escriba aquí para comprobar su teclado Page_UserSetup Form Formulario What is your name? Nombre What name do you want to use to log in? ¿Qué nombre desea usar para ingresar? font-weight: normal tamaño de la fuente: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Si este equipo es usado por varios usuarios, podrá configurar varias cuentas tras finalizar la instalación.</small> Choose a password to keep your account safe. Elija una contraseña para mantener su cuenta segura. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Ingrese la misma contraseña dos veces para poder revisar los errores al escribir. Una buena contraseña debe contener una mezcla entre letras, números y puntuación, deberá contener al menos ocho caracteres de longitud, y ser cambiada con regularidad.</small> What is the name of this computer? Nombre del equipo <small>This name will be used if you make the computer visible to others on a network.</small> <small>Este nombre será utilizado si hace este equipo visible para otros en una red.</small> Log in automatically without asking for the password. Conectarse automaticamente sin pedir la contraseña. Use the same password for the administrator account. Usar la misma contraseña para la cuenta de administrador. Choose a password for the administrator account. Elegir una contraseña para la cuenta de administrador. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Escriba dos veces la contraseña para que se puede verificar en caso de errores al escribir.</small> PartitionLabelsView Root Root Home Inicio Boot Boot EFI system Sistema EFI Swap Swap New partition for %1 Nueva partición de %1 New partition Partición nueva %1 %2 %1 %2 PartitionModel Free Space Espacio libre New partition Partición nueva Name Nombre File System Sistema de archivos Mount Point Punto de montaje Size Tamaño PartitionPage Form Formulario Storage de&vice: Dispositivo de almacenamiento: &Revert All Changes &Deshacer todos los cambios New Partition &Table Nueva &tabla de particiones &Create &Crear &Edit &Editar &Delete &Borrar Install boot &loader on: Instalar gestor de arranque en: Are you sure you want to create a new partition table on %1? ¿Está seguro de querer crear una nueva tabla de particiones en %1? PartitionViewStep Gathering system information... Obteniendo información del sistema... Partitions Particiones Install %1 <strong>alongside</strong> another operating system. Instalar %1 <strong>junto a</strong> otro sistema operativo. <strong>Erase</strong> disk and install %1. <strong>Borrar</strong> disco e instalar %1. <strong>Replace</strong> a partition with %1. <strong>Reemplazar</strong> una partición con %1. <strong>Manual</strong> partitioning. Particionamiento <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalar %1 <strong>junto a</strong> otro sistema operativo en disco <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Borrar</strong> disco <strong>%2</strong> (%3) e instalar %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Reemplazar</strong> una partición en disco <strong>%2</strong> (%3) con %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionamiento <strong>manual</strong> en disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1<strong> (%2) Current: Corriente After: Despúes: No EFI system partition configured No hay una partición del sistema EFI configurada An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Una partición EFI del sistema es necesaria para empezar %1.<br/><br/>Para configurar una partición EFI, vuelva atrás y seleccione crear un sistema de archivos FAT32 con el argumento <strong>esp</strong> activado y montada en <strong>%2</strong>.<br/><br/>Puede continuar sin configurar una partición EFI pero su sistema puede fallar al arrancar. EFI system partition flag not set Bandera EFI no establecida en la partición del sistema An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Una partición EFI del sistema es necesaria para empezar %1.<br/><br/>Una partición EFI fue configurada para ser montada en <strong>%2</strong> pero su argumento <strong>esp</strong> no fue seleccionado.<br/>Para activar el argumento, vuelva atrás y edite la partición.<br/><br/>Puede continuar sin configurar el argumento pero su sistema puede fallar al arrancar. Boot partition not encrypted Partición de arranque no cifrada A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Se estableció una partición de arranque aparte junto con una partición raíz cifrada, pero la partición de arranque no está cifrada.<br/><br/>Hay consideraciones de seguridad con esta clase de instalación, porque los ficheros de sistema importantes se mantienen en una partición no cifrada.<br/>Puede continuar si lo desea, pero el desbloqueo del sistema de ficheros ocurrirá más tarde durante el arranque del sistema.<br/>Para cifrar la partición de arranque, retroceda y vuelva a crearla, seleccionando <strong>Cifrar</strong> en la ventana de creación de la partición. QObject Default Keyboard Model Modelo de teclado por defecto Default Por defecto unknown desconocido extended extendido unformatted sin formato swap swap Unpartitioned space or unknown partition table Espacio no particionado o tabla de partición desconocida ReplaceWidget Form Formulario Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Seleccione dónde instalar %1<br/><font color="red">Atención: </font>esto borrará todos sus archivos en la partición seleccionada. The selected item does not appear to be a valid partition. El elemento seleccionado no parece ser una partición válida. %1 cannot be installed on empty space. Please select an existing partition. %1 no se puede instalar en el espacio vacío. Por favor, seleccione una partición existente. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 no se puede instalar en una partición extendida. Por favor, seleccione una partición primaria o lógica existente. %1 cannot be installed on this partition. %1 no se puede instalar en esta partición. Data partition (%1) Partición de datos (%1) Unknown system partition (%1) Partición desconocida del sistema (%1) %1 system partition (%2) %1 partición del sistema (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>La partición %1 es demasiado pequeña para %2. Por favor, seleccione una participación con capacidad para al menos %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>No se puede encontrar una partición de sistema EFI en ninguna parte de este sistema. Por favor, retroceda y use el particionamiento manual para establecer %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 se instalará en %2.<br/><font color="red">Advertencia: </font>Todos los datos en la partición %2 se perderán. The EFI system partition at %1 will be used for starting %2. La partición del sistema EFI en %1 se utilizará para iniciar %2. EFI system partition: Partición del sistema EFI: RequirementsChecker Gathering system information... Obteniendo información del sistema... has at least %1 GB available drive space tiene al menos %1 GB espacio libre en el disco There is not enough drive space. At least %1 GB is required. No hay suficiente espació en el disco duro. Se requiere al menos %1 GB libre. has at least %1 GB working memory tiene al menos %1 GB de memoria. The system does not have enough working memory. At least %1 GB is required. El sistema no tiene suficiente memoria. Se requiere al menos %1 GB is plugged in to a power source esta conectado a una fuente de alimentación The system is not plugged in to a power source. El sistema no esta conectado a una fuente de alimentación. is connected to the Internet esta conectado a Internet The system is not connected to the Internet. El sistema no esta conectado a Internet The installer is not running with administrator rights. El instalador no esta ejecutándose con permisos de administrador. The screen is too small to display the installer. La pantalla es demasiado pequeña para mostrar el instalador. ResizeFileSystemJob Resize file system on partition %1. Redimensionar el sistema de archivos de la partición %1. Parted failed to resize filesystem. Parted ha fallado al redimensionar el sistema de archivos. Failed to resize filesystem. Fallo al redimensionar el sistema de archivos. ResizePartitionJob Resize partition %1. Redimensionar partición %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar <strong>%2MB</strong> partición <strong>%1</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Redimensionando %2MB %1 a %3MB. The installer failed to resize partition %1 on disk '%2'. El instalador ha fallado a la hora de reducir la partición %1 en el disco '%2'. Could not open device '%1'. No se pudo abrir el dispositivo '%1'. ScanningDialog Scanning storage devices... Dispositivos de almacenamiento de escaneado... Partitioning Particiones SetHostNameJob Set hostname %1 Hostname: %1 Set hostname <strong>%1</strong>. Configurar hostname <strong>%1</strong>. Setting hostname %1. Configurando hostname %1. Internal Error Error interno Cannot write hostname to target system No es posible escribir el hostname en el sistema de destino SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Configurar modelo de teclado a %1, distribución a %2-%3 Failed to write keyboard configuration for the virtual console. Hubo un fallo al escribir la configuración del teclado para la consola virtual. Failed to write to %1 No se puede escribir en %1 Failed to write keyboard configuration for X11. Hubo un fallo al escribir la configuración del teclado para X11. Failed to write keyboard configuration to existing /etc/default directory. No se pudo escribir la configuración de teclado en el directorio /etc/default existente. SetPartFlagsJob Set flags on partition %1. Establecer indicadores en la partición %1. Set flags on %1MB %2 partition. Establecer indicadores en la partición de %1 MB %2. Set flags on new partition. Establecer indicadores en una nueva partición. Clear flags on partition <strong>%1</strong>. Limpiar indicadores en la partición <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Limpiar indicadores en la partición de %1 MB <strong>%2</strong>. Clear flags on new partition. Limpiar indicadores en la nueva partición. Flag partition <strong>%1</strong> as <strong>%2</strong>. Indicar partición <strong>%1</strong> como <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Indicar partición de %1 MB <strong>%2</strong> como <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Indicar nueva partición como <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Limpiando indicadores en la partición <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Limpiando indicadores en la partición de %1 MB <strong>%2</strong>. Clearing flags on new partition. Limpiando indicadores en la nueva partición. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Estableciendo indicadores <strong>%2</strong> en la partición <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Establecinedo indicadores <strong>%3</strong> en la partición de %1 MB <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Estableciendo indicadores <strong>%1</strong> en una nueva partición. The installer failed to set flags on partition %1. El instalador no pudo establecer indicadores en la partición %1. Could not open device '%1'. No se pudo abrir el dispositivo '%1'. Could not open partition table on device '%1'. No se pudo abrir la tabla de particiones en el dispositivo '%1'. Could not find partition '%1'. No se pudo encontrar la partición '%1'. SetPartGeometryJob Update geometry of partition %1. Actualizar la geometría de la partición %1. Failed to change the geometry of the partition. Fallo al cambiar la geometría de la partición. SetPasswordJob Set password for user %1 Definir contraseña para el usuario %1. Setting password for user %1. Configurando contraseña para el usuario %1. Bad destination system path. Destino erróneo del sistema. rootMountPoint is %1 El punto de montaje de la raíz es %1 Cannot disable root account. No se puede deshabilitar la cuenta root passwd terminated with error code %1. passwd finalizó con el código de error %1. Cannot set password for user %1. No se puede definir contraseña para el usuario %1. usermod terminated with error code %1. usermod ha terminado con el código de error %1 SetTimezoneJob Set timezone to %1/%2 Configurar uso horario a %1/%2 Cannot access selected timezone path. No se puede acceder a la ruta de la zona horaria. Bad path: %1 Ruta errónea: %1 Cannot set timezone. No se puede definir la zona horaria Link creation failed, target: %1; link name: %2 Fallo al crear el enlace, destino: %1; nombre del enlace: %2 Cannot set timezone, No se puede establecer la zona horaria, Cannot open /etc/timezone for writing No se puede abrir/etc/timezone para la escritura SummaryPage This is an overview of what will happen once you start the install procedure. Esto es una previsualización de que ocurrirá una vez que empiece la instalación. SummaryViewStep Summary Resumen UsersPage Your username is too long. Su nombre de usuario es demasiado largo. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Su nombre de usuario contiene caracteres inválidos. Solo se admiten letras minúsculas y números. Your hostname is too short. El nombre del Host es demasiado corto. Your hostname is too long. El nombre del Host es demasiado largo. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. El nombre del Host contiene caracteres inválidos. Solo se admiten letras, números y guiones. Your passwords do not match! ¡Sus contraseñas no coinciden! UsersViewStep Users Usuarios WelcomePage Form Formulario &Language: &Idioma: &Release notes &Notas de publicación &Known issues &Problemas conocidos &Support &Ayuda &About &Acerca de <h1>Welcome to the %1 installer.</h1> <h1>Bienvenido al instalador %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Bienvenido al instalador de Calamares para %1.</h1> About %1 installer Acerca del instalador %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>para %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Agradecimientos a: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg y el <a href="https://www.transifex.com/calamares/calamares/">equipo de traductores de Calamares</a>.<br/><br/>El desarrollo de <a href="http://calamares.io/">Calamares</a> está patrocinado por: <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberando Software. %1 support %1 ayuda WelcomeViewStep Welcome Bienvenido calamares-3.1.12/lang/calamares_es_ES.ts000066400000000000000000003331161322271446000200350ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partición de arranque System Partition Partición de sistema Do not install a boot loader %1 (%2) Calamares::DebugWindow Form Formulario GlobalStorage Almacenamiento global JobQueue Cola de trabajos Modules Módulos Type: none Interface: Tools Debug information Información de depuración Calamares::ExecutionViewStep Install Calamares::JobThread Done Hecho Calamares::ProcessJob Run command %1 %2 Ejecutar comando %1 %2 Running command %1 %2 External command crashed Ha fallado el comando externo Command %1 crashed. Output: %2 El comando %1 ha fallado. Salida: %2 External command failed to start El comando externo no ha podido iniciar Command %1 failed to start. El comando %1 no se puede iniciar. Internal error when starting command Error interno al arrancar el comando Bad parameters for process job call. Parámetros erróneos en la llamada al proceso. External command failed to finish El comando externo no ha podido finalizar Command %1 failed to finish in %2s. Output: %3 El comando %1 ha fallado al finalizar en %2. Salida: %3 External command finished with errors El comando externo ha finalizado con errores Command %1 finished with exit code %2. Output: %3 El comando %1 ha finalizado con el código %2. Salida: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Ruta de trabajo errónea Working directory %1 for python job %2 is not readable. No se puede leer la ruta de trabajo %1 de la tarea %2 de python. Bad main script file Script principal erróneo Main script file %1 for python job %2 is not readable. No se puede leer el script principal %1 de la tarea %2 de python. Boost.Python error in job "%1". Error de Boost.Python en la tarea "%1". Calamares::ViewManager &Back &Atrás &Next &Siguiente &Cancel &Cancelar Cancel installation without changing the system. Cancel installation? ¿Cancelar instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿Estás seguro de que quieres cancelar la instalación en curso? El instalador se cerrará y se perderán todos los cambios. &Yes &No &Close Continue with setup? ¿Continuar con la configuración? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Instalar ahora Go &back Volver atrás. &Done The installation is complete. Close the installer. Error Error Installation Failed La instalación ha fallado CalamaresPython::Helper Unknown exception type Tipo de excepción desconocida unparseable Python error Error de Python no analizable unparseable Python traceback Rastreo de Python no analizable Unfetchable Python error. Error de Python no alcanzable. CalamaresWindow %1 Installer Instalador %1 Show debug information Mostrar la información de depuración CheckFileSystemJob Checking file system on partition %1. Verificando el sistema de ficheros de la partición %1. The file system check on partition %1 failed. La verificación del sistema de ficheros de la partición %1 ha fallado. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Limpiar los puntos de montaje para particionar %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Unidades desmontadas en %1 ClearTempMountsJob Clear all temporary mounts. Quitar todos los puntos de montaje temporales. Clearing all temporary mounts. Cannot get list of temporary mounts. No se puede obtener la lista de puntos de montaje temporales. Cleared all temporary mounts. Se han quitado todos los puntos de montaje temporales. CreatePartitionDialog Create a Partition Crear una partición MiB Partition &Type: &Tipo de partición: &Primary &Primaria E&xtended E&xtendida Fi&le System: Flags: &Mount Point: Punto de &montaje: Si&ze: Tamaño En&crypt Logical Logica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. El instalador no ha podido crear la partición en el disco '%1' Could not open device '%1'. No se puede abrir el dispositivo '%1'. Could not open partition table. No se puede abrir la tabla de particiones. The installer failed to create file system on partition %1. El instalador no ha podido crear el sistema de ficheros en la partición %1. The installer failed to update partition table on disk '%1'. El instalador no ha podido actualizar la tabla de particiones en el disco '%1'. CreatePartitionTableDialog Create Partition Table Crear tabla de particiones Creating a new partition table will delete all existing data on the disk. Al crear una tabla de particiones se borrarán todos los datos del disco. What kind of partition table do you want to create? ¿Qué tipo de tabla de particiones quieres crear? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID de la tabla de particiones (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crear una nueva tabla de particiones %1 en %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crear una nueva tabla de particiones <strong>%1</strong> en <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. El instalador no ha podido crear la tabla de particiones en %1. Could not open device %1. No se puede abrir el dispositivo %1. CreateUserJob Create user %1 Crear el usuario %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. No se puede escribir en el directorio Sudoers. Cannot create sudoers file for writing. No se puede crear el archivo sudoers como de escritura. Cannot chmod sudoers file. No se puede ejecutar chmod sobre el fichero de sudoers. Cannot open groups file for reading. No se puede abrir para leer el fichero groups. Cannot create user %1. No se puede crear el usuario %1. useradd terminated with error code %1. useradd ha terminado con el código de error %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. No se puede establecer el propietario del directorio personal del usuario %1. chown terminated with error code %1. chown ha terminado con el código de error %1. DeletePartitionJob Delete partition %1. Borrar partición %1. Delete partition <strong>%1</strong>. Borrar partición <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. El instalado no ha podido borrar la partición %1. Partition (%1) and device (%2) do not match. La partición (%1) y el dispositvo (%2) no concuerdan. Could not open device %1. No se puede abrir el dispositivo %1. Could not open partition table. No se puede abrir la tabla de particiones. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editar las particiones existentes. Content: Contenido: &Keep Format Formatear Warning: Formatting the partition will erase all existing data. Aviso: Al formatear la partición se borrarán todos los datos. &Mount Point: Punto de &montaje: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Establecer la información de la partición Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar el cargador de arranque en <strong>%1</strong> Setting up mount points. FinishedPage Form Formulario &Restart now &Reiniciar ahora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. Hecho. %1 ha sido instalado en tu ordenador. Puedes reiniciar el nuevo sistema, o continuar en el modo %2 Live. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatear partición %1 (sistema de ficheros: %2, tamaño: %3 MB) en %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatear la partición <strong>%3MB</strong> <strong>%1</strong> con el sistema de ficheros <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. El instalador no ha podido formatear la partición %1 en el disco '%2' Could not open device '%1'. No se puede abrir el dispositivo '%1'. Could not open partition table. No se puede abrir la tabla de particiones. The installer failed to create file system on partition %1. El instalador no ha podido crear el sistema de ficheros en la partición %1. The installer failed to update partition table on disk '%1'. El instalador no ha podido actualizar la tabla de particiones en el disco '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Establecer el modelo de teclado a %1.<br/> Set keyboard layout to %1/%2. Establecer la disposición del teclado a %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Ajustar configuración local The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Región: Zone: Zona: &Change... &Cambiar Set timezone to %1/%2.<br/> Establecer la zona horaria a %1%2. <br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Cargando datos de ubicación... Location Ubicación MoveFileSystemJob Move file system of partition %1. Mover el sistema de ficheros de la partición %1. Could not open file system on partition %1 for moving. No se puede abrir para mover el sistema de ficheros de la partición %1. Could not create target for moving file system on partition %1. No se puede crear el destino para mover el sistema de ficheros en la partición %1. Moving of partition %1 failed, changes have been rolled back. Ha surgido un fallo al mover la partición 1%, los cambios han sido deshechos. Moving of partition %1 failed. Roll back of the changes have failed. Ha surgido un fallo al mover la partición %1. No se han podido deshacer los cambios. Updating boot sector after the moving of partition %1 failed. No se ha podido actualizar el sector de arranque después de mover la partición %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. El tamaño lógico de los sectores del destino y del origen de la copia no es el mismo. Esta operación no está soportada. Source and target for copying do not overlap: Rollback is not required. El origen y el destino no se superponen: no se necesita deshacer. Could not open device %1 to rollback copying. No se puede abrir el dispositivo %1 para deshacer la copia. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Formulario Keyboard Model: Modelo de teclado: Type here to test your keyboard Escribe aquí para probar el teclado Page_UserSetup Form Formulario What is your name? ¿Cómo te llamas? What name do you want to use to log in? ¿Qué nombre quieres usar para acceder al sistema? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Si el ordenador lo usa más de una persona puedes configurar más cuentas después de la instalación.</small> Choose a password to keep your account safe. Elige una contraseña para proteger tu cuenta. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Escribe dos veces la misma contraseña para que se pueda comprobar si tiene errores. Una buena contraseña está formada por letras, números y signos de puntuación, tiene por lo menos ocho caracteres y hay que cambiarla cada cierto tiempo.</small> What is the name of this computer? ¿Cuál es el nombre de este ordenador? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Este es el nombre que se usará para que otros usuarios de la red puedan identificar el ordenador</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. Elige una contraseña para la cuenta de administrador. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Escribe dos veces la contraseña para comprobar si tiene errores</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Espacio sin usar New partition Nueva partición Name Nombre File System Sistema de ficheros Mount Point Punto de montaje Size Tamaño PartitionPage Form Formulario Storage de&vice: &Revert All Changes Deshace&r todos los cambios New Partition &Table Nueva &tabla de particiones &Create &Crear &Edit &Editar &Delete Borrar Install boot &loader on: Are you sure you want to create a new partition table on %1? ¿Estás seguro de que quieres crear una nueva tabla de particiones en %1? PartitionViewStep Gathering system information... Recogiendo información sobre el sistema... Partitions Particiones Install %1 <strong>alongside</strong> another operating system. Instalar %1 <strong>junto con</strong> otro sistema operativo. <strong>Erase</strong> disk and install %1. <strong>Borrar</strong> el disco e instalar %1. <strong>Replace</strong> a partition with %1. <strong>Reemplazar</strong> una parición con %1. <strong>Manual</strong> partitioning. Particionamiento <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalar %1 <strong>junto con</strong> otro sistema operativo en el disco <strong>%2</strong>(%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Borrar</strong> el disco <strong>%2<strong> (%3) e instalar %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Reemplazar</strong> una parición en el disco <strong>%2</strong> (%3) con %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionar <strong>manualmente</strong> el disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Modelo de teclado por defecto Default Por defecto unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Redimensionar el sistema de ficheros de la partición %1 Parted failed to resize filesystem. Parted no ha podido redimensionar el sistema de ficheros. Failed to resize filesystem. No se ha podido redimensionar el sistema de ficheros. ResizePartitionJob Resize partition %1. Redimensionar partición %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar las partición <strong>%1</strong> de <strong>%2MB</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. El instalador no ha podido redimensionar la partición %1 del disco '%2'. Could not open device '%1'. No se puede abrir el dispositivo '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Establecer el nombre del equipo %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Error interno Cannot write hostname to target system No se puede escribir el nombre del equipo en el sistema destino SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Establecer el modelo de teclado %1, a una disposición %2-%3 Failed to write keyboard configuration for the virtual console. No se ha podido guardar la configuración de la consola virtual. Failed to write to %1 No se ha podido escribir en %1 Failed to write keyboard configuration for X11. No se ha podido guardar la configuración del teclado de X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Actualizar la geometría de la partición %1. Failed to change the geometry of the partition. No se ha podido cambiar la geometría de la partición. SetPasswordJob Set password for user %1 Establecer contraseña del usuario %1 Setting password for user %1. Bad destination system path. El destino de la ruta del sistema es errónea. rootMountPoint is %1 El punto de montaje de root es %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. No se puede establecer la contraseña del usuario %1. usermod terminated with error code %1. usermod ha terminado con el código de error %1. SetTimezoneJob Set timezone to %1/%2 Establecer el uso horario a %1%2 Cannot access selected timezone path. No se puede encontrar la ruta a la zona horaria seleccionada. Bad path: %1 Ruta errónea: %1 Cannot set timezone. No se puede establecer la zona horaria. Link creation failed, target: %1; link name: %2 No se puede crear el enlace, objetivo: %1; nombre del enlace: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. Este es un resumen de que pasará una vez que se inicie la instalación. SummaryViewStep Summary Resumen UsersPage Your username is too long. Tu nombre de usuario es demasiado largo. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Tu nombre de usuario contiene caracteres no válidos. Solo se pueden usar letras minúsculas y números. Your hostname is too short. El nombre de tu equipo es demasiado corto. Your hostname is too long. El nombre de tu equipo es demasiado largo. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Tu nombre de equipo contiene caracteres no válidos Sólo se pueden usar letras, números y guiones. Your passwords do not match! Tu contraseña no coincide UsersViewStep Users Usuarios WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_es_MX.ts000066400000000000000000003444441322271446000200600ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partición de arranque System Partition Partición del Sistema Do not install a boot loader No instalar el gestor de arranque %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulario GlobalStorage Almacenamiento Global JobQueue Cola de trabajo Modules Módulos Type: none Interface: Tools Herramientas Debug information Información de depuración Calamares::ExecutionViewStep Install Instalar Calamares::JobThread Done Hecho Calamares::ProcessJob Run command %1 %2 Ejecutar comando %1 %2 Running command %1 %2 Ejecutando comando %1 %2 External command crashed Ha fallado el comando externo Command %1 crashed. Output: %2 El comando %1 ha fallado. Salida: %2 External command failed to start El comando externo no ha podido iniciar Command %1 failed to start. El comando %1 no ha podido iniciar. Internal error when starting command Error interno al iniciar comando Bad parameters for process job call. Parámetros erróneos en la llamada al proceso. External command failed to finish Comando externo no ha podido finalizar Command %1 failed to finish in %2s. Output: %3 El comando %1 no ha podido finalizar in %2s. Salida: %3 External command finished with errors El comando externo ha finalizado con errores. Command %1 finished with exit code %2. Output: %3 El comando %1 ha finalizado con el código %2. Salida: %3 Calamares::PythonJob Running %1 operation. Ejecutando operación %1. Bad working directory path Ruta a la carpeta de trabajo errónea Working directory %1 for python job %2 is not readable. La carpeta de trabajo %1 para la tarea de python %2 no se pudo leer. Bad main script file Script principal erróneo Main script file %1 for python job %2 is not readable. El script principal %1 del proceso python %2 no es accesible. Boost.Python error in job "%1". Error Boost.Python en el proceso "%1". Calamares::ViewManager &Back &Atrás &Next &Siguiente &Cancel &Cancelar Cancel installation without changing the system. Cancel installation? Cancelar la instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Realmente desea cancelar el proceso de instalación actual? El instalador terminará y se perderán todos los cambios. &Yes &No &Close Continue with setup? Continuar con la instalación? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> El instalador %1 va a realizar cambios en su disco para instalar %2.<br/><strong>No podrá deshacer estos cambios.</strong> &Install now &Instalar ahora Go &back &Regresar &Done The installation is complete. Close the installer. Error Error Installation Failed Instalación Fallida CalamaresPython::Helper Unknown exception type Excepción desconocida unparseable Python error error no analizable Python unparseable Python traceback rastreo de Python no analizable Unfetchable Python error. Error de Python Unfetchable. CalamaresWindow %1 Installer %1 Instalador Show debug information Mostrar información de depuración CheckFileSystemJob Checking file system on partition %1. Verificando sistema de archivos en la partición %1. The file system check on partition %1 failed. La verificación del sistema de archivos en la partición %1. ha fallado. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Este equipo no cumple los requisitos mínimos para la instalación. %1.<br/>La instalación no puede continuar. <a href="#details">Detalles...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Este equipo no cumple alguno de los requisitos recomendados para la instalación %1.<br/>La instalación puede continuar, pero algunas funcionalidades podrían ser deshabilitadas. This program will ask you some questions and set up %2 on your computer. El programa le hará algunas preguntas y configurará %2 en su ordenador. For best results, please ensure that this computer: Para mejores resultados, por favor verifique que esta computadora: System requirements Requisitos de sistema ChoicePage Form Formulario After: Después: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionado manual </strong><br/> Puede crear o cambiar el tamaño de las particiones usted mismo. Boot loader location: Ubicación del cargador de arranque: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Seleccionar dispositivo de almacenamiento: Current: Actual: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Seleccione una partición para reducir el tamaño, a continuación, arrastre la barra inferior para redimencinar</strong> <strong>Select a partition to install on</strong> <strong>Seleccione una partición para instalar</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 <b>Instalar %1 en una partición existente</b><br/>Podrás elegir que partición borrar. Clearing mounts for partitioning operations on %1. Limpiar puntos de montaje para operaciones de particionamiento en %1 Cleared all mounts for %1 Todas las unidades desmontadas en %1 ClearTempMountsJob Clear all temporary mounts. Quitar todos los puntos de montaje temporales. Clearing all temporary mounts. Limpiando todos los puntos de montaje temporales. Cannot get list of temporary mounts. No se puede obtener la lista de puntos de montaje temporales. Cleared all temporary mounts. Se han quitado todos los puntos de montaje temporales. CreatePartitionDialog Create a Partition Crear partición MiB Partition &Type: &Tipo de partición: &Primary &Primaria E&xtended E&xtendida Fi&le System: Flags: &Mount Point: Punto de &montaje: Si&ze: &Tamaño: En&crypt Logical Lógica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Crear nueva partición %2MB en %4 (%3) con el sistema de archivos %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Crear nueva partición <strong>%2MB</strong> en <strong>%4</strong> (%3) con el sistema de archivos <strong>%1</strong>. Creating new %1 partition on %2. Creando nueva partición %1 en %2 The installer failed to create partition on disk '%1'. El instalador falló en crear la partición en el disco '%1'. Could not open device '%1'. No se pudo abrir el dispositivo '%1'. Could not open partition table. No se pudo abrir la tabla de particiones. The installer failed to create file system on partition %1. El instalador fallo al crear el sistema de archivos en la partición %1. The installer failed to update partition table on disk '%1'. El instalador falló al actualizar la tabla de partición en el disco '%1'. CreatePartitionTableDialog Create Partition Table Crear Tabla de Particiones Creating a new partition table will delete all existing data on the disk. Crear una nueva tabla de particiones borrara todos los datos existentes en el disco. What kind of partition table do you want to create? ¿Qué tipo de tabla de particiones desea crear? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Tabla de Particiones GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crear nueva tabla de particiones %1 en %2 Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crear nueva tabla de particiones <strong>%1</strong> en <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creando nueva tabla de particiones %1 en %2. The installer failed to create a partition table on %1. El instalador falló al crear una tabla de partición en %1. Could not open device %1. No se pudo abrir el dispositivo %1. CreateUserJob Create user %1 Crear usuario %1 Create user <strong>%1</strong>. Crear usuario <strong>%1</strong>. Creating user %1. Creando cuenta de susuario %1. Sudoers dir is not writable. El directorio "Sudoers" no es editable. Cannot create sudoers file for writing. No se puede crear el archivo sudoers para editarlo. Cannot chmod sudoers file. No se puede aplicar chmod al archivo sudoers. Cannot open groups file for reading. No se puede abrir el archivo groups para lectura. Cannot create user %1. No se puede crear el usuario %1. useradd terminated with error code %1. useradd ha finalizado con elcódigo de error %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. No se pueden aplicar permisos de propiedad a la carpeta home para el usuario %1. chown terminated with error code %1. chown ha finalizado con elcódigo de error %1. DeletePartitionJob Delete partition %1. Eliminar la partición %1. Delete partition <strong>%1</strong>. Eliminar la partición <strong>%1</strong>. Deleting partition %1. Eliminando partición %1. The installer failed to delete partition %1. El instalador no pudo borrar la partición %1. Partition (%1) and device (%2) do not match. La partición (%1) y el dispositivo (%2) no concuerdan. Could not open device %1. No se puede abrir el dispositivo %1. Could not open partition table. No se pudo abrir la tabla de particiones. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editar Partición Existente Content: Contenido: &Keep &Conservar Format Formato Warning: Formatting the partition will erase all existing data. Advertencia: Formatear la partición borrara todos los datos existentes. &Mount Point: Punto de &Montaje Si&ze: Tam&año: MiB Fi&le System: Sis&tema de Archivos: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Fijar información de la partición. Install %1 on <strong>new</strong> %2 system partition. Instalar %1 en <strong>nueva</strong> partición de sistema %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configurar <strong>nueva</strong> %2 partición con punto de montaje <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalar %2 en %3 partición del sistema <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configurar %3 partición <strong>%1</strong> con punto de montaje <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar el cargador de arranque en <strong>%1</strong>. Setting up mount points. Configurando puntos de montaje. FinishedPage Form Forma &Restart now &Reiniciar ahora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Listo.</h1><br/>%1 ha sido instalado en su computadora.<br/>Ahora puede reiniciar su nuevo sistema, o continuar usando el entorno Live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Terminado Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatear la partición %1 (sistema de archivos: %2, tamaño: %3 MB) en %4 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatear <strong>%3MB</strong> partición <strong>%1</strong> con sistema de archivos <strong>%2</strong>. Formatting partition %1 with file system %2. Formateando partición %1 con sistema de archivos %2. The installer failed to format partition %1 on disk '%2'. El instalador no ha podido formatear la partición %1 en el disco '%2' Could not open device '%1'. No se puede abrir el dispositivo '%1'. Could not open partition table. No se pudo abrir la tabla de particiones. The installer failed to create file system on partition %1. El instalador falló al crear el sistema de archivos en la partición %1. The installer failed to update partition table on disk '%1'. El instalador falló al actualizar la tabla de partición en el disco '%1'. InteractiveTerminalPage Konsole not installed Konsole no instalado Please install the kde konsole and try again! Por favor instale kde konsole e intente de nuevo! Executing script: &nbsp;<code>%1</code> Ejecutando script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Ajustar el modelo de teclado a %1.<br/> Set keyboard layout to %1/%2. Ajustar teclado a %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Configuración de localización del sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. La configuración regional del sistema afecta al idioma y a al conjunto de caracteres para algunos elementos de interfaz de la linea de comandos.<br/>La configuración actual es <strong>%1</strong>. &Cancel &OK LicensePage Form Formulario I accept the terms and conditions above. Acepto los terminos y condiciones anteriores. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acuerdo de Licencia</h1>Este procediemiento de configuración instalará software que está sujeto a terminos de la licencia. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Por favor, revise el acuerdo de licencia de usuario final (EULAs) anterior. <br/>Si usted no está de acuerdo con los términos, el procedimiento de configuración no podrá continuar. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acuerdo de licencia</ h1> Este procedimiento de configuración se puede instalar software privativo que está sujeto a condiciones de licencia con el fin de proporcionar características adicionales y mejorar la experiencia del usuario. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Por favor revise los acuerdos de licencia de usuario final (EULAs) anterior.<br/>Si usted no está de acuerdo con los términos, el software privativo no se instalará, y las alternativas de código abierto se utilizarán en su lugar. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>controlador %1</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>controladores gráficos de %1</strong><br/><font color="Grey">por %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>plugin del navegador %1</strong><br/><font color="Grey">por %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>codec %1</strong><br/><font color="Grey">por %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>paquete %1</strong><br/><font color="Grey">por %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">por %2</font> <a href="%1">view license agreement</a> <a href="%1">ver acuerdo de licencia</a> LicenseViewStep License Licencia LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Región: Zone: Zona: &Change... &Cambiar... Set timezone to %1/%2.<br/> Definir la zona horaria como %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Cargando datos de ubicación... Location Ubicación MoveFileSystemJob Move file system of partition %1. Mover el sistema de archivos de la partición %1. Could not open file system on partition %1 for moving. No se pudo abrir el sistema de archivos en la partición %1 para moverlo. Could not create target for moving file system on partition %1. No se pudo crear el destino para mover el sistema de archivos de la partición %1. Moving of partition %1 failed, changes have been rolled back. Falló el movimiento de la partición %1, los cambios se han revertido. Moving of partition %1 failed. Roll back of the changes have failed. Falló el movimiento de la partición %1. Los cambios no se han podido revertir. Updating boot sector after the moving of partition %1 failed. Falló la actualización del sector de arranque después de mover la partición %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. El tamaño lógico de los sectores del destino y del origen de la copia no es el mismo. Esta operación no está soportada. Source and target for copying do not overlap: Rollback is not required. El origen y el destino no se superponen: no se necesita deshacer. Could not open device %1 to rollback copying. No se puede abrir el dispositivo %1 para deshacer la copia. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Formulario Keyboard Model: Modelo de teclado: Type here to test your keyboard Teclee aquí para probar su teclado Page_UserSetup Form Formulario What is your name? ¿Cuál es su nombre? What name do you want to use to log in? ¿Qué nombre desea usar para acceder al sistema? font-weight: normal Tamaño de fuente: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Si este equipo es usado por varios usuarios, podrá configurar varias cuentas tras finalizar la instalación.</small> Choose a password to keep your account safe. Seleccione una contraseña para mantener segura su cuenta. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Escribe dos veces la misma contraseña para que se pueda comprobar si tiene errores. Una buena contraseña está formada por letras, números y signos de puntuación, tiene por lo menos ocho caracteres y hay que cambiarla cada cierto tiempo.</small> What is the name of this computer? ¿Cuál es el nombre de esta computadora? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Este nombre sera usado si hace esta computadora visible para otros en una red.</small> Log in automatically without asking for the password. Iniciar sesión automáticamente sin preguntar por la contraseña. Use the same password for the administrator account. Usar la misma contraseña para la cuenta de administrador. Choose a password for the administrator account. Elegir una contraseña para la cuenta de administrador. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Escribe dos veces la contraseña para comprobar si tiene errores</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Espacio libre New partition Partición nueva Name Nombre File System Sistema de archivos Mount Point Punto de montaje Size Tamaño PartitionPage Form Formulario Storage de&vice: &Revert All Changes &Deshacer todos los cambios New Partition &Table Nueva &tabla de particiones &Create &Crear &Edit &Editar &Delete &Borrar Install boot &loader on: Are you sure you want to create a new partition table on %1? ¿Está seguro de querer crear una nueva tabla de particiones en %1? PartitionViewStep Gathering system information... Obteniendo información del sistema... Partitions Particiones Install %1 <strong>alongside</strong> another operating system. Instalar %1 <strong>junto con</strong> otro sistema operativo. <strong>Erase</strong> disk and install %1. <strong>Borrar</strong> el disco e instalar %1. <strong>Replace</strong> a partition with %1. <strong>Reemplazar</strong> una parición con %1. <strong>Manual</strong> partitioning. Particionamiento <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalar %1 <strong>junto con</strong> otro sistema operativo en el disco <strong>%2</strong>(%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Borrar</strong> el disco <strong>%2<strong> (%3) e instalar %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Reemplazar</strong> una parición en el disco <strong>%2</strong> (%3) con %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionar <strong>manualmente</strong> el disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Modelo de teclado por defecto Default Por defecto unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... Obteniendo información del sistema... has at least %1 GB available drive space tiene al menos %1 GB de espacio en disco disponible There is not enough drive space. At least %1 GB is required. No hay suficiente espacio disponible en disco. Se requiere al menos %1 GB. has at least %1 GB working memory tiene al menos %1 GB de memoria para trabajar The system does not have enough working memory. At least %1 GB is required. No hay suficiente espacio disponible en disco. Se requiere al menos %1 GB. is plugged in to a power source está conectado a una fuente de energía The system is not plugged in to a power source. El sistema no está conectado a una fuente de energía. is connected to the Internet está conectado a Internet The system is not connected to the Internet. El sistema no está conectado a Internet. The installer is not running with administrator rights. El instalador no se está ejecutando con privilegios de administrador. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Redimensionar el sistema de archivos en la partición %1. Parted failed to resize filesystem. Parted ha fallado al redimensionar el sistema de archivos. Failed to resize filesystem. Fallo al redimensionar el sistema de archivos. ResizePartitionJob Resize partition %1. Redimensionar partición %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar la partición <strong>%1</strong> de <strong>%2MB</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Redimensionando partición %1 de %2MB a %3MB. The installer failed to resize partition %1 on disk '%2'. El instalador ha fallado al reducir la partición %1 en el disco '%2'. Could not open device '%1'. No se pudo abrir el dispositivo '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Hostname: %1 Set hostname <strong>%1</strong>. Establecer nombre del equipo <strong>%1</strong>. Setting hostname %1. Configurando nombre de host %1. Internal Error Error interno Cannot write hostname to target system No es posible escribir el hostname en el sistema de destino SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Establecer el modelo de teclado %1, a una disposición %2-%3 Failed to write keyboard configuration for the virtual console. No se ha podido guardar la configuración de teclado para la consola virtual. Failed to write to %1 No se ha podido escribir en %1 Failed to write keyboard configuration for X11. No se ha podido guardar la configuración del teclado de X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Actualizar la geometría de la partición %1. Failed to change the geometry of the partition. Fallo al cambiar la geometría de la partición. SetPasswordJob Set password for user %1 Definir contraseña para el usuario %1. Setting password for user %1. Configurando contraseña para el usuario %1. Bad destination system path. Destino erróneo del sistema. rootMountPoint is %1 El punto de montaje de root es %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. No se puede definir contraseña para el usuario %1. usermod terminated with error code %1. usermod ha terminado con el código de error %1 SetTimezoneJob Set timezone to %1/%2 Configurar zona horaria a %1/%2 Cannot access selected timezone path. No se puede acceder a la ruta de la zona horaria. Bad path: %1 Ruta errónea: %1 Cannot set timezone. No se puede definir la zona horaria Link creation failed, target: %1; link name: %2 Fallo al crear el enlace, destino: %1; nombre del enlace: %2 Cannot set timezone, No se puede establer la zona horaria. Cannot open /etc/timezone for writing No se puede abrir /etc/timezone para escritura SummaryPage This is an overview of what will happen once you start the install procedure. Esto es un resumen de lo que pasará una vez que inicie el procedimiento de instalación. SummaryViewStep Summary Resumen UsersPage Your username is too long. Tu nombre de usuario es demasiado largo. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Tu nombre de usuario contiene caracteres no válidos. Solo se pueden usar letras minúsculas y números. Your hostname is too short. El nombre de tu equipo es demasiado corto. Your hostname is too long. El nombre de tu equipo es demasiado largo. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Tu nombre de equipo contiene caracteres no válidos Sólo se pueden usar letras, números y guiones. Your passwords do not match! Las contraseñas no coinciden! UsersViewStep Users Usuarios WelcomePage Form Formulario &Language: &Idioma: &Release notes &Notas de lanzamiento &Known issues &Problemas Conocidos &Support &Soporte &About &Acerca de <h1>Welcome to the %1 installer.</h1> <h1>Bienvenido al instalador de %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Acerca del instalador %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 Soporte WelcomeViewStep Welcome Bienvenido calamares-3.1.12/lang/calamares_es_PR.ts000066400000000000000000003151641322271446000200520ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Registro de arranque maestro de %1 Boot Partition Partición de arranque System Partition Partición del sistema Do not install a boot loader %1 (%2) Calamares::DebugWindow Form Formulario GlobalStorage AlmacenamientoGlobal JobQueue ColadeTrabajos Modules Módulos Type: none Interface: Tools Debug information Información de depuración Calamares::ExecutionViewStep Install Calamares::JobThread Done Hecho Calamares::ProcessJob Run command %1 %2 Ejecutar comando %1 %2 Running command %1 %2 External command crashed Un comando externo falló. Command %1 crashed. Output: %2 El comando %1 falló. Salida: %2 External command failed to start Un comando externo falló al arrancar. Command %1 failed to start. El comando %1 falló al arrancar. Internal error when starting command Error interno al iniciar el comando Bad parameters for process job call. Parámetros erróneos para el trabajo en proceso. External command failed to finish Comando externo no pudo terminar. Command %1 failed to finish in %2s. Output: %3 Comando %1 no pudo terminar en %2s Salida: %3 External command finished with errors Comando externo finalizó con errores Command %1 finished with exit code %2. Output: %3 El comando %1 finalizó con el código de salida %2 Salida: %3 Calamares::PythonJob Running %1 operation. Bad working directory path La ruta del directorio de trabajo es incorrecta Working directory %1 for python job %2 is not readable. El directorio de trabajo %1 para el script de python %2 no se puede leer. Bad main script file Script principal erróneo Main script file %1 for python job %2 is not readable. El script principal %1 del proceso python %2 no es accesible. Boost.Python error in job "%1". Error Boost.Python en el proceso "%1". Calamares::ViewManager &Back &Atrás &Next &Próximo &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Error Installation Failed Falló la instalación CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_et.ts000066400000000000000000003136501322271446000174500ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Valmis Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Viga Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Loo sektsioon MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: Suurus: En&crypt Logical Loogiline köide Primary Peamine GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_eu.ts000066400000000000000000003216021322271446000174450ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition Abio partizioa System Partition Sistema-partizioa Do not install a boot loader Ez instalatu abio kargatzailerik %1 (%2) %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue LanIlara Modules Moduluak Type: Mota: none Interface: Tools Tresnak Debug information Calamares::ExecutionViewStep Install Instalatu Calamares::JobThread Done Egina Calamares::ProcessJob Run command %1 %2 %1 %2 komandoa abiarazi Running command %1 %2 %1 %2 komandoa exekutatzen External command crashed Kanpo-komandoak huts egin du Command %1 crashed. Output: %2 %1 komandoak huts egin du. Irteera: %2 External command failed to start Command %1 failed to start. Ezin izan da %1 komandoa abiarazi. Internal error when starting command Barne-akatsa komandoa hasterakoan Bad parameters for process job call. External command failed to finish Kanpo-komandoa ez da bukatu Command %1 failed to finish in %2s. Output: %3 %1 komandoa ez da %2s-tan bukatu. Irteera: %3 External command finished with errors Kanpo-komandoak akatsekin bukatu da Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. %1 eragiketa burutzen. Bad working directory path Direktorio ibilbide ezegokia Working directory %1 for python job %2 is not readable. Bad main script file Script fitxategi nagusi okerra Main script file %1 for python job %2 is not readable. %1 script fitxategi nagusia ezin da irakurri python %2 lanerako Boost.Python error in job "%1". Calamares::ViewManager &Back &Atzera &Next &Hurrengoa &Cancel &Utzi Cancel installation without changing the system. Instalazioa bertan behera utsi da sisteman aldaketarik gabe. Cancel installation? Bertan behera utzi instalazioa? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &Bai &No &Ez &Close &Itxi Continue with setup? Ezarpenarekin jarraitu? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Instalatu orain Go &back &Atzera &Done E&ginda The installation is complete. Close the installer. Instalazioa burutu da. Itxi instalatzailea. Error Akatsa Installation Failed Instalazioak huts egin du CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer %1 Instalatzailea Show debug information CheckFileSystemJob Checking file system on partition %1. %1 partizioko fitxategi sistema aztertzen The file system check on partition %1 failed. %1 partizioko fitxategi sistemaren aztertketak huts egin du. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: Emaitza egokienak lortzeko, ziurtatu ordenagailu honek baduela: System requirements Sistemaren betebeharrak ChoicePage Form After: Ondoren: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Eskuz partizioak landu</strong><br/>Zure kasa sortu edo tamainaz alda dezakezu partizioak. Boot loader location: Abio kargatzaile kokapena: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Unekoa: Reuse %1 as home partition for %2. Berrerabili %1 home partizio bezala %2rentzat. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> <strong>aukeratu partizioa instalatzeko</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Ezin da inon aurkitu EFI sistemako partiziorik sistema honetan. Mesedez joan atzera eta erabili eskuz partizioak lantzea %1 ezartzeko. The EFI system partition at %1 will be used for starting %2. %1eko EFI partizio sistema erabiliko da abiarazteko %2. EFI system partition: EFI sistema-partizioa: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Sortu partizio bat MiB Partition &Type: PartizioMo&ta: &Primary &Primarioa E&xtended &Hedatua Fi&le System: Flags: &Mount Point: &Muntatze Puntua: Si&ze: Ta&maina: En&crypt Logical Logikoa Primary Primarioa GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. Ezin izan da partizio taula ireki. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Sortu Partizio Taula Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partizio Taula (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. Ezin izan da %1 gailua ireki. CreateUserJob Create user %1 Sortu %1 erabiltzailea Create user <strong>%1</strong>. Creating user %1. %1 erabiltzailea sortzen. Sudoers dir is not writable. Ezin da sudoers direktorioan idatzi. Cannot create sudoers file for writing. Ezin da sudoers fitxategia sortu bertan idazteko. Cannot chmod sudoers file. Ezin zaio chmod egin sudoers fitxategiari. Cannot open groups file for reading. Ezin da groups fitxategia ireki berau irakurtzeko. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Ezabatu %1 partizioa. Delete partition <strong>%1</strong>. Deleting partition %1. %1 partizioa ezabatzen. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Ezin izan da %1 gailua ireki. Could not open partition table. Ezin izan da partizio taula ireki. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: Edukia: &Keep Format Formateatu Warning: Formatting the partition will erase all existing data. Oharra: Partizioa formateatzean dauden datu guztiak ezabatuko dira. &Mount Point: &Muntatze Puntua: Si&ze: &Tamaina: MiB Fi&le System: Fi&txategi-Sistema: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Ezarri partizioaren informazioa Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Ezarri %2 partizio <strong>berria</strong> <strong>%1</strong> muntatze puntuarekin. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Ezarri %3 partizioa <strong>%1</strong> <strong>%2</strong> muntatze puntuarekin. Install boot loader on <strong>%1</strong>. Setting up mount points. Muntatze puntuak ezartzen. FinishedPage Form &Restart now &Berrabiarazi orain <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Bukatu Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. Ezin izan da partizio taula ireki. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Konsole ez dago instalatuta Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Teklatua LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. Goiko baldintzak onartzen ditut. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License Lizentzia LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Eskualdea: Zone: Zonaldea: &Change... &Aldatu... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Kokapen datuak kargatzen... Location Kokapena MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Teklatu Modeloa: Type here to test your keyboard Idatzi hemen zure teklatua frogatzeko Page_UserSetup Form What is your name? Zein da zure izena? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? Zein da ordenagailu honen izena? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Hasi saioa automatikoki pasahitza eskatu gabe. Use the same password for the administrator account. Erabili pasahitz bera administratzaile kontuan. Choose a password for the administrator account. Aukeratu pasahitz bat administratzaile kontuarentzat. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Espazio librea New partition Partizio berria Name Izena File System Fitxategi Sistema Mount Point Muntatze Puntua Size Tamaina PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table Partizio &Taula berria &Create &Sortu &Edit &Editatu &Delete E&zabatu Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Sistemaren informazioa eskuratzen... Partitions Partizioak Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default Lehenetsia unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... Sistemaren informazioa eskuratzen... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. Sistema ez dago indar iturri batetara konektatuta. is connected to the Internet Internetera konektatuta dago The system is not connected to the Internet. Sistema ez dago Internetera konektatuta. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Barne errorea Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Ezin izan da %1 partizioan idatzi Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. Ezin izan da partizioaren geometria aldatu. SetPasswordJob Set password for user %1 Ezarri %1 erabiltzailearen pasahitza Setting password for user %1. Bad destination system path. rootMountPoint is %1 root Muntatze Puntua %1 da Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Bide okerra: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Laburpena UsersPage Your username is too long. Zure erabiltzaile-izena luzeegia da. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Zure ostalari-izena laburregia da. Your hostname is too long. Zure ostalari-izena luzeegia da. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Pasahitzak ez datoz bat! UsersViewStep Users Erabiltzaileak WelcomePage Form &Language: &Hizkuntza: &Release notes &Known issues &Arazo ezagunak &Support &Laguntza &About Honi &buruz <h1>Welcome to the %1 installer.</h1> <h1>Ongi etorri %1 instalatzailera.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer %1 instalatzaileari buruz <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 euskarria WelcomeViewStep Welcome Ongi etorri calamares-3.1.12/lang/calamares_fa.ts000066400000000000000000003136231322271446000174260ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_fi_FI.ts000066400000000000000000003266771322271446000200310ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 %1:n MBR Boot Partition Käynnistysosio System Partition Järjestelmäosio Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Valmis Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Ulkoinen komento kaatui Command %1 crashed. Output: %2 Komento %1 kaatui. Tuloste: %2 External command failed to start Ulkoisen komennon käynnistys epäonnistui Command %1 failed to start. Komennon %1 käynnistys epäonnistui. Internal error when starting command Sisäinen virhe suoritettaessa komentoa Bad parameters for process job call. Huonot parametrit prosessin kutsuun. External command failed to finish Ulkoista komentoa ei voitu ajaa loppuun Command %1 failed to finish in %2s. Output: %3 Komento %1 epäonnistui ajassa %2s. Tuloste: %3 External command finished with errors Ulkoinen komento päättyi virheeseen Command %1 finished with exit code %2. Output: %3 Komennon %1 suoritus loppui koodilla %2. Tuloste: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Epäkelpo työskentelyhakemiston polku Working directory %1 for python job %2 is not readable. Työkansio %1 pythonin työlle %2 ei ole luettavissa. Bad main script file Huono pää-skripti tiedosto Main script file %1 for python job %2 is not readable. Pääskriptitiedosto %1 pythonin työlle %2 ei ole luettavissa. Boost.Python error in job "%1". Boost.Python virhe työlle "%1". Calamares::ViewManager &Back &Takaisin &Next &Seuraava &Cancel &Peruuta Cancel installation without changing the system. Cancel installation? Peruuta asennus? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Oletko varma että haluat peruuttaa käynnissä olevan asennusprosessin? Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Virhe Installation Failed Asennus Epäonnistui CalamaresPython::Helper Unknown exception type Tuntematon poikkeustyyppi unparseable Python error jäsentämätön Python virhe unparseable Python traceback jäsentämätön Python jäljitys Unfetchable Python error. Python virhettä ei voitu hakea. CalamaresWindow %1 Installer %1 Asennusohjelma Show debug information CheckFileSystemJob Checking file system on partition %1. Tarkistetaan tiedostojärjestelmän osiota %1. The file system check on partition %1 failed. Tiedostojärjestelmän tarkistus osiolla %1 epäonnistui. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Poista osiointitoimenpiteitä varten tehdyt liitokset kohteesta %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Kaikki liitokset poistettu kohteesta %1 ClearTempMountsJob Clear all temporary mounts. Poista kaikki väliaikaiset liitokset. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. Poistettu kaikki väliaikaiset liitokset. CreatePartitionDialog Create a Partition Luo levyosio MiB Partition &Type: Osion &Tyyppi: &Primary &Ensisijainen E&xtended &Laajennettu Fi&le System: Flags: &Mount Point: &Liitoskohta: Si&ze: K&oko: En&crypt Logical Looginen Primary Ensisijainen GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Asennusohjelma epäonnistui osion luonnissa levylle '%1'. Could not open device '%1'. Ei pystytty avaamaan laitetta '%1'. Could not open partition table. Osiotaulukkoa ei voitu avata. The installer failed to create file system on partition %1. Asennusohjelma epäonnistui tiedostojärjestelmän luonnissa osiolle %1. The installer failed to update partition table on disk '%1'. Asennusohjelman epäonnistui päivittää osio levyllä '%1'. CreatePartitionTableDialog Create Partition Table Luo Osiotaulukko Creating a new partition table will delete all existing data on the disk. Uuden osiotaulukon luominen poistaa kaikki olemassa olevat tiedostot levyltä. What kind of partition table do you want to create? Minkälaisen osiotaulukon haluat luoda? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Asennusohjelma epäonnistui osiotaulukon luonnissa kohteeseen %1. Could not open device %1. Laitetta %1 ei voitu avata. CreateUserJob Create user %1 Luo käyttäjä %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Ei voitu kirjoittaa Sudoers -hakemistoon. Cannot create sudoers file for writing. Ei voida luoda sudoers -tiedostoa kirjoitettavaksi. Cannot chmod sudoers file. Ei voida tehdä käyttöoikeuden muutosta sudoers -tiedostolle. Cannot open groups file for reading. Ei voida avata ryhmätiedostoa luettavaksi. Cannot create user %1. Käyttäjää %1 ei voi luoda. useradd terminated with error code %1. useradd päättyi virhekoodilla %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Ei voida asettaa kotihakemiston omistusoikeutta käyttäjälle %1. chown terminated with error code %1. chown päättyi virhekoodilla %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Asennusohjelma epäonnistui osion %1 poistossa. Partition (%1) and device (%2) do not match. Osio (%1) ja laite (%2) eivät täsmää. Could not open device %1. Ei voitu avata laitetta %1. Could not open partition table. Osiotaulukkoa ei voitu avata. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Muokkaa olemassa olevaa osiota Content: Sisältö: &Keep Format Alusta Warning: Formatting the partition will erase all existing data. Varoitus: Osion alustus tulee poistamaan kaikki olemassa olevat tiedostot. &Mount Point: &Liitoskohta: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Aseta osion tiedot Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form Lomake &Restart now &Käynnistä uudelleen <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Kaikki tehty.</h1><br/>%1 on asennettu tietokoneellesi.<br/>Voit joko uudelleenkäynnistää uuteen kokoonpanoosi, tai voit jatkaa %2 live-ympäristön käyttöä. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Alusta osio %1 (tiedostojärjestelmä: %2, koko: %3 MB) levyllä %4 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Levyn '%2' osion %1 alustus epäonnistui. Could not open device '%1'. Ei voitu avata laitetta '%1'. Could not open partition table. Osiointitaulua ei voitu avata. The installer failed to create file system on partition %1. Asennusohjelma on epäonnistunut tiedostojärjestelmän luonnissa osiolle %1. The installer failed to update partition table on disk '%1'. Asennusohjelma on epäonnistunut osiointitaulun päivityksessä levylle '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Aseta näppäimiston malli %1.<br/> Set keyboard layout to %1/%2. Aseta näppäimiston asetelmaksi %1/%2. KeyboardViewStep Keyboard Näppäimistö LCLocaleDialog System locale setting Järjestelmän maa-asetus The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Alue: Zone: Vyöhyke: &Change... &Vaihda... Set timezone to %1/%2.<br/> Aseta aikavyöhyke %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Ladataan sijainnin tietoja... Location Sijainti MoveFileSystemJob Move file system of partition %1. Siirrä osion %1 tiedostojärjestelmä. Could not open file system on partition %1 for moving. Ei voitu avata tiedostojärjestelmää osiolla %1 siirtämiseen. Could not create target for moving file system on partition %1. Ei voitu luoda kohdetta tiedostojärjestelmän siirtoon osiolle %1. Moving of partition %1 failed, changes have been rolled back. Osion %1 siirtäminen epäonnistui, muutokset on palautettu aikaisempaan versioon. Moving of partition %1 failed. Roll back of the changes have failed. Osion %1 siirtäminen epäonnistui. Muutosten palauttaminen epäonnistui. Updating boot sector after the moving of partition %1 failed. Käynnistyslohkon päivitys epäonnistui osion %1 siirtämisen jälkeen. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Loogisten sektoreiden koot eivät täsmää lähde ja kohde sektorissa. Tämä ei ole toistaiseksi tuettu toiminto. Source and target for copying do not overlap: Rollback is not required. Kopioimisen lähde ja kohde eivät mene limittäin. Palauttaminen ei ole tarpeellista. Could not open device %1 to rollback copying. Laitetta %1 ei voitu avata palautuskopiointia varten. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Lomake Keyboard Model: Näppäimistön malli: Type here to test your keyboard Kirjoita tähän testaksesi näppäimistöäsi. Page_UserSetup Form Lomake What is your name? Mikä on nimesi? What name do you want to use to log in? Mitä nimeä haluat käyttää sisäänkirjautumisessa? font-weight: normal fontin koko: normaali <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>jos enemmän kuin yksi henkilö käyttää tätä tietokonetta, voit lisätä lisää tilejä asennuksen jälkeen.</small> Choose a password to keep your account safe. Valitse salasana pitääksesi tilisi turvallisena. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Syötä salasana kahdesti välttääksesi kirjoitusvirheitä. Hyvän salasanan tulee sisältää sekoitetusti kirjaimia, numeroita ja erikoismerkkejä. Salasanan täytyy olla vähintään kahdeksan merkin mittainen ja tulee vaihtaa säännöllisin väliajoin.</small> What is the name of this computer? Mikä on tämän tietokoneen nimi? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Tätä nimeä tullaan käyttämään mikäli asetat tietokoneen näkyviin muille verkossa.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. Valitse salasana pääkäyttäjän tilille. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Syötä salasana kahdesti välttääksesi kirjoitusvirheitä.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Vapaa tila New partition Uusi osiointi Name Nimi File System Tiedostojärjestelmä Mount Point Liitoskohta Size Koko PartitionPage Form Lomake Storage de&vice: &Revert All Changes &Peru kaikki muutokset New Partition &Table Uusi osiointi&taulukko &Create &Luo &Edit &Muokkaa &Delete &Poista Install boot &loader on: Are you sure you want to create a new partition table on %1? Oletko varma, että haluat luoda uuden osion %1? PartitionViewStep Gathering system information... Kerätään järjestelmän tietoja... Partitions Osiot Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Oletus näppäimistömalli Default Oletus unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Muuta tiedostojärjestelmän kokoa osiolla %1. Parted failed to resize filesystem. Parted epäonnistui osion koon muutoksessa. Failed to resize filesystem. Osion koon muutos epäonnistui. ResizePartitionJob Resize partition %1. Muuta osion kokoa %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Asennusohjelma epäonnistui osion %1 koon muuttamisessa levyllä '%2'. Could not open device '%1'. Laitetta ei voi avata %1. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Aseta isäntänimi %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Sisäinen Virhe Cannot write hostname to target system Ei voida kirjoittaa isäntänimeä kohdejärjestelmään. SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Aseta näppäimistön malliksi %1, asetelmaksi %2-%3 Failed to write keyboard configuration for the virtual console. Virtuaalikonsolin näppäimistöasetuksen tallentaminen epäonnistui. Failed to write to %1 Kirjoittaminen epäonnistui kohteeseen %1 Failed to write keyboard configuration for X11. X11 näppäimistöasetuksen tallentaminen epäonnistui. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Päivitä osion %1 geometria. Failed to change the geometry of the partition. Osion geometrian muuttaminen epäonnistui. SetPasswordJob Set password for user %1 Aseta salasana käyttäjälle %1 Setting password for user %1. Bad destination system path. Huono kohteen järjestelmäpolku rootMountPoint is %1 rootMountPoint on %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. Salasanaa ei voi asettaa käyttäjälle %1. usermod terminated with error code %1. usermod päättyi virhekoodilla %1. SetTimezoneJob Set timezone to %1/%2 Aseta aikavyöhykkeeksi %1/%2 Cannot access selected timezone path. Ei pääsyä valittuun aikavyöhykkeen polkuun. Bad path: %1 Huono polku: %1 Cannot set timezone. Aikavyöhykettä ei voi asettaa. Link creation failed, target: %1; link name: %2 Linkin luominen kohteeseen %1 epäonnistui; linkin nimi: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Yhteenveto UsersPage Your username is too long. Käyttäjänimesi on liian pitkä. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Isäntänimesi on liian lyhyt. Your hostname is too long. Isäntänimesi on liian pitkä. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Isäntänimesi sisältää epäkelpoja merkkejä. Vain kirjaimet, numerot ja väliviivat ovat sallittuja. Your passwords do not match! Salasanasi eivät täsmää! UsersViewStep Users Käyttäjät WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_fr.ts000066400000000000000000003766331322271446000174610ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. L'<strong>environnement de démarrage</strong> de ce système.<br><br>Les anciens systèmes x86 supportent uniquement le <strong>BIOS</strong>.<br>Les systèmes récents utilisent habituellement <strong>EFI</strong>, mais peuvent également exposer BIOS si démarré en mode de compatibilité. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Ce système a été initialisé avec un environnement de démarrage <strong>EFI</strong>.<br><br>Pour configurer le démarrage depuis un environnement EFI, cet installateur doit déployer un chargeur de démarrage, comme <strong>GRUB</strong> ou <strong>systemd-boot</strong> sur une <strong>partition système EFI</strong>. Ceci est automatique, à moins que vous n'ayez sélectionné le partitionnement manuel, auquel cas vous devez en choisir une ou la créer vous même. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Ce système a été initialisé avec un environnement de démarrage <strong>BIOS</strong>.<br><br>Pour configurer le démarrage depuis un environnement BIOS, cet installateur doit déployer un chargeur de démarrage, comme <strong>GRUB</strong> ou <strong>systemd-boot</strong> au début d'une partition ou bien sur le <strong>Master Boot Record</strong> au début de la table des partitions (méthode privilégiée). Ceci est automatique, à moins que vous n'ayez sélectionné le partitionnement manuel, auquel cas vous devez le configurer vous-même. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partition de démarrage System Partition Partition Système Do not install a boot loader Ne pas installer de chargeur de démarrage %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulaire GlobalStorage Stockage global JobQueue File de travail Modules Modules Type: Type : none aucun Interface: Interface: Tools Outils Debug information Informations de dépannage Calamares::ExecutionViewStep Install Installer Calamares::JobThread Done Fait Calamares::ProcessJob Run command %1 %2 Exécution de la commande %1 %2 Running command %1 %2 Exécution de la commande %1 %2 External command crashed La commande externe a échoué Command %1 crashed. Output: %2 La commande %1 a échoué. Sortie : %2 External command failed to start La commande externe n'a pas pu être lancée. Command %1 failed to start. La commande %1 n'a pas pu être lancée. Internal error when starting command Erreur interne au lancement de la commande Bad parameters for process job call. Mauvais paramètres pour l'appel au processus de job. External command failed to finish La commande externe ne s'est pas terminée. Command %1 failed to finish in %2s. Output: %3 La commande %1 ne s'est pas terminée en %2s. Sortie : %3 External command finished with errors La commande externe s'est terminée avec des erreurs Command %1 finished with exit code %2. Output: %3 La commande %1 s'est terminée avec le code de sortie %2. Sortie : %3 Calamares::PythonJob Running %1 operation. Exécution de l'opération %1. Bad working directory path Chemin du répertoire de travail invalide Working directory %1 for python job %2 is not readable. Le répertoire de travail %1 pour le job python %2 n'est pas accessible en lecture. Bad main script file Fichier de script principal invalide Main script file %1 for python job %2 is not readable. Le fichier de script principal %1 pour la tâche python %2 n'est pas accessible en lecture. Boost.Python error in job "%1". Erreur Boost.Python pour le job "%1". Calamares::ViewManager &Back &Précédent &Next &Suivant &Cancel &Annuler Cancel installation without changing the system. Annuler l'installation sans modifier votre système. Cancel installation? Abandonner l'installation ? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Voulez-vous réellement abandonner le processus d'installation ? L'installateur se fermera et les changements seront perdus. &Yes &Oui &No &Non &Close &Fermer Continue with setup? Poursuivre la configuration ? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> L'installateur %1 est sur le point de procéder aux changements sur le disque afin d'installer %2.<br/> <strong>Vous ne pourrez pas annulez ces changements.<strong> &Install now &Installer maintenant Go &back &Retour &Done &Terminé The installation is complete. Close the installer. L'installation est terminée. Fermer l'installateur. Error Erreur Installation Failed L'installation a échoué CalamaresPython::Helper Unknown exception type Type d'exception inconnue unparseable Python error Erreur Python non analysable unparseable Python traceback Traçage Python non exploitable Unfetchable Python error. Erreur Python non rapportable. CalamaresWindow %1 Installer Installateur %1 Show debug information Afficher les informations de dépannage CheckFileSystemJob Checking file system on partition %1. Vérification du système de fichiers sur la partition %1. The file system check on partition %1 failed. La vérification du système de fichiers sur la partition %1 a échoué. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Cet ordinateur ne satisfait pas les minimum prérequis pour installer %1.<br/>L'installation ne peut pas continuer. <a href="#details">Détails...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Cet ordinateur ne satisfait pas certains des prérequis recommandés pour installer %1.<br/>L'installation peut continuer, mais certaines fonctionnalités pourraient être désactivées. This program will ask you some questions and set up %2 on your computer. Ce programme va vous poser quelques questions et installer %2 sur votre ordinateur. For best results, please ensure that this computer: Pour de meilleur résultats, merci de s'assurer que cet ordinateur : System requirements Prérequis système ChoicePage Form Formulaire After: Après: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Partitionnement manuel</strong><br/>Vous pouvez créer ou redimensionner vous-même des partitions. Boot loader location: Emplacement du chargeur de démarrage: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 va être réduit à %2Mo et une nouvelle partition de %3Mo va être créée pour %4. Select storage de&vice: Sélectionnez le support de sto&ckage : Current: Actuel : Reuse %1 as home partition for %2. Réutiliser %1 comme partition home pour %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Sélectionnez une partition à réduire, puis faites glisser la barre du bas pour redimensionner</strong> <strong>Select a partition to install on</strong> <strong>Sélectionner une partition pour l'installation</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Une partition système EFI n'a pas pu être trouvée sur ce système. Veuillez retourner à l'étape précédente et sélectionner le partitionnement manuel pour configurer %1. The EFI system partition at %1 will be used for starting %2. La partition système EFI sur %1 va être utilisée pour démarrer %2. EFI system partition: Partition système EFI : This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ce périphérique de stockage ne semble pas contenir de système d'exploitation. Que souhaitez-vous faire ?<br/>Vous pourrez relire et confirmer vos choix avant que les modifications soient effectuées sur le périphérique de stockage. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Effacer le disque</strong><br/>Ceci va <font color="red">effacer</font> toutes les données actuellement présentes sur le périphérique de stockage sélectionné. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ce périphérique de stockage contient %1. Que souhaitez-vous faire ?<br/>Vous pourrez relire et confirmer vos choix avant que les modifications soient effectuées sur le périphérique de stockage. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Installer à côté</strong><br/>L'installateur va réduire une partition pour faire de la place pour %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Remplacer une partition</strong><br>Remplace une partition par %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ce périphérique de stockage contient déjà un système d'exploitation. Que souhaitez-vous faire ?<br/>Vous pourrez relire et confirmer vos choix avant que les modifications soient effectuées sur le périphérique de stockage. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ce péiphérique de stockage contient déjà plusieurs systèmes d'exploitation. Que souhaitez-vous faire ?<br/>Vous pourrez relire et confirmer vos choix avant que les modifications soient effectuées sur le périphérique de stockage. ClearMountsJob Clear mounts for partitioning operations on %1 Retirer les montages pour les opérations de partitionnement sur %1 Clearing mounts for partitioning operations on %1. Libération des montages pour les opérations de partitionnement sur %1. Cleared all mounts for %1 Tous les montages ont été retirés pour %1 ClearTempMountsJob Clear all temporary mounts. Supprimer les montages temporaires. Clearing all temporary mounts. Libération des montages temporaires. Cannot get list of temporary mounts. Impossible de récupérer la liste des montages temporaires. Cleared all temporary mounts. Supprimer les montages temporaires. CreatePartitionDialog Create a Partition Créer une partition MiB Mio Partition &Type: Type de partition : &Primary &Primaire E&xtended É&tendue Fi&le System: Sy&stème de fichiers: Flags: Drapeaux: &Mount Point: Point de &Montage : Si&ze: Ta&ille : En&crypt Chi&ffrer Logical Logique Primary Primaire GPT GPT Mountpoint already in use. Please select another one. Le point de montage est déjà utilisé. Merci d'en sélectionner un autre. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Créer une nouvelle partition de %2Mo sur %4 (%3) avec le système de fichiers %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Créer une nouvelle partition de <strong>%2Mo</strong> sur <strong>%4</strong> (%3) avec le système de fichiers <strong>%1</strong>. Creating new %1 partition on %2. Création d'une nouvelle partition %1 sur %2. The installer failed to create partition on disk '%1'. Le programme d'installation n'a pas pu créer la partition sur le disque '%1'. Could not open device '%1'. Impossible d'ouvrir le périphérique '%1'. Could not open partition table. Impossible d'ouvrir la table de partitionnement. The installer failed to create file system on partition %1. Le programme d'installation n'a pas pu créer le système de fichiers sur la partition %1. The installer failed to update partition table on disk '%1'. Le programme d'installation n'a pas pu mettre à jour la table de partitionnement sur le disque '%1'. CreatePartitionTableDialog Create Partition Table Créer une table de partitionnement Creating a new partition table will delete all existing data on the disk. Créer une nouvelle table de partitionnement supprimera toutes les données existantes sur le disque. What kind of partition table do you want to create? Quel type de table de partitionnement voulez-vous créer ? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Table de partitionnement GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Créer une nouvelle table de partition %1 sur %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Créer une nouvelle table de partitions <strong>%1</strong> sur <strong>%2</strong> (%3). Creating new %1 partition table on %2. Création d'une nouvelle table de partitions %1 sur %2. The installer failed to create a partition table on %1. Le programme d'installation n'a pas pu créer la table de partitionnement sur le disque %1. Could not open device %1. Impossible d'ouvrir le périphérique %1. CreateUserJob Create user %1 Créer l'utilisateur %1 Create user <strong>%1</strong>. Créer l'utilisateur <strong>%1</strong>. Creating user %1. Création de l'utilisateur %1. Sudoers dir is not writable. Le répertoire Superutilisateur n'est pas inscriptible. Cannot create sudoers file for writing. Impossible de créer le fichier sudoers en écriture. Cannot chmod sudoers file. Impossible d'exécuter chmod sur le fichier sudoers. Cannot open groups file for reading. Impossible d'ouvrir le fichier groups en lecture. Cannot create user %1. Impossible de créer l'utilisateur %1. useradd terminated with error code %1. useradd s'est terminé avec le code erreur %1. Cannot add user %1 to groups: %2. Impossible d'ajouter l'utilisateur %1 au groupe %2. usermod terminated with error code %1. usermod s'est terminé avec le code erreur %1. Cannot set home directory ownership for user %1. Impossible de définir le propriétaire du répertoire home pour l'utilisateur %1. chown terminated with error code %1. chown s'est terminé avec le code erreur %1. DeletePartitionJob Delete partition %1. Supprimer la partition %1. Delete partition <strong>%1</strong>. Supprimer la partition <strong>%1</strong>. Deleting partition %1. Suppression de la partition %1. The installer failed to delete partition %1. Le programme d'installation n'a pas pu supprimer la partition %1. Partition (%1) and device (%2) do not match. La partition (%1) et le périphérique (%2) ne correspondent pas. Could not open device %1. Impossible d'ouvrir le périphérique %1. Could not open partition table. Impossible d'ouvrir la table de partitionnement. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Le type de <strong>table de partitions</strong> sur le périphérique de stockage sélectionné.<br><br>Le seul moyen de changer le type de table de partitions est d'effacer et de recréer entièrement la table de partitions, ce qui détruit toutes les données sur le périphérique de stockage.<br>Cette installateur va conserver la table de partitions actuelle à moins de faire explicitement un autre choix.<br>Si vous n'êtes pas sûr, sur les systèmes modernes GPT est à privilégier. This device has a <strong>%1</strong> partition table. Ce périphérique utilise une table de partitions <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Ceci est un périphérique <strong>loop</strong>.<br><br>C'est un pseudo-périphérique sans table de partitions qui rend un fichier acccessible comme un périphérique de type block. Ce genre de configuration ne contient habituellement qu'un seul système de fichiers. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. L'installateur <strong>n'a pas pu détecter de table de partitions</strong> sur le périphérique de stockage sélectionné.<br><br>Le périphérique ne contient pas de table de partition, ou la table de partition est corrompue ou d'un type inconnu.<br>Cet installateur va créer une nouvelle table de partitions pour vous, soit automatiquement, soit au travers de la page de partitionnement manuel. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Ceci est le type de tables de partition recommandé pour les systèmes modernes qui démarrent depuis un environnement <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Ce type de table de partitions est uniquement envisageable que sur d'anciens systèmes qui démarrent depuis un environnement <strong>BIOS</strong>. GPT est recommandé dans la plupart des autres cas.<br><br><strong>Attention : </strong> la table de partitions MBR est un standard de l'ère MS-DOS.<br>Seules 4 partitions <em>primaires</em>peuvent être créées, et parmi ces 4, l'une peut être une partition <em>étendue</em>, qui à son tour peut contenir plusieurs partitions <em>logiques</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Inscrire la configuration LUKS pour Dracut sur %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Ne pas enreigstrer la configuration LUKS pour Dracut : la partition "/" n'est pas chiffrée Failed to open %1 Impossible d'ouvrir %1 DummyCppJob Dummy C++ Job Tâche C++ fictive EditExistingPartitionDialog Edit Existing Partition Éditer une partition existante Content: Contenu : &Keep &Conserver Format Formater Warning: Formatting the partition will erase all existing data. Attention : le formatage de cette partition effacera toutes les données existantes. &Mount Point: Point de &Montage : Si&ze: Ta&ille: MiB Mio Fi&le System: Sys&tème de fichiers: Flags: Drapeaux: Mountpoint already in use. Please select another one. Le point de montage est déjà utilisé. Merci d'en sélectionner un autre. EncryptWidget Form Formulaire En&crypt system Chi&ffrer le système Passphrase Phrase de passe Confirm passphrase Confirmez la phrase de passe Please enter the same passphrase in both boxes. Merci d'entrer la même phrase de passe dans les deux champs. FillGlobalStorageJob Set partition information Configurer les informations de la partition Install %1 on <strong>new</strong> %2 system partition. Installer %1 sur le <strong>nouveau</strong> système de partition %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configurer la <strong>nouvelle</strong> partition %2 avec le point de montage <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Installer %2 sur la partition système %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configurer la partition %3 <strong>%1</strong> avec le point de montage <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installer le chargeur de démarrage sur <strong>%1</strong>. Setting up mount points. Configuration des points de montage. FinishedPage Form Formulaire &Restart now &Redémarrer maintenant <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation terminée.</h1><br/>%1 a été installé sur votre ordinateur.<br/>Vous pouvez redémarrer sur le nouveau système, ou continuer d'utiliser l'environnement actuel %2 . <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installation échouée</h1><br/>%1 n'a pas été installée sur cet ordinateur.<br/>Le message d'erreur était : %2. FinishedViewStep Finish Terminer Installation Complete Installation terminée The installation of %1 is complete. L'installation de %1 est terminée. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formater la partition %1 (système de fichier : %2, taille : %3 Mo) sur %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formater la partition <strong>%1</strong> de <strong>%3MB</strong> avec le système de fichiers <strong>%2</strong>. Formatting partition %1 with file system %2. Formatage de la partition %1 avec le système de fichiers %2. The installer failed to format partition %1 on disk '%2'. Le programme d'installation n'a pas pu formater la partition %1 sur le disque '%2'. Could not open device '%1'. Impossible d'ouvrir le périphérique '%1'. Could not open partition table. Impossible d'ouvrir la table de partitionnement. The installer failed to create file system on partition %1. Le programme d'installation n'a pas pu créer le système de fichiers sur la partition %1. The installer failed to update partition table on disk '%1'. Le programme d'installation n'a pas pu mettre à jour la table de partitionnement sur le disque '%1'. InteractiveTerminalPage Konsole not installed Konsole n'a pas été installé Please install the kde konsole and try again! Merci d'installer Konsole et de réessayer ! Executing script: &nbsp;<code>%1</code> Exécution en cours du script : &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Configurer le modèle de clavier à %1.<br/> Set keyboard layout to %1/%2. Configurer la disposition clavier à %1/%2. KeyboardViewStep Keyboard Clavier LCLocaleDialog System locale setting Paramètre régional The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Les paramètres régionaux systèmes affectent la langue et le jeu de caractère pour la ligne de commande et différents éléments d'interface.<br/>Le paramètre actuel est <strong>%1</strong>. &Cancel &Annuler &OK &OK LicensePage Form Formulaire I accept the terms and conditions above. J'accepte les termes et conditions ci-dessus. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Accord de licence</h1>Cette procédure de configuration va installer des logiciels propriétaire sujet à des termes de licence. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Merci de relire les Contrats de Licence Utilisateur Final (CLUF/EULA) ci-dessus.<br/>Si vous n'acceptez pas les termes, la procédure ne peut pas continuer. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Accord de licence</h1>Cette procédure peut installer des logiciels propriétaires qui sont soumis à des termes de licence afin d'ajouter des fonctionnalités et améliorer l'expérience utilisateur. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Merci de relire les Contrats de Licence Utilisateur Final (CLUF/EULA) ci-dessus.<br/>Si vous n'acceptez pas les termes, les logiciels propriétaires ne seront pas installés, et des alternatives open-source seront utilisées à la place. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>Pilote %1</strong><br/>par %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>Pilote graphique %1</strong><br/><font color="Grey">par %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>Module de navigateur %1</strong><br/><font color="Grey">par %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>Codec %1</strong><br/><font color="Grey">par %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>Paquet %1</strong><br/><font color="Grey">par %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">par %2</font> <a href="%1">view license agreement</a> <a href="%1">Consulter l'accord de licence</a> LicenseViewStep License Licence LocalePage The system language will be set to %1. La langue du système sera réglée sur %1. The numbers and dates locale will be set to %1. Les nombres et les dates seront réglés sur %1. Region: Région : Zone: Zone : &Change... &Modifier... Set timezone to %1/%2.<br/> Configurer le fuseau horaire à %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Chargement des données de localisation... Location Localisation MoveFileSystemJob Move file system of partition %1. Déplacer le système de fichier de la partition %1. Could not open file system on partition %1 for moving. Impossible d'ouvrir le sytème de fichiers sur la partition %1 à déplacer. Could not create target for moving file system on partition %1. Impossible de créer la cible pour le déplacement du système de fichiers sur la partition %1. Moving of partition %1 failed, changes have been rolled back. Le déplacement de la partition %1 a échoué, les changements ont été annulés. Moving of partition %1 failed. Roll back of the changes have failed. Le déplacement de la partition %1 a échoué. L'annulation des changements a échoué. Updating boot sector after the moving of partition %1 failed. La mise à jour du secteur de démarrage après le déplacement de la partition %1 a échoué. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Les tailles des secteurs logiques source et cible pour la copie ne sont pas les mêmes. Ceci est actuellement non supporté. Source and target for copying do not overlap: Rollback is not required. La source et la cible pour la copie ne se chevauchent pas : un retour en arrière n'est pas nécessaire. Could not open device %1 to rollback copying. Impossible d'ouvrir le périphérique %1 pour annuler la copie. NetInstallPage Name Nom Description Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Installation par le réseau (Désactivée : impossible de récupérer leslistes de paquets, vérifiez la connexion réseau) NetInstallViewStep Package selection Sélection des paquets Page_Keyboard Form Formulaire Keyboard Model: Modèle Clavier : Type here to test your keyboard Saisir ici pour tester votre clavier Page_UserSetup Form Formulaire What is your name? Quel est votre nom ? What name do you want to use to log in? Quel nom souhaitez-vous utiliser pour la connexion ? font-weight: normal style de police : normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>si plusieurs personnes utilisent cet ordinateur, vous pourrez créer plusieurs comptes après l'installation.</small> Choose a password to keep your account safe. Veuillez saisir le mot de passe pour sécuriser votre compte. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Veuillez entrer le même mot de passe deux fois afin de vérifier qu'il n'y ait pas d'erreur de frappe. Un bon mot de passe doit contenir un mélange de lettres, de nombres et de caractères de ponctuation, contenir au moins huit caractères et être changé à des intervalles réguliers.</small> What is the name of this computer? Quel est le nom de votre ordinateur ? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ce nom sera utilisé pour rendre l'ordinateur visible des autres sur le réseau.</small> Log in automatically without asking for the password. Démarrer la session sans demander de mot de passe. Use the same password for the administrator account. Utiliser le même mot de passe pour le compte administrateur. Choose a password for the administrator account. Choisir un mot de passe pour le compte administrateur. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Veuillez entrer le même mot de passe deux fois, afin de vérifier qu'ils n'y ait pas d'erreur de frappe.</small> PartitionLabelsView Root Racine Home Home Boot Démarrage EFI system Système EFI Swap Swap New partition for %1 Nouvelle partition pour %1 New partition Nouvelle partition %1 %2 %1 %2 PartitionModel Free Space Espace libre New partition Nouvelle partition Name Nom File System Système de fichiers Mount Point Point de montage Size Taille PartitionPage Form Formulaire Storage de&vice: Périphérique de stockage: &Revert All Changes &Annuler tous les changements New Partition &Table Nouvelle &table de partitionnement &Create &Créer &Edit &Modifier &Delete &Supprimer Install boot &loader on: Installer le chargeur de démarrage sur: Are you sure you want to create a new partition table on %1? Êtes-vous sûr de vouloir créer une nouvelle table de partitionnement sur %1 ? PartitionViewStep Gathering system information... Récupération des informations système… Partitions Partitions Install %1 <strong>alongside</strong> another operating system. Installer %1 <strong>à côté</strong>d'un autre système d'exploitation. <strong>Erase</strong> disk and install %1. <strong>Effacer</strong> le disque et installer %1. <strong>Replace</strong> a partition with %1. <strong>Remplacer</strong> une partition avec %1. <strong>Manual</strong> partitioning. Partitionnement <strong>manuel</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Installer %1 <strong>à côté</strong> d'un autre système d'exploitation sur le disque <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Effacer</strong> le disque <strong>%2</strong> (%3) et installer %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Remplacer</strong> une partition sur le disque <strong>%2</strong> (%3) avec %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Partitionnement <strong>manuel</strong> sur le disque <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disque <strong>%1</strong> (%2) Current: Actuel : After: Après : No EFI system partition configured Aucune partition système EFI configurée An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Une partition système EFI est nécessaire pour démarrer %1.<br/><br/>Pour configurer une partition système EFI, revenez en arrière et sélectionnez ou créez une partition FAT32 avec le drapeau <strong>esp</strong> activé et le point de montage <strong>%2</strong>.<br/><br/>Vous pouvez continuer sans configurer de partition système EFI mais votre système pourrait refuser de démarrer. EFI system partition flag not set Drapeau de partition système EFI non configuré An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Une partition système EFI est nécessaire pour démarrer %1.<br/><br/>Une partition a été configurée avec le point de montage <strong>%2</strong> mais son drapeau <strong>esp</strong> n'est pas activé.<br/>Pour activer le drapeau, revenez en arrière et éditez la partition.<br/><br/>Vous pouvez continuer sans activer le drapeau mais votre système pourrait refuser de démarrer. Boot partition not encrypted Partition d'amorçage non chiffrée. A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Une partition d'amorçage distincte a été configurée avec une partition racine chiffrée, mais la partition d'amorçage n'est pas chiffrée. <br/> <br/> Il y a des problèmes de sécurité avec ce type d'installation, car des fichiers système importants sont conservés sur une partition non chiffrée <br/> Vous pouvez continuer si vous le souhaitez, mais le déverrouillage du système de fichiers se produira plus tard au démarrage du système. <br/> Pour chiffrer la partition d'amorçage, revenez en arrière et recréez-la, en sélectionnant <strong> Chiffrer </ strong> dans la partition Fenêtre de création. QObject Default Keyboard Model Modèle Clavier par défaut Default Défaut unknown inconnu extended étendu unformatted non formaté swap swap Unpartitioned space or unknown partition table Espace non partitionné ou table de partitions inconnue ReplaceWidget Form Formulaire Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Sélectionnez ou installer %1.<br><font color="red">Attention: </font>ceci va effacer tous les fichiers sur la partition sélectionnée. The selected item does not appear to be a valid partition. L'objet sélectionné ne semble pas être une partition valide. %1 cannot be installed on empty space. Please select an existing partition. %1 ne peut pas être installé sur un espace vide. Merci de sélectionner une partition existante. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 ne peut pas être installé sur une partition étendue. Merci de sélectionner une partition primaire ou logique existante. %1 cannot be installed on this partition. %1 ne peut pas être installé sur cette partition. Data partition (%1) Partition de données (%1) Unknown system partition (%1) Partition système inconnue (%1) %1 system partition (%2) Partition système %1 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>La partition %1 est trop petite pour %2. Merci de sélectionner une partition avec au moins %3 Gio de capacité. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Une partition système EFI n'a pas pu être localisée sur ce système. Veuillez revenir en arrière et utiliser le partitionnement manuel pour configurer %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 va être installé sur %2.<br/><font color="red">Attention:</font> toutes les données sur la partition %2 seront perdues. The EFI system partition at %1 will be used for starting %2. La partition système EFI sur %1 sera utilisée pour démarrer %2. EFI system partition: Partition système EFI: RequirementsChecker Gathering system information... Récupération des informations système... has at least %1 GB available drive space a au moins %1 Go d'espace disque disponible There is not enough drive space. At least %1 GB is required. Il n'y a pas assez d'espace disque. Au moins %1 Go sont requis. has at least %1 GB working memory a au moins %1 Go de mémoire vive The system does not have enough working memory. At least %1 GB is required. Le système n'a pas assez de mémoire vive. Au moins %1 Go sont requis. is plugged in to a power source est relié à une source de courant The system is not plugged in to a power source. Le système n'est pas relié à une source de courant. is connected to the Internet est connecté à Internet The system is not connected to the Internet. Le système n'est pas connecté à Internet. The installer is not running with administrator rights. L'installateur ne dispose pas des droits administrateur. The screen is too small to display the installer. L'écran est trop petit pour afficher l'installateur. ResizeFileSystemJob Resize file system on partition %1. Redimensionner le système de fichiers sur la partition %1. Parted failed to resize filesystem. Parted n'a pu redimensionner le système de fichiers. Failed to resize filesystem. Échec au redimensionnement du système de fichiers. ResizePartitionJob Resize partition %1. Redimensionner la partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimentionner la partition <strong>%1</strong> de <strong>%2MB</strong> à <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Redimensionnement de la partition %1 de %2Mo à %3Mo. The installer failed to resize partition %1 on disk '%2'. Le programme d'installation n'a pas pu redimensionner la partition %1 sur le disque '%2'. Could not open device '%1'. Impossible d'ouvrir le périphérique '%1'. ScanningDialog Scanning storage devices... Balayage des périphériques de stockage... Partitioning Partitionnement SetHostNameJob Set hostname %1 Définir le nom d'hôte %1 Set hostname <strong>%1</strong>. Configurer le nom d'hôte <strong>%1</strong>. Setting hostname %1. Configuration du nom d'hôte %1. Internal Error Erreur interne Cannot write hostname to target system Impossible d'écrire le nom d'hôte sur le système cible. SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Configurer le modèle de clavier à %1, la disposition des touches à %2-%3 Failed to write keyboard configuration for the virtual console. Échec de l'écriture de la configuration clavier pour la console virtuelle. Failed to write to %1 Échec de l'écriture sur %1 Failed to write keyboard configuration for X11. Échec de l'écriture de la configuration clavier pour X11. Failed to write keyboard configuration to existing /etc/default directory. Impossible d'écrire la configuration du clavier dans le dossier /etc/default existant. SetPartFlagsJob Set flags on partition %1. Configurer les drapeaux sur la partition %1. Set flags on %1MB %2 partition. Configurer les drapeaux sur la partition %2 de %1Mo. Set flags on new partition. Configurer les drapeaux sur la nouvelle partition. Clear flags on partition <strong>%1</strong>. Réinitialisez les drapeaux sur la partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Réinitialisez les drapeaux sur la partition <strong>%2</strong> de %1Mo. Clear flags on new partition. Réinitialisez les drapeaux sur la nouvelle partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Marquer la partition <strong>%1</strong> comme <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Marquer la partition <strong>%2</strong> de %1Mo comme <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Marquer la nouvelle partition comme <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Réinitialisation des drapeaux pour la partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Réinitialisez les drapeaux sur la partition <strong>%2</strong> de %1Mo. Clearing flags on new partition. Réinitialisez les drapeaux sur la nouvelle partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Configuration des drapeaux <strong>%2</strong> pour la partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Configuration des drapeaux <strong>%3</strong> pour la partition <strong>%2</strong> de %1Mo. Setting flags <strong>%1</strong> on new partition. Configuration des drapeaux <strong>%1</strong> pour la nouvelle partition. The installer failed to set flags on partition %1. L'installateur n'a pas pu activer les drapeaux sur la partition %1. Could not open device '%1'. Impossible d'ouvrir le périphérique '%1'. Could not open partition table on device '%1'. Impossible de lire la table de partitions sur le périphérique '%1'. Could not find partition '%1'. Impossible de trouver la partition '%1'. SetPartGeometryJob Update geometry of partition %1. Mettre à jour la géométrie de la partition %1. Failed to change the geometry of the partition. Échec au changement de géométrie de la partition. SetPasswordJob Set password for user %1 Définir le mot de passe pour l'utilisateur %1 Setting password for user %1. Configuration du mot de passe pour l'utilisateur %1. Bad destination system path. Mauvaise destination pour le chemin système. rootMountPoint is %1 Le point de montage racine est %1 Cannot disable root account. Impossible de désactiver le compte root. passwd terminated with error code %1. passwd c'est arrêté avec le code d'erreur %1. Cannot set password for user %1. Impossible de créer le mot de passe pour l'utilisateur %1. usermod terminated with error code %1. usermod s'est terminé avec le code erreur %1. SetTimezoneJob Set timezone to %1/%2 Configurer le fuseau-horaire à %1/%2 Cannot access selected timezone path. Impossible d'accéder au chemin d'accès du fuseau horaire sélectionné. Bad path: %1 Mauvais chemin : %1 Cannot set timezone. Impossible de définir le fuseau horaire. Link creation failed, target: %1; link name: %2 Création du lien échouée, destination : %1; nom du lien : %2 Cannot set timezone, Impossible de définir le fuseau horaire. Cannot open /etc/timezone for writing Impossible d'ourvir /etc/timezone pour écriture SummaryPage This is an overview of what will happen once you start the install procedure. Ceci est un aperçu de ce qui va arriver lorsque vous commencerez l'installation. SummaryViewStep Summary Résumé UsersPage Your username is too long. Votre nom d'utilisateur est trop long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Votre nom d'utilisateur contient des caractères invalides. Seuls les lettres minuscules et les chiffres sont autorisés. Your hostname is too short. Le nom d'hôte est trop petit. Your hostname is too long. Le nom d'hôte est trop long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Le nom d'hôte contient des caractères invalides. Seules les lettres, nombres et tirets sont autorisés. Your passwords do not match! Vos mots de passe ne correspondent pas ! UsersViewStep Users Utilisateurs WelcomePage Form Formulaire &Language: &Langue: &Release notes &Notes de publication &Known issues &Problèmes connus &Support &Support &About &À propos <h1>Welcome to the %1 installer.</h1> <h1>Bienvenue dans l'installateur de %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> Bien dans l'installateur Calamares pour %1. About %1 installer À propos de l'installateur %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>pour %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Merci à : Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg et <a href="https://www.transifex.com/calamares/calamares/">l'équipe de traducteurs de Calamares</a>.<br/><br/>Le développement de <a href="http://calamares.io/">Calamares</a>est sponsorisé par <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support Support de %1 WelcomeViewStep Welcome Bienvenue calamares-3.1.12/lang/calamares_fr_CH.ts000066400000000000000000003136261322271446000200240ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_gl.ts000066400000000000000000003454611322271446000174470ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. O <strong> entorno de arranque </strong> do sistema. <br><br> Os sistemas x86 antigos só soportan <strong> BIOS </strong>.<br> Os sistemas modernos empregan normalmente <strong> EFI </strong>, pero tamén poden arrincar como BIOS se funcionan no modo de compatibilidade. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Este sistema arrincou con <strong> EFI </strong> como entorno de arranque.<br><br> Para configurar o arranque dende un entorno EFI, este instalador debe configurar un cargador de arranque, como <strong>GRUB</strong> ou <strong>systemd-boot</strong> nunha <strong> Partición de Sistema EFI</strong>. Este proceso é automático, salvo que escolla particionamento manual. Nese caso deberá escoller unha existente ou crear unha pola súa conta. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Este sistema arrincou con <strong> BIOS </strong> como entorno de arranque.<br><br> Para configurar o arranque dende un entorno BIOS, este instalador debe configurar un cargador de arranque, como <strong>GRUB</strong>, ben ó comezo dunha partición ou no <strong>Master Boot Record</strong> preto do inicio da táboa de particións (recomendado). Este proceso é automático, salvo que escolla particionamento manual, nese caso deberá configuralo pola súa conta. BootLoaderModel Master Boot Record of %1 Rexistro de arranque maestro de %1 Boot Partition Partición de arranque System Partition Partición do sistema Do not install a boot loader Non instalar un cargador de arranque %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulario GlobalStorage Almacenamento global JobQueue Cola de traballo Modules Módulos Type: Tipo: none Non Interface: Interface Tools Ferramentas Debug information Informe de depuración de erros. Calamares::ExecutionViewStep Install Instalar Calamares::JobThread Done Feito Calamares::ProcessJob Run command %1 %2 Executar a orde %1 %2 Running command %1 %2 Executando a orde %1 %2 External command crashed A orde externa tivo un erro Command %1 crashed. Output: %2 A orde %1 tivo un erro. Saída: %2 External command failed to start Non se puido iniciar a orde externa Command %1 failed to start. Non se puido iniciar a orde %1 Internal error when starting command Erro interno ao comenzar a orde Bad parameters for process job call. Erro nos parámetros ao chamar o traballo External command failed to finish A orde externa non se puido rematar Command %1 failed to finish in %2s. Output: %3 A orde %1 non se puido rematar en %2s Saída: %3 External command finished with errors A orde externa rematouse con erros Command %1 finished with exit code %2. Output: %3 A orde %1 rematou co código de erro %2. Saída: %3 Calamares::PythonJob Running %1 operation. Excutando a operación %1. Bad working directory path A ruta ó directorio de traballo é errónea Working directory %1 for python job %2 is not readable. O directorio de traballo %1 para o traballo de python %2 non é lexible Bad main script file Ficheiro de script principal erróneo Main script file %1 for python job %2 is not readable. O ficheiro principal de script %1 para a execución de python %2 non é lexible. Boost.Python error in job "%1". Boost.Python tivo un erro na tarefa "%1". Calamares::ViewManager &Back &Atrás &Next &Seguinte &Cancel &Cancelar Cancel installation without changing the system. Cancela-la instalación sen cambia-lo sistema Cancel installation? Cancelar a instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Desexa realmente cancelar o proceso actual de instalación? O instalador pecharase e perderanse todos os cambios. &Yes &Si &No &Non &Close &Pechar Continue with setup? Continuar coa posta en marcha? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> O %1 instalador está a piques de realizar cambios no seu disco para instalar %2.<br/><strong>Estes cambios non poderán desfacerse.</strong> &Install now &Instalar agora Go &back Ir &atrás &Done &Feito The installation is complete. Close the installer. Completouse a instalacion. Peche o instalador Error Erro Installation Failed Erro na instalación CalamaresPython::Helper Unknown exception type Excepción descoñecida unparseable Python error Erro de Python descoñecido unparseable Python traceback O rastreo de Python non é analizable. Unfetchable Python error. Erro de Python non recuperable CalamaresWindow %1 Installer Instalador de %1 Show debug information Mostrar informes de depuración CheckFileSystemJob Checking file system on partition %1. Probando o sistema de ficheiros na partición %1 The file system check on partition %1 failed. O sistema de ficheiros na partición %1 tivo un erro. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Este ordenador non satisfai os requerimentos mínimos ara a instalación de %1.<br/>A instalación non pode continuar. <a href="#details">Máis información...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Este ordenador non satisfai algúns dos requisitos recomendados para instalar %1.<br/> A instalación pode continuar, pero pode que algunhas características sexan desactivadas. This program will ask you some questions and set up %2 on your computer. Este programa faralle algunhas preguntas mentres prepara %2 no seu ordenador. For best results, please ensure that this computer: Para os mellores resultados, por favor, asegúrese que este ordenador: System requirements Requisitos do sistema ChoicePage Form Formulario After: Despois: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionado manual</strong><br/> Pode crear o redimensionar particións pola súa conta. Boot loader location: Localización do cargador de arranque: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 será acurtada a %2MB e unha nova partición de %3MB será creada para %4 Select storage de&vice: Seleccione o dispositivo de almacenamento: Current: Actual: Reuse %1 as home partition for %2. Reutilizar %1 como partición home para %2 <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Seleccione unha partición para acurtar, logo empregue a barra para redimensionala</strong> <strong>Select a partition to install on</strong> <strong>Seleccione unha partición para instalar</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Non foi posible atopar unha partición de sistema de tipo EFI. Por favor, volva atrás e empregue a opción de particionado manual para crear unha en %1. The EFI system partition at %1 will be used for starting %2. A partición EFI do sistema en %1 será usada para iniciar %2. EFI system partition: Partición EFI do sistema: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esta unidade de almacenamento non semella ter un sistema operativo instalado nela. Que desexa facer?<br/>Poderá revisar e confirmar as súas eleccións antes de que calquera cambio sexa feito na unidade de almacenamento. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Borrar disco</strong><br/>Esto <font color="red">eliminará</font> todos os datos gardados na unidade de almacenamento seleccionada. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. A unidade de almacenamento ten %1 nela. Que desexa facer?<br/>Poderá revisar e confirmar a súa elección antes de que se aplique algún cambio á unidade. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalar a carón</strong><br/>O instalador encollerá a partición para facerlle sitio a %1 <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Substituír a partición</strong><br/>Substitúe a partición con %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esta unidade de almacenamento xa ten un sistema operativo instalado nel. Que desexa facer?<br/>Poderá revisar e confirmar as súas eleccións antes de que calquera cambio sexa feito na unidade de almacenamento This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Esta unidade de almacenamento ten múltiples sistemas operativos instalados nela. Que desexa facer?<br/>Poderá revisar e confirmar as súas eleccións antes de que calquera cambio sexa feito na unidade de almacenamento. ClearMountsJob Clear mounts for partitioning operations on %1 Desmontar os volumes para levar a cabo as operacións de particionado en %1 Clearing mounts for partitioning operations on %1. Desmontando os volumes para levar a cabo as operacións de particionado en %1. Cleared all mounts for %1 Os volumes para %1 foron desmontados ClearTempMountsJob Clear all temporary mounts. Limpar todas as montaxes temporais. Clearing all temporary mounts. Limpando todas as montaxes temporais. Cannot get list of temporary mounts. Non se pode obter unha lista dos montaxes temporais. Cleared all temporary mounts. Desmontados todos os volumes temporais. CreatePartitionDialog Create a Partition Crear partición MiB MiB Partition &Type: &Tipo de partición: &Primary &Primaria E&xtended E&xtendida Fi&le System: Sistema de ficheiros: Flags: Bandeiras: &Mount Point: Punto de &montaxe: Si&ze: &Tamaño: En&crypt Encriptar Logical Lóxica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. Punto de montaxe xa en uso. Faga o favor de escoller outro CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Crear unha nova partición de %2 MB en %4 (%3) empregando o sistema de arquivos %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Crear unha nova partición de <strong>%2 MB</strong> en <strong>%4<7strong>(%3) empregando o sistema de arquivos <strong>%1</strong>. Creating new %1 partition on %2. Creando unha nova partición %1 en %2. The installer failed to create partition on disk '%1'. O instalador fallou ó crear a partición no disco '%1'. Could not open device '%1'. Non se pode abrir o dispositivo '%1'. Could not open partition table. Non se pode abrir a táboa de particións. The installer failed to create file system on partition %1. O instalador errou ó crear o sistema de arquivos na partición %1. The installer failed to update partition table on disk '%1'. O instalador fallou ó actualizar a táboa de particións no disco '%1'. CreatePartitionTableDialog Create Partition Table Crear Táboa de Particións Creating a new partition table will delete all existing data on the disk. Creando unha nova táboa de particións eliminará todos os datos existentes no disco. What kind of partition table do you want to create? Que tipo de táboa de particións desexa crear? Master Boot Record (MBR) Rexistro de Arranque Maestro (MBR) GUID Partition Table (GPT) Táboa de Particións GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Crear unha nova táboa de particións %1 en %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Crear unha nova táboa de particións %1 en <strong>%2</strong>(%3) Creating new %1 partition table on %2. Creando nova táboa de partición %1 en %2. The installer failed to create a partition table on %1. O instalador fallou ó crear a táboa de partición en %1. Could not open device %1. Non foi posíbel abrir o dispositivo %1. CreateUserJob Create user %1 Crear o usuario %1 Create user <strong>%1</strong>. Crear usario <strong>%1</strong> Creating user %1. Creación do usuario %1. Sudoers dir is not writable. O directorio sudoers non ten permisos de escritura. Cannot create sudoers file for writing. Non foi posible crear o arquivo de sudoers. Cannot chmod sudoers file. Non se puideron cambiar os permisos do arquivo sudoers. Cannot open groups file for reading. Non foi posible ler o arquivo grupos. Cannot create user %1. Non foi posible crear o usuario %1. useradd terminated with error code %1. useradd terminou co código de erro %1. Cannot add user %1 to groups: %2. Non foi posible engadir o usuario %1 ós grupos: %2. usermod terminated with error code %1. usermod terminou co código de erro %1. Cannot set home directory ownership for user %1. Non foi posible asignar o directorio home como propio para o usuario %1. chown terminated with error code %1. chown terminou co código de erro %1. DeletePartitionJob Delete partition %1. Eliminar partición %1. Delete partition <strong>%1</strong>. Eliminar partición <strong>%1</strong>. Deleting partition %1. Eliminando partición %1 The installer failed to delete partition %1. O instalador fallou ó eliminar a partición %1 Partition (%1) and device (%2) do not match. A partición (%1) e o dispositivo (%2) non coinciden Could not open device %1. Non foi posíbel abrir o dispositivo %1. Could not open partition table. Non se pode abrir a táboa de particións. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. O tipo de <strong>táboa de partición</strong>no dispositivo de almacenamento escollido.<br><br>O único xeito de cambia-lo tipo de partición é borrar e volver a crear a táboa de partición dende o comenzo, isto destrúe todolos datos no dispositivo de almacenamento. <br> Este instalador manterá a táboa de partición actúal agás que escolla outra cousa explicitamente. <br> Se non está seguro, en sistemas modernos é preferibel GPT. This device has a <strong>%1</strong> partition table. O dispositivo ten <strong>%1</strong> una táboa de partición. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Este é un dispositivo de tipo <strong>loop</strong>. <br><br> É un pseudo-dispositivo que non ten táboa de partición que permita acceder aos ficheiros como un dispositivo de bloques. Este,modo de configuración normalmente so contén un sistema de ficheiros individual. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Este instalador <strong>non pode detectar unha táboa de partición </strong>no sistema de almacenamento seleccionado. <br><br>O dispositivo non ten táboa de particion ou a táboa de partición está corrompida ou é dun tipo descoñecido.<br>Este instalador poder crear una táboa de partición nova por vóstede, ben automaticamente ou a través de páxina de particionamento a man. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Este é o tipo de táboa de partición recomendada para sistema modernos que empezan dende un sistema de arranque <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Esta táboa de partición so é recomendabel en sistemas vellos que empezan dende un sistema de arranque <strong>BIOS</strong>. GPT é recomendabel na meirande parte dos outros casos.<br><br><strong>Atención:</strong>A táboa de partición MBR é un estándar obsoleto da época do MS-DOS.<br>So pódense crear 4 particións <em>primarias</em>, e desas 4, una pode ser unha partición<em>extensa</em>, que pode conter muitas particións <em>lóxicas</em>. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Escribila configuración LUKS para Dracut en %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Saltando escribila configuración LUKS para Dracut: A partición "/" non está encriptada Failed to open %1 Fallou ao abrir %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editar unha partición existente Content: Contido: &Keep &Gardar Format Formato Warning: Formatting the partition will erase all existing data. Atención: Dar formato á partición borrará tódolos datos existentes. &Mount Point: Punto de &montaxe: Si&ze: &Tamaño: MiB MiB Fi&le System: Sistema de Ficheiros: Flags: Bandeiras: Mountpoint already in use. Please select another one. Punto de montaxe xa en uso. Faga o favor de escoller outro. EncryptWidget Form Formulario En&crypt system En&criptar sistema Passphrase Frase de contrasinal Confirm passphrase Confirme a frase de contrasinal Please enter the same passphrase in both boxes. Faga o favor de introducila a misma frase de contrasinal námbalas dúas caixas. FillGlobalStorageJob Set partition information Poñela información da partición Install %1 on <strong>new</strong> %2 system partition. Instalar %1 nunha <strong>nova</strong> partición do sistema %2 Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configure unha <strong>nova</strong> partición %2 con punto de montaxe <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalar %2 na partición do sistema %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configurala partición %3 <strong>%1</strong> con punto de montaxe <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar o cargador de arranque en <strong>%1</strong>. Setting up mount points. Configuralos puntos de montaxe. FinishedPage Form Formulario &Restart now &Reiniciar agora. <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Todo feito.</h1><br/>%1 foi instalado na súa computadora.<br/>Agora pode reiniciar no seu novo sistema ou continuar a usalo entorno Live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Fallou a instalación</h1><br/>%1 non se pudo instalar na sua computadora. <br/>A mensaxe de erro foi: %2. FinishedViewStep Finish Fin Installation Complete Instalacion completa The installation of %1 is complete. Completouse a instalación de %1 FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formato da partición %1 (sistema de ficheiros: %2, tamaño: %3 MB) en %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formato <strong>%3MB</strong> partición <strong>%1</strong> con sistema de ficheiros <strong>%2</strong>. Formatting partition %1 with file system %2. Dando formato a %1 con sistema de ficheiros %2. The installer failed to format partition %1 on disk '%2'. O instalador fallou cando formateaba a partición %1 no disco '%2'. Could not open device '%1'. Non se pode abrir o dispositivo '%1'. Could not open partition table. Non se pode abrir a táboa de particións. The installer failed to create file system on partition %1. O instalador errou ó crear o sistema de arquivos na partición %1. The installer failed to update partition table on disk '%1'. O instalador fallou ó actualizar a táboa de particións no disco '%1'. InteractiveTerminalPage Konsole not installed Konsole non está instalado Please install the kde konsole and try again! Faga o favor de instalar konsole (de kde) e probe de novo! Executing script: &nbsp;<code>%1</code> Executando o script: &nbsp; <code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Seleccionado modelo de teclado a %1.<br/> Set keyboard layout to %1/%2. Seleccionada a disposición do teclado a %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Configuración da localización The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. A configuración de localización afecta a linguaxe e o conxunto de caracteres dalgúns elementos da interface de usuario de liña de comandos. <br/>A configuración actúal é <strong>%1</strong>. &Cancel &Cancelar &OK &Ok LicensePage Form Formulario I accept the terms and conditions above. Acepto os termos e condicións anteriores. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acordo de licencia</h1>Este proceso de configuración instalará programas privativos suxeito a termos de licencia. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Faga o favor de revisalos Acordos de Licencia de Usuario Final (ALUF) seguintes. <br/>De non estar dacordo cos termos non se pode seguir co proceso de configuración. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acordo de licencia</h1>Este proceso de configuración pode instalar programas privativos suxeito a termos de licencia para fornecer características adicionaís e mellorala experiencia do usuario. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Faga o favor de revisalos Acordos de Licencia de Usuario Final (ALUF) seguintes. <br/>De non estar dacordo cos termos non se instalará o programa privativo e no seu lugar usaranse alternativas de código aberto. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>dispositivo %1</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Formulario Keyboard Model: Type here to test your keyboard Page_UserSetup Form Formulario What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Formulario Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Formulario Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Redimensionar partición %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar <strong>%2MB</strong> partición <strong>%1</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Redimensionando %2MB %1 a %3MB. The installer failed to resize partition %1 on disk '%2'. O instalador fallou a hora de reducir a partición %1 no disco '%2'. Could not open device '%1'. Non foi posíbel abrir o dispositivo '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Hostname: %1 Set hostname <strong>%1</strong>. Configurar hostname <strong>%1</strong>. Setting hostname %1. Configurando hostname %1. Internal Error Erro interno Cannot write hostname to target system Non foi posíbel escreber o nome do servidor do sistema obxectivo SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Configurar modelo de teclado a %1, distribución a %2-%3 Failed to write keyboard configuration for the virtual console. Houbo un fallo ao escribir a configuración do teclado para a consola virtual. Failed to write to %1 Non pode escribir en %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users Usuarios WelcomePage Form Formulario &Language: &Idioma: &Release notes &Notas de publicación &Known issues &Problemas coñecidos &Support &Axuda &About &Acerca de <h1>Welcome to the %1 installer.</h1> <h1>Benvido o instalador %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Acerca do instalador %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 axuda WelcomeViewStep Welcome Benvido calamares-3.1.12/lang/calamares_gu.ts000066400000000000000000003136231322271446000174530ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_he.ts000066400000000000000000004017721322271446000174370ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>תצורת האתחול</strong> של מערכת זו. <br><br> מערכות x86 ישנות יותר תומכות אך ורק ב <strong>BIOS</strong>.<br> מערכות חדשות משתמשות בדרך כלל ב <strong>EFI</strong>, אך יכולות להיות מוצגות כ BIOS במידה והן מופעלות במצב תאימות לאחור. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. מערכת זו הופעלה בתצורת אתחול <strong>EFI</strong>.<br><br> בכדי להגדיר הפעלה מתצורת אתחול EFI, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong> או <strong>systemd-boot</strong> על <strong>מחיצת מערכת EFI</strong>. פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך לבחור זאת או להגדיר בעצמך. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. מערכת זו הופעלה בתצורת אתחול <strong>BIOS</strong>.<br><br> בכדי להגדיר הפעלה מתצורת אתחול BIOS, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong>, בתחלית מחיצה או על ה <strong>Master Boot Record</strong> בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך להגדיר זאת בעצמך. BootLoaderModel Master Boot Record of %1 Master Boot Record של %1 Boot Partition מחיצת טעינת המערכת Boot System Partition מחיצת מערכת Do not install a boot loader אל תתקין מנהל אתחול מערכת, boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form Form GlobalStorage אחסון גלובלי JobQueue JobQueue Modules מודולים Type: סוג: none ללא Interface: ממשק: Tools כלים Debug information מידע על ניפוי שגיאות Calamares::ExecutionViewStep Install התקן Calamares::JobThread Done בוצע Calamares::ProcessJob Run command %1 %2 הרץ פקודה %1 %2 Running command %1 %2 מריץ פקודה %1 %2 External command crashed פקודה חיצונית קרסה Command %1 crashed. Output: %2 פקודה %1 קרסה. פלט: %2 External command failed to start הרצת פקודה חיצונית כשלה Command %1 failed to start. הרצת פקודה %1 כשלה. Internal error when starting command שגיאה פנימית בעת התחלת הרצת הפקודה Bad parameters for process job call. פרמטרים לא תקינים עבור קריאת עיבוד פעולה. External command failed to finish הרצת פקודה חיצונית לא הצליחה להסתיים Command %1 failed to finish in %2s. Output: %3 פקודה %1 לא הצליחה להסתיים ב %2 שניות. פלט: %3 External command finished with errors פקודה חיצונית הסתיימה עם שגיאות Command %1 finished with exit code %2. Output: %3 פקודה %1 הסתיימה עם קוד יציאה %2. פלט: %3 Calamares::PythonJob Running %1 operation. מריץ פעולה %1. Bad working directory path נתיב תיקיית עבודה לא תקין Working directory %1 for python job %2 is not readable. תיקיית עבודה %1 עבור משימת python %2 לא קריאה. Bad main script file קובץ תסריט הרצה ראשי לא תקין Main script file %1 for python job %2 is not readable. קובץ תסריט הרצה ראשי %1 עבור משימת python %2 לא קריא. Boost.Python error in job "%1". שגיאת Boost.Python במשימה "%1". Calamares::ViewManager &Back &קודם &Next &הבא &Cancel &בטל Cancel installation without changing the system. בטל התקנה ללא ביצוע שינוי במערכת. Cancel installation? בטל את ההתקנה? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. האם אתה בטוח שברצונך לבטל את תהליך ההתקנה? אשף ההתקנה ייסגר וכל השינויים יאבדו. &Yes &כן &No &לא &Close &סגור Continue with setup? המשך עם הליך ההתקנה? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> אשף ההתקנה של %1 הולך לבצע שינויים בכונן שלך לטובת התקנת %2.<br/><strong>לא תוכל לבטל את השינויים הללו.</strong> &Install now &התקן כעת Go &back &אחורה &Done &בוצע The installation is complete. Close the installer. תהליך ההתקנה הושלם. אנא סגור את אשף ההתקנה. Error שגיאה Installation Failed ההתקנה נכשלה CalamaresPython::Helper Unknown exception type טיפוס חריגה אינו מוכר unparseable Python error שגיאת Python לא ניתנת לניתוח unparseable Python traceback עקבה לאחור של Python לא ניתנת לניתוח Unfetchable Python error. שגיאת Python לא ניתנת לאחזור. CalamaresWindow %1 Installer אשף התקנה של %1 Show debug information הצג מידע על ניפוי שגיאות CheckFileSystemJob Checking file system on partition %1. בודק את מערכת הקבצים על מחיצה %1. The file system check on partition %1 failed. בדיקת מערכת הקבצים על מחיצה %1 נכשלה. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> המחשב לא עומד ברף דרישות המינימום להתקנת %1. <br/>ההתקנה לא יכולה להמשיך. <a href="#details"> פרטים...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. המחשב לא עומד בחלק מרף דרישות המינימום להתקנת %1.<br/> ההתקנה יכולה להמשיך, אך חלק מהתכונות יכולות להיות מבוטלות. This program will ask you some questions and set up %2 on your computer. אשף התקנה זה נכתב בלשון זכר אך מיועד לשני המינים. תוכנה זו תשאל אותך מספר שאלות ותגדיר את %2 על המחשב שלך. For best results, please ensure that this computer: לקבלת התוצאות הטובות ביותר, אנא וודא כי מחשב זה: System requirements דרישות מערכת ChoicePage Form Form After: לאחר: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>הגדרת מחיצות באופן ידני</strong><br/>תוכל ליצור או לשנות את גודל המחיצות בעצמך. Boot loader location: מיקום מנהל אתחול המערכת: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 תוקטן ל %2 MB ומחיצה חדשה בגודל %3 MB תיווצר עבור %4. Select storage de&vice: בחר ה&תקן אחסון: Current: נוכחי: Reuse %1 as home partition for %2. השתמש ב %1 כמחיצת הבית, home, עבור %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>בחר מחיצה לכיווץ, לאחר מכן גרור את הסרגל התחתון בכדי לשנות את גודלה</strong> <strong>Select a partition to install on</strong> <strong>בחר מחיצה בכדי לבצע את ההתקנה עליה</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. מחיצת מערכת EFI לא נמצאה במערכת. אנא חזור והשתמש ביצירת מחיצות באופן ידני בכדי להגדיר את %1. The EFI system partition at %1 will be used for starting %2. מחיצת מערכת EFI ב %1 תשמש עבור טעינת %2. EFI system partition: מחיצת מערכת EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. לא נמצאה מערכת הפעלה על התקן אחסון זה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>מחק כונן</strong><br/> פעולה זו <font color="red">תמחק</font> את כל המידע השמור על התקן האחסון הנבחר. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. נמצא %1 על התקן אחסון זה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>התקן לצד</strong><br/> אשף ההתקנה יכווץ מחיצה בכדי לפנות מקום עבור %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>החלף מחיצה</strong><br/> מבצע החלפה של המחיצה עם %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. מערכת הפעלה קיימת על התקן האחסון הזה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. מערכות הפעלה מרובות קיימות על התקן אחסון זה. מה ברצונך לעשות? <br/>תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. ClearMountsJob Clear mounts for partitioning operations on %1 מחק נקודות עיגון עבור ביצוע פעולות של הגדרות מחיצה על %1. Clearing mounts for partitioning operations on %1. מבצע מחיקה של נקודות עיגון עבור ביצוע פעולות של הגדרות מחיצה על %1. Cleared all mounts for %1 בוצעה מחיקה עבור כל נקודות העיגון על %1. ClearTempMountsJob Clear all temporary mounts. מחק את כל נקודות העיגון הזמניות. Clearing all temporary mounts. מבצע מחיקה של כל נקודות העיגון הזמניות. Cannot get list of temporary mounts. לא ניתן לשלוף רשימה של כל נקודות העיגון הזמניות. Cleared all temporary mounts. בוצעה מחיקה של כל נקודות העיגון הזמניות. CreatePartitionDialog Create a Partition צור מחיצה MiB MiB Partition &Type: &סוג מחיצה: &Primary &ראשי E&xtended מ&ורחב Fi&le System: מ&ערכת קבצים Flags: סימונים: &Mount Point: נקודת &עיגון: Si&ze: גו&דל: En&crypt ה&צפן Logical לוגי Primary ראשי GPT GPT Mountpoint already in use. Please select another one. נקודת העיגון בשימוש. אנא בחר נקודת עיגון אחרת. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. צור מחיצה חדשה בגודל %2 MB על %4 (%3) עם מערכת קבצים %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. צור מחיצה חדשה בגודל <strong>%2 MB</strong> על <strong>%4</strong> (%3) עם מערכת קבצים <strong>%1</strong>. Creating new %1 partition on %2. מגדיר מחיצה %1 חדשה על %2. The installer failed to create partition on disk '%1'. אשף ההתקנה נכשל ביצירת מחיצה על כונן '%1'. Could not open device '%1'. לא ניתן לפתוח את התקן '%1'. Could not open partition table. לא ניתן לפתוח את טבלת המחיצות. The installer failed to create file system on partition %1. אשף ההתקנה נכשל בעת יצירת מערכת הקבצים על מחיצה %1. The installer failed to update partition table on disk '%1'. אשף ההתקנה נכשל בעת עדכון טבלת המחיצות על כונן '%1'. CreatePartitionTableDialog Create Partition Table צור טבלת מחיצות Creating a new partition table will delete all existing data on the disk. יצירת טבלת מחיצות חדשה תמחק את כל המידע הקיים על הכונן. What kind of partition table do you want to create? איזה סוג של טבלת מחיצות ברצונך ליצור? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. צור טבלת מחיצות %1 חדשה על %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). צור טבלת מחיצות <strong>%1</strong> חדשה על <strong>%2</strong> (%3). Creating new %1 partition table on %2. יוצר טבלת מחיצות %1 חדשה על %2. The installer failed to create a partition table on %1. אשף ההתקנה נכשל בעת יצירת טבלת המחיצות על %1. Could not open device %1. לא ניתן לפתוח את התקן %1. CreateUserJob Create user %1 צור משתמש %1 Create user <strong>%1</strong>. צור משתמש <strong>%1</strong>. Creating user %1. יוצר משתמש %1. Sudoers dir is not writable. תיקיית מנהלי המערכת לא ניתנת לכתיבה. Cannot create sudoers file for writing. לא ניתן ליצור את קובץ מנהלי המערכת לכתיבה. Cannot chmod sudoers file. לא ניתן לשנות את מאפייני קובץ מנהלי המערכת. Cannot open groups file for reading. לא ניתן לפתוח את קובץ הקבוצות לקריאה. Cannot create user %1. לא ניתן ליצור משתמש %1. useradd terminated with error code %1. פקודת יצירת המשתמש, useradd, נכשלה עם קוד יציאה %1. Cannot add user %1 to groups: %2. לא ניתן להוסיף את המשתמש %1 לקבוצות: %2. usermod terminated with error code %1. פקודת שינוי מאפייני המשתמש, usermod, נכשלה עם קוד יציאה %1. Cannot set home directory ownership for user %1. לא ניתן להגדיר בעלות על תיקיית הבית עבור משתמש %1. chown terminated with error code %1. פקודת שינוי בעלות, chown, נכשלה עם קוד יציאה %1. DeletePartitionJob Delete partition %1. מחק את מחיצה %1. Delete partition <strong>%1</strong>. מחק את מחיצה <strong>%1</strong>. Deleting partition %1. מבצע מחיקה של מחיצה %1. The installer failed to delete partition %1. אשף ההתקנה נכשל בעת מחיקת מחיצה %1. Partition (%1) and device (%2) do not match. מחיצה (%1) והתקן (%2) לא תואמים. Could not open device %1. לא ניתן לפתוח את התקן %1. Could not open partition table. לא ניתן לפתוח את טבלת המחיצות. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. סוג <strong>טבלת המחיצות</strong> על התקן האחסון הנבחר.<br><br> הדרך היחידה לשנות את סוג טבלת המחיצות היא למחוק וליצור מחדש את טבלת המחיצות, אשר דורסת את כל המידע הקיים על התקן האחסון.<br> אשף ההתקנה ישמור את טבלת המחיצות הקיימת אלא אם כן תבחר אחרת במפורש.<br> במידה ואינך בטוח, במערכות מודרניות, GPT הוא הסוג המועדף. This device has a <strong>%1</strong> partition table. על התקן זה קיימת טבלת מחיצות <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. זהו התקן מסוג <strong>loop</strong>.<br><br> זהו התקן מדמה ללא טבלת מחיצות אשר מאפשר גישה לקובץ כהתקן בלוק. תצורה מסוג זה בדרך כלל תכיל מערכת קבצים יחידה. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. אשף ההתקנה <strong>אינו יכול לזהות את טבלת המחיצות</strong> על התקן האחסון הנבחר.<br><br> ההתקן הנבחר לא מכיל טבלת מחיצות, או שטבלת המחיצות הקיימת הושחתה או שסוג הטבלה אינו מוכר.<br> אשף התקנה זה יכול ליצור טבלת מחיצות חדשה עבורך אוטומטית או בדף הגדרת מחיצות באופן ידני. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br> זהו סוג טבלת מחיצות מועדף במערכות מודרניות, אשר מאותחלות ממחיצת טעינת מערכת <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>סוג זה של טבלת מחיצות מומלץ לשימוש על מערכות ישנות אשר מאותחלות מסביבת טעינה <strong>BIOS</strong>. ברוב המקרים האחרים, GPT מומלץ לשימוש.<br><br><strong>אזהרה:</strong> תקן טבלת המחיצות של MBR מיושן מתקופת MS-DOS.<br> ניתן ליצור אך ורק 4 מחיצות <em>ראשיות</em>, מתוכן, אחת יכולה להיות מוגדרת כמחיצה <em>מורחבת</em>, אשר יכולה להכיל מחיצות <em>לוגיות</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 רשום הגדרות הצפנה LUKS עבור Dracut אל %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted דלג רישום הגדרות הצפנה LUKS עבור Dracut: מחיצת "/" לא תוצפן. Failed to open %1 נכשלה פתיחת %1. DummyCppJob Dummy C++ Job משימת דמה של C++ EditExistingPartitionDialog Edit Existing Partition ערוך מחיצה קיימת Content: תכולה: &Keep &השאר Format אתחול Warning: Formatting the partition will erase all existing data. אזהרה: אתחול המחיצה ימחק את כל המידע הקיים. &Mount Point: &נקודת עיגון: Si&ze: גו&דל: MiB MiB Fi&le System: מ&ערכת קבצים: Flags: סימונים: Mountpoint already in use. Please select another one. נקודת העיגון בשימוש. אנא בחר נקודת עיגון אחרת. EncryptWidget Form Form En&crypt system ה&צפן את המערכת Passphrase ביטוי אבטחה Confirm passphrase אשר ביטוי אבטחה Please enter the same passphrase in both boxes. אנא הכנס ביטוי אבטחה זהה בשני התאים. FillGlobalStorageJob Set partition information הגדר מידע עבור המחיצה Install %1 on <strong>new</strong> %2 system partition. התקן %1 על מחיצת מערכת %2 <strong>חדשה</strong>. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. הגדר מחיצת מערכת %2 <strong>חדשה</strong>בעלת נקודת עיגון <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. התקן %2 על מחיצת מערכת %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. התקן מחיצה %3 <strong>%1</strong> עם נקודת עיגון <strong>%2</strong>. Install boot loader on <strong>%1</strong>. התקן מנהל אתחול מערכת על <strong>%1</strong>. Setting up mount points. מגדיר נקודות עיגון. FinishedPage Form Form &Restart now &אתחל כעת <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>תהליך ההתקנה הסתיים.</h1><br/>%1 הותקן על המחשב שלך.<br/> כעת ניתן לאתחל את המחשב אל תוך המערכת החדשה שהותקנה, או להמשיך להשתמש בסביבה הנוכחית של %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>ההתקנה נכשלה</h1><br/>%1 לא הותקן על מחשבך.<br/> הודעת השגיאה: %2. FinishedViewStep Finish סיום Installation Complete ההתקנה הושלמה The installation of %1 is complete. ההתקנה של %1 הושלמה. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. אתחל מחיצה %1 (מערכת קבצים: %2, גודל: %3 MB) על %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. אתחול מחיצה <strong>%1</strong> בגודל <strong>%3 MB</strong> עם מערכת קבצים <strong>%2</strong>. Formatting partition %1 with file system %2. מאתחל מחיצה %1 עם מערכת קבצים %2. The installer failed to format partition %1 on disk '%2'. אשף ההתקנה נכשל בעת אתחול המחיצה %1 על כונן '%2'. Could not open device '%1'. לא ניתן לפתוח את התקן '%1'. Could not open partition table. לא ניתן לפתוח את טבלת המחיצות. The installer failed to create file system on partition %1. אשף ההתקנה נכשל בעת יצירת מערכת הקבצים על מחיצה %1. The installer failed to update partition table on disk '%1'. אשף ההתקנה נכשל בעת עדכון טבלת המחיצות על כונן '%1'. InteractiveTerminalPage Konsole not installed Konsole לא מותקן. Please install the kde konsole and try again! אנא התקן את kde konsole ונסה שוב! Executing script: &nbsp;<code>%1</code> מריץ תסריט הרצה: &nbsp; <code>%1</code> InteractiveTerminalViewStep Script תסריט הרצה KeyboardPage Set keyboard model to %1.<br/> הגדר את דגם המקלדת ל %1.<br/> Set keyboard layout to %1/%2. הגדר את פריסת לוח המקשים ל %1/%2. KeyboardViewStep Keyboard מקלדת LCLocaleDialog System locale setting הגדרות מיקום המערכת The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. הגדרת מיקום המערכת משפיעה על השפה וקידוד התווים של חלק מרכיבי ממשקי שורת פקודה למשתמש. <br/> ההגדרה הנוכחית היא <strong>%1</strong>. &Cancel &ביטול &OK &אישור LicensePage Form Form I accept the terms and conditions above. אני מאשר את התנאים וההתניות מעלה. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>הסכם רישיון</h1>אשף התקנה זה יבצע התקנה של תוכנות קנייניות אשר כפופות לתנאי רישיון. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. אנא סקור את הסכם משתמש הקצה (EULA) מעלה.<br/> במידה ואינך מסכים עם התנאים, תהליך ההתקנה יופסק. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>הסכם רישיון</h1>אשף התקנה זה יכול לבצע התקנה של תוכנות קנייניות אשר כפופות לתנאי רישיון בכדי לספק תכולות נוספות ולשדרג את חווית המשתמש. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. אנא סקור את הסכם משתמש הקצה (EULA) מעלה.<br/> במידה ואינך מסכים עם התנאים, תוכנות קנייניות לא יותקנו, ותוכנות חליפיות מבוססות קוד פתוח יותקנו במקומן. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>התקן %1</strong><br/> מאת %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>התקן תצוגה %1</strong><br/><font color="Grey"> מאת %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>תוסף לדפדפן %1</strong><br/><font color="Grey"> מאת %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>קידוד %1</strong><br/><font color="Grey"> מאת %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>חבילה %1</strong><br/><font color="Grey"> מאת %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">מאת %2</font> <a href="%1">view license agreement</a> <a href="%1">צפה בהסכם הרשיון</a> LicenseViewStep License רשיון LocalePage The system language will be set to %1. שפת המערכת תוגדר להיות %1. The numbers and dates locale will be set to %1. תבנית של המספרים והתאריכים של המיקום יוגדרו להיות %1. Region: איזור: Zone: מיקום: &Change... &החלף... Set timezone to %1/%2.<br/> הגדרת אזור זמן ל %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... טוען נתונים על המיקום... Location מיקום MoveFileSystemJob Move file system of partition %1. העבר את מערכת הקבצים של מחיצה %1. Could not open file system on partition %1 for moving. פתיחת מערכת הקבצים במחיצה %1 לטובת ההעברה נכשלה. Could not create target for moving file system on partition %1. לא ניתן ליצור יעד עבור העברת מערכת הקבצים במחיצה %1. Moving of partition %1 failed, changes have been rolled back. העברה של מחיצה %1 נכשלה, מבטל שינויים. Moving of partition %1 failed. Roll back of the changes have failed. העברה של מחיצה %1 נכשלה, ביטול השינויים נכשל. Updating boot sector after the moving of partition %1 failed. מעדכן את מקטע האתחול לאחר כשלון העברת מחיצה %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. הגדלים הלוגיים של מקטעי המקור והיעד להעתקה אינם זהים. הנ"ל לא נתמך בגרסה זו. Source and target for copying do not overlap: Rollback is not required. המקור והיעד להעתקה לא חופפים: ביטול שינויים לא נדרש. Could not open device %1 to rollback copying. פתיחת התקן %1 בכדי לבצע העתקה למצב הקודם נכשלה. NetInstallPage Name שם Description תיאור Network Installation. (Disabled: Unable to fetch package lists, check your network connection) התקנת רשת. (מנוטרלת: לא ניתן לאחזר רשימות של חבילות תוכנה, אנא בדוק את חיבורי הרשת) NetInstallViewStep Package selection בחירת חבילות Page_Keyboard Form Form Keyboard Model: דגם מקלדת: Type here to test your keyboard הקלד כאן בכדי לבדוק את המקלדת שלך Page_UserSetup Form Form What is your name? מהו שמך? What name do you want to use to log in? באיזה שם ברצונך להשתמש בעת כניסה למחשב? font-weight: normal משקל-גופן: נורמלי <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>במידה ויותר מאדם אחד ישתמש במחשב זה, תוכל להגדיר משתמשים נוספים לאחר ההתקנה.</small> Choose a password to keep your account safe. בחר סיסמה בכדי להגן על חשבונך. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>הכנס את אותה הסיסמה פעמיים, בכדי שניתן יהיה לבדוק שגיאות הקלדה. סיסמה טובה אמורה להכיל שילוב של אותיות, מספרים וסימני פיסוק, להיות באורך שמונה תווים לפחות, ועליה להשתנות במרווחי זמן קבועים.</small> What is the name of this computer? מהו שם מחשב זה? <small>This name will be used if you make the computer visible to others on a network.</small> <small>שם זה יהיה בשימוש במידה ומחשב זה יוגדר להיות נראה על ידי עמדות אחרות ברשת.</small> Log in automatically without asking for the password. התחבר באופן אוטומטי מבלי לבקש סיסמה. Use the same password for the administrator account. השתמש באותה הסיסמה עבור חשבון המנהל. Choose a password for the administrator account. בחר סיסמה עבור חשבון המנהל. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>הכנס את אותה הסיסמה פעמיים, בכדי שניתן יהיה לבדוק שגיאות הקלדה.</small> PartitionLabelsView Root מערכת הפעלה Root Home בית Home Boot טעינה Boot EFI system מערכת EFI Swap דפדוף, Swap New partition for %1 מחיצה חדשה עבור %1 New partition מחיצה חדשה %1 %2 %1 %2 PartitionModel Free Space זכרון פנוי New partition מחיצה חדשה Name שם File System מערכת קבצים Mount Point נקודת עיגון Size גודל PartitionPage Form Form Storage de&vice: &התקן זכרון: &Revert All Changes &בטל את כל השינויים New Partition &Table &טבלת מחיצות חדשה &Create &צור &Edit &ערוך &Delete &מחק Install boot &loader on: התקן &מנהל אתחול מערכת על: Are you sure you want to create a new partition table on %1? האם אתה בטוח שברצונך ליצור טבלת מחיצות חדשה על %1? PartitionViewStep Gathering system information... מלקט מידע אודות המערכת... Partitions מחיצות Install %1 <strong>alongside</strong> another operating system. התקן את %1 <strong>לצד</strong> מערכת הפעלה אחרת. <strong>Erase</strong> disk and install %1. <strong>מחק</strong> את הכונן והתקן את %1. <strong>Replace</strong> a partition with %1. <strong>החלף</strong> מחיצה עם %1. <strong>Manual</strong> partitioning. מגדיר מחיצות באופן <strong>ידני</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). התקן את %1 <strong>לצד</strong> מערכת הפעלה אחרת על כונן <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>מחק</strong> כונן <strong>%2</strong> (%3) והתקן %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>החלף</strong> מחיצה על כונן <strong>%2</strong> (%3) עם %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). מגדיר מחיצות באופן <strong>ידני</strong> על כונן <strong>%1</strong>(%2). Disk <strong>%1</strong> (%2) כונן <strong>%1</strong> (%2) Current: נוכחי: After: לאחר: No EFI system partition configured לא הוגדרה מחיצת מערכת EFI An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. מחיצת מערכת EFI נדרשת בשביל להפעיל את %1.<br/><br/> בכדי להגדיר מחיצת מערכת EFI, חזור ובחר או צור מערכת קבצים מסוג FAT32 עם סימון <strong>esp</strong> מופעל ונקודת עיגון <strong>%2</strong>.<br/><br/> ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך המערכת יכולה להיכשל בטעינה. EFI system partition flag not set סימון מחיצת מערכת EFI לא מוגדר An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. מחיצת מערכת EFI נדרשת להפעלת %1.<br/><br/> מחיצה הוגדרה עם נקודת עיגון <strong>%2</strong> אך סימון <strong>esp</strong> לא הוגדר.<br/> בכדי לסמן את המחיצה, חזור וערוך את המחיצה.<br/><br/> תוכל להמשיך ללא ביצוע הסימון אך המערכת יכולה להיכשל בטעינה. Boot partition not encrypted מחיצת טעינת המערכת Boot לא מוצפנת. A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. מחיצת טעינה, boot, נפרדת הוגדרה יחד עם מחיצת מערכת ההפעלה, root, מוצפנת, אך מחיצת הטעינה לא הוצפנה.<br/><br/> ישנן השלכות בטיחותיות עם התצורה שהוגדרה, מכיוון שקבצי מערכת חשובים נשמרים על מחיצה לא מוצפנת.<br/>תוכל להמשיך אם תרצה, אך שחרור מערכת הקבצים יתרחש מאוחר יותר כחלק מטעינת המערכת.<br/>בכדי להצפין את מחיצת הטעינה, חזור וצור אותה מחדש, על ידי בחירה ב <strong>הצפן</strong> בחלונית יצירת המחיצה. QObject Default Keyboard Model ברירת מחדל של דגם המקלדת Default ברירת מחדל unknown לא מוכר/ת extended מורחב/ת unformatted לא מאותחל/ת swap דפדוף, swap Unpartitioned space or unknown partition table הזכרון לא מחולק למחיצות או טבלת מחיצות לא מוכרת ReplaceWidget Form Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. בחר מיקום התקנת %1.<br/><font color="red">אזהרה: </font> הפעולה תמחק את כל הקבצים במחיצה שנבחרה. The selected item does not appear to be a valid partition. הפריט הנבחר איננו מחיצה תקינה. %1 cannot be installed on empty space. Please select an existing partition. לא ניתן להתקין את %1 על זכרון ריק. אנא בחר מחיצה קיימת. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. לא ניתן להתקין את %1 על מחיצה מורחבת. אנא בחר מחיצה ראשית או לוגית קיימת. %1 cannot be installed on this partition. לא ניתן להתקין את %1 על מחיצה זו. Data partition (%1) מחיצת מידע (%1) Unknown system partition (%1) מחיצת מערכת (%1) לא מוכרת %1 system partition (%2) %1 מחיצת מערכת (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/> גודל המחיצה %1 קטן מדי עבור %2. אנא בחר מחיצה עם קיבולת בנפח %3 GiB לפחות. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/> מחיצת מערכת EFI לא נמצאה באף מקום על המערכת. חזור בבקשה והשתמש ביצירת מחיצות באופן ידני בכדי להגדיר את %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 יותקן על %2. <br/><font color="red">אזהרה: </font>כל המידע אשר קיים במחיצה %2 יאבד. The EFI system partition at %1 will be used for starting %2. מחיצת מערכת EFI ב %1 תשמש עבור טעינת %2. EFI system partition: מחיצת מערכת EFI: RequirementsChecker Gathering system information... מלקט מידע אודות המערכת... has at least %1 GB available drive space קיים לפחות %1 GB של נפח אחסון There is not enough drive space. At least %1 GB is required. נפח האחסון לא מספק. נדרש לפחות %1 GB. has at least %1 GB working memory קיים לפחות %1 GB של זכרון פעולה The system does not have enough working memory. At least %1 GB is required. כמות הזכרון הנדרשת לפעולה, לא מספיקה. נדרש לפחות %1 GB. is plugged in to a power source מחובר לספק חשמל חיצוני The system is not plugged in to a power source. המערכת לא מחוברת לספק חשמל חיצוני. is connected to the Internet מחובר לאינטרנט The system is not connected to the Internet. המערכת לא מחוברת לאינטרנט. The installer is not running with administrator rights. אשף ההתקנה לא רץ עם הרשאות מנהל. The screen is too small to display the installer. גודל המסך קטן מדי בכדי להציג את מנהל ההתקנה. ResizeFileSystemJob Resize file system on partition %1. שנה את גודל מערכת הקבצים במחיצה %1. Parted failed to resize filesystem. Parted נכשלה לשנות את גודל מערכת הקבצים. Failed to resize filesystem. שינוי גודל מערכת הקבצים נכשלה. ResizePartitionJob Resize partition %1. שנה גודל מחיצה %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. משנה את מחיצה <strong>%1</strong> מגודל <strong>%2 MB</strong> ל <strong>%3 MB</strong>. Resizing %2MB partition %1 to %3MB. משנה את מחיצה %1 מ %2 MB ל %3 MB. The installer failed to resize partition %1 on disk '%2'. תהליך ההתקנה נכשל בשינוי גודל המחיצה %1 על כונן '%2'. Could not open device '%1'. נכשלה פתיחת התקן '%1'. ScanningDialog Scanning storage devices... סורק התקני זכרון... Partitioning מגדיר מחיצות SetHostNameJob Set hostname %1 הגדר שם עמדה %1 Set hostname <strong>%1</strong>. הגדר שם עמדה <strong>%1</strong>. Setting hostname %1. מגדיר את שם העמדה %1. Internal Error שגיאה פנימית Cannot write hostname to target system נכשלה כתיבת שם העמדה למערכת המטרה SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 הגדר דגם מקלדת ל %1, פריסת לוח מקשים ל %2-%3 Failed to write keyboard configuration for the virtual console. נכשלה כתיבת הגדרת מקלדת למסוף הוירטואלי. Failed to write to %1 נכשלה כתיבה ל %1 Failed to write keyboard configuration for X11. נכשלה כתיבת הגדרת מקלדת עבור X11. Failed to write keyboard configuration to existing /etc/default directory. נכשלה כתיבת הגדרת מקלדת לתיקיה קיימת /etc/default. SetPartFlagsJob Set flags on partition %1. הגדר סימונים על מחיצה %1. Set flags on %1MB %2 partition. הגדר סימונים על מחיצה %2 בגודל %1 MB. Set flags on new partition. הגדר סימונים על מחיצה חדשה. Clear flags on partition <strong>%1</strong>. מחק סימונים על מחיצה <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. מחק סימונים על מחיצה <strong>%2</strong> בגודל %1 MB. Clear flags on new partition. מחק סימונים על המחיצה החדשה. Flag partition <strong>%1</strong> as <strong>%2</strong>. סמן מחיצה <strong>%1</strong> כ <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. סמן מחיצה <strong>%2</strong> בגודל %1 MB כ <strong>%3</strong>. Flag new partition as <strong>%1</strong>. סמן מחיצה חדשה כ <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. מוחק סימונים על מחיצה <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. מוחק סימונים על מחיצה <strong>%2</strong> בגודל %1 MB. Clearing flags on new partition. מוחק סימונים על מחיצה חדשה. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. מגדיר סימונים <strong>%2</strong> על מחיצה <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. מגדיר סימונים <strong>%3</strong> על מחיצה <strong>%2</strong> בגודל %1 MB. Setting flags <strong>%1</strong> on new partition. מגדיר סימונים <strong>%1</strong> על מחיצה חדשה. The installer failed to set flags on partition %1. תהליך ההתקנה נכשל בעת הצבת סימונים במחיצה %1. Could not open device '%1'. פתיחת כונן '%1' נכשלה. Could not open partition table on device '%1'. פתיחת טבלת מחיצות על כונן '%1' נכשלה. Could not find partition '%1'. לא נמצאה מחיצה '%1'. SetPartGeometryJob Update geometry of partition %1. עדכן גאומטריית מחיצה %1. Failed to change the geometry of the partition. נכשל שינוי גאומטריית המחיצה. SetPasswordJob Set password for user %1 הגדר סיסמה עבור משתמש %1 Setting password for user %1. מגדיר סיסמה עבור משתמש %1. Bad destination system path. יעד נתיב המערכת לא תקין. rootMountPoint is %1 עיגון מחיצת מערכת ההפעלה, rootMountPoint, היא %1 Cannot disable root account. לא ניתן לנטרל את חשבון המנהל root. passwd terminated with error code %1. passwd הסתיימה עם שגיאת קוד %1. Cannot set password for user %1. לא ניתן להגדיר סיסמה עבור משתמש %1. usermod terminated with error code %1. פקודת שינוי מאפייני המשתמש, usermod, נכשלה עם קוד יציאה %1. SetTimezoneJob Set timezone to %1/%2 הגדרת אזור זמן ל %1/%2 Cannot access selected timezone path. לא ניתן לגשת לנתיב של אזור הזמן הנבחר. Bad path: %1 נתיב לא תקין: %1 Cannot set timezone. לא ניתן להגדיר את אזור הזמן. Link creation failed, target: %1; link name: %2 נכשלה יצירת קיצור דרך, מיקום: %1; שם קיצור הדרך: %2 Cannot set timezone, לא ניתן להגדיר את אזור הזמן, Cannot open /etc/timezone for writing לא ניתן לפתוח את /etc/timezone לכתיבה SummaryPage This is an overview of what will happen once you start the install procedure. להלן סקירת המאורעות שיתרחשו עם תחילת תהליך ההתקנה. SummaryViewStep Summary סיכום UsersPage Your username is too long. שם המשתמש ארוך מדי. Your username contains invalid characters. Only lowercase letters and numbers are allowed. שם העמדה מכיל ערכים לא תקינים. ניתן להשתמש אך ורק באותיות קטנות ומספרים. Your hostname is too short. שם העמדה קצר מדי. Your hostname is too long. שם העמדה ארוך מדי. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. שם העמדה מכיל ערכים לא תקינים. אך ורק אותיות, מספרים ומקפים מורשים. Your passwords do not match! הסיסמאות לא תואמות! UsersViewStep Users משתמשים WelcomePage Form Form &Language: &שפה: &Release notes &הערות הפצה &Known issues &בעיות נפוצות &Support &תמיכה &About &אודות <h1>Welcome to the %1 installer.</h1> <h1>ברוכים הבאים להתקנת %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>ברוכים הבאים להתקנת Calamares עבור %1.</h1> About %1 installer אודות התקנת %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>עבור %3</strong><br/><br/>זכויות יוצרים 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>זכויות יוצרים 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>תודות ל: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg ול<a href="https://www.transifex.com/calamares/calamares/">צוות התרגום של Calamares</a>.<br/><br/>פיתוח <a href="http://calamares.io/">Calamares</a> בחסות <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - משחררים תוכנה. %1 support תמיכה ב - %1 WelcomeViewStep Welcome ברוכים הבאים calamares-3.1.12/lang/calamares_hi.ts000066400000000000000000003136231322271446000174400ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_hr.ts000066400000000000000000003653141322271446000174550ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Boot okruženje</strong> sustava.<br><br>Stariji x86 sustavi jedino podržavaju <strong>BIOS</strong>.<br>Noviji sustavi uglavnom koriste <strong>EFI</strong>, ali mogu podržavati i BIOS ako su pokrenuti u načinu kompatibilnosti. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Ovaj sustav koristi <strong>EFI</strong> okruženje.<br><br>Za konfiguriranje pokretanja iz EFI okruženja, ovaj instalacijski program mora uvesti boot učitavač, kao što je <strong>GRUB</strong> ili <strong>systemd-boot</strong> na <strong>EFI particiju</strong>. To se odvija automatski, osim ako ste odabrali ručno particioniranje. U tom slučaju to ćete morati odabrati ili stvoriti sami. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Ovaj sustav koristi <strong>BIOS</strong> okruženje.<br><br>Za konfiguriranje pokretanja iz BIOS okruženja, ovaj instalacijski program mora uvesti boot učitavač, kao što je <strong>GRUB</strong>, ili na početku particije ili na <strong>Master Boot Record</strong> blizu početka particijske tablice (preporučen način). To se odvija automatski, osim ako ste odabrali ručno particioniranje. U tom slučaju to ćete morati napraviti sami. BootLoaderModel Master Boot Record of %1 Master Boot Record od %1 Boot Partition Boot particija System Partition Particija sustava Do not install a boot loader Nemoj instalirati boot učitavač %1 (%2) %1 (%2) Calamares::DebugWindow Form Oblik GlobalStorage GlobalStorage JobQueue JobQueue Modules Moduli Type: Tip: none nijedan Interface: Sučelje: Tools Alati Debug information Debug informacija Calamares::ExecutionViewStep Install Instaliraj Calamares::JobThread Done Gotovo Calamares::ProcessJob Run command %1 %2 Izvrši naredbu %1 %2 Running command %1 %2 Izvršavam naredbu %1 %2 External command crashed Vanjska naredba je prekinula s radom Command %1 crashed. Output: %2 Naredba %1 je prekinula s radom. Izlaz: %2 External command failed to start Vanjska naredba nije uspješno pokrenuta Command %1 failed to start. Naredba %1 nije uspješno pokrenuta. Internal error when starting command Unutrašnja greška pri pokretanju naredbe Bad parameters for process job call. Krivi parametri za proces poziva posla. External command failed to finish Vanjska naredba se nije uspjela izvršiti Command %1 failed to finish in %2s. Output: %3 Naredba %1 se nije uspjela izvršiti za %2s. Izlaz: %3 External command finished with errors Vanjska naredba je završila sa pogreškama Command %1 finished with exit code %2. Output: %3 Naredba %1 je završila sa izlaznim kodom %2. Izlaz: %3 Calamares::PythonJob Running %1 operation. Izvodim %1 operaciju. Bad working directory path Krivi put do radnog direktorija Working directory %1 for python job %2 is not readable. Radni direktorij %1 za python zadatak %2 nije čitljiv. Bad main script file Kriva glavna datoteka skripte Main script file %1 for python job %2 is not readable. Glavna skriptna datoteka %1 za python zadatak %2 nije čitljiva. Boost.Python error in job "%1". Boost.Python greška u zadatku "%1". Calamares::ViewManager &Back &Natrag &Next &Sljedeće &Cancel &Odustani Cancel installation without changing the system. Odustanite od instalacije bez promjena na sustavu. Cancel installation? Prekinuti instalaciju? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Stvarno želite prekinuti instalacijski proces? Instalacijski program će izaći i sve promjene će biti izgubljene. &Yes &Da &No &Ne &Close &Zatvori Continue with setup? Nastaviti s postavljanjem? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 instalacijski program će napraviti promjene na disku kako bi instalirao %2.<br/><strong>Nećete moći vratiti te promjene.</strong> &Install now &Instaliraj sada Go &back Idi &natrag &Done &Gotovo The installation is complete. Close the installer. Instalacija je završena. Zatvorite instalacijski program. Error Greška Installation Failed Instalacija nije uspjela CalamaresPython::Helper Unknown exception type Nepoznati tip iznimke unparseable Python error unparseable Python greška unparseable Python traceback unparseable Python traceback Unfetchable Python error. Nedohvatljiva Python greška. CalamaresWindow %1 Installer %1 Instalacijski program Show debug information Prikaži debug informaciju CheckFileSystemJob Checking file system on partition %1. Provjera datotečnog sustava na particiji %1. The file system check on partition %1 failed. Provjera datotečnog sustava na particiji %1 nije uspjela. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Ovo računalo ne zadovoljava minimalne uvijete za instalaciju %1.<br/>Instalacija se ne može nastaviti.<a href="#details">Detalji...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Računalo ne zadovoljava neke od preporučenih uvjeta za instalaciju %1.<br/>Instalacija se može nastaviti, ali neke značajke možda neće biti dostupne. This program will ask you some questions and set up %2 on your computer. Ovaj program će vam postaviti neka pitanja i instalirati %2 na vaše računalo. For best results, please ensure that this computer: Za najbolje rezultate, pobrinite se da ovo računalo: System requirements Zahtjevi sustava ChoicePage Form Oblik After: Poslije: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ručno particioniranje</strong><br/>Možete sami stvoriti ili promijeniti veličine particija. Boot loader location: Lokacija boot učitavača: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 će se smanjiti na %2MB i stvorit će se nova %3MB particija za %4. Select storage de&vice: Odaberi uređaj za spremanje: Current: Trenutni: Reuse %1 as home partition for %2. Koristi %1 kao home particiju za %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Odaberite particiju za smanjivanje, te povlačenjem donjeg pokazivača odaberite promjenu veličine</strong> <strong>Select a partition to install on</strong> <strong>Odaberite particiju za instalaciju</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. EFI particija ne postoji na ovom sustavu. Vratite se natrag i koristite ručno particioniranje da bi ste postavili %1. The EFI system partition at %1 will be used for starting %2. EFI particija na %1 će se koristiti za pokretanje %2. EFI system partition: EFI particija: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Izgleda da na ovom disku nema operacijskog sustava. Što želite učiniti?<br/>Moći ćete provjeriti i potvrditi vaš odabir prije bilo kakvih promjena na disku. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Obriši disk</strong><br/>To će <font color="red">obrisati</font> sve podatke na odabranom disku. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ovaj disk ima %1. Što želite učiniti?<br/>Moći ćete provjeriti i potvrditi vaš odabir prije bilo kakvih promjena na disku. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instaliraj uz postojeće</strong><br/>Instalacijski program će smanjiti particiju da bi napravio mjesto za %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Zamijeni particiju</strong><br/>Zamijenjuje particiju sa %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ovaj disk već ima operacijski sustav. Što želite učiniti?<br/>Moći ćete provjeriti i potvrditi vaš odabir prije bilo kakvih promjena na disku. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ovaj disk ima više operacijskih sustava. Što želite učiniti?<br/>Moći ćete provjeriti i potvrditi vaš odabir prije bilo kakvih promjena na disku. ClearMountsJob Clear mounts for partitioning operations on %1 Ukloni montiranja za operacije s particijama na %1 Clearing mounts for partitioning operations on %1. Uklanjam montiranja za operacija s particijama na %1. Cleared all mounts for %1 Uklonjena sva montiranja za %1 ClearTempMountsJob Clear all temporary mounts. Ukloni sva privremena montiranja. Clearing all temporary mounts. Uklanjam sva privremena montiranja. Cannot get list of temporary mounts. Ne mogu dohvatiti popis privremenih montiranja. Cleared all temporary mounts. Uklonjena sva privremena montiranja. CreatePartitionDialog Create a Partition Stvori particiju MiB MiB Partition &Type: Tip &particije: &Primary &Primarno E&xtended P&roduženo Fi&le System: Da&totečni sustav: Flags: Oznake: &Mount Point: &Točke montiranja: Si&ze: Ve&ličina: En&crypt Ši&friraj Logical Logično Primary Primarno GPT GPT Mountpoint already in use. Please select another one. Točka montiranja se već koristi. Odaberite drugu. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Stvori novu %2MB particiju na %4 (%3) s datotečnim sustavom %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Stvori novu <strong>%2MB</strong> particiju na <strong>%4</strong> (%3) s datotečnim sustavom <strong>%1</strong>. Creating new %1 partition on %2. Stvaram novu %1 particiju na %2. The installer failed to create partition on disk '%1'. Instalacijski program nije uspio stvoriti particiju na disku '%1'. Could not open device '%1'. Ne mogu otvoriti uređaj '%1'. Could not open partition table. Ne mogu otvoriti particijsku tablicu. The installer failed to create file system on partition %1. Instalacijski program nije uspio stvoriti datotečni sustav na particiji %1. The installer failed to update partition table on disk '%1'. Instalacijski program nije uspio nadograditi particijsku tablicu na disku '%1'. CreatePartitionTableDialog Create Partition Table Stvori particijsku tablicu Creating a new partition table will delete all existing data on the disk. Stvaranje nove particijske tablice će izbrisati postojeće podatke na disku. What kind of partition table do you want to create? Koju vrstu particijske tablice želite stvoriti? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Stvori novu %1 particijsku tablicu na %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Stvori novu <strong>%1</strong> particijsku tablicu na <strong>%2</strong> (%3). Creating new %1 partition table on %2. Stvaram novu %1 particijsku tablicu na %2. The installer failed to create a partition table on %1. Instalacijski program nije uspio stvoriti particijsku tablicu na %1. Could not open device %1. Ne mogu otvoriti uređaj %1. CreateUserJob Create user %1 Stvori korisnika %1 Create user <strong>%1</strong>. Stvori korisnika <strong>%1</strong>. Creating user %1. Stvaram korisnika %1. Sudoers dir is not writable. Po sudoers direktoriju nije moguće spremati. Cannot create sudoers file for writing. Ne mogu stvoriti sudoers datoteku za pisanje. Cannot chmod sudoers file. Ne mogu chmod sudoers datoteku. Cannot open groups file for reading. Ne mogu otvoriti groups datoteku za čitanje. Cannot create user %1. Ne mogu stvoriti korisnika %1. useradd terminated with error code %1. useradd je prestao s radom sa greškom koda %1. Cannot add user %1 to groups: %2. Ne mogu dodati korisnika %1 u grupe: %2. usermod terminated with error code %1. korisnički mod je prekinut s greškom %1. Cannot set home directory ownership for user %1. Ne mogu postaviti vlasništvo radnog direktorija za korisnika %1. chown terminated with error code %1. chown je prestao s radom sa greškom koda %1. DeletePartitionJob Delete partition %1. Obriši particiju %1. Delete partition <strong>%1</strong>. Obriši particiju <strong>%1</strong>. Deleting partition %1. Brišem particiju %1. The installer failed to delete partition %1. Instalacijski program nije uspio izbrisati particiju %1. Partition (%1) and device (%2) do not match. Particija (%1) i uređaj (%2) se ne poklapaju. Could not open device %1. Ne mogu otvoriti uređaj %1. Could not open partition table. Ne mogu otvoriti particijsku tablicu. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Tip <strong>particijske tablice</strong> na odabranom disku.<br><br>Jedini način da bi ste promijenili tip particijske tablice je da obrišete i iznova stvorite particijsku tablicu. To će uništiiti sve podatke na disku.<br>Instalacijski program će zadržati postojeću particijsku tablicu osim ako ne odaberete drugačije.<br>Ako niste sigurni, na novijim sustavima GPT je preporučena particijska tablica. This device has a <strong>%1</strong> partition table. Ovaj uređaj ima <strong>%1</strong> particijsku tablicu. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Ovo je <strong>loop</strong> uređaj.<br><br>To je pseudo uređaj koji nema particijsku tablicu koja omogučava pristup datotekama kao na block uređajima. Taj način postave obično sadrži samo jedan datotečni sustav. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Instalacijski program <strong>ne može detektirati particijsku tablicu</strong> na odabranom disku.<br><br>Uređaj ili nema particijsku tablicu ili je particijska tablica oštečena ili nepoznatog tipa.<br>Instalacijski program može stvoriti novu particijsku tablicu, ili automatski, ili kroz ručno particioniranje. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>To je preporučeni tip particijske tablice za moderne sustave koji se koristi za <strong> EFI </strong> boot okruženje. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Ovaj oblik particijske tablice je preporučen samo za starije sustave počevši od <strong>BIOS</strong> boot okruženja. GPT je preporučen u većini ostalih slučaja. <br><br><strong>Upozorenje:</strong> MBR particijska tablica je zastarjela iz doba MS-DOS standarda.<br>Samo 4 <em>primarne</em> particije se mogu kreirati i od tih 4, jedna može biti <em>proširena</em> particija, koja može sadržavati mnogo <em>logičkih</em> particija. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Zapisujem LUKS konfiguraciju za Dracut na %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Preskačem pisanje LUKS konfiguracije za Dracut: "/" particija nije kriptirana Failed to open %1 Neuspješno otvaranje %1 DummyCppJob Dummy C++ Job Lažni C++ posao EditExistingPartitionDialog Edit Existing Partition Uredi postojeću particiju Content: Sadržaj: &Keep &Zadrži Format Formatiraj Warning: Formatting the partition will erase all existing data. Upozorenje: Formatiranje particije će izbrisati sve postojeće podatke. &Mount Point: &Točka montiranja: Si&ze: Ve&ličina: MiB MiB Fi&le System: Da&totečni sustav: Flags: Oznake: Mountpoint already in use. Please select another one. Točka montiranja se već koristi. Odaberite drugu. EncryptWidget Form Oblik En&crypt system Ši&friraj sustav Passphrase Lozinka Confirm passphrase Potvrdi lozinku Please enter the same passphrase in both boxes. Molimo unesite istu lozinku u oba polja. FillGlobalStorageJob Set partition information Postavi informacije o particiji Install %1 on <strong>new</strong> %2 system partition. Instaliraj %1 na <strong>novu</strong> %2 sistemsku particiju. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Postavi <strong>novu</strong> %2 particiju s točkom montiranja <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instaliraj %2 na %3 sistemsku particiju <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Postavi %3 particiju <strong>%1</strong> s točkom montiranja <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instaliraj boot učitavač na <strong>%1</strong>. Setting up mount points. Postavljam točke montiranja. FinishedPage Form Oblik &Restart now &Ponovno pokreni sada <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Gotovo.</h1><br/>%1 je instaliran na vaše računalo.<br/>Sada možete ponovno pokrenuti računalo ili nastaviti sa korištenjem %2 live okruženja. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Instalacija nije uspijela</h1><br/>%1 nije instaliran na vaše računalo.<br/>Greška: %2. FinishedViewStep Finish Završi Installation Complete Instalacija je završena The installation of %1 is complete. Instalacija %1 je završena. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatiraj particiju %1 (datotečni sustav: %2, veličina: %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatiraj <strong>%3MB</strong>particiju <strong>%1</strong> na datotečni sustav <strong>%2</strong>. Formatting partition %1 with file system %2. Formatiraj particiju %1 na datotečni sustav %2. The installer failed to format partition %1 on disk '%2'. Instalacijski program nije uspio formatirati particiju %1 na disku '%2'. Could not open device '%1'. Ne mogu otvoriti uređaj '%1'. Could not open partition table. Ne mogu otvoriti particijsku tablicu. The installer failed to create file system on partition %1. Instalacijski program nije uspio stvoriti datotečni sustav na particiji %1. The installer failed to update partition table on disk '%1'. Instalacijski program nije uspio nadograditi particijsku tablicu na disku '%1'. InteractiveTerminalPage Konsole not installed Terminal nije instaliran Please install the kde konsole and try again! Molimo vas da instalirate kde terminal i pokušajte ponovno! Executing script: &nbsp;<code>%1</code> Izvršavam skriptu: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skripta KeyboardPage Set keyboard model to %1.<br/> Postavi model tipkovnice na %1.<br/> Set keyboard layout to %1/%2. Postavi raspored tipkovnice na %1%2. KeyboardViewStep Keyboard Tipkovnica LCLocaleDialog System locale setting Postavke jezične sheme sustava The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Jezična shema sustava ima efekt na jezični i znakovni skup za neke komandno linijske elemente sučelja.<br/>Trenutačna postavka je <strong>%1</strong>. &Cancel &Odustani &OK &OK LicensePage Form Oblik I accept the terms and conditions above. Prihvaćam gore navedene uvjete i odredbe. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licencni ugovor</h1>Instalacijska procedura će instalirati vlasnički program koji podliježe uvjetima licenciranja. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Molimo vas da pogledate gore navedene End User License Agreements (EULAs).<br/>Ako se ne slažete s navedenim uvjetima, instalacijska procedura se ne može nastaviti. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licencni ugovor</h1>Instalacijska procedura može instalirati vlasnički program, koji podliježe uvjetima licenciranja, kako bi pružio dodatne mogućnosti i poboljšao korisničko iskustvo. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Molimo vas da pogledate gore navedene End User License Agreements (EULAs).<br/>Ako se ne slažete s navedenim uvjetima, vlasnički program se ne će instalirati te će se umjesto toga koristiti program otvorenog koda. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 upravljački program</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafički upravljački program</strong><br/><font color="Grey">od %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 dodatak preglednika</strong><br/><font color="Grey">od %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 kodek</strong><br/><font color="Grey">od %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paket</strong><br/><font color="Grey">od %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">od %2</font> <a href="%1">view license agreement</a> <a href="%1">pogledaj licencni ugovor</a> LicenseViewStep License Licence LocalePage The system language will be set to %1. Jezik sustava će se postaviti na %1. The numbers and dates locale will be set to %1. Jezična shema brojeva i datuma će se postaviti na %1. Region: Regija: Zone: Zona: &Change... &Promijeni... Set timezone to %1/%2.<br/> Postavi vremesku zonu na %1%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Učitavanje podataka o lokaciji... Location Lokacija MoveFileSystemJob Move file system of partition %1. Pomakni datotečni sustav particije %1. Could not open file system on partition %1 for moving. Ne mogu otvoriti datotečni sustav na particiji %1 za pomicanje. Could not create target for moving file system on partition %1. Ne mogu stvoriti metu za pomicanje datotečnog sustava na particiji %1. Moving of partition %1 failed, changes have been rolled back. Pomicanje particije %1 nije uspjelo, promjene su uklonjene. Moving of partition %1 failed. Roll back of the changes have failed. Pomicanje particije %1 nije uspjelo. Uklanjanje promjena nije uspjelo. Updating boot sector after the moving of partition %1 failed. Nije uspjelo ažuriranje boot sektora nakon pomicanja particije %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Velićina logičkog sektora na izvoru i cilju za kopiranje nije ista. Ovo trenutno nije podržano. Source and target for copying do not overlap: Rollback is not required. Izvor i cilj za kopiranje se ne preklapaju. Vraćanje nije potrebno. Could not open device %1 to rollback copying. Ne mogu otvoriti uređaj %1 za vraćanje kopiranja. NetInstallPage Name Ime Description Opis Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Mrežna instalacija. (Onemogućeno: Ne mogu dohvatiti listu paketa, provjerite da li ste spojeni na mrežu) NetInstallViewStep Package selection Odabir paketa Page_Keyboard Form Oblik Keyboard Model: Tip tipkovnice: Type here to test your keyboard Ovdje testiraj tipkovnicu Page_UserSetup Form Oblik What is your name? Koje je tvoje ime? What name do you want to use to log in? Koje ime želite koristiti za prijavu? font-weight: normal debljina fonta: normalan <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ako će više osoba koristiti ovo računalo, možete postaviti više korisničkih računa poslije instalacije.</small> Choose a password to keep your account safe. Odaberite lozinku da bi račun bio siguran. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Unesite istu lozinku dvaput, tako da bi se provjerile eventualne pogreške prilikom upisa. Dobra lozinka sadrži kombinaciju slova, brojki i interpunkcija, trebala bi biti dugačka najmanje osam znakova i trebala bi se mijenjati u redovitim intervalima.</small> What is the name of this computer? Koje je ime ovog računala? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ovo ime će se koristiti ako odaberete da je računalo vidljivo ostalim korisnicima na mreži.</small> Log in automatically without asking for the password. Automatska prijava bez traženja lozinke. Use the same password for the administrator account. Koristi istu lozinku za administratorski račun. Choose a password for the administrator account. Odaberi lozinku za administratorski račun. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Unesite istu lozinku dvaput, tako da bi se provjerile eventualne pogreške prilikom upisa.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI sustav Swap Swap New partition for %1 Nova particija za %1 New partition Nova particija %1 %2 %1 %2 PartitionModel Free Space Slobodni prostor New partition Nova particija Name Ime File System Datotečni sustav Mount Point Točka montiranja Size Veličina PartitionPage Form Oblik Storage de&vice: Uređaj za sp&remanje: &Revert All Changes &Poništi sve promjene New Partition &Table Nova particijska &tablica &Create &Stvori &Edit &Uredi &Delete &Izbriši Install boot &loader on: Instaliraj boot &učitavač na: Are you sure you want to create a new partition table on %1? Jeste li sigurni da želite stvoriti novu particijsku tablicu na %1? PartitionViewStep Gathering system information... Skupljanje informacija o sustavu... Partitions Particije Install %1 <strong>alongside</strong> another operating system. Instaliraj %1 <strong>uz postojeći</strong> operacijski sustav. <strong>Erase</strong> disk and install %1. <strong>Obriši</strong> disk i instaliraj %1. <strong>Replace</strong> a partition with %1. <strong>Zamijeni</strong> particiju s %1. <strong>Manual</strong> partitioning. <strong>Ručno</strong> particioniranje. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instaliraj %1 <strong>uz postojeći</strong> operacijski sustav na disku <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Obriši</strong> disk <strong>%2</strong> (%3) i instaliraj %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Zamijeni</strong> particiju na disku <strong>%2</strong> (%3) s %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ručno</strong> particioniram disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Trenutni: After: Poslije: No EFI system partition configured EFI particija nije konfigurirana An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI particija je potrebna za pokretanje %1.<br/><br/>Da bi ste konfigurirali EFI particiju, idite natrag i odaberite ili stvorite FAT32 datotečni sustav s omogućenom <strong>esp</strong> oznakom i točkom montiranja <strong>%2</strong>.<br/><br/>Možete nastaviti bez postavljanja EFI particije, ali vaš sustav se možda neće moći pokrenuti. EFI system partition flag not set Oznaka EFI particije nije postavljena An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. EFI particija je potrebna za pokretanje %1.<br><br/>Particija je konfigurirana s točkom montiranja <strong>%2</strong> ali njezina <strong>esp</strong> oznaka nije postavljena.<br/>Za postavljanje oznake, vratite se i uredite postavke particije.<br/><br/>Možete nastaviti bez postavljanja oznake, ali vaš sustav se možda neće moći pokrenuti. Boot partition not encrypted Boot particija nije kriptirana A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Odvojena boot particija je postavljena zajedno s kriptiranom root particijom, ali boot particija nije kriptirana.<br/><br/>Zabrinuti smo za vašu sigurnost jer su važne datoteke sustava na nekriptiranoj particiji.<br/>Možete nastaviti ako želite, ali datotečni sustav će se otključati kasnije tijekom pokretanja sustava.<br/>Da bi ste kriptirali boot particiju, vratite se natrag i napravite ju, odabirom opcije <strong>Kriptiraj</strong> u prozoru za stvaranje prarticije. QObject Default Keyboard Model Zadani oblik tipkovnice Default Zadano unknown nepoznato extended prošireno unformatted nije formatirano swap swap Unpartitioned space or unknown partition table Ne particionirani prostor ili nepoznata particijska tablica ReplaceWidget Form Oblik Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Odaberite gdje želite instalirati %1.<br/><font color="red">Upozorenje: </font>to će obrisati sve datoteke na odabranoj particiji. The selected item does not appear to be a valid partition. Odabrana stavka se ne ćini kao ispravna particija. %1 cannot be installed on empty space. Please select an existing partition. %1 ne može biti instaliran na prazni prostor. Odaberite postojeću particiju. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 se ne može instalirati na proširenu particiju. Odaberite postojeću primarnu ili logičku particiju. %1 cannot be installed on this partition. %1 se ne može instalirati na ovu particiju. Data partition (%1) Podatkovna particija (%1) Unknown system partition (%1) Nepoznata particija sustava (%1) %1 system partition (%2) %1 particija sustava (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Particija %1 je premala za %2. Odaberite particiju kapaciteta od najmanje %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>EFI particijane postoji na ovom sustavu. Vratite se natrag i koristite ručno particioniranje za postavljane %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 će biti instaliran na %2.<br/><font color="red">Upozorenje: </font>svi podaci na particiji %2 će biti izgubljeni. The EFI system partition at %1 will be used for starting %2. EFI particija na %1 će se koristiti za pokretanje %2. EFI system partition: EFI particija: RequirementsChecker Gathering system information... Skupljanje informacija o sustavu... has at least %1 GB available drive space ima barem %1 GB dostupne slobodne memorije na disku There is not enough drive space. At least %1 GB is required. Nema dovoljno prostora na disku. Potrebno je najmanje %1 GB. has at least %1 GB working memory ima barem %1 GB radne memorije The system does not have enough working memory. At least %1 GB is required. Ovaj sustav nema dovoljno radne memorije. Potrebno je najmanje %1 GB. is plugged in to a power source je spojeno na izvor struje The system is not plugged in to a power source. Ovaj sustav nije spojen na izvor struje. is connected to the Internet je spojeno na Internet The system is not connected to the Internet. Ovaj sustav nije spojen na internet. The installer is not running with administrator rights. Instalacijski program nije pokrenut sa administratorskim dozvolama. The screen is too small to display the installer. Zaslon je premalen za prikaz instalacijskog programa. ResizeFileSystemJob Resize file system on partition %1. Promjena veličine datotečnog sustava na particiji %1. Parted failed to resize filesystem. Parted nije uspio promijeniti veličinu datotečnog sustava. Failed to resize filesystem. Nije uspjela promjena veličine datotečnog sustava. ResizePartitionJob Resize partition %1. Promijeni veličinu particije %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Promijeni veličinu od <strong>%2MB</strong> particije <strong>%1</strong> na <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Mijenjam veličinu od %2MB particije %1 na %3MB. The installer failed to resize partition %1 on disk '%2'. Instalacijski program nije uspio promijeniti veličinu particije %1 na disku '%2'. Could not open device '%1'. Ne mogu otvoriti uređaj '%1'. ScanningDialog Scanning storage devices... Tražim dostupne uređaje za spremanje... Partitioning Particioniram SetHostNameJob Set hostname %1 Postavi ime računala %1 Set hostname <strong>%1</strong>. Postavi ime računala <strong>%1</strong>. Setting hostname %1. Postavljam ime računala %1. Internal Error Unutarnja pogreška Cannot write hostname to target system Ne mogu zapisati ime računala na traženi sustav. SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Postavi model tpkovnice na %1, raspored na %2-%3 Failed to write keyboard configuration for the virtual console. Neuspješno pisanje konfiguracije tipkovnice za virtualnu konzolu. Failed to write to %1 Neuspješno pisanje na %1 Failed to write keyboard configuration for X11. Neuspješno pisanje konfiguracije tipkovnice za X11. Failed to write keyboard configuration to existing /etc/default directory. Neuspješno pisanje konfiguracije tipkovnice u postojeći /etc/default direktorij. SetPartFlagsJob Set flags on partition %1. Postavi oznake na particiji %1. Set flags on %1MB %2 partition. Postavi oznake na %1MB %2 particiji. Set flags on new partition. Postavi oznake na novoj particiji. Clear flags on partition <strong>%1</strong>. Obriši oznake na particiji <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Obriši oznake na %1MB <strong>%2</strong> particiji. Clear flags on new partition. Obriši oznake na novoj particiji. Flag partition <strong>%1</strong> as <strong>%2</strong>. Označi particiju <strong>%1</strong> kao <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Označi %1MB <strong>%2</strong> particiju kao <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Označi novu particiju kao <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Brišem oznake na particiji <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Brišem oznake na %1MB <strong>%2</strong> particiji. Clearing flags on new partition. Brišem oznake na novoj particiji. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Postavljam oznake <strong>%2</strong> na particiji <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Postavljam oznake <strong>%3</strong> na %1MB <strong>%2</strong> particiji. Setting flags <strong>%1</strong> on new partition. Postavljam oznake <strong>%1</strong> na novoj particiji. The installer failed to set flags on partition %1. Instalacijski program nije uspio postaviti oznake na particiji %1. Could not open device '%1'. Ne mogu otvoriti uređaj '%1'. Could not open partition table on device '%1'. Ne mogu otvoriti particijsku tablicu na uređaju '%1'. Could not find partition '%1'. Ne mogu pronaći particiju '%1'. SetPartGeometryJob Update geometry of partition %1. Ažuriram geometriju particije %1. Failed to change the geometry of the partition. Neuspješna promjena geometrije particije. SetPasswordJob Set password for user %1 Postavi lozinku za korisnika %1 Setting password for user %1. Postavljam lozinku za korisnika %1. Bad destination system path. Loš odredišni put sustava. rootMountPoint is %1 rootTočkaMontiranja je %1 Cannot disable root account. Ne mogu onemogućiti root račun. passwd terminated with error code %1. passwd je prekinut s greškom %1. Cannot set password for user %1. Ne mogu postaviti lozinku za korisnika %1. usermod terminated with error code %1. usermod je prekinut s greškom %1. SetTimezoneJob Set timezone to %1/%2 Postavi vremesku zonu na %1%2 Cannot access selected timezone path. Ne mogu pristupiti odabranom putu do vremenske zone. Bad path: %1 Loš put: %1 Cannot set timezone. Ne mogu postaviti vremesku zonu. Link creation failed, target: %1; link name: %2 Kreiranje linka nije uspjelo, cilj: %1; ime linka: %2 Cannot set timezone, Ne mogu postaviti vremensku zonu, Cannot open /etc/timezone for writing Ne mogu otvoriti /etc/timezone za pisanje SummaryPage This is an overview of what will happen once you start the install procedure. Ovo je prikaz događaja koji će uslijediti jednom kad počne instalacijska procedura. SummaryViewStep Summary Sažetak UsersPage Your username is too long. Vaše korisničko ime je predugačko. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Korisničko ime sadržava nedozvoljene znakove. Dozvoljena su samo mala slova i brojevi. Your hostname is too short. Ime računala je kratko. Your hostname is too long. Ime računala je predugačko. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Ime računala sadrži nedozvoljene znakove. Samo slova, brojevi i crtice su dozvoljene. Your passwords do not match! Lozinke se ne podudaraju! UsersViewStep Users Korisnici WelcomePage Form Oblik &Language: &Jezik: &Release notes &Napomene o izdanju &Known issues &Poznati problemi &Support &Podrška &About &O programu <h1>Welcome to the %1 installer.</h1> <h1>Dobrodošli u %1 instalacijski program.</h1> <h1>Welcome to the Calamares installer for %1.</h1> Dobrodošli u Calamares instalacijski program za %1. About %1 installer O %1 instalacijskom programu <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>za %3</strong><br/><br/>Autorska prava 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Autorska prava 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Zahvale: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg i <a href="https://www.transifex.com/calamares/calamares/">Calamares timu za prevođenje</a>.<br/><br/><a href="http://calamares.io/">Calamares</a>sponzorira <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 podrška WelcomeViewStep Welcome Dobrodošli calamares-3.1.12/lang/calamares_hr_HR.ts000066400000000000000000003234231322271446000200410ustar00rootroot00000000000000 AlongsidePage Choose partition to shrink: Allocate drive space by dragging the divider below: With this operation, the partition <b>%1</b> which contains %4 will be shrunk to %2MB and a new %3MB partition will be created for %5. ApplyProgressDetailsWidgetBase Save Open in External Browser ApplyProgressDialogWidgetBase Operations and Jobs Time Elapsed Total Time: 00:00:00 Operation: %p% Status Total: %p% Base Installer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; color:#343434;">Welcome</span></p></body></html> Location License Approval <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; color:#343434;">Installation</span></p></body></html> Install System <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; color:#343434;">Configuration</span></p></body></html> Reboot Language User Info Summary Keyboard Disk Setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; color:#343434;">Preparation</span></p></body></html> BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Calamares::InstallationViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Run script %1 Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Quit Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. ChoicePage This computer currently does not seem to have an operating system on it. What would you like to do? <b>Erase disk and install %1</b><br/><font color="red">Warning: </font>This will delete all of your programs, documents, photos, music, and any other files. This computer currently has %1 on it. What would you like to do? <b>Install %2 alongside %1</b><br/>Documents, music and other personal files will be kept. You can choose which operating system you want each time the computer starts up. <b>Replace %1 with %2</b><br/><font color="red">Warning: </font>This will erase the whole disk and delete all of your %1 programs, documents, photos, music, and any other files. This computer already has an operating system on it. What would you like to do? <b>Install %1 alongside your current operating system</b><br/>Documents, music and other personal files will be kept. You can choose which operating system you want each time the computer starts up. <b>Erase disk and install %1</b><br/><font color="red">Warning: </font>This will delete all of your Windows 7 programs, documents, photos, music, and any other files. This computer currently has multiple operating systems on it. What would you like to do? <b>Install %1 alongside your current operating systems</b><br/>Documents, music and other personal files will be kept. You can choose which operating system you want each time the computer starts up. <b>Something else</b><br/>You can create or resize partitions yourself, or choose multiple partitions for %1. ConfigurePageAdvanced Permissions Allow applying operations without administrator privileges Backend Active backend: Units Preferred unit: Byte KiB MiB GiB TiB PiB EiB ConfigurePageFileSystemColors File Systems luks: ntfs: ext2: ext3: ext4: btrfs: linuxswap: fat16: fat32: zfs: reiserfs: reiser4: hpfs: jfs hfs: hfsplus: ufs: xfs: ocfs2: extended: unformatted: unknown: exfat: nilfs2: lvm2 pv: ConfigurePageGeneral Partition Alignment Use cylinder based alignment (Windows XP compatible) Sector alignment: sectors Align partitions per default Logging Hide messages below: Debug Information Warning Error File Systems Default file system: Shredding Overwrite with: Random data Zeros CreatePartitionDialog Create a Partition Partition &Type: &Primary E&xtended F&ile System: &Mount Point: / /boot /home /opt /usr /var Si&ze: MB Logical Primary GPT CreatePartitionJob Create partition (file system: %1, size: %2 MB) on %3. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create partition table The installer failed to create a partition table on %1. Could not open device %1. CreatePartitionTableWidgetBase Choose the type of partition table you want to create: GPT MS-Dos (icon) <b>Warning:</b> This will destroy all data on the device! CreateUserJob Create user %1 Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot set full name for user %1. chfn terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DecryptLuksDialogWidgetBase &Name: &Passphrase: DeletePartitionJob Delete partition %1 The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceModel %1 - %2 (%3) DevicePropsWidgetBase Partition table: Cylinder alignment Sector based alignment Capacity: Total sectors: Cylinders/Heads/Sectors: Logical sector size: Physical sector size: Cylinder size: Primaries/Max: SMART status: More... EditExistingPartitionDialog Edit Existing Partition Content: Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: / /boot /home /opt /usr /var Size: EditMountOptionsDialogWidgetBase Edit Mount Options Edit the mount options for this file system: EditMountPointDialogWidgetBase Path: Select... Type: Options: Read-only Users can mount and unmount No automatic mount No update of file access times Synchronous access No update of directory access times No binary execution Update access times relative to modification More... Dump Frequency: Pass Number: Device Node UUID Label Identify by: EraseDiskPage Select drive: Before: After: FileSystemSupportDialogWidgetBase This table shows which file systems are supported and which specific operations can be performed on them. Some file systems need external tools to be installed for them to be supported. But not all operations can be performed on all file systems, even if all required tools are installed. Please see the documentation for details. File System Create Grow Shrink Move Copy Check Read Label Write Label Read Usage Backup Restore Support Tools Rescan Support @action:button FillGlobalStorageJob Set partition information Failed to find path for boot loader FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. GreetingPage <h1>Welcome to the %1 installer.</h1><br/>This program will ask you some questions and set up %2 on your computer. GreetingViewStep Welcome KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LocalePage Region: Zone: Set timezone to %1/%2.<br/> LocaleViewStep Loading location data... Location MainWindowBase KDE Partition Manager @title:window Devices @title:window Pending Operations @title:window Information @title:window Log Output @title:window MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> Log in automatically Require my password to log in PartPropsWidgetBase File system: @label:listbox Label: @label This file system does not support setting a label. @label Recreate existing file system @action:button Mount point: @label Partition type: @label Status: @label UUID: @label Size: @label Available: @label partition capacity available Used: @label partition capacity used First sector: @label Last sector: @label Number of sectors: @label Flags: @label PartitionManagerWidgetBase KDE Partition Manager @title:window Partition Type Mount Point Label UUID Size Used Available First Sector Last Sector Number of Sectors Flags PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form &Disk: &Revert All Changes New Partition &Table &Create &Edit &Delete &Install boot loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Before: After: PreparePage For best results, please ensure that this computer: This computer does not satisfy the minimum requirements for installing %1. Installation cannot continue. This computer does not satisfy some of the recommended requirements for installing %1. Installation can continue, but some features might be disabled. PrepareViewStep Gathering system information... has at least %1 GB available drive space has at least %1 GB working memory is plugged in to a power source is connected to the Internet Prepare ProgressTreeModel Prepare Finish QObject Default Keyboard Model Default ReleaseDialog KDE Release Builder Application Name: &Version: Repository and Revision &Checkout From: trunk branches tags Ta&g/Branch: &SVN Access: anonsvn https svn+ssh &User: Options Get &Documentation Get &Translations C&reate Tag S&kip translations below completion: % Create Tar&ball Apply &fixes ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. SetHostNameJob Set hostname %1 Internal Error Cannot write hostname to target system SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Bad destination system path. rootMountPoint is %1 Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 SizeDetailsWidgetBase First sector: @label:listbox Last sector: @label:listbox Align partition SizeDialogWidgetBase Partition type: @label:listbox Primary Extended Logical File system: @label:listbox Label: @label This file system does not support setting a label. @label Minimum size: @label Maximum size: @label Free space before: @label:listbox Size: @label:listbox Free space after: @label:listbox SmartDialogWidgetBase SMART status: Model: Serial number: Firmware revision: Temperature: Bad sectors: Powered on for: Power cycles: Id Attribute Failure Type Update Type Worst Current Threshold Raw Assessment Value Overall assessment: Self tests: SummaryViewStep Summary TreeLogBase Sev. @title:column Severity of a log entry / log level. Text must be very short. Severity Time @title:column a time stamp of a log entry Message @title:column the text message of a log entry UsersPage Your username contains an invalid character '%1' Your username contains invalid characters! Your hostname contains an invalid character '%1' Your hostname contains invalid characters! Your passwords do not match! UsersViewStep Users calamares-3.1.12/lang/calamares_hu.ts000066400000000000000000003702741322271446000174610ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. A rendszer <strong>indító környezete.<strong> <br><br>Régebbi x86 alapú rendszerek csak <strong>BIOS</strong><br>-t támogatják. A modern rendszerek gyakran <strong>EFI</strong>-t használnak, de lehet, hogy BIOS-ként látható ha kompatibilitási módban fut az indító környezet. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. A rendszer <strong>EFI</strong> indító környezettel lett indítva.<br><br>Annak érdekében, hogy az EFI környezetből indíthassunk a telepítőnek telepítenie kell a rendszerbetöltő alkalmazást pl. <strong>GRUB</strong> vagy <strong>systemd-boot</strong> az <strong>EFI Rendszer Partíción.</strong> Ez automatikus kivéve ha kézi partícionálást választottál ahol neked kell kiválasztani vagy létrehozni. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. A rendszer <strong>BIOS</strong> környezetből lett indítva. <br><br>Azért, hogy el lehessen indítani a rendszert egy BIOS környezetből a telepítőnek telepítenie kell egy indító környezetet mint pl. <strong>GRUB</strong>. Ez telepíthető a partíció elejére vagy a <strong>Master Boot Record</strong>-ba. javasolt a partíciós tábla elejére (javasolt). Ez automatikus kivéve ha te kézi partícionálást választottál ahol neked kell telepíteni. BootLoaderModel Master Boot Record of %1 Mester Boot Record - %1 Boot Partition Indító partíció System Partition Rendszer Partíció Do not install a boot loader Ne telepítsen rendszerbetöltőt %1 (%2) %1 (%2) Calamares::DebugWindow Form Adatlap GlobalStorage Tárolás JobQueue Feladatok Modules Modulok Type: Típus: none semelyik Interface: Interfész: Tools Eszközök Debug information Hibakeresési információk Calamares::ExecutionViewStep Install Telepít Calamares::JobThread Done Kész Calamares::ProcessJob Run command %1 %2 Parancs futtatása %1 %2 Running command %1 %2 Parancs futtatása %1 %2 External command crashed Külső parancs összeomlott Command %1 crashed. Output: %2 Parancs %1 összeomlott. Kimenet: %2 External command failed to start Külső parancsot nem sikerült elindítani Command %1 failed to start. A parancs %1 -et nem sikerült elindítani. Internal error when starting command Belső hiba parancs végrehajtásakor Bad parameters for process job call. Hibás paraméterek a folyamat hívásához. External command failed to finish Külső parancs nem fejeződött be Command %1 failed to finish in %2s. Output: %3 Parancs %1 nem sikerült befejezni a %2 -ben. Kimenet: %3 External command finished with errors Külső parancs hibával fejeződött be Command %1 finished with exit code %2. Output: %3 Parancs %1 befejeződött a kilépési kóddal %2. Kimenet: %3 Calamares::PythonJob Running %1 operation. Futó %1 műveletek. Bad working directory path Rossz munkakönyvtár útvonal Working directory %1 for python job %2 is not readable. Munkakönyvtár %1 a python folyamathoz %2 nem olvasható. Bad main script file Rossz alap script fájl Main script file %1 for python job %2 is not readable. Alap script fájl %1 a python folyamathoz %2 nem olvasható. Boost.Python error in job "%1". Boost. Python hiba ebben a folyamatban "%1". Calamares::ViewManager &Back &Vissza &Next &Következő &Cancel &Mégse Cancel installation without changing the system. Kilépés a telepítőből a rendszer megváltoztatása nélkül. Cancel installation? Abbahagyod a telepítést? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Biztos abba szeretnéd hagyni a telepítést? Minden változtatás elveszik, ha kilépsz a telepítőből. &Yes &Igen &No @Nem &Close &Bezár Continue with setup? Folytatod a telepítéssel? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> A %1 telepítő változtatásokat fog elvégezni, hogy telepítse a következőt: %2.<br/><strong>A változtatások visszavonhatatlanok lesznek.</strong> &Install now &Telepítés most Go &back Menj &vissza &Done &Befejez The installation is complete. Close the installer. A telepítés befejeződött, kattints a bezárásra. Error Hiba Installation Failed Telepítés nem sikerült CalamaresPython::Helper Unknown exception type Ismeretlen kivétel típus unparseable Python error nem egyeztethető Python hiba unparseable Python traceback nem egyeztethető Python visszakövetés Unfetchable Python error. Összehasonlíthatatlan Python hiba. CalamaresWindow %1 Installer %1 Telepítő Show debug information Hibakeresési információk mutatása CheckFileSystemJob Checking file system on partition %1. Fájlrendszer ellenőrzése a partíción %1. The file system check on partition %1 failed. A fájlrendszer ellenőrzés a(z) %1 partíción sikertelen. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Ez a számítógép nem felel meg a minimum követelményeknek a %1 telepítéséhez.<br/> Telepítés nem folytatható. <a href="#details">Részletek...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Ez a számítógép nem felel meg a minimum követelményeknek a %1 telepítéséhez.<br/>Telepítés folytatható de néhány tulajdonság valószínűleg nem lesz elérhető. This program will ask you some questions and set up %2 on your computer. Ez a program fel fog tenni néhány kérdést és %2 -t telepíti a számítógépre. For best results, please ensure that this computer: A legjobb eredményért győződjünk meg, hogy ez a számítógép: System requirements Rendszer követelmények ChoicePage Form Adatlap After: Utána: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Manuális partícionálás</strong><br/>Létrehozhat vagy átméretezhet partíciókat. Boot loader location: Rendszerbetöltő helye: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 lesz zsugorítva %2MB méretűre és egy új %3MB méretű partíció lesz létrehozva itt %4 Select storage de&vice: Válassz tároló eszközt: Current: Aktuális: Reuse %1 as home partition for %2. %1 partíció használata mint home partíció a %2 -n <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Válaszd ki a partíciót amit zsugorítani akarsz és egérrel méretezd át.</strong> <strong>Select a partition to install on</strong> <strong>Válaszd ki a telepítésre szánt partíciót </strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Nem található EFI partíció a rendszeren. Menj vissza a manuális partícionáláshoz és állíts be %1. The EFI system partition at %1 will be used for starting %2. A %1 EFI rendszer partíció lesz használva %2 indításához. EFI system partition: EFI rendszerpartíció: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Úgy tűnik ezen a tárolóeszközön nincs operációs rendszer. Mit szeretnél csinálni?<br/>Lehetőséged lesz átnézni és megerősíteni a választásod mielőtt bármilyen változtatás történik a tárolóeszközön. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Lemez törlése</strong><br/>Ez <font color="red">törölni</font> fogja a lemezen levő összes adatot. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ezen a tárolóeszközön %1 található. Mit szeretnél tenni?<br/>Lehetőséged lesz átnézni és megerősíteni a választásod mielőtt bármilyen változtatás történik a tárolóeszközön. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Meglévő mellé telepíteni</strong><br/>A telepítő zsugorítani fogja a partíciót, hogy elférjen a %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>A partíció lecserélése</strong> a következővel: %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Ez a tárolóeszköz már tartalmaz egy operációs rendszert. Mit szeretnél tenni?<br/>Lehetőséged lesz átnézni és megerősíteni a választásod mielőtt bármilyen változtatás történik a tárolóeszközön. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. A tárolóeszközön több operációs rendszer található. Mit szeretnél tenni?<br/>Lehetőséged lesz átnézni és megerősíteni a választásod mielőtt bármilyen változtatás történik a tárolóeszközön. ClearMountsJob Clear mounts for partitioning operations on %1 %1 csatolás törlése partícionáláshoz Clearing mounts for partitioning operations on %1. %1 csatolás törlése partícionáláshoz Cleared all mounts for %1 %1 minden csatolása törölve ClearTempMountsJob Clear all temporary mounts. Minden ideiglenes csatolás törlése Clearing all temporary mounts. Minden ideiglenes csatolás törlése Cannot get list of temporary mounts. Nem lehet lekérni az ideiglenes csatolási listát Cleared all temporary mounts. Minden ideiglenes csatolás törölve CreatePartitionDialog Create a Partition Partíció Létrehozása MiB MiB Partition &Type: Partíció &típus: &Primary &Elsődleges E&xtended K&iterjesztett Fi&le System: Fájlrendszer: Flags: Zászlók: &Mount Point: &Csatolási pont: Si&ze: Mé&ret: En&crypt Titkosítás Logical Logikai Primary Elsődleges GPT GPT Mountpoint already in use. Please select another one. A csatolási pont már használatban van. Kérem, válassz másikat. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Új %2MB- os partíció létrehozása a %4 (%3) eszközön %1 fájlrendszerrel. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Új <strong>%2MB</strong>- os partíció létrehozása a </strong>%4</strong> (%3) eszközön <strong>%1</strong> fájlrendszerrel. Creating new %1 partition on %2. Új %1 partíció létrehozása a következőn: %2. The installer failed to create partition on disk '%1'. A telepítő nem tudta létrehozni a partíciót ezen a lemezen '%1'. Could not open device '%1'. Nem sikerült az eszköz megnyitása '%1'. Could not open partition table. Nem sikerült a partíciós tábla megnyitása. The installer failed to create file system on partition %1. A telepítő nem tudta létrehozni a fájlrendszert a %1 partíción. The installer failed to update partition table on disk '%1'. A telepítő nem tudta frissíteni a partíciós táblát a %1 lemezen. CreatePartitionTableDialog Create Partition Table Partíciós tábla létrehozása Creating a new partition table will delete all existing data on the disk. Új partíciós tábla létrehozásával az összes létező adat törlődni fog a lemezen. What kind of partition table do you want to create? Milyen típusú partíciós táblát szeretnél létrehozni? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partíciós Tábla (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Új %1 partíciós tábla létrehozása a következőn: %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Új <strong>%1 </strong> partíciós tábla létrehozása a következőn: <strong>%2</strong> (%3). Creating new %1 partition table on %2. Új %1 partíciós tábla létrehozása a következőn: %2. The installer failed to create a partition table on %1. A telepítőnek nem sikerült létrehoznia a partíciós táblát a lemezen %1. Could not open device %1. Nem sikerült megnyitni a %1 eszközt. CreateUserJob Create user %1 %1 nevű felhasználó létrehozása Create user <strong>%1</strong>. <strong>%1</strong> nevű felhasználó létrehozása. Creating user %1. %1 nevű felhasználó létrehozása Sudoers dir is not writable. Sudoers mappa nem írható. Cannot create sudoers file for writing. Nem lehet sudoers fájlt létrehozni írásra. Cannot chmod sudoers file. Nem lehet a sudoers fájlt "chmod" -olni. Cannot open groups file for reading. Nem lehet a groups fájlt megnyitni olvasásra. Cannot create user %1. Nem lehet a %1 felhasználót létrehozni. useradd terminated with error code %1. useradd megszakítva %1 hibakóddal. Cannot add user %1 to groups: %2. Nem lehet a %1 felhasználót létrehozni a %2 csoportban. usermod terminated with error code %1. usermod megszakítva %1 hibakóddal. Cannot set home directory ownership for user %1. Nem lehet a home könyvtár tulajdonos jogosultságát beállítani %1 felhasználónak. chown terminated with error code %1. chown megszakítva %1 hibakóddal. DeletePartitionJob Delete partition %1. %1 partíció törlése Delete partition <strong>%1</strong>. A következő partíció törlése: <strong>%1</strong>. Deleting partition %1. %1 partíció törlése The installer failed to delete partition %1. A telepítő nem tudta törölni a %1 partíciót. Partition (%1) and device (%2) do not match. A (%1) nevű partíció és a (%2) nevű eszköz között nincs egyezés. Could not open device %1. Nem sikerült megnyitni a %1 eszközt. Could not open partition table. Nem sikerült a partíciós tábla megnyitása. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. A <strong>partíciós tábla</strong> típusa a kiválasztott tárolóeszközön.<br><br>Az egyetlen lehetőség a partíciós tábla változtatására ha töröljük és újra létrehozzuk a partíciós táblát, ami megsemmisít minden adatot a tárolóeszközön.<br>A telepítő megtartja az aktuális partíciós táblát ha csak másképp nem döntesz.<br>Ha nem vagy benne biztos a legtöbb modern rendszernél GPT az elterjedt. This device has a <strong>%1</strong> partition table. Az ezköz tartalmaz egy <strong>%1</strong> partíciós táblát. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. A választott tárolóeszköz egy <strong>loop</strong> eszköz.<br><br>Ez nem egy partíciós tábla, ez egy pszeudo eszköz ami lehetővé teszi a hozzáférést egy fájlhoz, úgy mint egy blokk eszköz. Ez gyakran csak egy fájlrendszert tartalmaz. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. A telepítő <strong>nem talált partíciós táblát</strong> a választott tárolóeszközön.<br><br> Az eszköz nem tartalmaz partíciós táblát vagy sérült vagy ismeretlen típusú.<br> A telepítő létre tud hozni újat automatikusan vagy te magad kézi partícionálással. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Ez az ajánlott partíciós tábla típus modern rendszerekhez ami <strong>EFI</strong> indító környezettel indul. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Ez a partíciós tábla típus régebbi rendszerekhez javasolt amik <strong>BIOS</strong> indító környezetből indulnak. Legtöbb esetben azonban GPT használata javasolt. <br><strong>Figyelem:</strong> az MSDOS partíciós tábla egy régi sztenderd lényeges korlátozásokkal. <br>Maximum 4 <em>elsődleges</em> partíció hozható létre és abból a 4-ből egy lehet <em>kiterjesztett</em> partíció. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Dracut LUKS konfiguráció mentése ide %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Dracut LUKS konfiguráció mentésének kihagyása: "/" partíció nincs titkosítva. Failed to open %1 Hiba történt %1 megnyitásakor DummyCppJob Dummy C++ Job Teszt C++ job EditExistingPartitionDialog Edit Existing Partition Meglévő partíció szerkesztése Content: Tartalom: &Keep &megtart Format Formázás Warning: Formatting the partition will erase all existing data. Figyelem: A partíció formázása az összes meglévő adatot törölni fogja. &Mount Point: &Csatolási pont: Si&ze: &méret: MiB MiB Fi&le System: &fájlrendszer Flags: Zászlók: Mountpoint already in use. Please select another one. A csatolási pont már használatban van. Kérem, válassz másikat. EncryptWidget Form Adatlap En&crypt system Rendszer titkosítása Passphrase Jelszó Confirm passphrase Jelszó megerősítés Please enter the same passphrase in both boxes. Írd be ugyanazt a jelmondatot mindkét dobozban. FillGlobalStorageJob Set partition information Partíció információk beállítása Install %1 on <strong>new</strong> %2 system partition. %1 telepítése az <strong>új</strong> %2 partícióra. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. <strong>Új</strong> %2 partíció beállítása <strong>%1</strong> csatolási ponttal. Install %2 on %3 system partition <strong>%1</strong>. %2 telepítése %3 <strong>%1</strong> rendszer partícióra. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. %3 partíció beállítása <strong>%1</strong> <strong>%2</strong> csatolási ponttal. Install boot loader on <strong>%1</strong>. Rendszerbetöltő telepítése ide <strong>%1</strong>. Setting up mount points. Csatlakozási pontok létrehozása FinishedPage Form Adatlap &Restart now $Újraindítás most <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Sikeres művelet.</h1><br/>%1 telepítve lett a számítógépére.<br/>Újraindítás után folytathatod az %2 éles környezetben. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>A telepítés hibába ütközött.</h1><br/>%1 nem lett telepítve a számítógépre.<br/>A hibaüzenet: %2. FinishedViewStep Finish Befejezés Installation Complete A telepítés befejeződött. The installation of %1 is complete. A %1 telepítése elkészült. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Partíció formázása %1 (fájlrendszer: %2, méret: %3 MB) a %4 -on. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. <strong>%3MB</strong> partíció formázása <strong>%1</strong> a következő fájlrendszerrel <strong>%2</strong>. Formatting partition %1 with file system %2. %1 partíció formázása %2 fájlrendszerrel. The installer failed to format partition %1 on disk '%2'. A telepítő nem tudta formázni a %1 partíciót a %2 lemezen. Could not open device '%1'. Nem sikerült megnyitni a %1 eszközt. Could not open partition table. Nem sikerült a partíciós tábla megnyitása. The installer failed to create file system on partition %1. A telepítő nem tudta létrehozni a fájlrendszert a %1 partíción. The installer failed to update partition table on disk '%1'. A telepítő nem tudta frissíteni a partíciós táblát a %1 lemezen. InteractiveTerminalPage Konsole not installed Konsole nincs telepítve Please install the kde konsole and try again! Telepítsd a KDE konzolt és próbáld újra! Executing script: &nbsp;<code>%1</code> Script végrehajása: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Szkript KeyboardPage Set keyboard model to %1.<br/> Billentyűzet típus beállítása %1.<br/> Set keyboard layout to %1/%2. Billentyűzet kiosztás beállítása %1/%2. KeyboardViewStep Keyboard Billentyűzet LCLocaleDialog System locale setting Területi beállítások The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. A nyelvi beállítás kihat a nyelvi és karakter beállításokra a parancssori elemeknél.<br/>A jelenlegi beállítás <strong>%1</strong>. &Cancel &OK LicensePage Form Adatlap I accept the terms and conditions above. Elfogadom a fentebbi felhasználási feltételeket. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licensz</h1>A telepítő szabadalmaztatott szoftvert fog telepíteni. Információ a licenszben. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Kérlek, olvasd el a fenti végfelhasználói licenszfeltételeket (EULAs)<br/>Ha nem értesz egyet a feltételekkel, akkor a telepítés nem folytatódik. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licensz</h1>A telepítő szabadalmaztatott szoftvert fog telepíteni. Információ a licenszben. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Kérlek, olvasd el a fenti végfelhasználói licenszfeltételeket (EULAs)<br/>Ha nem értesz egyet a feltételekkel, akkor a szabadalmaztatott program telepítése nem folytatódik és nyílt forrású program lesz telepítve helyette. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/> %2 -ból/ -ből <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafikus driver</strong><br/><font color="Grey">%2 -ból/ -ből</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 böngésző plugin</strong><br/><font color="Grey">%2 -ból/ -ből</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 kodek</strong><br/><font color="Grey">%2 -ból/ -ből</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 csomag</strong><br/><font color="Grey" >%2 -ból/ -ből</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">%2 -ból/ -ből</font> <a href="%1">view license agreement</a> <a href="%1">a licensz elolvasása</a> LicenseViewStep License Licensz LocalePage The system language will be set to %1. A rendszer területi beállítása %1. The numbers and dates locale will be set to %1. A számok és dátumok területi beállítása %1. Region: Régió: Zone: Zóna: &Change... &Változtat... Set timezone to %1/%2.<br/> Időzóna beállítása %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Hely adatok betöltése... Location Hely MoveFileSystemJob Move file system of partition %1. Fájlrendszer mozgatása a %1 partíción. Could not open file system on partition %1 for moving. Nem lehet megnyitni a fájlrendszert a %1 partíción a mozgatáshoz. Could not create target for moving file system on partition %1. Nem sikerült létrehozni a célt a fájlrendszer mozgatáshoz a %1 partíción. Moving of partition %1 failed, changes have been rolled back. %1 partíció mozgatása nem sikerült, a módosítások vissza lettek vonva. Moving of partition %1 failed. Roll back of the changes have failed. %1 partíció mozgatása nem sikerült. A módosítások visszavonása nem sikerült. Updating boot sector after the moving of partition %1 failed. Boot szektor frissítése a %1 partíció mozgatása után nem sikerült. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. A logikai szektor méretek nem egyeznek a forrásban és a célban a másoláshoz. Ez jelenleg nem támogatott. Source and target for copying do not overlap: Rollback is not required. Forrás és a cél nem fedik egymást a másoláshoz: Visszavonás nem szükséges. Could not open device %1 to rollback copying. Nem sikerült megnyitni a %1 eszközt a másolás visszavonásához. NetInstallPage Name Név Description Leírás Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Hálózati telepítés. (Kikapcsolva: A csomagokat nem lehet letölteni, ellenőrizd a hálózati kapcsolatot) NetInstallViewStep Package selection Csomag választása Page_Keyboard Form Adatlap Keyboard Model: Billentyűzet modell: Type here to test your keyboard Gépelj itt a billentyűzet teszteléséhez Page_UserSetup Form Adatlap What is your name? Mi a neved? What name do you want to use to log in? Milyen felhasználónévvel szeretnél bejelentkezni? font-weight: normal betű-súly: normál <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ha több mint egy személy használja a számítógépet akkor létrehozhatsz több felhasználói fiókot a telepítés után.</small> Choose a password to keep your account safe. Adj meg jelszót a felhasználói fiókod védelmére. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Írd be a jelszót kétszer így ellenőrizve lesznek a gépelési hibák. A jó jelszó tartalmazzon kis és nagy betűket, számokat és legalább 8 karakter hosszúságú. Ajánlott megváltoztatni rendszeres időközönként.</small> What is the name of this computer? Mi legyen a számítógép neve? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ez a név lesz használva ha a számítógép látható a hálózaton.</small> Log in automatically without asking for the password. Jelszó megkérdezése nélküli automatikus bejelentkezés. Use the same password for the administrator account. Ugyanaz a jelszó használata az adminisztrátor felhasználóhoz. Choose a password for the administrator account. Adj meg jelszót az adminisztrátor felhasználói fiókhoz. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Írd be a jelszót kétszer így ellenőrizve lesznek a gépelési hibák.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI rendszer Swap Swap New partition for %1 Új partíció %1 -ra/ -re New partition Új partíció %1 %2 %1 %2 PartitionModel Free Space Szabad terület New partition Új partíció Name Név File System Fájlrendszer Mount Point Csatolási pont Size Méret PartitionPage Form Adatlap Storage de&vice: Eszköz: &Revert All Changes &Módosítások visszavonása New Partition &Table Új partíciós &tábla &Create &Létrehoz &Edit &Szerkeszt &Delete &Töröl Install boot &loader on: &Rendszerbetöltő telepítése ide: Are you sure you want to create a new partition table on %1? Biztos vagy benne, hogy létrehozol egy új partíciós táblát itt %1 ? PartitionViewStep Gathering system information... Rendszerinformációk gyűjtése... Partitions Partíciók Install %1 <strong>alongside</strong> another operating system. %1 telepítése más operációs rendszer <strong>mellé</strong> . <strong>Erase</strong> disk and install %1. <strong>Lemez törlés</strong>és %1 telepítés. <strong>Replace</strong> a partition with %1. <strong>A partíció lecserélése</strong> a következővel: %1. <strong>Manual</strong> partitioning. <strong>Kézi</strong> partícionálás. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). %1 telepítése más operációs rendszer <strong>mellé</strong> a <strong>%2</strong> (%3) lemezen. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>%2 lemez törlése</strong> (%3) és %1 telepítés. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>A partíció lecserélése</strong> a <strong>%2</strong> lemezen(%3) a következővel: %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Kézi</strong> telepítés a <strong>%1</strong> (%2) lemezen. Disk <strong>%1</strong> (%2) Lemez <strong>%1</strong> (%2) Current: Aktuális: After: Utána: No EFI system partition configured Nincs EFI rendszer partíció beállítva An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI rendszerpartíciónak léteznie kell %1 indításához.<br/><br/> Az EFI rendszer beállításához lépj vissza és hozz létre FAT32 fájlrendszert <strong>esp</strong> zászlóval és <strong>%2</strong> csatolási ponttal beállítva.<br/><br/> Folytathatod a telepítést EFI rendszerpartíció létrehozása nélkül is, de lehet, hogy a rendszer nem indul majd. EFI system partition flag not set EFI partíciós zászló nincs beállítva An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. EFI rendszerpartíciónak léteznie kell %1 indításához.<br/><br/> A csatolási pont <strong>%2</strong> beállítása sikerült a partíción de a zászló nincs beállítva. A beálíltásához lépj vissza szerkeszteni a partíciót..<br/><br/> Folytathatod a telepítést zászló beállítása nélkül is, de lehet, hogy a rendszer nem indul el majd. Boot partition not encrypted Indító partíció nincs titkosítva A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Egy külön indító partíció lett beállítva egy titkosított root partícióval, de az indító partíció nincs titkosítva.br/><br/>Biztonsági aggályok merülnek fel ilyen beállítás mellet, mert fontos fájlok nem titkosított partíción vannak tárolva. <br/>Ha szeretnéd, folytathatod így, de a fájlrendszer zárolása meg fog történni az indítás után. <br/> Az indító partíció titkosításához lépj vissza és az újra létrehozáskor válaszd a <strong>Titkosít</strong> opciót. QObject Default Keyboard Model Alapértelmezett billentyűzet Default Alapértelmezett unknown ismeretlen extended kiterjesztett unformatted formázatlan swap Swap Unpartitioned space or unknown partition table Nem particionált, vagy ismeretlen partíció ReplaceWidget Form Adatlap Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Válaszd ki az telepítés helyét %1.<br/><font color="red">Figyelmeztetés: </font>minden fájl törölve lesz a kiválasztott partíción. The selected item does not appear to be a valid partition. A kiválasztott elem nem tűnik érvényes partíciónak. %1 cannot be installed on empty space. Please select an existing partition. %1 nem telepíthető, kérlek válassz egy létező partíciót. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 nem telepíthető a kiterjesztett partícióra. Kérlek, válassz egy létező elsődleges vagy logikai partíciót. %1 cannot be installed on this partition. Nem lehet telepíteni a következőt %1 erre a partícióra. Data partition (%1) Adat partíció (%1) Unknown system partition (%1) Ismeretlen rendszer partíció (%1) %1 system partition (%2) %1 rendszer partíció (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>A partíció %1 túl kicsi a következőhöz %2. Kérlek, válassz egy legalább %3 GB- os partíciót. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Az EFI rendszerpartíció nem található a rendszerben. Kérlek, lépj vissza és állítsd be manuális partícionálással %1- et. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 installálva lesz a következőre: %2.<br/><font color="red">Figyelmeztetés: </font>a partíción %2 minden törölve lesz. The EFI system partition at %1 will be used for starting %2. A %2 indításához az EFI rendszer partíciót használja a következőn: %1 EFI system partition: EFI rendszer partíció: RequirementsChecker Gathering system information... Rendszerinformációk gyűjtése... has at least %1 GB available drive space Legalább %1 GB lemezterület elérhető There is not enough drive space. At least %1 GB is required. Nincs elég lemezterület. Legalább %1GB szükséges. has at least %1 GB working memory Legalább %1 GB elérhető memória The system does not have enough working memory. At least %1 GB is required. A rendszernek nincs elég memóriája. Legalább %1 GB szükséges. is plugged in to a power source csatlakoztatva van külső áramforráshoz The system is not plugged in to a power source. A rendszer nincs csatlakoztatva külső áramforráshoz is connected to the Internet csatlakozik az internethez The system is not connected to the Internet. A rendszer nem csatlakozik az internethez. The installer is not running with administrator rights. A telepítő nem adminisztrátori jogokkal fut. The screen is too small to display the installer. A képernyő túl kicsi a telepítőnek. ResizeFileSystemJob Resize file system on partition %1. Fájlrendszer átméretezése a %1 partíción. Parted failed to resize filesystem. Parted nem tudta átméretezni a fájlrendszert. Failed to resize filesystem. A fájlrendszer átméretezése nem sikerült. ResizePartitionJob Resize partition %1. A %1 partíció átméretezése. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. <strong>%2MB</strong> partíció átméretezése <strong>%1</strong a következőre:<strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. %2MB partíció átméretezése %1 -ról/ -ről %3MB- ra/ -re. The installer failed to resize partition %1 on disk '%2'. A telepítő nem tudta átméretezni a(z) %1 partíciót a(z) '%2' lemezen. Could not open device '%1'. Nem sikerült megnyitni a %1 eszközt. ScanningDialog Scanning storage devices... Eszközök keresése... Partitioning Partícionálás SetHostNameJob Set hostname %1 Hálózati név beállítása a %1 -en Set hostname <strong>%1</strong>. Hálózati név beállítása a következőhöz: <strong>%1</strong>. Setting hostname %1. Hálózati név beállítása a %1 -hez Internal Error Belső hiba Cannot write hostname to target system Nem lehet a hálózati nevet írni a célrendszeren SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Billentyűzet beállítása %1, elrendezés %2-%3 Failed to write keyboard configuration for the virtual console. Hiba történt a billentyűzet virtuális konzolba való beállításakor Failed to write to %1 Hiba történt %1 -re történő íráskor Failed to write keyboard configuration for X11. Hiba történt a billentyűzet X11- hez való beállításakor Failed to write keyboard configuration to existing /etc/default directory. Hiba történt a billentyűzet konfiguráció alapértelmezett /etc/default mappába valló elmentésekor. SetPartFlagsJob Set flags on partition %1. Zászlók beállítása a partíción %1. Set flags on %1MB %2 partition. Jelzők beállítása a %1MB %2 partíción. Set flags on new partition. Jelzők beállítása az új partíción. Clear flags on partition <strong>%1</strong>. Zászlók törlése a partíción: <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Jelzők törlése a %1MB <strong>%2</strong> partíción. Clear flags on new partition. Jelzők törlése az új partíción. Flag partition <strong>%1</strong> as <strong>%2</strong>. Zászlók beállítása <strong>%1</strong> ,mint <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Jelzők beállítása %1MB <strong>%2</strong> a partíción mint <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Jelző beállítása mint <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Zászlók törlése a partíción: <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Jelzők törlése a %1MB <strong>%2</strong> partíción. Clearing flags on new partition. jelzők törlése az új partíción. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Zászlók beállítása <strong>%2</strong> a <strong>%1</strong> partíción. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Jelzők beállítása <strong>%3</strong> a %1MB <strong>%2</strong> partíción. Setting flags <strong>%1</strong> on new partition. Jelzők beállítása az új <strong>%1</strong> partíción. The installer failed to set flags on partition %1. A telepítőnek nem sikerült a zászlók beállítása a partíción %1. Could not open device '%1'. Nem sikerült az eszköz megnyitása '%1'. Could not open partition table on device '%1'. Nem sikerült a partíció megnyitása a következő eszközön '%1'. Could not find partition '%1'. A '%1' partcíió nem található. SetPartGeometryJob Update geometry of partition %1. %1 partíció geometriájának frissítése. Failed to change the geometry of the partition. Nem sikerült megváltoztatni a partíció geometriáját. SetPasswordJob Set password for user %1 %1 felhasználó jelszó beállítása Setting password for user %1. %1 felhasználói jelszó beállítása Bad destination system path. Rossz célrendszer elérési út rootMountPoint is %1 rootMountPoint is %1 Cannot disable root account. A root account- ot nem lehet inaktiválni. passwd terminated with error code %1. passwd megszakítva %1 hibakóddal. Cannot set password for user %1. Nem lehet a %1 felhasználó jelszavát beállítani. usermod terminated with error code %1. usermod megszakítva %1 hibakóddal. SetTimezoneJob Set timezone to %1/%2 Időzóna beállítása %1/%2 Cannot access selected timezone path. A választott időzóna útvonal nem hozzáférhető. Bad path: %1 Rossz elérési út: %1 Cannot set timezone. Nem lehet az időzónát beállítani. Link creation failed, target: %1; link name: %2 Link létrehozása nem sikerült: %1, link év: %2 Cannot set timezone, Nem lehet beállítani az időzónát . Cannot open /etc/timezone for writing Nem lehet megnyitni írásra: /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. Ez áttekintése annak, hogy mi fog történni, ha megkezded a telepítést. SummaryViewStep Summary Összefoglalás UsersPage Your username is too long. A felhasználónév túl hosszú. Your username contains invalid characters. Only lowercase letters and numbers are allowed. A felhasználónév érvénytelen karaktereket tartalmaz. Csak kis kezdőbetűk és számok érvényesek. Your hostname is too short. A hálózati név túl rövid. Your hostname is too long. A hálózati név túl hosszú. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. A hálózati név érvénytelen karaktereket tartalmaz. Csak betűk, számok és kötőjel érvényes. Your passwords do not match! A két jelszó nem egyezik! UsersViewStep Users Felhasználók WelcomePage Form Adatlap &Language: &Nyelv: &Release notes &Kiadási megjegyzések &Known issues &Ismert hibák &Support &Támogatás &About &Névjegy <h1>Welcome to the %1 installer.</h1> <h1>Üdvözlet a %1 telepítőben.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Üdvözlet a Calamares %1 telepítőjében.</h1> About %1 installer A %1 telepítőről <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Minden jog fenntartva 2014-2017 Teo Mrnjavac <teo@kde.org>;<br/>Minden jog fenntartva 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Köszönet: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Philip Müller, Pier Luigi Fiorini and Rohan Garg és a <a href="https://www.transifex.com/calamares/calamares/" Calamares Fordító Csapat/a>. <br/><a href="http://calamares.io/">Calamares</a> fejlesztés támogatói:<br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 támogatás WelcomeViewStep Welcome Üdvözlet calamares-3.1.12/lang/calamares_id.ts000066400000000000000000003647021322271446000174400ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Lingkungan boot</strong> pada sistem ini.<br><br>Sistem x86 kuno hanya mendukung <strong>BIOS</strong>.<br>Sistem moderen biasanya menggunakan <strong>EFI</strong>, tapi mungkin juga tampak sebagai BIOS jika dimulai dalam mode kompatibilitas. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Sistem ini telah dimulai dengan lingkungan boot <strong>EFI</strong>.<br><br>Untuk mengkonfigurasi startup dari lingkungan EFI, pemasang ini seharusnya memaparkan sebuah aplikasi boot loader, seperti <strong>GRUB</strong> atau <strong>systemd-boot</strong> pada sebuah <strong>EFI System Partition</strong>. Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus memilihnya atau menciptakannya pada milikmu. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Sistem ini dimulai dengan sebuah lingkungan boot <strong>BIOS</strong>.<br><br>Untuk mengkonfigurasi startup dari sebuah lingkungan BIOS, pemasang ini seharusnya memasang sebuah boot loader, seperti <strong>GRUB</strong>, baik di awal partisi atau pada <strong>Master Boot Record</strong> di dekat awalan tabel partisi (yang disukai). Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus menyetelnya pada milikmu. BootLoaderModel Master Boot Record of %1 Master Boot Record %1 Boot Partition Partisi Boot System Partition Partisi Sistem Do not install a boot loader Jangan pasang boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form Isian GlobalStorage PenyimpananGlobal JobQueue AntrianTugas Modules Modul Type: Tipe: none tidak ada Interface: Antarmuka: Tools Alat Debug information Informasi debug Calamares::ExecutionViewStep Install Pasang Calamares::JobThread Done Selesai Calamares::ProcessJob Run command %1 %2 Jalankan perintah %1 %2 Running command %1 %2 Menjalankan perintah %1 %2 External command crashed Perintah eksternal mogok Command %1 crashed. Output: %2 Perintah %1 mogok. Keluaran: %2 External command failed to start Perintah eksternal gagal dijalankan Command %1 failed to start. Perintah %1 gagal dijalankan. Internal error when starting command Terjadi kesalahan internal saat menjalankan perintah Bad parameters for process job call. Parameter buruk untuk memproses panggilan tugas, External command failed to finish Perintah eksternal gagal diselesaikan Command %1 failed to finish in %2s. Output: %3 Perintah %1 gagal diselesaikan dalam %2s. Keluaran: %3 External command finished with errors Perintah eksternal diselesaikan dengan kesalahan Command %1 finished with exit code %2. Output: %3 Perintah %1 diselesaikan dengan kode keluar %2. Keluaran: %3 Calamares::PythonJob Running %1 operation. Menjalankan %1 operasi. Bad working directory path Jalur lokasi direktori tidak berjalan baik Working directory %1 for python job %2 is not readable. Direktori kerja %1 untuk penugasan python %2 tidak dapat dibaca. Bad main script file Berkas skrip utama buruk Main script file %1 for python job %2 is not readable. Berkas skrip utama %1 untuk penugasan python %2 tidak dapat dibaca. Boost.Python error in job "%1". Boost.Python mogok dalam penugasan "%1". Calamares::ViewManager &Back &Kembali &Next &Berikutnya &Cancel &Batal Cancel installation without changing the system. Batal pemasangan tanpa mengubah sistem yang ada. Cancel installation? Batalkan pemasangan? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Apakah Anda benar-benar ingin membatalkan proses pemasangan ini? Pemasangan akan ditutup dan semua perubahan akan hilang. &Yes &Ya &No &Tidak &Close &Tutup Continue with setup? Lanjutkan dengan setelan ini? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Pemasang %1 akan membuat perubahan ke disk Anda untuk memasang %2.<br/><strong>Anda tidak dapat membatalkan perubahan tersebut.</strong> &Install now &Pasang sekarang Go &back &Kembali &Done &Kelar The installation is complete. Close the installer. Pemasangan sudah lengkap. Tutup pemasang. Error Kesalahan Installation Failed Pemasangan Gagal CalamaresPython::Helper Unknown exception type Tipe pengecualian tidak dikenal unparseable Python error tidak dapat mengurai pesan kesalahan Python unparseable Python traceback tidak dapat mengurai penelusuran balik Python Unfetchable Python error. Tidak dapat mengambil pesan kesalahan Python. CalamaresWindow %1 Installer Pemasang %1 Show debug information Tampilkan informasi debug CheckFileSystemJob Checking file system on partition %1. Memeriksa sistem berkas pada partisi %1. The file system check on partition %1 failed. Pemeriksaan sistem berkas pada partisi %1 gagal. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Komputer ini tidak memenuhi syarat minimum untuk memasang %1. Pemasang tidak dapat dilanjutkan. <a href=" This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Komputer ini tidak memenuhi beberapa syarat yang dianjurkan untuk memasang %1. Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. This program will ask you some questions and set up %2 on your computer. Program ini akan mengajukan beberapa pertanyaan dan menyetel %2 pada komputer Anda. For best results, please ensure that this computer: Untuk hasil terbaik, mohon pastikan bahwa komputer ini: System requirements Kebutuhan sistem ChoicePage Form Isian After: Setelah: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Pemartisian manual</strong><br/>Anda bisa membuat atau mengubah ukuran partisi. Boot loader location: Lokasi Boot loader: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 akan disusutkan menjadi %2MB dan partisi baru %3MB akan dibuat untuk %4. Select storage de&vice: Pilih perangkat penyimpanan: Current: Saat ini: Reuse %1 as home partition for %2. Gunakan kembali %1 sebagai partisi home untuk %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Pilih sebuah partisi untuk diiris, kemudian seret bilah di bawah untuk mengubah ukuran</strong> <strong>Select a partition to install on</strong> <strong>Pilih sebuah partisi untuk memasang</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Sebuah partisi sistem EFI tidak ditemukan pada sistem ini. Silakan kembali dan gunakan pemartisian manual untuk mengeset %1. The EFI system partition at %1 will be used for starting %2. Partisi sistem EFI di %1 akan digunakan untuk memulai %2. EFI system partition: Partisi sistem EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Tampaknya media penyimpanan ini tidak mengandung sistem operasi. Apa yang hendak Anda lakukan?<br/>Anda dapat menelaah dan mengkonfirmasi pilihan Anda sebelum dilakukan perubahan pada media penyimpanan. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Hapus disk</strong><br/>Aksi ini akan <font color="red">menghapus</font> semua berkas yang ada pada media penyimpanan terpilih. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Media penyimpanan ini mengandung %1. Apa yang hendak Anda lakukan?<br/>Anda dapat menelaah dan mengkonfirmasi pilihan Anda sebelum dilakukan perubahan pada media penyimpanan. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Pasang berdampingan dengan</strong><br/>Pemasang akan mengiris sebuah partisi untuk memberi ruang bagi %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Ganti sebuah partisi</strong><br/> Ganti partisi dengan %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Media penyimpanan ini telah mengandung sistem operasi. Apa yang hendak Anda lakukan?<br/>Anda dapat menelaah dan mengkonfirmasi pilihan Anda sebelum dilakukan perubahan pada media penyimpanan. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Media penyimpanan ini telah mengandung beberapa sistem operasi. Apa yang hendak Anda lakukan?<br/>Anda dapat menelaah dan mengkonfirmasi pilihan Anda sebelum dilakukan perubahan pada media penyimpanan. ClearMountsJob Clear mounts for partitioning operations on %1 Lepaskan semua kaitan untuk operasi pemartisian pada %1 Clearing mounts for partitioning operations on %1. Melepas semua kaitan untuk operasi pemartisian pada %1 Cleared all mounts for %1 Semua kaitan dilepas untuk %1 ClearTempMountsJob Clear all temporary mounts. Lepaskan semua kaitan sementara. Clearing all temporary mounts. Melepaskan semua kaitan sementara. Cannot get list of temporary mounts. Tidak bisa mendapatkan daftar kaitan sementara. Cleared all temporary mounts. Semua kaitan sementara dilepas. CreatePartitionDialog Create a Partition Buat Partisi MiB MiB Partition &Type: Partisi & Tipe: &Primary &Utama E&xtended E&xtended Fi&le System: Sistem Berkas: Flags: Tanda: &Mount Point: &Titik Kait: Si&ze: Uku&ran: En&crypt Enkripsi Logical Logikal Primary Utama GPT GPT Mountpoint already in use. Please select another one. Titik-kait sudah digunakan. Silakan pilih yang lainnya. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Buat partisi %2MB baru pada %4 (%3) dengan sistem berkas %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Buat <strong>%2MB</strong> partisi baru pada <strong>%4</strong> (%3) dengan sistem berkas <strong>%1</strong>. Creating new %1 partition on %2. Membuat partisi %1 baru di %2. The installer failed to create partition on disk '%1'. Pemasang gagal untuk membuat partisi di disk '%1'. Could not open device '%1'. Tidak dapat membuka piranti '%1'. Could not open partition table. Tidak dapat membuka tabel partisi. The installer failed to create file system on partition %1. Pemasang gagal membuat sistem berkas pada partisi %1. The installer failed to update partition table on disk '%1'. Pemasang gagal memperbarui tabel partisi pada disk %1. CreatePartitionTableDialog Create Partition Table Buat Tabel Partisi Creating a new partition table will delete all existing data on the disk. Membuat tabel partisi baru akan menghapus data pada disk yang ada. What kind of partition table do you want to create? Apa jenis tabel partisi yang ingin Anda buat? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Membuat tabel partisi %1 baru di %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Membuat tabel partisi <strong>%1</strong> baru di <strong>%2</strong> (%3). Creating new %1 partition table on %2. Membuat tabel partisi %1 baru di %2. The installer failed to create a partition table on %1. Pemasang gagal membuat tabel partisi pada %1. Could not open device %1. Tidak dapat membuka piranti %1. CreateUserJob Create user %1 Buat pengguna %1 Create user <strong>%1</strong>. Buat pengguna <strong>%1</strong>. Creating user %1. Membuat pengguna %1. Sudoers dir is not writable. Direktori sudoers tidak dapat ditulis. Cannot create sudoers file for writing. Tidak dapat membuat berkas sudoers untuk ditulis. Cannot chmod sudoers file. Tidak dapat chmod berkas sudoers. Cannot open groups file for reading. Tidak dapat membuka berkas groups untuk dibaca. Cannot create user %1. Tidak dapat membuat pengguna %1. useradd terminated with error code %1. useradd dihentikan dengan kode kesalahan %1. Cannot add user %1 to groups: %2. Tak bisa menambahkan pengguna %1 ke kelompok: %2. usermod terminated with error code %1. usermod terhenti dengan kode galat %1. Cannot set home directory ownership for user %1. Tidak dapat menyetel kepemilikan direktori home untuk pengguna %1. chown terminated with error code %1. chown dihentikan dengan kode kesalahan %1. DeletePartitionJob Delete partition %1. Hapus partisi %1. Delete partition <strong>%1</strong>. Hapus partisi <strong>%1</strong> Deleting partition %1. Menghapus partisi %1. The installer failed to delete partition %1. Pemasang gagal untuk menghapus partisi %1. Partition (%1) and device (%2) do not match. Partisi (%1) dan perangkat (%2) tidak sesuai. Could not open device %1. Tidak dapat membuka perangkat %1. Could not open partition table. Tidak dapat membuka tabel partisi. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Tipe dari <strong>tabel partisi</strong> pada perangkat penyimpanan terpilih.<br><br>Satu-satunya cara untuk mengubah tabel partisi adalah dengan menyetip dan menciptakan ulang tabel partisi dari awal, yang melenyapkan semua data pada perangkat penyimpanan.<br>Pemasang ini akan menjaga tabel partisi saat ini kecuali kamu secara gamblang memilih sebaliknya.<br>Jika tidak yakin, pada sistem GPT modern lebih disukai. This device has a <strong>%1</strong> partition table. Perangkai in memiliki sebuah tabel partisi <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Ini adalah sebuah perangkat <strong>loop</strong>.<br><br>Itu adalah sebuah pseudo-device dengan tiada tabel partisi yang membuat sebuah file dapat diakses sebagai perangkat blok. Ini jenis set yang biasanya hanya berisi filesystem tunggal. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Pemasang <strong>tidak bisa mendeteksi tabel partisi apapun</strong> pada media penyimpanan terpilih.<br><br>Mungkin media ini tidak memiliki tabel partisi, atau tabel partisi yang ada telah korup atau tipenya tidak dikenal.<br>Pemasang dapat membuatkan partisi baru untuk Anda, baik secara otomatis atau melalui laman pemartisian manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Ini adalah tipe tabel partisi yang dianjurkan untuk sistem modern yang dimulai dengan <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Tipe tabel partisi ini adalah hanya baik pada sistem kuno yang mulai dari sebuah lingkungan boot <strong>BIOS</strong>. GPT adalah yang dianjurkan dalam beberapa kasus lainnya.<br><br><strong>Peringatan:</strong> tabel partisi MBR adalah sebuah standar era MS-DOS usang.<br>Hanya 4 partisi <em>primary</em> yang mungkin dapat diciptakan, dan yang 4, salah satu yang bisa dijadikan sebuah partisi <em>extended</em>, yang mana terdapat berisi beberapa partisi <em>logical</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Tulis konfigurasi LUKS untuk Dracut ke %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Lewati penulisan konfigurasi LUKS untuk Dracut: partisi "/" tidak dienkripsi Failed to open %1 Gagal membuka %1 DummyCppJob Dummy C++ Job Tugas C++ Kosong EditExistingPartitionDialog Edit Existing Partition Sunting Partisi yang Ada Content: Isi: &Keep &Pertahankan Format Format Warning: Formatting the partition will erase all existing data. Peringatan: Memformat partisi akan menghapus semua data yang ada. &Mount Point: Lokasi Mount: Si&ze: Uku&ran: MiB MiB Fi&le System: Sis&tem Berkas: Flags: Bendera: Mountpoint already in use. Please select another one. Titik-kait sudah digunakan. Silakan pilih yang lainnya. EncryptWidget Form Formulir En&crypt system &Sistem enkripsi Passphrase Kata Sandi Confirm passphrase Konfirmasi kata sandi Please enter the same passphrase in both boxes. Silakan masukkan kata sandi yang sama di kedua kotak. FillGlobalStorageJob Set partition information Tetapkan informasi partisi Install %1 on <strong>new</strong> %2 system partition. Pasang %1 pada partisi sistem %2 <strong>baru</strong> Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Setel partisi %2 <strong>baru</strong> dengan tempat kait <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Pasang %2 pada sistem partisi %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Setel partisi %3 <strong>%1</strong> dengan tempat kait <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Pasang boot loader di <strong>%1</strong>. Setting up mount points. Menyetel tempat kait. FinishedPage Form Formulir &Restart now Mulai ulang seka&rang <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Selesai.</h1><br>%1 sudah terpasang di komputer Anda.<br/>Anda dapat memulai ulang ke sistem baru atau lanjut menggunakan lingkungan Live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Pemasangan Gagal</h1><br/>%1 tidak bisa dipasang pada komputermu.<br/>Pesan galatnya adalah: %2. FinishedViewStep Finish Selesai Installation Complete Pemasangan Lengkap The installation of %1 is complete. Pemasangan %1 telah lengkap. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format partisi %1 (sistem berkas: %2, ukuran: %3 MB) pada %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Format <strong>%3MB</strong> partisi <strong>%1</strong> dengan berkas sistem <strong>%2</strong>. Formatting partition %1 with file system %2. Memformat partisi %1 dengan sistem berkas %2. The installer failed to format partition %1 on disk '%2'. Pemasang gagal memformat partisi %1 pada disk '%2'.'%2'. Could not open device '%1'. Tidak dapat membuka piranti '%1'. Could not open partition table. Tidak dapat membuka tabel partisi. The installer failed to create file system on partition %1. Pemasang gagal membuat sistem berkas pada partisi %1. The installer failed to update partition table on disk '%1'. Pemasang gagal memperbarui tabel partisi pada disk '%1'. InteractiveTerminalPage Konsole not installed Konsole tidak terpasang Please install the kde konsole and try again! Mohon pasang konsole KDE dan coba lagi! Executing script: &nbsp;<code>%1</code> Mengeksekusi skrip: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skrip KeyboardPage Set keyboard model to %1.<br/> Setel model papan ketik ke %1.<br/> Set keyboard layout to %1/%2. Setel tata letak papan ketik ke %1/%2. KeyboardViewStep Keyboard Papan Ketik LCLocaleDialog System locale setting Setelan lokal sistem The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Pengaturan system locale berpengaruh pada bahasa dan karakter pada beberapa elemen antarmuka Command Line. <br/>Pengaturan saat ini adalah <strong>%1</strong>. &Cancel &OK LicensePage Form Isian I accept the terms and conditions above. Saya menyetujui segala persyaratan di atas. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Persetujuan Lisensi</h1>Prosedur ini akan memasang perangkat lunak berpemilik yang terkait dengan lisensi. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Mohon periksa End User License Agreements (EULA) di atas.<br/>Bila Anda tidak setuju, maka prosedur tidak bisa dilanjutkan. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Persetujuan Lisensi</h1>Prosedur ini dapat memasang perangkat lunak yang terkait dengan lisensi agar bisa menyediakan fitur tambahan dan meningkatkan pengalaman pengguna. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Mohon periksa End User License Agreements(EULA) di atas.<br/>Bila Anda tidak setuju, perangkat lunak proprietary tidak akan dipasang, dan alternatif open source akan dipasang sebagai gantinya <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 driver grafis</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 plugin peramban</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paket</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> <a href="%1">baca Persetujuan Lisensi</a> LicenseViewStep License Lisensi LocalePage The system language will be set to %1. Bahasa sistem akan disetel ke %1. The numbers and dates locale will be set to %1. Nomor dan tanggal lokal akan disetel ke %1. Region: Wilayah: Zone: Zona: &Change... &Ubah... Set timezone to %1/%2.<br/> Setel zona waktu ke %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Memuat data lokasi... Location Lokasi MoveFileSystemJob Move file system of partition %1. Pindahkan sistem berkas dari partisi %1. Could not open file system on partition %1 for moving. Tidak dapat membuka sistem berkas pada partisi %1 untuk dipindahkan. Could not create target for moving file system on partition %1. Tidak dapat membuat sasaran untuk pemindahan berkas sistem pada partisi %1. Moving of partition %1 failed, changes have been rolled back. Pemindahan partisi %1 gagal, perubahan telah dibatalkan kembali. Moving of partition %1 failed. Roll back of the changes have failed. Pemindahan partisi %1 gagal. Pembatalan perubahan telah gagal. Updating boot sector after the moving of partition %1 failed. Pembaruan sektor boot setelah pemindahan partisi %1 gagal. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Ukuran sektor logikal pada sumber dan sasaran untuk penyalinan tidak sama. Hal ini saat ini tidak didukung. Source and target for copying do not overlap: Rollback is not required. Sumber dan sasaran untuk penyalinan tidak dapat dicocokkan. Pembatalan tidak diperlukan. Could not open device %1 to rollback copying. Tidak dapat membuka perangkat %1 untuk pembatalan penyalinan. NetInstallPage Name Nama Description Deskripsi Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Pemasangan Jaringan. (Dinonfungsikan: Tak mampu menarik daftar paket, periksa sambungan jaringanmu) NetInstallViewStep Package selection Pemilihan paket Page_Keyboard Form Isian Keyboard Model: Model Papan Ketik: Type here to test your keyboard Ketik di sini untuk mencoba papan ketik Anda Page_UserSetup Form Isian What is your name? Siapa nama Anda? What name do you want to use to log in? Nama apa yang ingin Anda gunakan untuk log in? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Jika lebih dari satu orang akan menggunakan komputer ini, Anda dapat mengatur beberapa akun setelah pemasangan.</small> Choose a password to keep your account safe. Pilih sebuah kata sandi untuk menjaga keamanan akun Anda. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Ketik kata sandi yang sama dua kali, supaya kesalahan pengetikan dapat diketahui. Sebuah kata sandi yang bagus berisi campuran dari kata, nomor dan tanda bada, sebaiknya memiliki panjang paling sedikit delapan karakter, dan sebaiknya diganti dalam interval yang teratur.</small> What is the name of this computer? Apakah nama dari komputer ini? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Nama ini akan digunakan jika anda membuat komputer ini terlihat oleh orang lain dalam sebuah jaringan.</small> Log in automatically without asking for the password. Log in otomatis tanpa menanyakan sandi. Use the same password for the administrator account. Gunakan sandi yang sama untuk akun administrator. Choose a password for the administrator account. Pilih sebuah kata sandi untuk akun administrator. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Ketik kata sandi yang sama dua kali, supaya kesalahan pengetikan dapat diketahui.</small> PartitionLabelsView Root Root Home Beranda Boot Boot EFI system Sistem EFI Swap Swap New partition for %1 Partisi baru untuk %1 New partition Partisi baru %1 %2 %1 %2 PartitionModel Free Space Ruang Kosong New partition Partisi baru Name Nama File System Berkas Sistem Mount Point Lokasi Mount Size Ukuran PartitionPage Form Isian Storage de&vice: Media penyim&panan: &Revert All Changes &Pulihkan Semua Perubahan New Partition &Table Partisi Baru & Tabel &Create &Buat &Edit &Sunting &Delete &Hapus Install boot &loader on: Pasang boot %loader pada: Are you sure you want to create a new partition table on %1? Apakah Anda yakin ingin membuat tabel partisi baru pada %1? PartitionViewStep Gathering system information... Mengumpulkan informasi sistem... Partitions Paritsi Install %1 <strong>alongside</strong> another operating system. Pasang %1 <strong>berdampingan</strong> dengan sistem operasi lain. <strong>Erase</strong> disk and install %1. <strong>Hapus</strong> diska dan pasang %1. <strong>Replace</strong> a partition with %1. <strong>Ganti</strong> partisi dengan %1. <strong>Manual</strong> partitioning. Partisi <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Pasang %1 <strong>berdampingan</strong> dengan sistem operasi lain di disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Hapus</strong> diska <strong>%2</strong> (%3) dan pasang %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Ganti</strong> partisi pada diska <strong>%2</strong> (%3) dengan %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Partisi Manual</strong> pada diska <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Saat ini: After: Sesudah: No EFI system partition configured Tiada partisi sistem EFI terkonfigurasi An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Sebuah partisi sistem EFI perlu memulai %1.<br/><br/>Untuk mengkonfigurasi sebuah partisi sistem EFI, pergi mundur dan pilih atau ciptakan sebuah filesystem FAT32 dengan bendera <strong>esp</strong> yang difungsikan dan titik kait <strong>%2</strong>.<br/><br/>Kamu bisa melanjutkan tanpa menyetel sebuah partisi sistem EFI tapi sistemmu mungkin gagal memulai. EFI system partition flag not set Bendera partisi sistem EFI tidak disetel An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Sebuah partisi sistem EFI perlu memulai %1.<br/><br/>Sebuah partisi telah dikonfigurasi dengan titik kait <strong>%2</strong> tapi bendera <strong>esp</strong> tersebut tidak disetel.<br/>Untuk mengeset bendera, pergi mundur dan editlah partisi.<br/><br/>Kamu bisa melanjutkan tanpa menyetel bendera tapi sistemmu mungkin gagal memulai. Boot partition not encrypted Partisi boot tidak dienkripsi A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Sebuah partisi tersendiri telah terset bersama dengan sebuah partisi root terenkripsi, tapi partisi boot tidak terenkripsi.<br/><br/>Ada kekhawatiran keamanan dengan jenis setup ini, karena file sistem penting tetap pada partisi tak terenkripsi.<br/>Kamu bisa melanjutkan jika kamu menghendaki, tapi filesystem unlocking akan terjadi nanti selama memulai sistem.<br/>Untuk mengenkripsi partisi boot, pergi mundur dan menciptakannya ulang, memilih <strong>Encrypt</strong> di jendela penciptaan partisi. QObject Default Keyboard Model Model Papan Ketik Standar Default Standar unknown tidak diketahui: extended extended unformatted tidak terformat: swap swap Unpartitioned space or unknown partition table Ruang tidak terpartisi atau tidak diketahui tabel partisinya ReplaceWidget Form Isian Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Pilih tempat pemasangan %1.<br/><font color="red">Peringatan: </font>hal ini akan menghapus semua berkas di partisi terpilih. The selected item does not appear to be a valid partition. Item yang dipilih tidak tampak seperti partisi yang valid. %1 cannot be installed on empty space. Please select an existing partition. %1 tidak dapat dipasang di ruang kosong. Mohon pilih partisi yang tersedia. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 tidak bisa dipasang pada Partisi Extended. Mohon pilih Partisi Primary atau Logical yang tersedia. %1 cannot be installed on this partition. %1 tidak dapat dipasang di partisi ini. Data partition (%1) Partisi data (%1) Unknown system partition (%1) Partisi sistem tidak dikenal (%1) %1 system partition (%2) Partisi sistem %1 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partisi %1 teralu kecil untuk %2. Mohon pilih partisi dengan kapasitas minimal %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Tidak ditemui adanya Partisi EFI pada sistem ini. Mohon kembali dan gunakan Pemartisi Manual untuk set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 akan dipasang pada %2.<br/><font color="red">Peringatan: </font>seluruh data %2 akan hilang. The EFI system partition at %1 will be used for starting %2. Partisi EFI pada %1 akan digunakan untuk memulai %2. EFI system partition: Partisi sistem EFI: RequirementsChecker Gathering system information... Mengumpulkan informasi sistem... has at least %1 GB available drive space memiliki paling sedikit %1 GB ruang drive tersedia There is not enough drive space. At least %1 GB is required. Ruang drive tidak cukup. Butuh minial %1 GB. has at least %1 GB working memory memiliki paling sedikit %1 GB memori bekerja The system does not have enough working memory. At least %1 GB is required. Sistem ini tidak memiliki memori yang cukup. Butuh minial %1 GB. is plugged in to a power source terhubung dengan sumber listrik The system is not plugged in to a power source. Sistem tidak terhubung dengan sumber listrik. is connected to the Internet terkoneksi dengan internet The system is not connected to the Internet. Sistem tidak terkoneksi dengan internet. The installer is not running with administrator rights. Pemasang tidak dijalankan dengan kewenangan administrator. The screen is too small to display the installer. Layar terlalu kecil untuk menampilkan pemasang. ResizeFileSystemJob Resize file system on partition %1. Ubah ukuran sistem berkas pada partisi %1. Parted failed to resize filesystem. Parted gagal untuk merubah ukuran sistem berkas Failed to resize filesystem. Gagal merubah ukuran sistem berkas. ResizePartitionJob Resize partition %1. Ubah ukuran partisi %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Ubah ukuran<strong>%2MB</strong> partisi <strong>%1</strong> menjadi <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Mengubah partisi %2MB %1 ke %3MB. The installer failed to resize partition %1 on disk '%2'. Pemasang gagal untuk merubah ukuran partisi %1 pada disk '%2'. Could not open device '%1'. Tidak dapat membuka perangkat '%1'. ScanningDialog Scanning storage devices... Memeriksa media penyimpanan... Partitioning Mempartisi SetHostNameJob Set hostname %1 Pengaturan hostname %1 Set hostname <strong>%1</strong>. Atur hostname <strong>%1</strong>. Setting hostname %1. Mengatur hostname %1. Internal Error Kesalahan Internal Cannot write hostname to target system Tidak dapat menulis nama host untuk sistem target SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Model papan ketik ditetapkan ke %1, tata letak ke %2-%3 Failed to write keyboard configuration for the virtual console. Gagal menulis konfigurasi keyboard untuk virtual console. Failed to write to %1 Gagal menulis ke %1. Failed to write keyboard configuration for X11. Gagal menulis konfigurasi keyboard untuk X11. Failed to write keyboard configuration to existing /etc/default directory. Gagal menulis konfigurasi keyboard ke direktori /etc/default yang ada. SetPartFlagsJob Set flags on partition %1. Setel bendera pada partisi %1. Set flags on %1MB %2 partition. Setel bendera pada partisi %2 %1MB. Set flags on new partition. Setel bendera pada partisi baru. Clear flags on partition <strong>%1</strong>. Bersihkan bendera pada partisi <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Bersihkan bendera pada partisi <strong>%2</strong> %1MB. Clear flags on new partition. Bersihkan bendera pada partisi baru. Flag partition <strong>%1</strong> as <strong>%2</strong>. Benderakan partisi <strong>%1</strong> sebagai <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag partisi <strong>%2</strong> %1MB sebagai <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Benderakan partisi baru sebagai <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Membersihkan bendera pada partisi <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Membersihkan bendera pada partisi <strong>%2</strong> %1MB. Clearing flags on new partition. Membersihkan bendera pada partisi baru. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Menyetel bendera <strong>%2</strong> pada partisi <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Menyetel bendera <strong>%3</strong> pada partisi <strong>%2</strong> %1MB. Setting flags <strong>%1</strong> on new partition. Menyetel bendera <strong>%1</strong> pada partisi baru. The installer failed to set flags on partition %1. Pemasang gagal menetapkan bendera pada partisi %1. Could not open device '%1'. Tidak dapat membuka perangkat '%1'. Could not open partition table on device '%1'. Tidak dapat membuka tabel partisi pada perangkat '%1'. Could not find partition '%1'. Tidak dapat menemukan partisi '%1'. SetPartGeometryJob Update geometry of partition %1. Perbarui geometri partisi %1. Failed to change the geometry of the partition. Gagal mengubah geometri partisi. SetPasswordJob Set password for user %1 Setel sandi untuk pengguna %1 Setting password for user %1. Mengatur sandi untuk pengguna %1. Bad destination system path. Jalur lokasi sistem tujuan buruk. rootMountPoint is %1 rootMountPoint adalah %1 Cannot disable root account. Tak bisa menonfungsikan akun root. passwd terminated with error code %1. passwd terhenti dengan kode galat %1. Cannot set password for user %1. Tidak dapat menyetel sandi untuk pengguna %1. usermod terminated with error code %1. usermod dihentikan dengan kode kesalahan %1. SetTimezoneJob Set timezone to %1/%2 Setel zona waktu ke %1/%2 Cannot access selected timezone path. Tidak dapat mengakses jalur lokasi zona waktu yang dipilih. Bad path: %1 Jalur lokasi buruk: %1 Cannot set timezone. Tidak dapat menyetel zona waktu. Link creation failed, target: %1; link name: %2 Pembuatan tautan gagal, target: %1; nama tautan: %2 Cannot set timezone, Tidak bisa menetapkan zona waktu. Cannot open /etc/timezone for writing Tidak bisa membuka /etc/timezone untuk penulisan SummaryPage This is an overview of what will happen once you start the install procedure. Berikut adalah tinjauan mengenai yang akan terjadi setelah Anda memulai prosedur pemasangan. SummaryViewStep Summary Ikhtisar UsersPage Your username is too long. Nama pengguna Anda terlalu panjang. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Nama pengguna Anda berisi karakter yang tidak sah. Hanya huruf kecil dan angka yang diperbolehkan. Your hostname is too short. Hostname Anda terlalu pendek. Your hostname is too long. Hostname Anda terlalu panjang. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Hostname Anda berisi karakter yang tidak sah. Hanya huruf kecil, angka, dan strip yang diperbolehkan. Your passwords do not match! Sandi Anda tidak sama! UsersViewStep Users Pengguna WelcomePage Form Isian &Language: &Bahasa: &Release notes &Catatan rilis &Known issues &Isu-isu yang diketahui &Support &Dukungan &About &Tentang <h1>Welcome to the %1 installer.</h1> <h1>Selamat datang di pemasang %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Selamat datang di Calamares pemasang untuk %1.</h1> About %1 installer Tentang pemasang %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1<br/><strong>%2<br/>untuk %3</strong><br/><br/>Hak Cipta 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Hak Cipta 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Terimakasih kepada: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg dan <a href="https://www.transifex.com/calamares/calamares/">regu penerjemah Calamares</a>.<br/><br/>Pengembangan <a href="http://calamares.io/">Calamares</a> disponsori oleh<br/> <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support Dukungan %1 WelcomeViewStep Welcome Selamat Datang calamares-3.1.12/lang/calamares_is.ts000066400000000000000000003435061322271446000174560ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Aðalræsifærsla (MBR) %1 Boot Partition Ræsidisksneið System Partition Kerfisdisksneið Do not install a boot loader Ekki setja upp ræsistjóra %1 (%2) %1 (%2) Calamares::DebugWindow Form Eyðublað GlobalStorage VíðværGeymsla JobQueue Vinnuröð Modules Forritseiningar Type: Tegund: none ekkert Interface: Viðmót: Tools Verkfæri Debug information Villuleitarupplýsingar Calamares::ExecutionViewStep Install Setja upp Calamares::JobThread Done Búið Calamares::ProcessJob Run command %1 %2 Keyra skipun %1 %2 Running command %1 %2 Keyri skipun %1 %2 External command crashed Ytri skipun hrundi Command %1 crashed. Output: %2 Skipun %1 hrundi. Frálag: %2 External command failed to start Ytri skipun ræstist ekki Command %1 failed to start. Skipun %1 ræstist ekki. Internal error when starting command Innri villa við að ræsa skipun Bad parameters for process job call. External command failed to finish Ytri skipun lauk ekki Command %1 failed to finish in %2s. Output: %3 Skipun %1 lauk ekki í %2 Frálag: %3 External command finished with errors Ytri skipun kláruð með villum Command %1 finished with exit code %2. Output: %3 Skipun %1 lauk með lokakóða %2 Frálag: %3 Calamares::PythonJob Running %1 operation. Keyri %1 aðgerð. Bad working directory path Röng slóð á vinnumöppu Working directory %1 for python job %2 is not readable. Vinnslumappa %1 fyrir python-verkið %2 er ekki lesanleg. Bad main script file Röng aðal-skriftuskrá Main script file %1 for python job %2 is not readable. Aðal-skriftuskrá %1 fyrir python-verkið %2 er ekki lesanleg. Boost.Python error in job "%1". Boost.Python villa í verkinu "%1". Calamares::ViewManager &Back &Til baka &Next &Næst &Cancel &Hætta við Cancel installation without changing the system. Hætta við uppsetningu ánþess að breyta kerfinu. Cancel installation? Hætta við uppsetningu? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Viltu virkilega að hætta við núverandi uppsetningarferli? Uppsetningarforritið mun hætta og allar breytingar tapast. &Yes &Já &No &Nei &Close &Loka Continue with setup? Halda áfram með uppsetningu? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 uppsetningarforritið er um það bil að gera breytingar á diskinum til að setja upp %2.<br/><strong>Þú munt ekki geta afturkallað þessar breytingar.</strong> &Install now Setja &inn núna Go &back Fara til &baka &Done &Búið The installation is complete. Close the installer. Uppsetning er lokið. Lokaðu uppsetningarforritinu. Error Villa Installation Failed Uppsetning mistókst CalamaresPython::Helper Unknown exception type Óþekkt tegund fráviks unparseable Python error óþáttanleg Python villa unparseable Python traceback óþáttanleg Python reki Unfetchable Python error. Ósækjanleg Python villa. CalamaresWindow %1 Installer %1 uppsetningarforrit Show debug information Birta villuleitarupplýsingar CheckFileSystemJob Checking file system on partition %1. Athuga skráakerfi á %1 disksneiðinni. The file system check on partition %1 failed. Prófun skráakerfis á disksneið %1 mistókst. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Þessi tölva uppfyllir ekki lágmarkskröfur um uppsetningu %1.<br/>Uppsetningin getur ekki haldið áfram. <a href="#details">Upplýsingar...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Þessi tölva uppfyllir ekki lágmarkskröfur um uppsetningu %1.<br/>Uppsetningin getur haldið áfram, en sumir eiginleikar gætu verið óvirk. This program will ask you some questions and set up %2 on your computer. Þetta forrit mun spyrja þig nokkurra spurninga og setja upp %2 á tölvunni þinni. For best results, please ensure that this computer: Fyrir bestu niðurstöður, skaltu tryggja að þessi tölva: System requirements Kerfiskröfur ChoicePage Form Eyðublað After: Eftir: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Handvirk disksneiðing</strong><br/>Þú getur búið til eða breytt stærð disksneiða sjálf(ur). Boot loader location: Staðsetning ræsistjóra %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 verður minnkuð í %2MB og ný %3MB disksneið verður búin til fyrir %4. Select storage de&vice: Veldu geymslu tæ&ki: Current: Núverandi: Reuse %1 as home partition for %2. Endurnota %1 sem heimasvæðis disksneið fyrir %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Veldu disksneið til að minnka, dragðu síðan botnstikuna til að breyta stærðinni</strong> <strong>Select a partition to install on</strong> <strong>Veldu disksneið til að setja upp á </strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI kerfisdisksneið á %1 mun verða notuð til að ræsa %2. EFI system partition: EFI kerfisdisksneið: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Þetta geymslu tæki hefur mörg stýrikerfi á sér. Hvað viltu gera?<br/>Þú verður að vera fær um að yfirfara og staðfesta val þitt áður en breytingar eru gerðar til geymslu tæki. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Eyða disk</strong><br/>Þetta mun <font color="red">eyða</font> öllum gögnum á þessu valdna geymslu tæki. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Þetta geymslu tæki hefur %1 á sér. Hvað viltu gera?<br/>Þú verður að vera fær um að yfirfara og staðfesta val þitt áður en breytingar eru gerðar til geymslu tæki. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Setja upp samhliða</strong><br/>Uppsetningarforritið mun minnka disksneið til að búa til pláss fyrir %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Skipta út disksneið</strong><br/>Skiptir disksneið út með %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Þetta geymslu tæki hefur stýrikerfi á sér. Hvað viltu gera?<br/>Þú verður að vera fær um að yfirfara og staðfesta val þitt áður en breytingar eru gerðar til geymslu tæki. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Þetta geymslu tæki hefur mörg stýrikerfi á sér. Hvað viltu gera?<br/>Þú verður að vera fær um að yfirfara og staðfesta val þitt áður en breytingar eru gerðar til geymslu tæki. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Hreinsaði alla tengipunkta fyrir %1 ClearTempMountsJob Clear all temporary mounts. Hreinsa alla bráðabirgðatengipunkta. Clearing all temporary mounts. Hreinsa alla bráðabirgðatengipunkta. Cannot get list of temporary mounts. Cleared all temporary mounts. Hreinsaði alla bráðabirgðatengipunkta. CreatePartitionDialog Create a Partition Búa til disksneið MiB MiB Partition &Type: &Tegund disksneiðar: &Primary &Aðal E&xtended Útví&kkuð Fi&le System: Skráa&kerfi: Flags: Flögg: &Mount Point: Tengi&punktur: Si&ze: St&ærð: En&crypt &Dulrita Logical Rökleg Primary Aðal GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Búa til nýja %2MB disksneið á %4 (%3) með %1 skráakerfi. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Búa til nýja <strong>%2MB</strong> disksneið á <strong>%4</strong> (%3) með skrár kerfi <strong>%1</strong>. Creating new %1 partition on %2. Búa til nýja %1 disksneiðatöflu á %2. The installer failed to create partition on disk '%1'. Uppsetningarforritinu mistókst að búa til disksneið á diski '%1'. Could not open device '%1'. Gat ekki opnað tæki '%1'. Could not open partition table. Gat ekki opnað disksneiðatöflu. The installer failed to create file system on partition %1. Uppsetningarforritinu mistókst að búa til skráakerfi á disksneið %1. The installer failed to update partition table on disk '%1'. Uppsetningarforritinu mistókst að uppfæra disksneið á diski '%1'. CreatePartitionTableDialog Create Partition Table Búa til disksneiðatöflu Creating a new partition table will delete all existing data on the disk. Gerð nýrrar disksneiðatöflu mun eyða öllum gögnum á diskinum. What kind of partition table do you want to create? Hverning disksneiðstöflu langar þig til að búa til? Master Boot Record (MBR) Aðalræsifærsla (MBR) GUID Partition Table (GPT) GUID disksneiðatafla (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Búa til nýja %1 disksneiðatöflu á %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Búa til nýja <strong>%1</strong> disksneiðatöflu á <strong>%2</strong> (%3). Creating new %1 partition table on %2. Búa til nýja %1 disksneiðatöflu á %2. The installer failed to create a partition table on %1. Uppsetningarforritinu mistókst að búa til disksneiðatöflu á diski '%1'. Could not open device %1. Gat ekki opnað tæki %1. CreateUserJob Create user %1 Búa til notanda %1 Create user <strong>%1</strong>. Búa til notanda <strong>%1</strong>. Creating user %1. Bý til notanda %1. Sudoers dir is not writable. Sudoers dir er ekki skrifanleg. Cannot create sudoers file for writing. Get ekki búið til sudoers skrá til að lesa. Cannot chmod sudoers file. Get ekki chmod sudoers skrá. Cannot open groups file for reading. Get ekki opnað hópa skrá til að lesa. Cannot create user %1. Get ekki búið til notanda %1. useradd terminated with error code %1. useradd endaði með villu kóðann %1. Cannot add user %1 to groups: %2. Get ekki bætt við notanda %1 til hóps: %2. usermod terminated with error code %1. usermod endaði með villu kóðann %1. Cannot set home directory ownership for user %1. Get ekki stillt heimasvæðis eignarhald fyrir notandann %1. chown terminated with error code %1. chown endaði með villu kóðann %1. DeletePartitionJob Delete partition %1. Eyða disksneið %1. Delete partition <strong>%1</strong>. Eyða disksneið <strong>%1</strong>. Deleting partition %1. Eyði disksneið %1. The installer failed to delete partition %1. Uppsetningarforritinu mistókst að eyða disksneið %1. Partition (%1) and device (%2) do not match. Disksneið (%1) og tæki (%2) passa ekki saman. Could not open device %1. Gat ekki opnað tæki %1. Could not open partition table. Gat ekki opnað disksneiðatöflu. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. Þetta tæki hefur <strong>%1</strong> sniðtöflu. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skrifa LUKS stillingar fyrir Dracut til %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 Tókst ekki að opna %1 DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Breyta fyrirliggjandi disksneið Content: Innihald: &Keep &Halda Format Forsníða Warning: Formatting the partition will erase all existing data. Aðvörun: Ef disksneiðin er forsniðin munu öll gögn eyðast. &Mount Point: Tengi&punktur: Si&ze: St&ærð: MiB MiB Fi&le System: Skráaker&fi: Flags: Flögg: Mountpoint already in use. Please select another one. Tengipunktur er þegar í notkun. Veldu einhvern annan. EncryptWidget Form Eyðublað En&crypt system &Dulrita kerfi Passphrase Lykilorð Confirm passphrase Staðfesta lykilorð Please enter the same passphrase in both boxes. Vinsamlegast sláðu inn sama lykilorðið í báða kassana. FillGlobalStorageJob Set partition information Setja upplýsingar um disksneið Install %1 on <strong>new</strong> %2 system partition. Setja upp %1 á <strong>nýja</strong> %2 disk sneiðingu. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Setja upp <strong>nýtt</strong> %2 snið með tengipunkti <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Setja upp %2 á %3 disk sneiðingu <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Setja upp %3 snið <strong>%1</strong> með tengipunkti <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setja ræsistjórann upp á <strong>%1</strong>. Setting up mount points. Set upp tengipunkta. FinishedPage Form Eyðublað &Restart now &Endurræsa núna <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Allt klárt.</h1><br/>%1 hefur verið sett upp á tölvunni þinni.<br/>Þú getur nú endurræst í nýja kerfið, eða halda áfram að nota %2 Lifandi umhverfi. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Ljúka Installation Complete Uppsetningu lokið The installation of %1 is complete. Uppsetningu af %1 er lokið. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Forsníða disksneið %1 (skráakerfi: %2, stærð: %3 MB) á %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Forsníða <strong>%3MB</strong> disksneið <strong>%1</strong> með <strong>%2</strong> skráakerfinu. Formatting partition %1 with file system %2. Forsníða disksneið %1 með %2 skráakerfinu. The installer failed to format partition %1 on disk '%2'. Uppsetningarforritinu mistókst að forsníða disksneið %1 á diski '%2'. Could not open device '%1'. Gat ekki opnað tæki '%1'. Could not open partition table. Gat ekki opnað disksneiðatöflu. The installer failed to create file system on partition %1. Uppsetningarforritinu mistókst að búa til skráakerfi á disksneið %1. The installer failed to update partition table on disk '%1'. Uppsetningarforritinu mistókst að uppfæra disksneiðatöflu á diski '%1'. InteractiveTerminalPage Konsole not installed Konsole ekki uppsett Please install the kde konsole and try again! Settu upp kde konsole og reyndu aftur! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skrifta KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Lyklaborð LCLocaleDialog System locale setting Staðfærsla kerfisins stilling The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &Hætta við &OK &Í lagi LicensePage Form Eyðublað I accept the terms and conditions above. Ég samþykki skilyrði leyfissamningsins hér að ofan. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 rekill</strong><br/>hjá %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pakki</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">frá %2</font> <a href="%1">view license agreement</a> <a href="%1">skoða leyfissamning</a> LicenseViewStep License Notkunarleyfi LocalePage The system language will be set to %1. Tungumál kerfisins verður sett sem %1. The numbers and dates locale will be set to %1. Region: Hérað: Zone: Svæði: &Change... &Breyta... Set timezone to %1/%2.<br/> Setja tímabelti sem %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Hleð inn staðsetningargögnum... Location Staðsetning MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Heiti Description Lýsing Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Valdir pakkar Page_Keyboard Form Eyðublað Keyboard Model: Lyklaborðs tegund: Type here to test your keyboard Skrifaðu hér til að prófa lyklaborðið Page_UserSetup Form Eyðublað What is your name? Hvað heitir þú? What name do you want to use to log in? Hvaða nafn vilt þú vilt nota til að skrá þig inn? font-weight: normal letur-þyngd: venjuleg <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ef fleiri en ein manneskja mun nota þessa tölvu, getur þú sett upp marga reikninga eftir uppsetningu.</small> Choose a password to keep your account safe. Veldu lykilorð til að halda reikningnum þínum öruggum. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Sláðu inn sama lykilorðið tvisvar, þannig að það geta verið athugað fyrir innsláttarvillur. Góð lykilorð mun innihalda blöndu af stöfum, númerum og greinarmerki, ætti að vera að minnsta kosti átta stafir að lengd, og ætti að vera breytt með reglulegu millibili.</small> What is the name of this computer? Hvað er nafnið á þessari tölvu? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Þetta nafn verður notað ef þú gerir tölvuna sýnilega öðrum á neti.</small> Log in automatically without asking for the password. Skrá inn sjálfkrafa án þess að biðja um lykilorð. Use the same password for the administrator account. Nota sama lykilorð fyrir kerfisstjóra reikning. Choose a password for the administrator account. Veldu lykilorð fyrir kerfisstjóra reikning. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Sláðu sama lykilorð tvisvar, þannig að það er hægt að yfirfara innsláttarvillur.</small> PartitionLabelsView Root Rót Home Heimasvæði Boot Ræsisvæði EFI system EFI-kerfi Swap Swap diskminni New partition for %1 Ný disksneið fyrir %1 New partition Ný disksneið %1 %2 %1 %2 PartitionModel Free Space Laust pláss New partition Ný disksneið Name Heiti File System Skráakerfi Mount Point Tengipunktur Size Stærð PartitionPage Form Eyðublað Storage de&vice: Geymslu tæ&ki: &Revert All Changes &Afturkalla allar breytingar New Partition &Table Ný disksneiðatafla &Create &Búa til &Edit &Breyta &Delete &Eyða Install boot &loader on: Setja upp ræsistjóran á: Are you sure you want to create a new partition table on %1? Ertu viss um að þú viljir búa til nýja disksneið á %1? PartitionViewStep Gathering system information... Söfnun kerfis upplýsingar... Partitions Disksneiðar Install %1 <strong>alongside</strong> another operating system. Setja upp %1 <strong>ásamt</strong> ásamt öðru stýrikerfi. <strong>Erase</strong> disk and install %1. <strong>Eyða</strong> disk og setja upp %1. <strong>Replace</strong> a partition with %1. <strong>Skipta út</strong> disksneið með %1. <strong>Manual</strong> partitioning. <strong>Handvirk</strong> disksneiðaskipting. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Uppsetning %1 <strong>með</strong> öðru stýrikerfi á disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Eyða</strong> disk <strong>%2</strong> (%3) og setja upp %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Skipta út</strong> disksneið á diski <strong>%2</strong> (%3) með %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Handvirk</strong> disksneiðaskipting á diski <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Diskur <strong>%1</strong> (%2) Current: Núverandi: After: Eftir: No EFI system partition configured Ekkert EFI kerfisdisksneið stillt An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Sjálfgefin tegund lyklaborðs Default Sjálfgefið unknown óþekkt extended útvíkkuð unformatted ekki forsniðin swap swap diskminni Unpartitioned space or unknown partition table ReplaceWidget Form Eyðublað Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Veldu hvar á að setja upp %1.<br/><font color="red">Aðvörun: </font>þetta mun eyða öllum skrám á valinni disksneið. The selected item does not appear to be a valid partition. Valið atriði virðist ekki vera gild disksneið. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. %1 er hægt að setja upp á þessari disksneið. Data partition (%1) Gagnadisksneið (%1) Unknown system partition (%1) Óþekkt kerfisdisksneið (%1) %1 system partition (%2) %1 kerfisdisksneið (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Disksneið %1 er of lítil fyrir %2. Vinsamlegast veldu disksneið með að lámark %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>EFI kerfisdisksneið er hvergi að finna á þessu kerfi. Vinsamlegast farðu til baka og notaðu handvirka skiptingu til að setja upp %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 mun vera sett upp á %2.<br/><font color="red">Aðvörun: </font>öll gögn á disksneið %2 mun verða eytt. The EFI system partition at %1 will be used for starting %2. EFI kerfis stýring á %1 mun vera notuð til að byrja %2. EFI system partition: EFI kerfisdisksneið: RequirementsChecker Gathering system information... Söfnun kerfis upplýsingar... has at least %1 GB available drive space hefur að minnsta kosti %1 GB laus á harðadisk There is not enough drive space. At least %1 GB is required. Það er ekki nóg diskapláss. Að minnsta kosti %1 GB eru þörf. has at least %1 GB working memory hefur að minnsta kosti %1 GB vinnsluminni The system does not have enough working memory. At least %1 GB is required. Kerfið hefur ekki nóg vinnsluminni. Að minnsta kosti %1 GB er krafist. is plugged in to a power source er í sambandi við aflgjafa The system is not plugged in to a power source. Kerfið er ekki í sambandi við aflgjafa. is connected to the Internet er tengd við Internetið The system is not connected to the Internet. Kerfið er ekki tengd við internetið. The installer is not running with administrator rights. Uppsetningarforritið er ekki keyrandi með kerfisstjóraheimildum. The screen is too small to display the installer. Skjárinn er of lítill til að birta uppsetningarforritið. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Breyti stærð disksneiðar %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Breyta stærð <strong>%2MB</strong> disksneiðar <strong>%1</strong> í <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Breyti stærð %2MB disksneiðar %1 í %3MB. The installer failed to resize partition %1 on disk '%2'. Uppsetningarforritinu mistókst að breyta stærð disksneiðar %1 á diski '%2'. Could not open device '%1'. Gat ekki opnað tæki '%1'. ScanningDialog Scanning storage devices... Skönnun geymslu tæki... Partitioning Partasneiðing SetHostNameJob Set hostname %1 Setja vélarheiti %1 Set hostname <strong>%1</strong>. Setja vélarheiti <strong>%1</strong>. Setting hostname %1. Stilla vélarheiti %1. Internal Error Innri Villa Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Tókst ekki að skrifa %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Uppsetningarforritinu mistókst að setja flögg á disksneið %1. Could not open device '%1'. Gat ekki opnað tæki '%1'. Could not open partition table on device '%1'. Gat ekki opnað disksneiðatöflu á tækinu '%1'. Could not find partition '%1'. Gat ekki fundið disksneiðina '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Gerðu lykilorð fyrir notanda %1 Setting password for user %1. Geri lykilorð fyrir notanda %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. Ekki er hægt að aftengja kerfisstjóra reikning. passwd terminated with error code %1. Cannot set password for user %1. Get ekki sett lykilorð fyrir notanda %1. usermod terminated with error code %1. usermod endaði með villu kóðann %1. SetTimezoneJob Set timezone to %1/%2 Setja tímabelti til %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Get ekki sett tímasvæði. Link creation failed, target: %1; link name: %2 Cannot set timezone, Get ekki sett tímasvæði, Cannot open /etc/timezone for writing Get ekki opnað /etc/timezone til að skrifa. SummaryPage This is an overview of what will happen once you start the install procedure. Þetta er yfirlit yfir það sem mun gerast þegar þú byrjar að setja upp aðferð. SummaryViewStep Summary Yfirlit UsersPage Your username is too long. Notandanafnið þitt er of langt. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Notandanafnið þitt inniheldur ógilda stafi. Aðeins lágstöfum og númer eru leyfð. Your hostname is too short. Notandanafnið þitt er of stutt. Your hostname is too long. Notandanafnið þitt er of langt. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Lykilorð passa ekki! UsersViewStep Users Notendur WelcomePage Form Eyðublað &Language: &Tungumál: &Release notes &Um útgáfu &Known issues &Þekktir gallar &Support &Stuðningur &About &Um <h1>Welcome to the %1 installer.</h1> <h1>Velkomin í %1 uppsetningarforritið.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Velkomin(n) til Calamares uppsetningar fyrir %1</h1> About %1 installer Um %1 uppsetningarforrrit <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 stuðningur WelcomeViewStep Welcome Velkomin(n) calamares-3.1.12/lang/calamares_it_IT.ts000066400000000000000000003707241322271446000200550ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. L'<strong>ambiente di avvio</strong> di questo sistema. <br><br>I vecchi sistemi x86 supportano solo <strong>BIOS</strong>. <bt>I sistemi moderni normalmente usano <strong>EFI</strong> ma possono anche usare BIOS se l'avvio viene eseguito in modalità compatibile. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Il sistema è stato avviato con un ambiente di boot <strong>EFI</strong>.<br><br>Per configurare l'avvio da un ambiente EFI, il programma d'installazione deve inserire un boot loader come <strong>GRUB</strong> o <strong>systemd-boot</strong> su una <strong>EFI System Partition</strong>. Ciò avviene automaticamente, a meno che non si scelga il partizionamento manuale che permette di scegliere un proprio boot loader personale. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. ll sistema è stato avviato con un ambiente di boot <strong>BIOS</strong>.<br><br>Per configurare l'avvio da un ambiente BIOS, il programma d'installazione deve installare un boot loader come <strong>GRUB</strong> all'inizio di una partizione o nel <strong>Master Boot Record</strong> vicino all'origine della tabella delle partizioni (preferito). Ciò avviene automaticamente, a meno che non si scelga il partizionamento manuale che permette di fare una configurazione personale. BootLoaderModel Master Boot Record of %1 Master Boot Record di %1 Boot Partition Partizione di avvio System Partition Partizione di sistema Do not install a boot loader Non installare un boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form Modulo GlobalStorage GlobalStorage JobQueue JobQueue Modules Moduli Type: Tipo: none nessuna Interface: Interfaccia: Tools Strumenti Debug information Informazioni di debug Calamares::ExecutionViewStep Install Installa Calamares::JobThread Done Fatto Calamares::ProcessJob Run command %1 %2 Esegui il comando %1 %2 Running command %1 %2 Comando in esecuzione %1 %2 External command crashed Il comando esterno si è arrestato Command %1 crashed. Output: %2 Il comando %1 si è arrestato. Output: %2 External command failed to start Il comando esterno non si è avviato Command %1 failed to start. Il comando %1 non si è avviato Internal error when starting command Errore interno all'avvio del comando Bad parameters for process job call. Parametri errati per elaborare l'attività richiesta External command failed to finish Il comando esterno non è stato portato a termine Command %1 failed to finish in %2s. Output: %3 Il comando %1 non è stato portato a termine in %2s. Output: %3 External command finished with errors Il comando esterno è terminato con errori Command %1 finished with exit code %2. Output: %3 Il comando %1 è terminato con codice di uscita %2. Output: %3 Calamares::PythonJob Running %1 operation. Operazione %1 in esecuzione. Bad working directory path Il percorso della cartella corrente non è corretto Working directory %1 for python job %2 is not readable. La cartella corrente %1 per l'attività di Python %2 non è accessibile. Bad main script file File dello script principale non valido Main script file %1 for python job %2 is not readable. Il file principale dello script %1 per l'attività di python %2 non è accessibile. Boost.Python error in job "%1". Errore da Boost.Python nell'operazione "%1". Calamares::ViewManager &Back &Indietro &Next &Avanti &Cancel &Annulla Cancel installation without changing the system. Cancel installation? Annullare l'installazione? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Si vuole davvero annullare l'installazione in corso? Il programma d'installazione sarà terminato e tutte le modifiche andranno perse. &Yes &No &Close Continue with setup? Procedere con la configurazione? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Il programma d'nstallazione %1 sta per eseguire delle modifiche al tuo disco per poter installare %2.<br/><strong> Non sarà possibile annullare tali modifiche.</strong> &Install now &Installa adesso Go &back &Indietro &Done The installation is complete. Close the installer. Error Errore Installation Failed Installazione non riuscita CalamaresPython::Helper Unknown exception type Tipo di eccezione sconosciuto unparseable Python error Errore Python non definibile unparseable Python traceback Traceback Python non definibile Unfetchable Python error. Errore di Python non definibile. CalamaresWindow %1 Installer %1 Programma di installazione Show debug information Mostra le informazioni di debug CheckFileSystemJob Checking file system on partition %1. Controllo del file system sulla partizione %1 The file system check on partition %1 failed. Il controllo del file system sulla partizione %1 non è riuscito. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Questo computer non soddisfa i requisiti minimi per installare %1. <br/>L'installazione non può proseguire. <a href="#details">Dettagli...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Questo computer non soddisfa alcuni requisiti consigliati per l'installazione di %1. <br/>L'installazione può proseguire ma alcune funzionalità potrebbero non essere disponibili. This program will ask you some questions and set up %2 on your computer. Questo programma chiederà alcune informazioni e configurerà %2 sul computer. For best results, please ensure that this computer: Per ottenere prestazioni ottimali, assicurarsi che questo computer: System requirements Requisiti di sistema ChoicePage Form Modulo After: Dopo: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Partizionamento manuale</strong><br/>Si possono creare o ridimensionare le partizioni manualmente. Boot loader location: Posizionamento del boot loader: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 sarà ridotta a %2MB e una nuova partizione di %3MB sarà creata per %4. Select storage de&vice: Selezionare un dispositivo di me&moria: Current: Corrente: Reuse %1 as home partition for %2. Riutilizzare %1 come partizione home per &2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Selezionare una partizione da ridurre, trascina la barra inferiore per ridimensionare</strong> <strong>Select a partition to install on</strong> <strong>Selezionare la partizione sulla quale si vuole installare</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Impossibile trovare una partizione EFI di sistema. Si prega di tornare indietro ed effettuare un partizionamento manuale per configurare %1. The EFI system partition at %1 will be used for starting %2. La partizione EFI di sistema su %1 sarà usata per avviare %2. EFI system partition: Partizione EFI di sistema: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Questo dispositivo di memoria non sembra contenere alcun sistema operativo. Come si vuole procedere?<br/>Si potranno comunque rivedere e confermare le scelte prima di apportare i cambiamenti al dispositivo. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Cancellare disco</strong><br/>Questo <font color="red">cancellerà</font> tutti i dati attualmente presenti sul dispositivo di memoria. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Questo dispositivo di memoria ha %1. Come si vuole procedere?<br/>Si potranno comunque rivedere e confermare le scelte prima di apportare i cambiamenti al dispositivo. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Installare a fianco</strong><br/>Il programma di installazione ridurrà una partizione per dare spazio a %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Sostituire una partizione</strong><br/>Sostituisce una partizione con %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Questo dispositivo di memoria contenere già un sistema operativo. Come si vuole procedere?<br/>Si potranno comunque rivedere e confermare le scelte prima di apportare i cambiamenti al dispositivo. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Questo dispositivo di memoria contenere diversi sistemi operativi. Come si vuole procedere?<br/>Comunque si potranno rivedere e confermare le scelte prima di apportare i cambiamenti al dispositivo. ClearMountsJob Clear mounts for partitioning operations on %1 Rimuovere i punti di mount per operazioni di partizionamento su %1 Clearing mounts for partitioning operations on %1. Rimozione dei punti di mount per le operazioni di partizionamento su %1. Cleared all mounts for %1 Rimossi tutti i punti di mount per %1 ClearTempMountsJob Clear all temporary mounts. Rimuovere tutti i punti di mount temporanei. Clearing all temporary mounts. Rimozione di tutti i punti di mount temporanei. Cannot get list of temporary mounts. Non è possibile ottenere la lista dei punti di mount temporanei. Cleared all temporary mounts. Rimossi tutti i punti di mount temporanei. CreatePartitionDialog Create a Partition Creare una partizione MiB Partition &Type: &Tipo di partizione: &Primary &Primaria E&xtended E&stesa Fi&le System: Fi&le System: Flags: Flag: &Mount Point: Punto di &mount: Si&ze: &Dimensione: En&crypt Cr&iptare Logical Logica Primary Primaria GPT GPT Mountpoint already in use. Please select another one. Il punto di mount è già in uso. Sceglierne un altro. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Creare una nuova partizione da %2MB su %4 (%3) con file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creare una nuova partizione da <strong>%2MB</strong> su <strong>%4</strong> (%3) con file system <strong>%1</strong>. Creating new %1 partition on %2. Creazione della nuova partizione %1 su %2. The installer failed to create partition on disk '%1'. Il programma di installazione non è riuscito a creare la partizione sul disco '%1'. Could not open device '%1'. Impossibile aprire il disco '%1'. Could not open partition table. Impossibile aprire la tabella delle partizioni. The installer failed to create file system on partition %1. Il programma di installazione non è riuscito a creare il file system nella partizione %1. The installer failed to update partition table on disk '%1'. Il programma di installazione non è riuscito ad aggiornare la tabella delle partizioni sul disco '%1' CreatePartitionTableDialog Create Partition Table Creare la tabella delle partizioni Creating a new partition table will delete all existing data on the disk. La creazione di una nuova tabella delle partizioni cancellerà tutti i dati esistenti sul disco. What kind of partition table do you want to create? Che tipo di tabella delle partizioni vuoi creare? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Tavola delle Partizioni GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Creare una nuova tabella delle partizioni %1 su %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creare una nuova tabella delle partizioni <strong>%1</strong> su <strong>%2</strong> (%3). Creating new %1 partition table on %2. Creazione della nuova tabella delle partizioni %1 su %2. The installer failed to create a partition table on %1. Il programma di installazione non è riuscito a creare una tabella delle partizioni su %1. Could not open device %1. Impossibile aprire il dispositivo %1. CreateUserJob Create user %1 Creare l'utente %1 Create user <strong>%1</strong>. Creare l'utente <strong>%1</strong> Creating user %1. Creazione utente %1. Sudoers dir is not writable. La cartella sudoers non è scrivibile. Cannot create sudoers file for writing. Impossibile creare il file sudoers in scrittura. Cannot chmod sudoers file. Impossibile eseguire chmod sul file sudoers. Cannot open groups file for reading. Impossibile aprire il file groups in lettura. Cannot create user %1. Impossibile creare l'utente %1. useradd terminated with error code %1. useradd si è chiuso con codice di errore %1. Cannot add user %1 to groups: %2. Impossibile aggiungere l'utente %1 ai gruppi: %2. usermod terminated with error code %1. usermod è terminato con codice di errore: %1. Cannot set home directory ownership for user %1. Impossibile impostare i diritti sulla cartella home per l'utente %1. chown terminated with error code %1. chown si è chiuso con codice di errore %1. DeletePartitionJob Delete partition %1. Cancellare la partizione %1. Delete partition <strong>%1</strong>. Cancellare la partizione <strong>%1</strong>. Deleting partition %1. Cancellazione partizione %1. The installer failed to delete partition %1. Il programma di installazione non è riuscito a cancellare la partizione %1. Partition (%1) and device (%2) do not match. La partizione (%1) ed il dispositivo (%2) non corrispondono. Could not open device %1. Impossibile aprire il dispositivo %1. Could not open partition table. Impossibile aprire la tabella delle partizioni. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Il tipo di <strong>tabella delle partizioni</strong> attualmente presente sul dispositivo di memoria selezionato.<br><br>L'unico modo per cambiare il tipo di tabella delle partizioni è quello di cancellarla e ricrearla da capo, distruggendo tutti i dati sul dispositivo.<br>Il programma di installazione conserverà l'attuale tabella a meno che no si scelga diversamente.<br>Se non si è sicuri, sui sistemi moderni si preferisce GPT. This device has a <strong>%1</strong> partition table. Questo dispositivo ha una tabella delle partizioni <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Questo è un dispositivo <strong>loop</strong>.<br><br>E' uno pseudo-dispositivo senza tabella delle partizioni che rende un file accessibile come block device. Questo tipo di configurazione contiene normalmente solo un singolo filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Il programma d'installazione <strong>non riesce a rilevare una tabella delle partizioni</strong> sul dispositivo di memoria selezionato.<br><br>Il dispositivo o non ha una tabella delle partizioni o questa è corrotta, oppure è di tipo sconosciuto.<br>Il programma può creare una nuova tabella delle partizioni, automaticamente o attraverso la sezione del partizionamento manuale. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Questo è il tipo raccomandato di tabella delle partizioni per i sistemi moderni che si avviano da un ambiente di boot <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Questo tipo di tabella delle partizioni è consigliabile solo su sistemi più vecchi che si avviano da un ambiente di boot <strong>BIOS</strong>. GPT è raccomandato nella maggior parte degli altri casi.<br><br><strong>Attenzione:</strong> la tabella delle partizioni MBR è uno standar obsoleto dell'era MS-DOS.<br>Solo 4 partizioni <em>primarie</em> possono essere create e di queste 4 una può essere una partizione <em>estesa</em>, che può a sua volta contenere molte partizioni <em>logiche</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Scrittura della configurazione LUKS per Dracut su %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Salto scrittura della configurazione LUKS per Dracut: la partizione "/" non è criptata Failed to open %1 Impossibile aprire %1 DummyCppJob Dummy C++ Job Processo Dummy C++ EditExistingPartitionDialog Edit Existing Partition Modifica la partizione esistente Content: Contenuto: &Keep &Mantenere Format Formattare Warning: Formatting the partition will erase all existing data. Attenzione: la formattazione della partizione cancellerà tutti i dati! &Mount Point: Punto di &Mount: Si&ze: Di&mensione: MiB Fi&le System: Fi&le System: Flags: Flag: Mountpoint already in use. Please select another one. Il punto di mount è già in uso. Sceglierne un altro. EncryptWidget Form Modulo En&crypt system Cr&iptare il sistema Passphrase Frase di accesso Confirm passphrase Confermare frase di accesso Please enter the same passphrase in both boxes. Si prega di immettere la stessa frase di accesso in entrambi i riquadri. FillGlobalStorageJob Set partition information Impostare informazioni partizione Install %1 on <strong>new</strong> %2 system partition. Installare %1 sulla <strong>nuova</strong> partizione di sistema %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Impostare la <strong>nuova</strong> %2 partizione con punto di mount <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Installare %2 sulla partizione di sistema %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Impostare la partizione %3 <strong>%1</strong> con punto di montaggio <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installare il boot loader su <strong>%1</strong>. Setting up mount points. Impostazione dei punti di mount. FinishedPage Form Modulo &Restart now &Riavviare ora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Tutto fatto.</ h1><br/>%1 è stato installato sul computer.<br/>Ora è possibile riavviare il sistema, o continuare a utilizzare l'ambiente Live di %2 . <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Termina Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formattare la partizione %1 (file system: %2, dimensioni: %3 MB) su %4 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formattare la partizione <strong>%1</strong> da <strong>%3MB</strong> con file system <strong>%2</strong>. Formatting partition %1 with file system %2. Formattazione della partizione %1 con file system %2. The installer failed to format partition %1 on disk '%2'. Il programma di installazione non è riuscito a formattare la partizione %1 sul disco '%2'. Could not open device '%1'. Impossibile aprire il dispositivo '%1'. Could not open partition table. Impossibile aprire la tabella delle partizioni. The installer failed to create file system on partition %1. Il programma di installazione non è riuscito a creare il file system sulla partizione %1. The installer failed to update partition table on disk '%1'. Il programma di installazione non è riuscito ad aggiornare la tabella delle partizioni sul disco '%1'. InteractiveTerminalPage Konsole not installed Konsole non installato Please install the kde konsole and try again! Si prega di installare kde konsole a riprovare! Executing script: &nbsp;<code>%1</code> Esecuzione script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Impostare il modello di tastiera a %1.<br/> Set keyboard layout to %1/%2. Impostare il layout della tastiera a %1%2. KeyboardViewStep Keyboard Tastiera LCLocaleDialog System locale setting Impostazioni di localizzazione del sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Le impostazioni di localizzazione del sistema influenzano la lingua e il set di caratteri per alcuni elementi di interfaccia da linea di comando. <br/>L'impostazione attuale è <strong>%1</strong>. &Cancel &OK LicensePage Form Modulo I accept the terms and conditions above. Accetto i termini e le condizioni sopra indicati. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Accordo di licenza</h1>Questa procedura di configurazione installerà software proprietario sottoposto a termini di licenza. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Leggere attentamente le licenze d'uso (EULA) riportate sopra.<br/>Se non ne accetti i termini, la procedura di configurazione non può proseguire. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Accordo di licenza</h1>Questa procedura di configurazione installerà software proprietario sottoposto a termini di licenza, per fornire caratteristiche aggiuntive e migliorare l'esperienza utente. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Si prega di leggere attentamente gli accordi di licenza dell'utente finale (EULA) riportati sopra.</br>Se non se ne accettano i termini, il software proprietario non verrà installato e al suo posto saranno utilizzate alternative open source. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>da %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 driver video</strong><br/><font color="Grey">da %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 plugin del browser</strong><br/><font color="Grey">da %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">da %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pacchetto</strong><br/><font color="Grey">da %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">da %2</font> <a href="%1">view license agreement</a> <a href="%1">vedi l'accordo di licenza</a> LicenseViewStep License Licenza LocalePage The system language will be set to %1. La lingua di sistema sarà impostata a %1. The numbers and dates locale will be set to %1. I numeri e le date locali saranno impostati a %1. Region: Area: Zone: Zona: &Change... &Cambia... Set timezone to %1/%2.<br/> Imposta il fuso orario a %1%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Caricamento dei dati di posizione... Location Posizione MoveFileSystemJob Move file system of partition %1. Spostare il file system della partizione %1. Could not open file system on partition %1 for moving. Impossibile aprire il file system della partizione %1 per lo spostamento. Could not create target for moving file system on partition %1. Impossibile creare la destinazione per lo spostamento del file system sulla partizione %1. Moving of partition %1 failed, changes have been rolled back. Lo spostamento della partizione %1 non è andato a buon fine, i cambiamenti sono stati annullati. Moving of partition %1 failed. Roll back of the changes have failed. Lo spostamento della partizione %1 non è andato a buon fine. L'annullamento dei cambiamenti non è andato a buon fine. Updating boot sector after the moving of partition %1 failed. L'aggiornamento del settore di avvio eseguito dopo lo spostamento della partizione %1 non è andato a buon fine. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Le dimensioni dei settori logici dell'origine e della destinazione non uguali per la copia. Attualmente ciò non è supportato. Source and target for copying do not overlap: Rollback is not required. Origine e destinazione per la copia non coincidono: non è necessario annullare i cambiamenti. Could not open device %1 to rollback copying. Impossibile aprire il dispositivo %1 per annullare la copia. NetInstallPage Name Nome Description Descrizione Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Installazione di rete. (Disabilitata: impossibile recuperare le liste dei pacchetti, controllare la connessione di rete) NetInstallViewStep Package selection Selezione del pacchetto Page_Keyboard Form Modulo Keyboard Model: Modello della tastiera: Type here to test your keyboard Digitare qui per provare la tastiera Page_UserSetup Form Modulo What is your name? Qual è il tuo nome? What name do you want to use to log in? Quale nome usare per l'autenticazione? font-weight: normal Dimensione font: normale <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Se più utenti useranno questo computer, puoi impostare altri account dopo l'installazione.</small> Choose a password to keep your account safe. Scegliere una password per rendere sicuro il tuo account. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Inserire la password due volte per controllare eventuali errori di battitura. Una buona password contiene lettere, numeri e segni di punteggiatura. Deve essere lunga almeno otto caratteri e dovrebbe essere cambiata a intervalli regolari.</small> What is the name of this computer? Qual è il nome di questo computer? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Questo nome sarà usato se rendi visibile il computer ad altre persone in una rete.</small> Log in automatically without asking for the password. Accedere automaticamente senza chiedere la password. Use the same password for the administrator account. Usare la stessa password per l'account amministratore. Choose a password for the administrator account. Scegliere una password per l'account dell'amministratore. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Inserire la password due volte per controllare eventuali errori di battitura.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system Sistema EFI Swap Swap New partition for %1 Nuova partizione per %1 New partition Nuova partizione %1 %2 %1 %2 PartitionModel Free Space Spazio disponibile New partition Nuova partizione Name Nome File System File System Mount Point Punto di mount Size Dimensione PartitionPage Form Modulo Storage de&vice: Dispositivo di me&moria: &Revert All Changes &Annulla tutte le modifiche New Partition &Table Nuova &Tabella delle partizioni &Create &Creare &Edit &Modificare &Delete &Cancellare Install boot &loader on: Installare il boot &loader su: Are you sure you want to create a new partition table on %1? Si è sicuri di voler creare una nuova tabella delle partizioni su %1? PartitionViewStep Gathering system information... Raccolta delle informazioni di sistema... Partitions Partizioni Install %1 <strong>alongside</strong> another operating system. Installare %1 <strong>a fianco</strong> di un altro sistema operativo. <strong>Erase</strong> disk and install %1. <strong>Cancellare</strong> il disco e installare %1. <strong>Replace</strong> a partition with %1. <strong>Sostituire</strong> una partizione con %1. <strong>Manual</strong> partitioning. Partizionamento <strong>manuale</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Installare %1 <strong>a fianco</strong> di un altro sistema operativo sul disco<strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Cancellare</strong> il disco <strong>%2</strong> (%3) e installa %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Sostituire</strong> una partizione sul disco <strong>%2</strong> (%3) con %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Partizionamento <strong>manuale</strong> sul disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1</strong> (%2) Current: Corrente: After: Dopo: No EFI system partition configured Nessuna partizione EFI di sistema è configurata An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Una partizione EFI di sistema è necessaria per avviare %1.<br/><br/>Per configurare una partizione EFI di sistema, tornare indietro e selezionare o creare un filesystem FAT32 con il flag <strong>esp</strong> abilitato e un punto di mount <strong>%2</strong>.<br/><br/>Si può continuare senza configurare una partizione EFI ma il sistema rischia di non avviarsi. EFI system partition flag not set Il flag della partizione EFI di sistema non è impostato. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Una partizione EFI di sistema è necessaria per avviare %1.<br/><br/>Una partizione è stata configurata con punto di mount <strong>%2</strong> ma il relativo flag <strong>esp</strong> non è impostato.<br/>Per impostare il flag, tornare indietro e modificare la partizione.<br/><br/>Si può continuare senza impostare il flag ma il sistema rischia di non avviarsi. Boot partition not encrypted Partizione di avvio non criptata A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. E' stata configurata una partizione di avvio non criptata assieme ad una partizione root criptata. <br/><br/>Ci sono problemi di sicurezza con questo tipo di configurazione perchè dei file di sistema importanti sono tenuti su una partizione non criptata.<br/>Si può continuare se lo si desidera ma dopo ci sarà lo sblocco del file system, durante l'avvio del sistema.<br/>Per criptare la partizione di avvio, tornare indietro e ricrearla, selezionando <strong>Criptare</strong> nella finestra di creazione della partizione. QObject Default Keyboard Model Modello tastiera di default Default Default unknown sconosciuto extended estesa unformatted non formattata swap swap Unpartitioned space or unknown partition table Spazio non partizionato o tabella delle partizioni sconosciuta ReplaceWidget Form Modulo Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Selezionare dove installare %1.<br/><font color="red">Attenzione: </font>questo eliminerà tutti i file dalla partizione selezionata. The selected item does not appear to be a valid partition. L'elemento selezionato non sembra essere una partizione valida. %1 cannot be installed on empty space. Please select an existing partition. %1 non può essere installato su spazio non partizionato. Si prega di selezionare una partizione esistente. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 non può essere installato su una partizione estesa. Si prega di selezionare una partizione primaria o logica esistente. %1 cannot be installed on this partition. %1 non può essere installato su questa partizione. Data partition (%1) Partizione dati (%1) Unknown system partition (%1) Partizione di sistema sconosciuta (%1) %1 system partition (%2) %1 partizione di sistema (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>La partizione %1 è troppo piccola per %2. Si prega di selezionare una partizione con capacità di almeno %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Nessuna partizione EFI di sistema rilevata. Si prega di tornare indietro e usare il partizionamento manuale per configurare %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 sarà installato su %2.<br/><font color="red">Attenzione: </font>tutti i dati sulla partizione %2 saranno persi. The EFI system partition at %1 will be used for starting %2. La partizione EFI di sistema a %1 sarà usata per avviare %2. EFI system partition: Partizione EFI di sistema: RequirementsChecker Gathering system information... Raccolta delle informazioni di sistema... has at least %1 GB available drive space ha almeno %1 GB di spazio disponibile There is not enough drive space. At least %1 GB is required. Non c'è spazio sufficiente sul dispositivo. E' richiesto almeno %1 GB. has at least %1 GB working memory ha almeno %1 GB di memoria The system does not have enough working memory. At least %1 GB is required. Il sistema non dispone di sufficiente memoria. E' richiesto almeno %1 GB. is plugged in to a power source è collegato a una presa di alimentazione The system is not plugged in to a power source. Il sistema non è collegato a una presa di alimentazione. is connected to the Internet è connesso a Internet The system is not connected to the Internet. Il sistema non è connesso a internet. The installer is not running with administrator rights. Il programma di installazione non è stato avviato con i diritti di amministrazione. The screen is too small to display the installer. Schermo troppo piccolo per mostrare il programma d'installazione. ResizeFileSystemJob Resize file system on partition %1. Ridimensionare il file system sulla partizione %1. Parted failed to resize filesystem. Parted non è riuscito a ridimensionare il filesystem. Failed to resize filesystem. Impossibile ridimensionare il filesystem. ResizePartitionJob Resize partition %1. Ridimensionare la partizione %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Ridimensionare la partizione <strong>%1</strong> da <strong>%2MB</strong> a <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Ridimensionamento della partizione %1 da %2MB a %3MB. The installer failed to resize partition %1 on disk '%2'. Il programma di installazione non è riuscito a ridimensionare la partizione %1 sul disco '%2'. Could not open device '%1'. Non riesco ad aprire il dispositivo '%1'. ScanningDialog Scanning storage devices... Rilevamento dei dispositivi di memoria... Partitioning Partizionamento SetHostNameJob Set hostname %1 Impostare hostname %1 Set hostname <strong>%1</strong>. Impostare hostname <strong>%1</strong>. Setting hostname %1. Impostare hostname %1. Internal Error Errore interno Cannot write hostname to target system Impossibile scrivere l'hostname nel sistema di destinazione SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Imposta il modello di tastiera a %1, con layout %2-%3 Failed to write keyboard configuration for the virtual console. Impossibile scrivere la configurazione della tastiera per la console virtuale. Failed to write to %1 Impossibile scrivere su %1 Failed to write keyboard configuration for X11. Impossibile scrivere la configurazione della tastiera per X11. Failed to write keyboard configuration to existing /etc/default directory. Impossibile scrivere la configurazione della tastiera nella cartella /etc/default. SetPartFlagsJob Set flags on partition %1. Impostare i flag sulla partizione: %1. Set flags on %1MB %2 partition. Impostare i flag sulla partizione %1MB %2. Set flags on new partition. Impostare i flag sulla nuova partizione. Clear flags on partition <strong>%1</strong>. Rimuovere i flag sulla partizione <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Rimuovere i flag dalla partizione %1MB <strong>%2</strong>. Clear flags on new partition. Rimuovere i flag dalla nuova partizione. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag di partizione <strong>%1</strong> come <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag di partizione %1MB <strong>%2</strong> come <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Flag della nuova partizione come <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Rimozione dei flag sulla partizione <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Rimozione del flag dalla partizione %1MB <strong>%2</strong>. Clearing flags on new partition. Rimozione dei flag dalla nuova partizione. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Impostazione dei flag <strong>%2</strong> sulla partizione <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Impostazione dei flag <strong>%3</strong> sulla partizione %1MB <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Impostazione dei flag <strong>%1</strong> sulla nuova partizione. The installer failed to set flags on partition %1. Impossibile impostare i flag sulla partizione %1. Could not open device '%1'. Impossibile accedere al dispositivo '%1'. Could not open partition table on device '%1'. Impossibile accedere alla tabella delle partizioni sul dispositivo '%1'. Could not find partition '%1'. Impossibile trovare la partizione '%1'. SetPartGeometryJob Update geometry of partition %1. Aggiornare la struttura della partizione %1. Failed to change the geometry of the partition. Impossibile cambiare la struttura della partizione. SetPasswordJob Set password for user %1 Impostare la password per l'utente %1 Setting password for user %1. Impostare la password per l'utente %1. Bad destination system path. Percorso di destinazione del sistema errato. rootMountPoint is %1 punto di mount per root è %1 Cannot disable root account. Impossibile disabilitare l'account di root. passwd terminated with error code %1. passwd è terminato con codice di errore %1. Cannot set password for user %1. Impossibile impostare la password per l'utente %1. usermod terminated with error code %1. usermod si è chiuso con codice di errore %1. SetTimezoneJob Set timezone to %1/%2 Impostare il fuso orario su %1%2 Cannot access selected timezone path. Impossibile accedere al percorso della timezone selezionata. Bad path: %1 Percorso errato: %1 Cannot set timezone. Impossibile impostare il fuso orario. Link creation failed, target: %1; link name: %2 Impossibile creare il link, destinazione: %1; nome del link: %2 Cannot set timezone, Impossibile impostare il fuso orario, Cannot open /etc/timezone for writing Impossibile aprire il file /etc/timezone in scrittura SummaryPage This is an overview of what will happen once you start the install procedure. Una panoramica delle modifiche che saranno effettuate una volta avviata la procedura di installazione. SummaryViewStep Summary Riepilogo UsersPage Your username is too long. Il nome utente è troppo lungo. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Il nome utente contiene caratteri non validi. Sono ammessi solo lettere minuscole e numeri. Your hostname is too short. Hostname è troppo corto. Your hostname is too long. Hostname è troppo lungo. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Hostname contiene caratteri non validi. Sono ammessi solo lettere, numeri e trattini. Your passwords do not match! Le password non corrispondono! UsersViewStep Users Utenti WelcomePage Form Modulo &Language: &Lingua: &Release notes &Note di rilascio &Known issues &Problemi conosciuti &Support &Supporto &About &Informazioni su <h1>Welcome to the %1 installer.</h1> <h1>Benvenuto nel programma d'installazione di %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Benvenuti nel programma di installazione Calamares per %1.</h1> About %1 installer Informazioni sul programma di installazione %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support supporto %1 WelcomeViewStep Welcome Benvenuti calamares-3.1.12/lang/calamares_ja.ts000066400000000000000000004077251322271446000174410ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. このシステムの <strong>ブート環境。</strong><br><br>古いx86システムは<strong>BIOS</strong>のみサポートしています。<br>最近のシステムは通常<strong>EFI</strong>を使用しますが、互換モードが起動できる場合はBIOSが現れる場合もあります。 This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. このシステムは<strong>EFI</strong> ブート環境で起動しました。<br><br>EFI環境からの起動について設定するためには、<strong>EFI システムパーティション</strong>に <strong>GRUB</strong> あるいは <strong>systemd-boot</strong> といったブートローダーアプリケーションを配置しなければなりません。手動によるパーティショニングを選択する場合、EFI システムパーティションを選択あるいは作成しなければなりません。そうでない場合は、この操作は自動的に行われます。 This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. このシステムは <strong>BIOS</strong> ブート環境で起動しました。<br><br> BIOS環境からの起動について設定するためには、パーティションの開始位置あるいはパーティションテーブルの開始位置の近く(推奨)にある<strong>マスターブートレコード</strong>に <strong>GRUB</strong> のようなブートローダーをインストールしなければなりません。手動によるパーティショニングを選択する場合はユーザー自身で設定しなければなりません。そうでない場合は、この操作は自動的に行われます。 BootLoaderModel Master Boot Record of %1 %1 のマスターブートレコード Boot Partition ブートパーティション System Partition システムパーティション Do not install a boot loader ブートローダーをインストールしません %1 (%2) %1 (%2) Calamares::DebugWindow Form Form GlobalStorage グローバルストレージ JobQueue ジョブキュー Modules モジュール Type: Type: none なし Interface: インターフェース: Tools ツール Debug information デバッグ情報 Calamares::ExecutionViewStep Install インストール Calamares::JobThread Done 完了 Calamares::ProcessJob Run command %1 %2 コマンド %1 %2 を実行 Running command %1 %2 コマンド %1 %2 を実行中 External command crashed 外部コマンドのクラッシュ Command %1 crashed. Output: %2 コマンド %1 がクラッシュ 出力: %2 External command failed to start 外部コマンドの開始に失敗 Command %1 failed to start. コマンド %1 の開始に失敗 Internal error when starting command コマンド開始時における内部エラー Bad parameters for process job call. ジョブ呼び出しにおける不正なパラメータ External command failed to finish 外部コマンドの完了に失敗 Command %1 failed to finish in %2s. Output: %3 %2s においてコマンド %1 が完了に失敗しました。 出力: %3 External command finished with errors 外部コマンドでエラー Command %1 finished with exit code %2. Output: %3 コマンド %1 がコード %2 によって終了 出力: %3 Calamares::PythonJob Running %1 operation. %1 操作を実行中。 Bad working directory path 不正なワーキングディレクトリパス Working directory %1 for python job %2 is not readable. python ジョブ %2 において作業ディレクトリ %1 が読み込めません。 Bad main script file 不正なメインスクリプトファイル Main script file %1 for python job %2 is not readable. python ジョブ %2 におけるメインスクリプトファイル %1 が読み込めません。 Boost.Python error in job "%1". ジョブ "%1" での Boost.Python エラー。 Calamares::ViewManager &Back 戻る(&B) &Next 次へ(&N) &Cancel 中止(&C) Cancel installation without changing the system. システムを変更しないでインストールを中止します。 Cancel installation? インストールを中止しますか? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 本当に現在の作業を中止しますか? すべての変更が取り消されます。 &Yes はい(&Y) &No いいえ(&N) &Close 閉じる(&C) Continue with setup? セットアップを続行しますか? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 インストーラーは %2 をインストールするためにディスクの内容を変更しようとします。<br/><strong>これらの変更は取り消しできなくなります。</strong> &Install now 今すぐインストール(&I) Go &back 戻る(&B) &Done 実行(&D) The installation is complete. Close the installer. インストールが完了しました。インストーラーを閉じます。 Error エラー Installation Failed インストールに失敗 CalamaresPython::Helper Unknown exception type 不明な例外型 unparseable Python error 解析不能なPythonエラー unparseable Python traceback 解析不能な Python トレースバック Unfetchable Python error. 取得不能なPythonエラー。 CalamaresWindow %1 Installer %1 インストーラー Show debug information デバッグ情報を表示 CheckFileSystemJob Checking file system on partition %1. パーティション %1 のファイルシステムをチェック中。 The file system check on partition %1 failed. %1 ファイルシステムのチェックに失敗しました。 CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> このコンピュータは %1 をインストールするための最低要件を満たしていません。<br/>インストールは続行できません。<a href="#details">詳細...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. このコンピュータは、 %1 をインストールするための推奨条件をいくつか満たしていません。<br/>インストールは続行しますが、一部の機能が無効になる場合があります。 This program will ask you some questions and set up %2 on your computer. このプログラムはあなたにいくつか質問をして、コンピュータ上で %2 を設定します。 For best results, please ensure that this computer: 良好な結果を得るために、このコンピュータについて以下の項目を確認してください: System requirements システム要件 ChoicePage Form フォーム After: 後: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>手動パーティション</strong><br/>パーティションの作成、あるいはサイズ変更を行うことができます。 Boot loader location: ブートローダーの場所: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 は %2 MB に縮小され、新しい %3 MB のパーティションが %4 のために作成されます。 Select storage de&vice: ストレージデバイスを選択(&V): Current: 現在: Reuse %1 as home partition for %2. %1 を %2 のホームパーティションとして再利用する <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>縮小するパーティションを選択し、下のバーをドラッグしてサイズを変更して下さい</strong> <strong>Select a partition to install on</strong> <strong>インストールするパーティションの選択</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. システムにEFIシステムパーティションが存在しません。%1 のセットアップのため、元に戻り、手動パーティショニングを使用してください。 The EFI system partition at %1 will be used for starting %2. %1 上のEFIシステムパーテイションは %2 のスタートに使用されます。 EFI system partition: EFI システムパーティション: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. このストレージデバイスは、オペレーティングシステムを持っていないようです。どうしますか?<br/>ストレージデバイスに対する変更が実施される前に、変更点をレビューし、確認することができます。 <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>ディスクの消去</strong><br/>選択したストレージデバイス上のデータがすべて <font color="red">削除</font>されます。 This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. このストレージデバイスは %1 を有しています。どうしますか?<br/>ストレージデバイスに対する変更が実施される前に、変更点をレビューし、確認することができます。 <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>共存してインストール</strong><br/>インストーラは %1 用の空きスペースを確保するため、パーティションを縮小します。 <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>パーティションの置換</strong><br/>パーティションを %1 に置き換えます。 This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. この記憶装置は、すでにオペレーティングシステムが存在します。どうしますか?<br/>ストレージデバイスに対する変更が実施される前に、変更点をレビューし、確認することができます。 This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. このストレージデバイスには、複数のオペレーティングシステムが存在します。どうしますか?<br />ストレージデバイスに対する変更が実施される前に、変更点をレビューし、確認することができます。 ClearMountsJob Clear mounts for partitioning operations on %1 %1 のパーティション操作のため、マウントを解除 Clearing mounts for partitioning operations on %1. %1 のパーティション操作のため、マウントを解除中 Cleared all mounts for %1 %1 のすべてのマウントを解除 ClearTempMountsJob Clear all temporary mounts. すべての一時的なマウントをクリア Clearing all temporary mounts. すべての一時的なマウントをクリアしています。 Cannot get list of temporary mounts. 一時的なマウントのリストを取得できません。 Cleared all temporary mounts. すべての一時的なマウントを解除しました。 CreatePartitionDialog Create a Partition パーティションの生成 MiB MiB Partition &Type: パーティションの種類(&T): &Primary プライマリ(&P) E&xtended 拡張(&x) Fi&le System: ファイルシステム (&L): Flags: フラグ: &Mount Point: マウントポイント(&M) Si&ze: サイズ(&Z) En&crypt 暗号化(&C) Logical 論理 Primary プライマリ GPT GPT Mountpoint already in use. Please select another one. マウントポイントは既に使用されています。他を選択してください。 CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. ファイルシステム %1 で %4 (%3) 上に新しく%2 MBのパーティションを作成 Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. ファイルシステム %1で <strong>%4</strong> (%3) 上に新しく<strong>%2MB</strong>のパーティションを作成 Creating new %1 partition on %2. %2 上に新しく %1 パーティションを作成中 The installer failed to create partition on disk '%1'. インストーラーはディスク '%1' にパーティションを作成することに失敗しました。 Could not open device '%1'. デバイス '%1' を開けませんでした。 Could not open partition table. パーティションテーブルを開くことができませんでした。 The installer failed to create file system on partition %1. インストーラーは %1 パーティション上でのファイルシステムの作成に失敗しました。 The installer failed to update partition table on disk '%1'. インストーラーはディスク '%1' 上にあるパーティションテーブルの更新に失敗しました。 CreatePartitionTableDialog Create Partition Table パーティションテーブルの作成 Creating a new partition table will delete all existing data on the disk. パーティションテーブルを作成することによって、ディスク上のデータがすべて削除されます。 What kind of partition table do you want to create? どの種類のパーティションテーブルを作成しますか? Master Boot Record (MBR) マスターブートレコード (MBR) GUID Partition Table (GPT) GUID パーティションテーブル(GPT) CreatePartitionTableJob Create new %1 partition table on %2. %2 上に新しく %1 パーティションテーブルを作成 Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). <strong>%2</strong> (%3) 上に新しく <strong>%1</strong> パーティションテーブルを作成 Creating new %1 partition table on %2. %2 上に新しく %1 パーティションテーブルを作成中 The installer failed to create a partition table on %1. インストーラーは%1 上でのパーティションテーブルの作成に失敗しました。 Could not open device %1. デバイス %1 を開けませんでした。 CreateUserJob Create user %1 ユーザー %1 を作成 Create user <strong>%1</strong>. ユーザー <strong>%1</strong> を作成。 Creating user %1. ユーザー %1 を作成中。 Sudoers dir is not writable. sudoers ディレクトリは書き込み可能ではありません。 Cannot create sudoers file for writing. sudoersファイルを作成できません。 Cannot chmod sudoers file. sudoersファイルの権限を変更できません。 Cannot open groups file for reading. groups ファイルを読み込めません。 Cannot create user %1. ユーザー %1 を作成できません。 useradd terminated with error code %1. エラーコード %1 によりuseraddを中止しました。 Cannot add user %1 to groups: %2. ユーザー %1 をグループに追加することができません。: %2 usermod terminated with error code %1. エラーコード %1 によりusermodが停止しました。 Cannot set home directory ownership for user %1. ユーザー %1 のホームディレクトリの所有者を設定できません。 chown terminated with error code %1. エラーコード %1 によりchown は中止しました。 DeletePartitionJob Delete partition %1. パーティション %1 の削除 Delete partition <strong>%1</strong>. パーティション <strong>%1</strong> の削除 Deleting partition %1. パーティション %1 の削除中。 The installer failed to delete partition %1. インストーラーはパーティション %1 の削除に失敗しました。 Partition (%1) and device (%2) do not match. パーティション (%1) とデバイス (%2) が適合しません。 Could not open device %1. デバイス %1 を開けませんでした。 Could not open partition table. パーティションテーブルを開くことができませんでした。 DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. 選択したストレージデバイスにおける<strong> パーティションテーブル </strong> の種類。 <br><br> パーティションテーブルの種類を変更する唯一の方法は、パーティションテーブルを消去し、最初から再作成を行うことですが、この操作はストレージ上の全てのデータを破壊します。 <br> このインストーラーは、他の種類へ明示的に変更ししない限り、現在のパーティションテーブルが保持されます。よくわからない場合、最近のシステムではGPTが推奨されます。 This device has a <strong>%1</strong> partition table. このデバイスのパーティションテーブルは <strong>%1</strong> です。 This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. このデバイスは<strong>ループ</strong> デバイスです。<br><br> ブロックデバイスとしてふるまうファイルを作成する、パーティションテーブルを持たない仮想デバイスです。このセットアップの種類は通常単一のファイルシステムで構成されます。 This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. インストーラが、選択したストレージデバイス上の<strong>パーティションテーブルを検出することができません。</strong><br><br>デバイスにはパーティションテーブルが存在しないか、パーティションテーブルが未知のタイプまたは破損しています。<br>このインストーラーでは、自動であるいは、パーティションページによって手動で、新しいパーティションテーブルを作成することができます。 <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>これは <strong>EFI</ strong> ブート環境から起動する現在のシステムで推奨されるパーティションテーブルの種類です。 <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>このパーティションテーブルの種類は<strong>BIOS</strong> ブート環境から起動する古いシステムにおいてのみ望ましいものです。他の多くの場合ではGPTが推奨されます。<br><br><strong>警告:</strong> MBR パーティションテーブルは時代遅れのMS-DOS時代の標準です。<br>わずか 4 つだけの<em>プライマリ</em>パーティションが作成され、そのうち1つについては、多くの<em>論理</em>パーティションを含む<em>拡張</em>パーティションにすることができます。 DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Dracut のためのLUKS設定を %1 に書き込む Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Dracut のためのLUKS設定の書き込みをスキップ: "/" パーティションは暗号化されません。 Failed to open %1 %1 を開くのに失敗しました DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition パーティションの編集 Content: 内容: &Keep 保持(&K) Format フォーマット Warning: Formatting the partition will erase all existing data. 警告: パーティションのフォーマットはすべてのデータを消去します。 &Mount Point: マウントポイント(&M) Si&ze: サイズ(&Z): MiB MiB Fi&le System: ファイルシステム(&L) Flags: フラグ: Mountpoint already in use. Please select another one. マウントポイントは既に使用されています。他を選択してください。 EncryptWidget Form フォーム En&crypt system システムを暗号化(&C) Passphrase パスフレーズ Confirm passphrase パスフレーズの確認 Please enter the same passphrase in both boxes. 両方のボックスに同じパスフレーズを入力してください。 FillGlobalStorageJob Set partition information パーティション情報の設定 Install %1 on <strong>new</strong> %2 system partition. <strong>新しい</strong> %2 システムパーティションに %1 をインストール。 Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. マウントポイント <strong>%1</strong> に <strong>新しい</strong> %2 パーティションをセットアップ。 Install %2 on %3 system partition <strong>%1</strong>. %3 システムパーティション <strong>%1</strong> に%2 をインストール。 Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. パーティション <strong>%1</strong> マウントポイント <strong>%2</strong> に %3 をセットアップ。 Install boot loader on <strong>%1</strong>. <strong>%1</strong> にブートローダーをインストール Setting up mount points. マウントポイントの設定。 FinishedPage Form フォーム &Restart now 今すぐ再起動(&R) <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>すべて完了しました。</h1><br/>%1 はコンピュータにインストールされました。<br/>再起動して新しいシステムを立ち上げるか、%2 Live環境を使用し続けることができます。 <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>インストールに失敗しました</h1><br/>%1 はコンピュータにインストールされませんでした。<br/>エラーメッセージ: %2. FinishedViewStep Finish 終了 Installation Complete インストールが完了 The installation of %1 is complete. %1 のインストールは完了です。 FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. %4 上でパーティション %1 (ファイルシステム: %2, サイズ: %3 MB) のフォーマット Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. <strong>%3MB</strong> パーティション <strong>%1</strong> をファイルシステム<strong>%2</strong>でフォーマット。 Formatting partition %1 with file system %2. ファイルシステム %2 でパーティション %1 をフォーマット中。 The installer failed to format partition %1 on disk '%2'. インストーラーはディスク '%2' 上のパーティション %1 のフォーマットに失敗しました。 Could not open device '%1'. デバイス '%1' を開けませんでした。 Could not open partition table. パーティションテーブルを開くことができませんでした。 The installer failed to create file system on partition %1. インストラーは %1 パーティションにシステムを作成することに失敗しました。 The installer failed to update partition table on disk '%1'. インストーラーはディスク '%1' 上のパーティションテーブルのアップデートに失敗しました。 InteractiveTerminalPage Konsole not installed Konsoleがインストールされていません Please install the kde konsole and try again! kde konsoleをインストールして、再度試してください! Executing script: &nbsp;<code>%1</code> スクリプトの実行: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script スクリプト KeyboardPage Set keyboard model to %1.<br/> キーボードのモデルを %1 に設定。<br/> Set keyboard layout to %1/%2. キーボードのレイアウトを %1/%2 に設定。 KeyboardViewStep Keyboard キーボード LCLocaleDialog System locale setting システムのロケールの設定 The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. システムロケールの設定はコマンドラインやインターフェース上での言語や文字の表示に影響をおよぼします。<br/>現在の設定 <strong>%1</strong>. &Cancel 中止(&C) &OK 了解(&O) LicensePage Form フォーム I accept the terms and conditions above. 上記の項目及び条件に同意します。 <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>ライセンス契約条項</h1> このセットアップはライセンス条項に従うことが必要なプロプライエタリなソフトウェアをインストールします。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. 上記のエンドユーザーライセンス条項 (EULAs) を確認してください。<br/>もしライセンス条項に同意できない場合、セットアップを続行することはできません。 <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>ライセンス契約条項</h1> このセットアップは、機能を追加し、ユーザーの使いやすさを向上させるために、ライセンス条項に従うことが必要なプロプライエタリなソフトウェアをインストールします。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. 上記のエンドユーザーライセンス条項 (EULAs) を確認してください。<br/>もしライセンス条項に同意できない場合、プロプライエタリなソフトウェアはインストールされず、代わりにオープンソースのソフトウェアが使用されます。 <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 ドライバー</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 グラフィックドライバー</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 ブラウザプラグイン</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 パッケージ</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> <a href="%1">ライセンスへの同意</a> LicenseViewStep License ライセンス LocalePage The system language will be set to %1. システムの言語が %1 に設定されます。 The numbers and dates locale will be set to %1. 数字と日付のロケールが %1 に設定されます。 Region: 地域: Zone: ゾーン: &Change... 変更(&C)... Set timezone to %1/%2.<br/> タイムゾーンを %1/%2 に設定。<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... ロケーションデータをロード中... Location ロケーション MoveFileSystemJob Move file system of partition %1. パーティション %1 のファイルシステムを移動 Could not open file system on partition %1 for moving. パーティション %1 のファイルシステムを開けませんでした。 Could not create target for moving file system on partition %1. パーティション %1 上のファイルシステムを移動させるためのターゲットを作成できませんでした。 Moving of partition %1 failed, changes have been rolled back. パーティション %1 の移動に失敗しました。変更は取り消されます。 Moving of partition %1 failed. Roll back of the changes have failed. パーティション %1 の移動に失敗しました。変更からのロールバックに失敗しました。 Updating boot sector after the moving of partition %1 failed. パーティション %1 の移動後のブートセクターの更新に失敗しました。 The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. ソースとターゲットの論理セクタサイズが異なります。これは現在サポートされていません。 Source and target for copying do not overlap: Rollback is not required. コピーのためのソースとターゲットは領域が重なりません。ロールバックを行う必要はありません。 Could not open device %1 to rollback copying. ロールバック用のデバイス %1 を開く事ができませんでした。 NetInstallPage Name 名前 Description 説明 Network Installation. (Disabled: Unable to fetch package lists, check your network connection) ネットワークインストール。(無効: パッケージリストを取得できません。ネットワーク接続を確認してください。) NetInstallViewStep Package selection パッケージの選択 Page_Keyboard Form フォーム Keyboard Model: キーボードモデル: Type here to test your keyboard ここでタイプしてキーボードをテストしてください Page_UserSetup Form フォーム What is your name? 名前は何ですか? What name do you want to use to log in? ログインの際、どの名前を使用しますか? font-weight: normal フォントウェイト: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>もし複数の人間がこのコンピュータを使用する場合、インストールの後で複数のアカウントのセットアップを行うことができます。</small> Choose a password to keep your account safe. アカウントを安全に使うため、パスワードを選択してください <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> 確認のため、同じパスワードを二回入力して下さい。最低8字で、文字・数値・句読点を含めれば、強いパスワードになります。また、パスワードを定期的に変更することを変更してください。 What is the name of this computer? このコンピュータの名前は何ですか? <small>This name will be used if you make the computer visible to others on a network.</small> <small>ネットワーク上からコンピュータが見えるようにする場合、この名前が使用されます。</small> Log in automatically without asking for the password. パスワードを尋ねずに自動的にログインする。 Use the same password for the administrator account. 管理者アカウントと同じパスワードを使用する。 Choose a password for the administrator account. 管理者アカウントのパスワードを選択する。 <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>入力ミスを確認することができるように、同じパスワードを 2 回入力します。</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI システム Swap スワップ New partition for %1 新しいパーティション %1 New partition 新しいパーティション %1 %2 %1 %2 PartitionModel Free Space 空き領域 New partition 新しいパーティション Name 名前 File System ファイルシステム Mount Point マウントポイント Size サイズ PartitionPage Form フォーム Storage de&vice: ストレージデバイス (&V): &Revert All Changes すべての変更を元に戻す (&R) New Partition &Table 新しいパーティションテーブル(&T) &Create 作成(&C) &Edit 編集(&E) &Delete 削除(&D) Install boot &loader on: ブートローダーインストール先 (&L): Are you sure you want to create a new partition table on %1? %1 上で新しいパーティションテーブルを作成します。よろしいですか? PartitionViewStep Gathering system information... システム情報を取得中... Partitions パーティション Install %1 <strong>alongside</strong> another operating system. 他のオペレーティングシステムに<strong>共存して</strong> %1 をインストール。 <strong>Erase</strong> disk and install %1. ディスクを<strong>消去</strong>し %1 をインストール。 <strong>Replace</strong> a partition with %1. パーティションを %1 に<strong>置き換える。</strong> <strong>Manual</strong> partitioning. <strong>手動</strong>でパーティションを設定する。 Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). ディスク <strong>%2</strong> (%3) 上ののオペレーティングシステムと<strong>共存</strong>して %1 をインストール。 <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. ディスク <strong>%2</strong> (%3) を<strong>消去して</strong> %1 をインストール。 <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. ディスク <strong>%2</strong> (%3) 上のパーティションを %1 に<strong>置き換える。</strong> <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). ディスク <strong>%1</strong> (%2) 上で <strong>手動で</strong>パーティショニングする。 Disk <strong>%1</strong> (%2) ディスク <strong>%1</strong> (%2) Current: 現在: After: 変更後: No EFI system partition configured EFI システムパーティションが設定されていません An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. %1 を起動するためにはEFI システムパ ーティションが必要です。<br/><br/> EFI システムパーティションを設定するためには、元に戻って、マウントポイント<strong>%2</strong>で<strong>esp</strong>フラグを設定したFAT32ファイルシステムを選択するか作成します。<br/><br/>EFI システムパ ーティションの設定をせずに続行することはできますが、その場合はシステムの起動に失敗することになるかもしれません。 EFI system partition flag not set EFI システムパーティションのフラグが設定されていません An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. %1 を起動するためにはEFI システムパ ーティションが必要です。<br/><br/>パーティションはマウントポイント<strong>%2</strong>に設定されていますが、<strong>esp</strong> フラグが設定されていません。<br/>フラグを設定するには、元に戻ってパーティションを編集してください。<br/><br/>フラグの設定をせずに続けることはできますが、その場合、システムの起動に失敗することになるかもしれません。 Boot partition not encrypted ブートパーティションが暗号化されていません A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. ブートパーティションは暗号化されたルートパーティションとともにセットアップされましたが、ブートパーティションは暗号化されていません。<br/><br/>重要なシステムファイルが暗号化されていないパーティションに残されているため、このようなセットアップは安全上の懸念があります。<br/>セットアップを続行することはできますが、後でシステムの起動中にファイルシステムが解除されるおそれがあります。<br/>ブートパーティションを暗号化させるには、前の画面に戻って、再度パーティションを作成し、パーティション作成ウィンドウ内で<strong>Encrypt</strong>(暗号化)を選択してください。 QObject Default Keyboard Model デフォルトのキーボードモデル Default デフォルト unknown 不明 extended 拡張 unformatted 未フォーマット swap スワップ Unpartitioned space or unknown partition table パーティションされていない領域または未知のパーティションテーブル ReplaceWidget Form フォーム Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. %1 をインストールする場所を選択します。<br/><font color="red">警告: </font>選択したパーティション内のすべてのファイルが削除されます。 The selected item does not appear to be a valid partition. 選択した項目は有効なパーティションではないようです。 %1 cannot be installed on empty space. Please select an existing partition. %1 は空き領域にインストールすることはできません。既存のパーティションを選択してください。 %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 は拡張パーティションにインストールできません。既存のプライマリまたは論理パーティションを選択してください。 %1 cannot be installed on this partition. %1 はこのパーティションにインストールできません。 Data partition (%1) データパーティション (%1) Unknown system partition (%1) 不明なシステムパーティション (%1) %1 system partition (%2) %1 システムパーティション (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>パーティション %1 は、%2 には小さすぎます。少なくとも %3 GB 以上のパーティションを選択してください。 <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>EFI システムパーティションがシステムに見つかりません。%1 を設定するために一旦戻って手動パーティショニングを使用してください。 <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 は %2 にインストールされます。<br/><font color="red">警告: </font>パーティション %2 のすべてのデータは失われます。 The EFI system partition at %1 will be used for starting %2. %1 上の EFI システムパーティションは %2 開始時に使用されます。 EFI system partition: EFI システムパーティション: RequirementsChecker Gathering system information... システム情報を取得中... has at least %1 GB available drive space 最低 %1 GBのディスク空き領域があること There is not enough drive space. At least %1 GB is required. 十分なドライブ容量がありません。少なくとも %1 GB 必要です。 has at least %1 GB working memory 最低 %1 GB のワーキングメモリーがあること The system does not have enough working memory. At least %1 GB is required. システムには十分なワーキングメモリがありません。少なくとも %1 GB 必要です。 is plugged in to a power source 電源が接続されていること The system is not plugged in to a power source. システムに電源が接続されていません。 is connected to the Internet インターネットに接続されていること The system is not connected to the Internet. システムはインターネットに接続されていません。 The installer is not running with administrator rights. インストーラーは管理者権限で実行されていません。 The screen is too small to display the installer. インストーラーを表示するためには、画面が小さすぎます。 ResizeFileSystemJob Resize file system on partition %1. パーティション %1 でのファイルシステムのリサイズ Parted failed to resize filesystem. Partedは、ファイルシステムのリサイズに失敗しました。 Failed to resize filesystem. ファイルシステムリサイズに失敗しました。 ResizePartitionJob Resize partition %1. パーティション %1 のサイズを変更する。 Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. <strong>%2MB</strong> のパーティション <strong>%1</strong> を<strong>%3MB</strong> にサイズを変更。 Resizing %2MB partition %1 to %3MB. %2MB のパーティション %1 を %3MB にサイズ変更中。 The installer failed to resize partition %1 on disk '%2'. インストーラが、ディスク '%2' でのパーティション %1 のリサイズに失敗しました。 Could not open device '%1'. デバイス '%1' を開けませんでした。 ScanningDialog Scanning storage devices... ストレージデバイスのスキャン中... Partitioning パーティショニング中 SetHostNameJob Set hostname %1 ホスト名 %1 の設定 Set hostname <strong>%1</strong>. ホスト名 <strong>%1</strong> の設定。 Setting hostname %1. ホスト名 %1 の設定中。 Internal Error 内部エラー Cannot write hostname to target system ターゲットとするシステムにホスト名を書き込めません SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 キーボードのモデルを %1 に、レイアウトを %2-%3に設定 Failed to write keyboard configuration for the virtual console. 仮想コンソールでのキーボード設定の書き込みに失敗しました。 Failed to write to %1 %1 への書き込みに失敗しました Failed to write keyboard configuration for X11. X11 のためのキーボード設定の書き込みに失敗しました。 Failed to write keyboard configuration to existing /etc/default directory. 現存する /etc/default ディレクトリへのキーボード設定の書き込みに失敗しました。 SetPartFlagsJob Set flags on partition %1. パーティション %1 にフラグを設定。 Set flags on %1MB %2 partition. %1MB %2 パーティション上にフラグを設定。 Set flags on new partition. 新しいパーティション上にフラグを設定。 Clear flags on partition <strong>%1</strong>. パーティション <strong>%1</strong> 上のフラグを消去。 Clear flags on %1MB <strong>%2</strong> partition. %1MB <strong>%2</strong> パーティション上のフラグを消去。 Clear flags on new partition. 新しいパーティション上のフラグを消去。 Flag partition <strong>%1</strong> as <strong>%2</strong>. パーティション <strong>%1</strong> を<strong>%2</strong>のフラグとして設定。 Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. %1MB <strong>%2</strong> パーティションに <strong>%3</strong> のフラグを設定。 Flag new partition as <strong>%1</strong>. 新しいパーティションに <strong>%1</strong>のフラグを設定。 Clearing flags on partition <strong>%1</strong>. パーティション <strong>%1</strong> 上のフラグを消去中。 Clearing flags on %1MB <strong>%2</strong> partition. %1MB <strong>%2</strong> パーティション上のフラグを消去しています。 Clearing flags on new partition. 新しいパーティション上のフラグを消去しています。 Setting flags <strong>%2</strong> on partition <strong>%1</strong>. パーティション <strong>%1</strong> 上に フラグ<strong>%2</strong>を設定。 Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. %1MB <strong>%2</strong> パーティション上に <strong>%3</strong> フラグを設定しています。 Setting flags <strong>%1</strong> on new partition. 新しいパーティション上に <strong>%1</strong> フラグを設定しています。 The installer failed to set flags on partition %1. インストーラーはパーティション %1 上のフラグの設定に失敗しました。 Could not open device '%1'. デバイス '%1' を開けませんでした。 Could not open partition table on device '%1'. デバイス '%1' 上のパーティションテーブルを開けませんでした。 Could not find partition '%1'. パーティション '%1' が見つかりませんでした。 SetPartGeometryJob Update geometry of partition %1. パーティション %1 のジオメトリーの更新 Failed to change the geometry of the partition. パーティションのジオメトリーの変更に失敗しました。 SetPasswordJob Set password for user %1 ユーザ %1 のパスワード設定 Setting password for user %1. ユーザ %1 のパスワード設定中。 Bad destination system path. 不正なシステムパス。 rootMountPoint is %1 root のマウントポイントは %1 。 Cannot disable root account. rootアカウントを使用することができません。 passwd terminated with error code %1. passwd がエラーコード %1 のため終了しました。 Cannot set password for user %1. ユーザ %1 のパスワードは設定できませんでした。 usermod terminated with error code %1. エラーコード %1 によりusermodが停止しました。 SetTimezoneJob Set timezone to %1/%2 タイムゾーンを %1/%2 に設定 Cannot access selected timezone path. 選択したタイムゾーンのパスにアクセスできません。 Bad path: %1 不正なパス: %1 Cannot set timezone. タイムゾーンを設定できません。 Link creation failed, target: %1; link name: %2 リンクの作成に失敗しました、ターゲット: %1 ; リンク名: %2 Cannot set timezone, タイムゾーンを設定できません, Cannot open /etc/timezone for writing /etc/timezone を開くことができません SummaryPage This is an overview of what will happen once you start the install procedure. これはインストールを開始した時に起こることの概要です。 SummaryViewStep Summary 要約 UsersPage Your username is too long. ユーザー名が長すぎます。 Your username contains invalid characters. Only lowercase letters and numbers are allowed. ユーザー名に不適切な文字が含まれています。アルファベットの小文字と数字のみが使用できます。 Your hostname is too short. ホスト名が短すぎます。 Your hostname is too long. ホスト名が長過ぎます。 Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. ホスト名に不適切な文字が含まれています。アルファベット、数字及びハイフンのみが使用できます。 Your passwords do not match! パスワードが一致していません! UsersViewStep Users ユーザー情報 WelcomePage Form フォーム &Language: 言語(&L): &Release notes リリースノート(&R) &Known issues 既知の問題(&K) &Support サポート (&S) &About 説明(&A) <h1>Welcome to the %1 installer.</h1> <h1>%1 インストーラーへようこそ。</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>%1 Calamares インストーラーにようこそ</h1> About %1 installer %1 インストーラーについて <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 サポート WelcomeViewStep Welcome ようこそ calamares-3.1.12/lang/calamares_kk.ts000066400000000000000000003141251322271446000174430ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Саймандар Debug information Жөндеу ақпараты Calamares::ExecutionViewStep Install Орнату Calamares::JobThread Done Дайын Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back А&ртқа &Next &Алға &Cancel Ба&с тарту Cancel installation without changing the system. Cancel installation? Орнатудан бас тарту керек пе? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users Пайдаланушылар WelcomePage Form &Language: &Тіл: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 қолдауы WelcomeViewStep Welcome Қош келдіңіз calamares-3.1.12/lang/calamares_lo.ts000066400000000000000000003136231322271446000174520ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_lt.ts000066400000000000000000003706241322271446000174630ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. Šios sistemos <strong>paleidimo aplinka</strong>.<br><br>Senesnės x86 sistemos palaiko tik <strong>BIOS</strong>.<br>Šiuolaikinės sistemos, dažniausiai, naudoja <strong>EFI</strong>, tačiau, jeigu jos yra paleistos suderinamumo veiksenoje, taip pat gali būti rodomos kaip BIOS. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Ši sistema buvo paleista su <strong>EFI</strong> paleidimo aplinka.<br><br>Tam, kad sukonfigūruotų paleidimą iš EFI aplinkos, ši diegimo programa, <strong>EFI sistemos skaidinyje</strong>, privalo išskleisti paleidyklės programą, kaip, pavyzdžiui, <strong>GRUB</strong> ar <strong>systemd-boot</strong>. Tai vyks automatiškai, nebent pasirinksite rankinį skaidymą ir tokiu atveju patys turėsite pasirinkti arba sukurti skaidinį. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Ši sistema buvo paleista su <strong>BIOS</strong> paleidimo aplinka.<br><br>Tam, kad sukonfigūruotų paleidimą iš BIOS aplinkos, ši diegimo programa, arba skaidinio pradžioje, arba <strong>Paleidimo įraše (MBR)</strong>, šalia skaidinių lentelės pradžios (pageidautina), privalo įdiegti paleidyklę, kaip, pavyzdžiui, <strong>GRUB</strong>. Tai vyks automatiškai, nebent pasirinksite rankinį skaidymą ir tokiu atveju, viską turėsite nusistatyti patys. BootLoaderModel Master Boot Record of %1 %1 paleidimo įrašas (MBR) Boot Partition Paleidimo skaidinys System Partition Sistemos skaidinys Do not install a boot loader Nediegti paleidyklės %1 (%2) %1 (%2) Calamares::DebugWindow Form Forma GlobalStorage VisuotinisKaupiklis JobQueue DarboEilė Modules Moduliai Type: Tipas: none nėra Interface: Sąsaja: Tools Įrankiai Debug information Derinimo informacija Calamares::ExecutionViewStep Install Diegimas Calamares::JobThread Done Atlikta Calamares::ProcessJob Run command %1 %2 Vykdyti komandą %1 %2 Running command %1 %2 Vykdoma komanda %1 %2 External command crashed Išorinė komanda nepavyko Command %1 crashed. Output: %2 Komanda %1 nustojo veikti . Išvestis: %2 External command failed to start Nepavyko paleisti išorinės komandos Command %1 failed to start. Nepavyko paleisti %1 komandos Internal error when starting command Vidinė komandos klaida Bad parameters for process job call. Netinkamas proceso parametras External command failed to finish Nepavyko pabaigti išorinės komandos Command %1 failed to finish in %2s. Output: %3 Nepavyko pabaigti komandos %1 per %2s. Išvestis: %3 External command finished with errors Išorinė komanda pabaigta su klaidomis Command %1 finished with exit code %2. Output: %3 Komanda %1 pabaigta su išėjimo kodu %2. Išvestis: %3 Calamares::PythonJob Running %1 operation. Vykdoma %1 operacija. Bad working directory path Netinkama darbinio katalogo vieta Working directory %1 for python job %2 is not readable. Darbinis %1 python katalogas dėl %2 užduoties yra neskaitomas Bad main script file Prastas pagrindinio skripto failas Main script file %1 for python job %2 is not readable. Pagrindinis skriptas %1 dėl python %2 užduoties yra neskaitomas Boost.Python error in job "%1". Boost.Python klaida darbe "%1". Calamares::ViewManager &Back &Atgal &Next &Toliau &Cancel A&tšaukti Cancel installation without changing the system. Atsisakyti diegimo, nieko nekeisti sistemoje. Cancel installation? Atšaukti diegimą? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ar tikrai norite atšaukti dabartinio diegimo procesą? Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. &Yes &Taip &No &Ne &Close &Užverti Continue with setup? Tęsti sąranką? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 diegimo programa, siekdama įdiegti %2, ketina atlikti pakeitimus diske.<br/><strong>Negalėsite atšaukti šių pakeitimų.</strong> &Install now Į&diegti dabar Go &back &Grįžti &Done A&tlikta The installation is complete. Close the installer. Diegimas užbaigtas. Užverkite diegimo programą. Error Klaida Installation Failed Diegimas nepavyko CalamaresPython::Helper Unknown exception type Nežinomas išimties tipas unparseable Python error Nepalyginama Python klaida unparseable Python traceback Nepalyginamas Python atsekimas Unfetchable Python error. Neatgaunama Python klaida. CalamaresWindow %1 Installer %1 diegimo programa Show debug information Rodyti derinimo informaciją CheckFileSystemJob Checking file system on partition %1. Tikrinama %1 skaidinio failų sistema The file system check on partition %1 failed. %1 skaidinio failų sistemos patikra nepavyko. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Šis kompiuteris netenkina minimalių %1 diegimo reikalavimų.<br/>Diegimas negali būti tęsiamas. <a href="#details">Išsamiau...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Šis kompiuteris netenkina kai kurių %1 diegimui rekomenduojamų reikalavimų.<br/>Diegti galite, bet kai kurios funkcijos gali būti išjungtos. This program will ask you some questions and set up %2 on your computer. Programa užduos klausimus ir padės įsidiegti %2. For best results, please ensure that this computer: Norėdami pasiekti geriausių rezultatų, įsitikinkite kad šis kompiuteris: System requirements Sistemos reikalavimai ChoicePage Form Forma After: Po: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Rankinis skaidymas</strong><br/>Galite patys kurti ar keisti skaidinių dydžius. Boot loader location: Paleidyklės vieta: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 bus sumažintas iki %2MB ir naujas %3MB skaidinys bus sukurtas sistemai %4. Select storage de&vice: Pasirinkite atminties įr&enginį: Current: Dabartinis: Reuse %1 as home partition for %2. Pakartotinai naudoti %1 kaip namų skaidinį, skirtą %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Pasirinkite, kurį skaidinį sumažinti, o tuomet vilkite juostą, kad pakeistumėte skaidinio dydį</strong> <strong>Select a partition to install on</strong> <strong>Pasirinkite kuriame skaidinyje įdiegti</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Šioje sistemoje niekur nepavyko rasti EFI skaidinio. Prašome grįžti ir naudoti rankinį skaidymą, kad nustatytumėte %1. The EFI system partition at %1 will be used for starting %2. %2 paleidimui bus naudojamas EFI sistemos skaidinys, esantis ties %1. EFI system partition: EFI sistemos skaidinys: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Atrodo, kad šiame įrenginyje nėra operacinės sistemos. Ką norėtumėte daryti?<br/>Prieš atliekant bet kokius pakeitimus atminties įrenginyje, jūs galėsite apžvelgti ir patvirtinti savo pasirinkimus. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Ištrinti diską</strong><br/>Tai <font color="red">ištrins</font> visus, pasirinktame atminties įrenginyje, esančius duomenis. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Šiame atminties įrenginyje jau yra %1. Ką norėtumėte daryti?<br/>Prieš atliekant bet kokius pakeitimus atminties įrenginyje, jūs galėsite apžvelgti ir patvirtinti savo pasirinkimus. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Įdiegti šalia</strong><br/>Diegimo programa sumažins skaidinį, kad atlaisvintų vietą sistemai %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Pakeisti skaidinį</strong><br/>Pakeičia skaidinį ir įrašo %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Šiame atminties įrenginyje jau yra operacinė sistema. Ką norėtumėte daryti?<br/>Prieš atliekant bet kokius pakeitimus atminties įrenginyje, jūs galėsite apžvelgti ir patvirtinti savo pasirinkimus. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Šiame atminties įrenginyje jau yra kelios operacinės sistemos. Ką norėtumėte daryti?<br/>Prieš atliekant bet kokius pakeitimus atminties įrenginyje, jūs galėsite apžvelgti ir patvirtinti savo pasirinkimus. ClearMountsJob Clear mounts for partitioning operations on %1 Išvalyti prijungimus, siekiant atlikti skaidymo operacijas skaidiniuose %1 Clearing mounts for partitioning operations on %1. Išvalomi prijungimai, siekiant atlikti skaidymo operacijas skaidiniuose %1. Cleared all mounts for %1 Visi %1 prijungimai išvalyti ClearTempMountsJob Clear all temporary mounts. Išvalyti visus laikinuosius prijungimus. Clearing all temporary mounts. Išvalomi visi laikinieji prijungimai. Cannot get list of temporary mounts. Nepavyksta gauti laikinųjų prijungimų sąrašo. Cleared all temporary mounts. Visi laikinieji prijungimai išvalyti. CreatePartitionDialog Create a Partition Sukurti skaidinį MiB MiB Partition &Type: Skaidinio tipas: &Primary &Pirminė E&xtended Iš&plėstinė Fi&le System: Fai&lų sistema: Flags: Vėliavėlės: &Mount Point: &Prijungimo vieta: Si&ze: D&ydis: En&crypt Užši&fruoti Logical Loginė Primary Pagrindinė GPT GPT Mountpoint already in use. Please select another one. Prijungimo taškas jau yra naudojamas. Prašome pasirinkti kitą. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Sukurti naują %2MB skaidinį diske %4 (%3) su %1 failų sistema. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Sukurti naują <strong>%2MB</strong> skaidinį diske <strong>%4</strong> (%3) su <strong>%1</strong> failų sistema. Creating new %1 partition on %2. Kuriamas naujas %1 skaidinys ties %2. The installer failed to create partition on disk '%1'. Diegimo programai nepavyko sukurti skaidinio diske '%1'. Could not open device '%1'. Nepavyko atidaryti įrenginio '%1'. Could not open partition table. Nepavyko atidaryti skaidinių lentelės. The installer failed to create file system on partition %1. Diegimo programai nepavyko sukurti failų sistemos skaidinyje %1. The installer failed to update partition table on disk '%1'. Diegimo programai napavyko atnaujinti skaidinių lentelės diske '%1'. CreatePartitionTableDialog Create Partition Table Sukurti skaidinių lentelę Creating a new partition table will delete all existing data on the disk. Naujos skaidinių lentelės kūrimas ištrins visus, diske esančius, duomenis. What kind of partition table do you want to create? Kokio tipo skaidinių lentelę norite sukurti? Master Boot Record (MBR) Paleidimo Įrašas (MBR) GUID Partition Table (GPT) GUID Skaidinių lentelė (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Sukurti naują %1 skaidinių lentelę ties %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Sukurti naują <strong>%1</strong> skaidinių lentelę diske <strong>%2</strong> (%3). Creating new %1 partition table on %2. Kuriama nauja %1 skaidinių lentelė ties %2. The installer failed to create a partition table on %1. Diegimo programai nepavyko %1 sukurti skaidinių lentelės. Could not open device %1. Nepavyko atidaryti įrenginio %1. CreateUserJob Create user %1 Sukurti naudotoją %1 Create user <strong>%1</strong>. Sukurti naudotoją <strong>%1</strong>. Creating user %1. Kuriamas naudotojas %1. Sudoers dir is not writable. Nepavyko įrašymui sukurti katalogo sudoers. Cannot create sudoers file for writing. Nepavyko įrašymui sukurti failo sudoers. Cannot chmod sudoers file. Nepavyko pritaikyti chmod failui sudoers. Cannot open groups file for reading. Nepavyko skaitymui atverti grupių failo. Cannot create user %1. Nepavyko sukurti naudotojo %1. useradd terminated with error code %1. komanda useradd nutraukė darbą dėl klaidos kodo %1. Cannot add user %1 to groups: %2. Nepavyksta pridėti naudotojo %1 į grupes: %2. usermod terminated with error code %1. usermod nutraukta su klaidos kodu %1. Cannot set home directory ownership for user %1. Nepavyko nustatyti home katalogo nuosavybės naudotojui %1. chown terminated with error code %1. komanda chown nutraukė darbą dėl klaidos kodo %1. DeletePartitionJob Delete partition %1. Ištrinti skaidinį %1. Delete partition <strong>%1</strong>. Ištrinti skaidinį <strong>%1</strong>. Deleting partition %1. Ištrinamas skaidinys %1. The installer failed to delete partition %1. Diegimo programai nepavyko ištrinti skaidinio %1. Partition (%1) and device (%2) do not match. Skaidinys (%1) ir įrenginys (%2) nesutampa. Could not open device %1. Nepavyko atidaryti įrenginio %1. Could not open partition table. Nepavyko atidaryti skaidinių lentelės. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Pasirinktame atminties įrenginyje esančios, <strong>skaidinių lentelės</strong> tipas.<br><br>Vienintelis būdas kaip galima pakeisti skaidinių lentelės tipą yra ištrinti ir iš naujo sukurti skaidinių lentelę, kas savo ruožtu ištrina visus atminties įrenginyje esančius duomenis.<br>Ši diegimo programa paliks esamą skaidinių lentelę, nebent aiškiai pasirinksite kitaip.<br>Jeigu nesate tikri, šiuolaikinėse sistemose pirmenybė yra teikiama GPT tipui. This device has a <strong>%1</strong> partition table. Šiame įrenginyje yra <strong>%1</strong> skaidinių lentelė. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Tai yra <strong>ciklo</strong> įrenginys.<br><br>Tai pseudo-įrenginys be skaidinių lentelės, kuris failą padaro prieinamą kaip bloko įrenginį. Tokio tipo sąrankoje, dažniausiai, yra tik viena failų sistema. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Šiai diegimo programai, pasirinktame atminties įrenginyje, <strong>nepavyko aptikti skaidinių lentelės</strong>.<br><br>Arba įrenginyje nėra skaidinių lentelės, arba ji yra pažeista, arba nežinomo tipo.<br>Ši diegimo programa gali jums sukurti skaidinių lentelę automatiškai arba per rankinio skaidymo puslapį. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Tai yra rekomenduojamas skaidinių lentelės tipas, skirtas šiuolaikinėms sistemoms, kurios yra paleidžiamos iš <strong>EFI</strong> paleidimo aplinkos. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Šį skaidinių lentelės tipą yra patartina naudoti tik senesnėse sistemose, kurios yra paleidžiamos iš <strong>BIOS</strong> paleidimo aplinkos. Visais kitais atvejais yra rekomenduojamas GPT tipas.<br><strong>Įspėjimas:</strong> MBR skaidinių lentelė yra pasenusio MS-DOS eros standarto.<br>Gali būti kuriami tik 4 <em>pirminiai</em> skaidiniai, o iš tų 4, vienas gali būti <em>išplėstas</em> skaidinys, kuriame savo ruožtu gali būti daug <em>loginių</em> skaidinių. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Dracut skirtąją LUKS konfigūraciją įrašyti į %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Praleisti LUKS konfigūracijos, kuri yra skirta Dracut, įrašymą: "/" skaidinys nėra užšifruotas Failed to open %1 Nepavyko atverti %1 DummyCppJob Dummy C++ Job Fiktyvi C++ užduotis EditExistingPartitionDialog Edit Existing Partition Keisti jau esamą skaidinį Content: Turinys: &Keep Išsa&ugoti Format Suženklinti Warning: Formatting the partition will erase all existing data. Įspėjimas: suženklinant skaidinį, sunaikinami visi jame esantys duomenys. &Mount Point: &Prijungimo vieta: Si&ze: Dy&dis: MiB MiB Fi&le System: Fai&lų sistema: Flags: Vėliavėlės: Mountpoint already in use. Please select another one. Prijungimo taškas jau yra naudojamas. Prašome pasirinkti kitą. EncryptWidget Form Forma En&crypt system Užš&ifruoti sistemą Passphrase Slaptafrazė Confirm passphrase Patvirtinkite slaptafrazę Please enter the same passphrase in both boxes. Prašome abiejuose langeliuose įrašyti tą pačią slaptafrazę. FillGlobalStorageJob Set partition information Nustatyti skaidinio informaciją Install %1 on <strong>new</strong> %2 system partition. Įdiegti %1 <strong>naujame</strong> %2 sistemos skaidinyje. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Nustatyti <strong>naują</strong> %2 skaidinį su prijungimo tašku <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Diegti %2 sistemą, %3 sistemos skaidinyje <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Nustatyti %3 skaidinį <strong>%1</strong> su prijungimo tašku <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Diegti paleidyklę skaidinyje <strong>%1</strong>. Setting up mount points. Nustatomi prijungimo taškai. FinishedPage Form Forma &Restart now &Paleisti iš naujo dabar <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Viskas atlikta.</h1><br/>%1 sistema jau įdiegta.<br/>Galite iš naujo paleisti kompiuterį dabar ir naudotis savo naująja sistema; arba galite tęsti naudojimąsi %2 sistema demonstracinėje aplinkoje. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Diegimas nepavyko</h1><br/>%1 nebuvo įdiegta jūsų kompiuteryje.<br/>Klaidos pranešimas buvo: %2. FinishedViewStep Finish Pabaiga Installation Complete Diegimas užbaigtas The installation of %1 is complete. %1 diegimas yra užbaigtas. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Suženklinti skaidinį %1 (failų sistema: %2, dydis: %3 MB) diske %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Suženklinti <strong>%3MB</strong> skaidinį <strong>%1</strong> su failų sistema <strong>%2</strong>. Formatting partition %1 with file system %2. Suženklinamas skaidinys %1 su %2 failų sistema. The installer failed to format partition %1 on disk '%2'. Diegimo programai nepavyko suženklinti „%2“ disko skaidinio %1. Could not open device '%1'. Nepavyko atidaryti įrenginio '%1'. Could not open partition table. Nepavyko atidaryti skaidinių lentelės. The installer failed to create file system on partition %1. Diegimo programai nepavyko sukurti failų sistemos skaidinyje %1. The installer failed to update partition table on disk '%1'. Diegimo programai nepavyko atnaujinti skaidinių lentelės diske '%1'. InteractiveTerminalPage Konsole not installed Konsole neįdiegta Please install the kde konsole and try again! Prašome įdiegti kde programą konsole ir bandyti dar kartą! Executing script: &nbsp;<code>%1</code> Vykdomas scenarijus: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Scenarijus KeyboardPage Set keyboard model to %1.<br/> Nustatyti klaviatūros modelį kaip %1.<br/> Set keyboard layout to %1/%2. Nustatyti klaviatūros išdėstymą kaip %1/%2. KeyboardViewStep Keyboard Klaviatūra LCLocaleDialog System locale setting Sistemos lokalės nustatymas The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Sistemos lokalės nustatymas įtakoja, kai kurių komandų eilutės naudotojo sąsajos elementų, kalbos ir simbolių rinkinį.<br/>Dabar yra nustatyta <strong>%1</strong>. &Cancel &Atsisakyti &OK &Gerai LicensePage Form Forma I accept the terms and conditions above. Sutinku su aukščiau išdėstytomis nuostatomis ir sąlygomis. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licencijos Sutartis</h1>Ši sąrankos procedūra įdiegs nuosavybinę programinę įrangą, kuriai yra taikomos licencijavimo nuostatos. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Prašome aukščiau peržiūrėti Galutinio Vartotojo Licencijos Sutartis (angl. EULA).<br/>Jeigu nesutiksite su nuostatomis, sąrankos procedūra negalės būti tęsiama. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licencijos Sutartis</h1>Tam, kad pateiktų papildomas ypatybes ir pagerintų naudotojo patirtį, ši sąrankos procedūra gali įdiegti nuosavybinę programinę įrangą, kuriai yra taikomos licencijavimo nuostatos. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Prašome aukščiau peržiūrėti Galutinio Vartotojo Licencijos Sutartis (angl. EULA).<br/>Jeigu nesutiksite su nuostatomis, tuomet nuosavybinė programinė įranga nebus įdiegta, o vietoj jos, bus naudojamos atviro kodo alternatyvos. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 tvarkyklė</strong><br/>iš %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafikos tvarkyklė</strong><br/><font color="Grey">iš %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 naršyklės papildinys</strong><br/><font color="Grey">iš %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 kodekas</strong><br/><font color="Grey">iš %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paketas</strong><br/><font color="Grey">iš %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">iš %2</font> <a href="%1">view license agreement</a> <a href="%1">žiūrėti licenciją</a> LicenseViewStep License Licencija LocalePage The system language will be set to %1. Sistemos kalba bus nustatyta į %1. The numbers and dates locale will be set to %1. Skaičių ir datų lokalė bus nustatyta į %1. Region: Regionas: Zone: Zona: &Change... K&eisti... Set timezone to %1/%2.<br/> Nustatyti laiko juostą kaip %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Įkeliami vietos duomenys... Location Vieta MoveFileSystemJob Move file system of partition %1. Perkelti %1 skaidinio failų sistemą. Could not open file system on partition %1 for moving. Nepavyko perkelimui atidaryti failų sistemos skaidinyje %1. Could not create target for moving file system on partition %1. Nepavyko sukurti paskirties vietos failų sistemos perkėlimui į skaidinį %1. Moving of partition %1 failed, changes have been rolled back. Nepavyko perkelti skaidinį %1, visi pakeitimai buvo anuliuoti. Moving of partition %1 failed. Roll back of the changes have failed. Nepavyko perkelti skaidinį %1. Anuliuoti pakeitimų nepavyko. Updating boot sector after the moving of partition %1 failed. Po skaidinio %1 perkėlimo, nepavyko atnaujinti paleidimo sektorių. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Loginio sektoriaus dydžiai pradinėje ir kopijavimo paskirties vietoje yra nevienodi. Šiuo metu tai yra nepalaikoma. Source and target for copying do not overlap: Rollback is not required. Kopijavimo pradinė ir paskirties vietos nepersikloja. Ankstesnės būsenos atstatymas nereikalingas. Could not open device %1 to rollback copying. Nepavyko atidaryti įrenginio %1, ankstesnės būsenos kopijavimui. NetInstallPage Name Pavadinimas Description Aprašas Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Tinklo diegimas. (Išjungta: Nepavyksta gauti paketų sąrašus, patikrinkite savo tinklo ryšį) NetInstallViewStep Package selection Paketų pasirinkimas Page_Keyboard Form Forma Keyboard Model: Klaviatūros modelis: Type here to test your keyboard Rašykite čia ir išbandykite savo klaviatūrą Page_UserSetup Form Forma What is your name? Koks jūsų vardas? What name do you want to use to log in? Kokį vardą norite naudoti prisijungimui? font-weight: normal šrifto ryškumas: normalus <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Jei šiuo kompiuteriu naudosis keli žmonės, po diegimo galite sukurti papildomas paskyras.</small> Choose a password to keep your account safe. Apsaugokite savo paskyrą slaptažodžiu <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Norint įsitikinti, kad rašydami slaptažodį nesuklydote, įrašykite tą patį slaptažodį du kartus. Stiprus slaptažodis yra raidžių, skaičių ir punktuacijos ženklų mišinys, jis turi būti mažiausiai aštuonių simbolių, be to, turėtų būti reguliariai keičiamas.</small> What is the name of this computer? Koks šio kompiuterio vardas? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Šis vardas bus naudojamas, jeigu padarysite savo kompiuterį matomą kitiems naudotojams tinkle.</small> Log in automatically without asking for the password. Prisijungti automatiškai, neklausiant slaptažodžio. Use the same password for the administrator account. Naudoti tokį patį slaptažodį administratoriaus paskyrai. Choose a password for the administrator account. Pasirinkite slaptažodį administratoriaus paskyrai. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Norint įsitikinti, kad rašydami slaptažodį nesuklydote, įrašykite tą patį slaptažodį du kartus.</small> PartitionLabelsView Root Šaknies Home Namų Boot Paleidimo EFI system EFI sistema Swap Sukeitimų (swap) New partition for %1 Naujas skaidinys, skirtas %1 New partition Naujas skaidinys %1 %2 %1 %2 PartitionModel Free Space Laisva vieta New partition Naujas skaidinys Name Pavadinimas File System Failų sistema Mount Point Prijungimo vieta Size Dydis PartitionPage Form Forma Storage de&vice: Atminties įre&nginys: &Revert All Changes &Atšaukti visus pakeitimus New Partition &Table Nauja skaidinių &lentelė &Create &Sukurti &Edit &Keisti &Delete Ša&linti Install boot &loader on: Įdiegti pa&leidyklę skaidinyje: Are you sure you want to create a new partition table on %1? Ar tikrai %1 norite sukurti naują skaidinių lentelę? PartitionViewStep Gathering system information... Renkama sistemos informacija... Partitions Skaidiniai Install %1 <strong>alongside</strong> another operating system. Diegti %1 <strong>šalia</strong> kitos operacinės sistemos. <strong>Erase</strong> disk and install %1. <strong>Ištrinti</strong> diską ir diegti %1. <strong>Replace</strong> a partition with %1. <strong>Pakeisti</strong> skaidinį, įrašant %1. <strong>Manual</strong> partitioning. <strong>Rankinis</strong> skaidymas. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Įdiegti %1 <strong>šalia</strong> kitos operacinės sistemos diske <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Ištrinti</strong> diską <strong>%2</strong> (%3) ir diegti %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Pakeisti</strong> skaidinį diske <strong>%2</strong> (%3), įrašant %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Rankinis</strong> skaidymas diske <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Diskas <strong>%1</strong> (%2) Current: Dabartinis: After: Po: No EFI system partition configured Nėra sukonfigūruoto EFI sistemos skaidinio An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI sistemos skaidinys yra būtinas, norint paleisti %1.<br/><br/>Tam, kad sukonfigūruotumėte EFI sistemos skaidinį, grįžkite atgal ir pasirinkite arba sukurkite FAT32 failų sistemą su įjungta <strong>esp</strong> vėliavėle ir <strong>%2</strong> prijungimo tašku.<br/><br/>Jūs galite tęsti ir nenustatę EFI sistemos skaidinio, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos. EFI system partition flag not set Nenustatyta EFI sistemos skaidinio vėliavėlė An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. EFI sistemos skaidinys yra būtinas, norint paleisti %1.<br/><br/>Skaidinys buvo sukonfigūruotas su prijungimo tašku <strong>%2</strong>, tačiau jo <strong>esp</strong> vėliavėlė yra nenustatyta.<br/>Tam, kad nustatytumėte vėliavėlę, grįžkite atgal ir redaguokite skaidinį.<br/><br/>Jūs galite tęsti ir nenustatę vėliavėlės, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos. Boot partition not encrypted Paleidimo skaidinys nėra užšifruotas A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Kartu su užšifruotu šaknies skaidiniu, buvo nustatytas atskiras paleidimo skaidinys, tačiau paleidimo skaidinys nėra užšifruotas.<br/><br/>Dėl tokios sąrankos iškyla tam tikrų saugumo klausimų, kadangi svarbūs sisteminiai failai yra laikomi neužšifruotame skaidinyje.<br/>Jeigu norite, galite tęsti, tačiau failų sistemos atrakinimas įvyks vėliau, sistemos paleidimo metu.<br/>Norėdami užšifruoti paleidimo skaidinį, grįžkite atgal ir sukurkite jį iš naujo bei skaidinių kūrimo lange pažymėkite parinktį <strong>Užšifruoti</strong>. QObject Default Keyboard Model Numatytasis klaviatūros modelis Default Numatytasis unknown nežinoma extended išplėsta unformatted nesutvarkyta swap sukeitimų (swap) Unpartitioned space or unknown partition table Nesuskaidyta vieta arba nežinoma skaidinių lentelė ReplaceWidget Form Forma Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Pasirinkite, kur norėtumėte įdiegti %1.<br/><font color="red">Įspėjimas: </font>tai ištrins visus, pasirinktame skaidinyje esančius, failus. The selected item does not appear to be a valid partition. Pasirinktas elementas neatrodo kaip teisingas skaidinys. %1 cannot be installed on empty space. Please select an existing partition. %1 negali būti įdiegta laisvoje vietoje. Prašome pasirinkti esamą skaidinį. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 negali būti įdiegta išplėstame skaidinyje. Prašome pasirinkti esamą pirminį ar loginį skaidinį. %1 cannot be installed on this partition. %1 negali būti įdiegta šiame skaidinyje. Data partition (%1) Duomenų skaidinys (%1) Unknown system partition (%1) Nežinomas sistemos skaidinys (%1) %1 system partition (%2) %1 sistemos skaidinys (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Skaidinys %1 yra pernelyg mažas sistemai %2. Prašome pasirinkti skaidinį, kurio dydis siektų bent %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Šioje sistemoje niekur nepavyko rasti EFI skaidinio. Prašome grįžti ir naudoti rankinį skaidymą, kad nustatytumėte %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 sistema bus įdiegta skaidinyje %2.<br/><font color="red">Įspėjimas: </font>visi duomenys skaidinyje %2 bus prarasti. The EFI system partition at %1 will be used for starting %2. %2 paleidimui bus naudojamas EFI sistemos skaidinys, esantis %1. EFI system partition: EFI sistemos skaidinys: RequirementsChecker Gathering system information... Renkama sistemos informacija... has at least %1 GB available drive space turi bent %1 GB laisvos vietos diske There is not enough drive space. At least %1 GB is required. Neužtenka vietos diske. Reikia bent %1 GB. has at least %1 GB working memory turi bent %1 GB darbinės atminties The system does not have enough working memory. At least %1 GB is required. Sistemai neužtenka darbinės atminties. Reikia bent %1 GB. is plugged in to a power source prijungta prie maitinimo šaltinio The system is not plugged in to a power source. Sistema nėra prijungta prie maitinimo šaltinio. is connected to the Internet prijungta prie Interneto The system is not connected to the Internet. Sistema nėra prijungta prie Interneto. The installer is not running with administrator rights. Diegimo programa yra vykdoma be administratoriaus teisių. The screen is too small to display the installer. Ekranas yra per mažas, kad būtų parodyta diegimo programa. ResizeFileSystemJob Resize file system on partition %1. Keisti failų sistemos dydį skaidinyje %1. Parted failed to resize filesystem. Parted nepavyko pakeisti failų sistemos dydžio. Failed to resize filesystem. Nepavyko pakeisti failų sistemos dydžio. ResizePartitionJob Resize partition %1. Keisti skaidinio %1 dydį. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Pakeisti <strong>%2MB</strong> skaidinio <strong>%1</strong> dydį iki <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Keičiamas %2MB skaidinio %1 dydis iki %3MB. The installer failed to resize partition %1 on disk '%2'. Diegimo programai nepavyko pakeisti skaidinio %1 dydį diske '%2'. Could not open device '%1'. Nepavyko atidaryti įrenginio '%1'. ScanningDialog Scanning storage devices... Peržiūrimi atminties įrenginiai... Partitioning Skaidymas SetHostNameJob Set hostname %1 Nustatyti kompiuterio vardą %1 Set hostname <strong>%1</strong>. Nustatyti kompiuterio vardą <strong>%1</strong>. Setting hostname %1. Nustatomas kompiuterio vardas %1. Internal Error Vidinė klaida Cannot write hostname to target system Nepavyko įrašyti kompiuterio vardo į paskirties sistemą SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Nustatyti klaviatūros modelį kaip %1, o išdėstymą kaip %2-%3 Failed to write keyboard configuration for the virtual console. Nepavyko įrašyti klaviatūros sąrankos virtualiam pultui. Failed to write to %1 Nepavyko įrašyti į %1 Failed to write keyboard configuration for X11. Nepavyko įrašyti klaviatūros sąrankos X11 aplinkai. Failed to write keyboard configuration to existing /etc/default directory. Nepavyko įrašyti klaviatūros konfigūracijos į esamą /etc/default katalogą. SetPartFlagsJob Set flags on partition %1. Nustatyti vėliavėles skaidinyje %1. Set flags on %1MB %2 partition. Nustatyti vėliavėles %1MB skaidinyje %2. Set flags on new partition. Nustatyti vėliavėles naujame skaidinyje. Clear flags on partition <strong>%1</strong>. Išvalyti vėliavėles skaidinyje <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Išvalyti vėliavėles %1MB skaidinyje <strong>%2</strong>. Clear flags on new partition. Išvalyti vėliavėles naujame skaidinyje. Flag partition <strong>%1</strong> as <strong>%2</strong>. Pažymėti vėliavėle skaidinį <strong>%1</strong> kaip <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Pažymėti vėliavėle %1MB skaidinį <strong>%2</strong> kaip <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Pažymėti vėliavėle naują skaidinį kaip <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Išvalomos vėliavėlės skaidinyje <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Išvalomos vėliavėlės %1MB skaidinyje <strong>%2</strong>. Clearing flags on new partition. Išvalomos vėliavėlės naujame skaidinyje. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Nustatomos <strong>%2</strong> vėliavėlės skaidinyje <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Nustatomos vėliavėlės <strong>%3</strong>, %1MB skaidinyje <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Nustatomos vėliavėlės <strong>%1</strong> naujame skaidinyje. The installer failed to set flags on partition %1. Diegimo programai nepavyko nustatyti vėliavėlių skaidinyje %1. Could not open device '%1'. Nepavyko atidaryti įrenginio "%1". Could not open partition table on device '%1'. Nepavyko atidaryti skaidinių lentelės įrenginyje "%1". Could not find partition '%1'. Nepavyko rasti skaidinio "%1". SetPartGeometryJob Update geometry of partition %1. Atnaujinti skaidinio %1 geometriją. Failed to change the geometry of the partition. Nepavyko pakeisti skaidinio geometriją. SetPasswordJob Set password for user %1 Nustatyti naudotojo %1 slaptažodį Setting password for user %1. Nustatomas slaptažodis naudotojui %1. Bad destination system path. Neteisingas paskirties sistemos kelias. rootMountPoint is %1 šaknies prijungimo vieta yra %1 Cannot disable root account. Nepavyksta išjungti administratoriaus (root) paskyros. passwd terminated with error code %1. komanda passwd nutraukė darbą dėl klaidos kodo %1. Cannot set password for user %1. Nepavyko nustatyti slaptažodžio naudotojui %1. usermod terminated with error code %1. komanda usermod nutraukė darbą dėl klaidos kodo %1. SetTimezoneJob Set timezone to %1/%2 Nustatyti laiko juostą kaip %1/%2 Cannot access selected timezone path. Nepavyko pasiekti pasirinktos laiko zonos Bad path: %1 Neteisingas kelias: %1 Cannot set timezone. Negalima nustatyti laiko juostas. Link creation failed, target: %1; link name: %2 Nuorodos sukūrimas nepavyko, paskirtis: %1; nuorodos pavadinimas: %2 Cannot set timezone, Nepavyksta nustatyti laiko juostos, Cannot open /etc/timezone for writing Nepavyksta įrašymui atidaryti failo /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. Tai yra apžvalga to, kas įvyks, prasidėjus diegimo procedūrai. SummaryViewStep Summary Suvestinė UsersPage Your username is too long. Jūsų naudotojo vardas yra pernelyg ilgas. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Jūsų naudotojo varde yra neleistinų simbolių. Leidžiamos tik mažosios raidės ir skaičiai. Your hostname is too short. Jūsų kompiuterio vardas yra pernelyg trumpas. Your hostname is too long. Jūsų kompiuterio vardas yra pernelyg ilgas. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Jūsų kompiuterio varde yra neleistinų simbolių. Kompiuterio varde gali būti tik raidės, skaičiai ir brūkšniai. Your passwords do not match! Jūsų slaptažodžiai nesutampa! UsersViewStep Users Naudotojai WelcomePage Form Forma &Language: Ka&lba: &Release notes Lai&dos informacija &Known issues Ž&inomos problemos &Support &Palaikymas &About &Apie <h1>Welcome to the %1 installer.</h1> <h1>Jus sveikina %1 diegimo programa.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Jus sveikina Calamares diegimo programa, skirta %1 sistemai.</h1> About %1 installer Apie %1 diegimo programą <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>sistemai %3</strong><br/><br/>Autorių teisės 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Autorių teisės 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Dėkojame: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg ir <a href="https://www.transifex.com/calamares/calamares/">Calamares vertėjų komandai</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> kūrimą remia <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Išlaisvinanti programinė įranga. %1 support %1 palaikymas WelcomeViewStep Welcome Pasisveikinimas calamares-3.1.12/lang/calamares_mr.ts000066400000000000000000003136231322271446000174560ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_nb.ts000066400000000000000000003164471322271446000174460ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record til %1 Boot Partition Bootpartisjon System Partition Systempartisjon Do not install a boot loader %1 (%2) Calamares::DebugWindow Form Form GlobalStorage Global Lagring JobQueue OppgaveKø Modules Moduler Type: none Interface: Tools Debug information Debug informasjon Calamares::ExecutionViewStep Install Calamares::JobThread Done Ferdig Calamares::ProcessJob Run command %1 %2 Kjør kommando %1 %2 Running command %1 %2 External command crashed Ekstern kommando feilet Command %1 crashed. Output: %2 Kommando %1 feilet. Output: %2 External command failed to start Ekstern kommando kunne ikke startes Command %1 failed to start. Kommando %1 kunne ikke startes Internal error when starting command Intern feil ved start av kommando Bad parameters for process job call. Ugyldige parametere for prosessens oppgavekall External command failed to finish Ekstern kommando kunne ikke fullføres Command %1 failed to finish in %2s. Output: %3 Kommando %1 feilet i å fullføre etter %2s. Output: %3 External command finished with errors Ekstern kommando fullført med feil Command %1 finished with exit code %2. Output: %3 Kommando %1 fullført med utgangskode %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Feil filsti til arbeidsmappe Working directory %1 for python job %2 is not readable. Arbeidsmappe %1 for python oppgave %2 er ikke lesbar. Bad main script file Ugyldig hovedskriptfil Main script file %1 for python job %2 is not readable. Hovedskriptfil %1 for python oppgave %2 er ikke lesbar. Boost.Python error in job "%1". Boost.Python feil i oppgave "%1". Calamares::ViewManager &Back &Tilbake &Next &Neste &Cancel &Avbryt Cancel installation without changing the system. Cancel installation? Avbryte installasjon? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Vil du virkelig avbryte installasjonen? Installasjonsprogrammet vil avsluttes og alle endringer vil gå tapt. &Yes &No &Close Continue with setup? Fortsette å sette opp? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 vil nå gjøre endringer på harddisken, for å installere %2. <br/><strong>Du vil ikke kunne omgjøre disse endringene.</strong> &Install now &Installer nå Go &back Gå &tilbake &Done The installation is complete. Close the installer. Error Feil Installation Failed Installasjon feilet CalamaresPython::Helper Unknown exception type Ukjent unntakstype unparseable Python error Ikke-kjørbar Python feil unparseable Python traceback Ikke-kjørbar Python tilbakesporing Unfetchable Python error. Ukjent Python feil. CalamaresWindow %1 Installer %1 Installasjonsprogram Show debug information Vis feilrettingsinformasjon CheckFileSystemJob Checking file system on partition %1. Sjekker filsystemet på partisjon %1. The file system check on partition %1 failed. Sjekk av filsystem på partisjon %1 har feilet. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Klarer ikke å få tak i listen over midlertidige monterte disker. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Opprett en partisjon MiB Partition &Type: Partisjon &Type: &Primary &Primær E&xtended U&tvidet Fi&le System: Flags: &Mount Point: &Monteringspunkt: Si&ze: St&ørrelse: En&crypt Logical Logisk Primary Primær GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Klarte ikke å åpne enheten '%1'. Could not open partition table. Klarte ikke å åpne partisjonstabellen. The installer failed to create file system on partition %1. Lyktes ikke med å opprette filsystem på partisjon %1 The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Opprett partisjonstabell Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Opprett bruker %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. Klarte ikke å opprette bruker %1 useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_nl.ts000066400000000000000000003664411322271446000174570ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. De <strong>opstartomgeving</strong> van dit systeem.<br><br>Oudere x86-systemen ondersteunen enkel <strong>BIOS</strong>.<br>Moderne systemen gebruiken meestal <strong>EFI</strong>, maar kunnen ook als BIOS verschijnen als in compatibiliteitsmodus opgestart werd. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Dit systeem werd opgestart met een <strong>EFI</strong>-opstartomgeving.<br><br>Om het opstarten vanaf een EFI-omgeving te configureren moet dit installatieprogramma een bootloader instellen, zoals <strong>GRUB</strong> of <strong>systemd-boot</strong> op een <strong>EFI-systeempartitie</strong>. Dit gebeurt automatisch, tenzij je voor manueel partitioneren kiest, waar je het moet aanvinken of het zelf aanmaken. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Dit systeem werd opgestart met een <strong>BIOS</strong>-opstartomgeving.<br><br>Om het opstarten vanaf een BIOS-omgeving te configureren moet dit installatieprogramma een bootloader installeren, zoals <strong>GRUB</strong>, ofwel op het begin van een partitie ofwel op de <strong>Master Boot Record</strong> bij het begin van de partitietabel (bij voorkeur). Dit gebeurt automatisch, tenzij je voor manueel partitioneren kiest, waar je het zelf moet aanmaken. BootLoaderModel Master Boot Record of %1 Master Boot Record van %1 Boot Partition Bootpartitie System Partition Systeempartitie Do not install a boot loader Geen bootloader installeren %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulier GlobalStorage Globale Opslag JobQueue Wachtrij Modules Modules Type: Type: none geen Interface: Interface: Tools Hulpmiddelen Debug information Debug informatie Calamares::ExecutionViewStep Install Installeer Calamares::JobThread Done Gereed Calamares::ProcessJob Run command %1 %2 Voer opdracht %1 %2 uit Running command %1 %2 Uitvoeren van opdracht %1 %2 External command crashed Externe opdracht is vastgelopen Command %1 crashed. Output: %2 Opdracht %1 is vastglopen. Output: %2 External command failed to start Externe opdracht starten mislukt Command %1 failed to start. Opdracht %1 starten mislukt. Internal error when starting command Interne fout bij starten opdracht Bad parameters for process job call. Onjuiste parameters voor procestaak External command failed to finish Externe opdracht voltooiing mislukt Command %1 failed to finish in %2s. Output: %3 Opdracht %1 mislukt voor voltooiing in %2s. Uitvoer: %3 External command finished with errors Externe opdracht voltooid met fouten Command %1 finished with exit code %2. Output: %3 Opdracht %1 voltooid met exit code %2. Uitvoer: %3 Calamares::PythonJob Running %1 operation. Bewerking %1 uitvoeren. Bad working directory path Ongeldig pad voor huidige map Working directory %1 for python job %2 is not readable. Werkmap %1 voor python taak %2 onleesbaar. Bad main script file Onjuist hoofdscriptbestand Main script file %1 for python job %2 is not readable. Hoofdscriptbestand %1 voor python taak %2 onleesbaar. Boost.Python error in job "%1". Boost.Python fout in taak "%1". Calamares::ViewManager &Back &Terug &Next &Volgende &Cancel &Afbreken Cancel installation without changing the system. Installatie afbreken zonder aanpassingen aan het systeem. Cancel installation? Installatie afbreken? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Wil je het huidige installatieproces echt afbreken? Het installatieprogramma zal afsluiten en alle wijzigingen zullen verloren gaan. &Yes &ja &No &Nee &Close &Sluiten Continue with setup? Doorgaan met installatie? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Het %1 installatieprogramma zal nu aanpassingen maken aan je schijf om %2 te installeren.<br/><strong>Deze veranderingen kunnen niet ongedaan gemaakt worden.</strong> &Install now Nu &installeren Go &back Ga &terug &Done Voltooi&d The installation is complete. Close the installer. De installatie is voltooid. Sluit het installatie-programma. Error Fout Installation Failed Installatie Mislukt CalamaresPython::Helper Unknown exception type Onbekend uitzonderingstype unparseable Python error onuitvoerbare Python fout unparseable Python traceback onuitvoerbare Python traceback Unfetchable Python error. Onbekende Python fout. CalamaresWindow %1 Installer %1 Installatieprogramma Show debug information Toon debug informatie CheckFileSystemJob Checking file system on partition %1. Controleren van het bestandssysteem op partitie %1. The file system check on partition %1 failed. Controle van bestandssysteem partitie %1 mislukt. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Deze computer voldoet niet aan de minimumvereisten om %1 te installeren.<br/>De installatie kan niet doorgaan. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Deze computer voldoet niet aan enkele van de aanbevolen specificaties om %1 te installeren.<br/>De installatie kan doorgaan, maar sommige functies kunnen uitgeschakeld zijn. This program will ask you some questions and set up %2 on your computer. Dit programma stelt je enkele vragen en installeert %2 op jouw computer. For best results, please ensure that this computer: Voor de beste resultaten is het aangeraden dat deze computer: System requirements Systeemvereisten ChoicePage Form Formulier After: Na: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Handmatig partitioneren</strong><br/>Je maakt of wijzigt zelf de partities. Boot loader location: Bootloader locatie: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 zal verkleind worden tot %2MB en een nieuwe %3MB partitie zal worden aangemaakt voor %4. Select storage de&vice: Selecteer &opslagmedium: Current: Huidig: Reuse %1 as home partition for %2. Hergebruik %1 als home-partitie voor %2 <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Selecteer een partitie om te verkleinen, en sleep vervolgens de onderste balk om het formaat te wijzigen</strong> <strong>Select a partition to install on</strong> <strong>Selecteer een partitie om op te installeren</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Er werd geen EFI systeempartitie gevonden op dit systeem. Gelieve terug te gaan en manueel te partitioneren om %1 in te stellen. The EFI system partition at %1 will be used for starting %2. De EFI systeempartitie op %1 zal gebruikt worden om %2 te starten. EFI system partition: EFI systeempartitie: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Dit opslagmedium lijkt geen besturingssysteem te bevatten. Wat wil je doen?<br/>Je zal jouw keuzes kunnen nazien en bevestigen voordat er iets aan het opslagmedium wordt veranderd. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Wis schijf</strong><br/>Dit zal alle huidige gegevens op de geselecteerd opslagmedium <font color="red">verwijderen</font>. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Dit opslagmedium bevat %1. Wat wil je doen?<br/>Je zal jouw keuzes kunnen nazien en bevestigen voordat er iets aan het opslagmedium wordt veranderd. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Installeer ernaast</strong><br/>Het installatieprogramma zal een partitie verkleinen om plaats te maken voor %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Vervang een partitie</strong><br/>Vervangt een partitie met %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Dit opslagmedium bevat reeds een besturingssysteem. Wat wil je doen?<br/>Je zal jouw keuzes kunnen nazien en bevestigen voordat er iets aan het opslagmedium wordt veranderd. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Dit opslagmedium bevat meerdere besturingssystemen. Wat wil je doen?<br/>Je zal jouw keuzes kunnen nazien en bevestigen voordat er iets aan het opslagmedium wordt veranderd. ClearMountsJob Clear mounts for partitioning operations on %1 Geef aankoppelpunten vrij voor partitiebewerkingen op %1 Clearing mounts for partitioning operations on %1. Aankoppelpunten vrijgeven voor partitiebewerkingen op %1. Cleared all mounts for %1 Alle aankoppelpunten voor %1 zijn vrijgegeven ClearTempMountsJob Clear all temporary mounts. Geef alle tijdelijke aankoppelpunten vrij. Clearing all temporary mounts. Alle tijdelijke aankoppelpunten vrijgeven. Cannot get list of temporary mounts. Kan geen lijst van tijdelijke aankoppelpunten verkrijgen. Cleared all temporary mounts. Alle tijdelijke aankoppelpunten zijn vrijgegeven. CreatePartitionDialog Create a Partition Maak partitie MiB MiB Partition &Type: Partitie&type: &Primary &Primair E&xtended &Uitgebreid Fi&le System: &Bestandssysteem Flags: Vlaggen: &Mount Point: Aan&koppelpunt Si&ze: &Grootte: En&crypt &Versleutelen Logical Logisch Primary Primair GPT GPT Mountpoint already in use. Please select another one. Aankoppelpunt reeds in gebruik. Gelieve een andere te kiezen. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Maak nieuwe %2MB partitie aan op %4 (%3) met bestandsysteem %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Maak een nieuwe <strong>%2MB</strong> partitie aan op <strong>%4</strong> (%3) met bestandsysteem <strong>%1</strong>. Creating new %1 partition on %2. Nieuwe %1 partitie aanmaken op %2. The installer failed to create partition on disk '%1'. Het installatieprogramma kon geen partitie aanmaken op schijf '%1'. Could not open device '%1'. Kan apparaat %1 niet openen. Could not open partition table. Kon partitietabel niet open The installer failed to create file system on partition %1. Het installatieprogramma kon geen bestandssysteem aanmaken op partitie %1. The installer failed to update partition table on disk '%1'. Het installatieprogramma kon de partitietabel op schijf '%1' niet bijwerken . CreatePartitionTableDialog Create Partition Table Maak Partitietabel Creating a new partition table will delete all existing data on the disk. Een nieuwe partitietabel aanmaken zal alle bestaande gegevens op de schijf wissen. What kind of partition table do you want to create? Welk type partitietabel wens je aan te maken? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partitietabel (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Maak een nieuwe %1 partitietabel aan op %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Maak een nieuwe <strong>%1</strong> partitietabel aan op <strong>%2</strong> (%3). Creating new %1 partition table on %2. Nieuwe %1 partitietabel aanmaken op %2. The installer failed to create a partition table on %1. Het installatieprogramma kon geen partitietabel aanmaken op %1. Could not open device %1. Kon apparaat %1 niet openen. CreateUserJob Create user %1 Maak gebruiker %1 Create user <strong>%1</strong>. Maak gebruiker <strong>%1</strong> Creating user %1. Gebruiker %1 aanmaken. Sudoers dir is not writable. Sudoers map is niet schrijfbaar. Cannot create sudoers file for writing. Kan het bestand sudoers niet aanmaken. Cannot chmod sudoers file. chmod sudoers gefaald. Cannot open groups file for reading. Kan het bestand groups niet lezen. Cannot create user %1. Kan gebruiker %1 niet aanmaken. useradd terminated with error code %1. useradd is gestopt met foutcode %1. Cannot add user %1 to groups: %2. Kan gebruiker %1 niet toevoegen aan groepen: %2. usermod terminated with error code %1. usermod is gestopt met foutcode %1. Cannot set home directory ownership for user %1. Kan eigendomsrecht gebruikersmap niet instellen voor gebruiker %1. chown terminated with error code %1. chown is gestopt met foutcode %1. DeletePartitionJob Delete partition %1. Verwijder partitie %1. Delete partition <strong>%1</strong>. Verwijder partitie <strong>%1</strong>. Deleting partition %1. Partitie %1 verwijderen. The installer failed to delete partition %1. Het installatieprogramma kon partitie %1 niet verwijderen. Partition (%1) and device (%2) do not match. Partitie (%1) en apparaat (%2) komen niet overeen. Could not open device %1. Kon apparaat %1 niet openen. Could not open partition table. Kon de partitietabel niet openen. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Het type van <strong>partitietabel</strong> op het geselecteerde opslagmedium.<br><br>Om het type partitietabel te wijzigen, dien je deze te verwijderen en opnieuw aan te maken, wat alle gegevens op het opslagmedium vernietigt.<br>Het installatieprogramma zal de huidige partitietabel behouden tenzij je expliciet anders verkiest.<br>Bij twijfel wordt aangeraden GPT te gebruiken op moderne systemen. This device has a <strong>%1</strong> partition table. Dit apparaat heeft een <strong>%1</strong> partitietabel. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Dit is een <strong>loop</strong> apparaat.<br><br>Dit is een pseudo-apparaat zonder partitietabel en maakt een bestand beschikbaar als blokapparaat. Dergelijke configuratie bevat gewoonlijk slechts een enkel bestandssysteem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Het installatieprogramma <strong>kon geen partitietabel vinden</strong> op het geselecteerde opslagmedium.<br><br>Dit apparaat heeft ofwel geen partitietabel, ofwel is deze ongeldig of van een onbekend type.<br>Het installatieprogramma kan een nieuwe partitietabel aanmaken, ofwel automatisch, ofwel via de manuele partitioneringspagina. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Dit is de aanbevolen partitietabel voor moderne systemen die starten vanaf een <strong>EFI</strong> opstartomgeving. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Dit type partitietabel is enkel aan te raden op oudere systemen die opstarten vanaf een <strong>BIOS</strong>-opstartomgeving. GPT is aan te raden in de meeste andere gevallen.<br><br><strong>Opgelet:</strong> De MBR-partitietabel is een verouderde standaard uit de tijd van MS-DOS.<br>Slechts 4 <em>primaire</em> partities kunnen aangemaakt worden, en van deze 4 kan één een <em>uitgebreide</em> partitie zijn, die op zijn beurt meerdere <em>logische</em> partities kan bevatten. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Schrijf LUKS configuratie voor Dracut op %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Schrijven van LUKS configuratie voor Dracut overgeslaan: "/" partitie is niet versleuteld Failed to open %1 Openen van %1 mislukt DummyCppJob Dummy C++ Job C++ schijnopdracht EditExistingPartitionDialog Edit Existing Partition Bestaande Partitie Aanpassen Content: Inhoud: &Keep &Behouden Format Formatteren Warning: Formatting the partition will erase all existing data. Opgelet: Een partitie formatteren zal alle bestaande gegevens wissen. &Mount Point: Aan&koppelpunt: Si&ze: &Grootte: MiB MiB Fi&le System: Bestands&systeem Flags: Vlaggen: Mountpoint already in use. Please select another one. Aankoppelpunt reeds in gebruik. Gelieve een andere te kiezen. EncryptWidget Form Formulier En&crypt system En&crypteer systeem Passphrase Wachtwoordzin Confirm passphrase Bevestig wachtwoordzin Please enter the same passphrase in both boxes. Gelieve in beide velden dezelfde wachtwoordzin in te vullen. FillGlobalStorageJob Set partition information Instellen partitie-informatie Install %1 on <strong>new</strong> %2 system partition. Installeer %1 op <strong>nieuwe</strong> %2 systeempartitie. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Maak <strong>nieuwe</strong> %2 partitie met aankoppelpunt <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Installeer %2 op %3 systeempartitie <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Stel %3 partitie <strong>%1</strong> in met aankoppelpunt <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installeer bootloader op <strong>%1</strong>. Setting up mount points. Aankoppelpunten instellen. FinishedPage Form Formulier &Restart now &Nu herstarten <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Klaar.</h1><br/>%1 is op je computer geïnstalleerd.<br/>Je mag je nieuwe systeem nu herstarten of de %2 Live omgeving blijven gebruiken. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installatie Mislukt</h1><br/>%1 werd niet op de computer geïnstalleerd. <br/>De foutboodschap was: %2 FinishedViewStep Finish Beëindigen Installation Complete Installatie Afgerond. The installation of %1 is complete. De installatie van %1 is afgerond. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formateer partitie %1 (bestandssysteem: %2, grootte: %3 MB) op %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatteer <strong>%3MB</strong> partitie <strong>%1</strong> met bestandsysteem <strong>%2</strong>. Formatting partition %1 with file system %2. Partitie %1 formatteren met bestandssysteem %2. The installer failed to format partition %1 on disk '%2'. Installatieprogramma heeft gefaald om partitie %1 op schijf %2 te formateren. Could not open device '%1'. Kan apparaat '%1' niet openen. Could not open partition table. Kan de partitietabel niet openen. The installer failed to create file system on partition %1. Installatieprogramma heeft gefaald om een bestandsysteem te creëren op partitie %1. The installer failed to update partition table on disk '%1'. Installatieprogramma heeft gefaald om de partitietabel bij te werken op schijf '%1'. InteractiveTerminalPage Konsole not installed Konsole is niet geïnstalleerd Please install the kde konsole and try again! Gelieve kde Konsole en probeer opnieuw! Executing script: &nbsp;<code>%1</code> Script uitvoeren: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Instellen toetsenbord model naar %1.<br/> Set keyboard layout to %1/%2. Instellen toetsenbord lay-out naar %1/%2. KeyboardViewStep Keyboard Toetsenbord LCLocaleDialog System locale setting Landinstellingen The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. De landinstellingen bepalen de taal en het tekenset voor sommige opdrachtregelelementen.<br/>De huidige instelling is <strong>%1</strong>. &Cancel &OK LicensePage Form Formulier I accept the terms and conditions above. Ik aanvaard de bovenstaande algemene voorwaarden. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licentieovereenkomst</h1>Deze installatieprocedure zal propriëtaire software installeren die onderworpen is aan licentievoorwaarden. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Gelieve bovenstaande licentieovereenkomsten voor eindgebruikers (EULA's) na te kijken.<br/>Indien je de voorwaarden niet aanvaardt, kan de installatie niet doorgaan. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licentieovereenkomst</h1>Deze installatieprocedure kan mogelijk propriëtaire software, onderworpen aan licentievoorwaarden, installeren om bijkomende functies aan te bieden of de gebruikservaring te verbeteren. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Gelieve bovenstaande licentieovereenkomsten voor eindgebruikers (EULA's) na te kijken.<br/>Indien je de voorwaarden niet aanvaardt zal de propriëtaire software vervangen worden door openbron alternatieven. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 stuurprogramma</strong><br/>door %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafisch stuurprogramma</strong><br/><font color="Grey">door %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">door %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">door %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pakket</strong><br/><font color="Grey">door %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">door %2</font> <a href="%1">view license agreement</a> <a href="%1">toon de licentieovereenkomst</a> LicenseViewStep License Licentie LocalePage The system language will be set to %1. De taal van het systeem zal worden ingesteld op %1. The numbers and dates locale will be set to %1. De getal- en datumnotatie worden ingesteld op %1. Region: Regio: Zone: Zone: &Change... &Aanpassen Set timezone to %1/%2.<br/> Instellen tijdzone naar %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Laden van locatiegegevens... Location Locatie MoveFileSystemJob Move file system of partition %1. Verplaatsen van bestandssysteem van partitie %1. Could not open file system on partition %1 for moving. Kan het bestandssysteem van partitie %1 niet openen voor verplaatsing. Could not create target for moving file system on partition %1. Kan het doel voor verplaatsen bestandssysteem op partitie %1 niet creëren. Moving of partition %1 failed, changes have been rolled back. Verplaatsen van partitie %1 mislukt. De veranderingen zijn teruggedraaid. Moving of partition %1 failed. Roll back of the changes have failed. Verplaatsen van partitie %1 mislukt. Het terugdraaien van de veranderingen heeft gefaald. Updating boot sector after the moving of partition %1 failed. Updaten bootsector na het verplaatsen van partitie %1 is mislukt. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. De logische sector afmetingen in de bron en doel voor kopiëren zijn niet hetzelfde. Dit wordt momenteel niet ondersteund. Source and target for copying do not overlap: Rollback is not required. Bron en doel voor het kopiëren overlappen niet: Terugdraaien is niet vereist. Could not open device %1 to rollback copying. Kan apparaat %1 niet openen om het kopiëren terug te draaien. NetInstallPage Name Naam Description Beschrijving Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Netwerkinstallatie. (Uitgeschakeld: kon de pakketlijsten niet binnenhalen, controleer de netwerkconnectie) NetInstallViewStep Package selection Pakketkeuze Page_Keyboard Form Formulier Keyboard Model: Toetsenbord model: Type here to test your keyboard Typ hier om uw toetsenbord te testen Page_UserSetup Form Formulier What is your name? Wat is je naam? What name do you want to use to log in? Welke naam wil je gebruiken om in te loggen? font-weight: normal afronding lettertype: normaal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Indien meer dan één persoon deze computer gebruikt, kunt u meerdere accounts instellen na de installatie.</ small> Choose a password to keep your account safe. Kies een wachtwoord om uw account veilig te houden. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Voer hetzelfde wachtwoord twee keer in, zodat het gecontroleerd kan worden op typefouten. Een goed wachtwoord bevat een combinatie van letters, cijfers en leestekens, is ten minste acht tekens lang en moet regelmatig worden gewijzigd.</ small> What is the name of this computer? Wat is de naam van deze computer? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Deze naam zal worden gebruikt als u de computer zichtbaar maakt voor anderen op een netwerk.</ small> Log in automatically without asking for the password. Automatisch aanmelden zonder wachtwoord te vragen. Use the same password for the administrator account. Gebruik hetzelfde wachtwoord voor het administratoraccount. Choose a password for the administrator account. Kies een wachtwoord voor het administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Voer hetzelfde wachtwoord twee keer in, zodat het gecontroleerd kan worden op typefouten.</ small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI systeem Swap Wisselgeheugen New partition for %1 Nieuwe partitie voor %1 New partition Nieuwe partitie %1 %2 %1 %2 PartitionModel Free Space Vrije ruimte New partition Nieuwe partitie Name Naam File System Bestandssysteem Mount Point Aankoppelpunt Size Grootte PartitionPage Form Formulier Storage de&vice: &Opslagmedium: &Revert All Changes Alle wijzigingen &ongedaan maken New Partition &Table Nieuwe Partitie & Tabel &Create &Maak &Edit &Bewerken &Delete &Verwijderen Install boot &loader on: Installeer boot&loader op: Are you sure you want to create a new partition table on %1? Weet u zeker dat u een nieuwe partitie tabel wil maken op %1? PartitionViewStep Gathering system information... Systeeminformatie verzamelen... Partitions Partities Install %1 <strong>alongside</strong> another operating system. Installeer %1 <strong>naast</strong> een ander besturingssysteem. <strong>Erase</strong> disk and install %1. <strong>Wis</strong> schijf en installeer %1. <strong>Replace</strong> a partition with %1. <strong>Vervang</strong> een partitie met %1. <strong>Manual</strong> partitioning. <strong>Handmatig</strong> partitioneren. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Installeer %1 <strong>naast</strong> een ander besturingssysteem op schijf <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Wis</strong> schijf <strong>%2</strong> (%3) en installeer %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Vervang</strong> een partitie op schijf <strong>%2</strong> (%3) met %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Handmatig</strong> partitioneren van schijf <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Schijf <strong>%1</strong> (%2) Current: Huidig: After: Na: No EFI system partition configured Geen EFI systeempartitie geconfigureerd An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Een EFI systeempartitie is vereist om %1 te starten.<br/><br/>Om een EFI systeempartitie in te stellen, ga terug en selecteer of maak een FAT32 bestandssysteem met de <strong>esp</strong>-vlag aangevinkt en aankoppelpunt <strong>%2</strong>.<br/><br/>Je kan verdergaan zonder een EFI systeempartitie, maar mogelijk start je systeem dan niet op. EFI system partition flag not set EFI-systeem partitievlag niet ingesteld. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Een EFI systeempartitie is vereist om %1 op te starten.<br/><br/>Een partitie is ingesteld met aankoppelpunt <strong>%2</strong>, maar de de <strong>esp</strong>-vlag is niet aangevinkt.<br/>Om deze vlag aan te vinken, ga terug en pas de partitie aan.<br/><br/>Je kan verdergaan zonder deze vlag, maar mogelijk start je systeem dan niet op. Boot partition not encrypted Bootpartitie niet versleuteld A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Een aparte bootpartitie was ingesteld samen met een versleutelde rootpartitie, maar de bootpartitie zelf is niet versleuteld.<br/><br/>Dit is niet volledig veilig, aangezien belangrijke systeembestanden bewaard worden op een niet-versleutelde partitie.<br/>Je kan doorgaan als je wil, maar het ontgrendelen van bestandssystemen zal tijdens het opstarten later plaatsvinden.<br/>Om de bootpartitie toch te versleutelen: keer terug en maak de bootpartitie opnieuw, waarbij je <strong>Versleutelen</strong> aanvinkt in het venster partitie aanmaken. QObject Default Keyboard Model Standaard Toetsenbord Model Default Standaard unknown onbekend extended uitgebreid unformatted niet-geformateerd swap wisselgeheugen Unpartitioned space or unknown partition table Niet-gepartitioneerde ruimte of onbekende partitietabel ReplaceWidget Form Formulier Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Kies waar %1 te installeren. <br/><font color="red">Opgelet: </font>dit zal alle bestanden op de geselecteerde partitie wissen. The selected item does not appear to be a valid partition. Het geselecteerde item is geen geldige partitie. %1 cannot be installed on empty space. Please select an existing partition. %1 kan niet worden geïnstalleerd op lege ruimte. Kies een bestaande partitie. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 kan niet op een uitgebreide partitie geïnstalleerd worden. Kies een bestaande primaire of logische partitie. %1 cannot be installed on this partition. %1 kan niet op deze partitie geïnstalleerd worden. Data partition (%1) Gegevenspartitie (%1) Unknown system partition (%1) Onbekende systeempartitie (%1) %1 system partition (%2) %1 systeempartitie (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partitie %1 is te klein voor %2. Gelieve een partitie te selecteren met een capaciteit van minstens %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Er werd geen EFI systeempartite gevonden op dit systeem. Gelieve terug te keren en manueel te partitioneren om %1 in te stellen. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 zal geïnstalleerd worden op %2.<br/><font color="red">Opgelet: </font>alle gegevens op partitie %2 zullen verloren gaan. The EFI system partition at %1 will be used for starting %2. De EFI systeempartitie op %1 zal gebruikt worden om %2 te starten. EFI system partition: EFI systeempartitie: RequirementsChecker Gathering system information... Systeeminformatie verzamelen... has at least %1 GB available drive space tenminste %1 GB vrije schijfruimte heeft There is not enough drive space. At least %1 GB is required. Er is onvoldoende vrije schijfruimte. Tenminste %1 GB is vereist. has at least %1 GB working memory tenminste %1 GB werkgeheugen heeft The system does not have enough working memory. At least %1 GB is required. Dit systeem heeft onvoldoende werkgeheugen. Tenminste %1 GB is vereist. is plugged in to a power source aangesloten is op netstroom The system is not plugged in to a power source. Dit systeem is niet aangesloten op netstroom. is connected to the Internet verbonden is met het Internet The system is not connected to the Internet. Dit systeem is niet verbonden met het Internet. The installer is not running with administrator rights. Het installatieprogramma draait zonder administratorrechten. The screen is too small to display the installer. Het schem is te klein on het installatieprogramma te vertonen. ResizeFileSystemJob Resize file system on partition %1. Pas grootte bestandssysteem aan op partitie %1. Parted failed to resize filesystem. Parted heeft gefaald de grootte van het bestandssysteem aan te passen. Failed to resize filesystem. Het aanpassen van de grootte van het bestandsysteem is mislukt. ResizePartitionJob Resize partition %1. Pas de grootte van partitie %1 aan. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Herschaal de <strong>%2MB</strong> partitie <strong>%1</strong> naar <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Pas de %2MB partitie %1 aan naar %3MB. The installer failed to resize partition %1 on disk '%2'. Installatieprogramma is er niet in geslaagd om de grootte van partitie %1 op schrijf %2 aan te passen. Could not open device '%1'. Kan apparaat '%1' niet openen. ScanningDialog Scanning storage devices... Opslagmedia inlezen... Partitioning Partitionering SetHostNameJob Set hostname %1 Instellen hostnaam %1 Set hostname <strong>%1</strong>. Instellen hostnaam <strong>%1</strong> Setting hostname %1. Hostnaam %1 instellen. Internal Error Interne Fout Cannot write hostname to target system Kan de hostnaam niet naar doelsysteem schrijven SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Stel toetsenbordmodel in op %1 ,indeling op %2-%3 Failed to write keyboard configuration for the virtual console. Kon de toetsenbordconfiguratie voor de virtuele console niet opslaan. Failed to write to %1 Schrijven naar %1 mislukt Failed to write keyboard configuration for X11. Schrijven toetsenbord configuratie voor X11 mislukt. Failed to write keyboard configuration to existing /etc/default directory. Kon de toetsenbordconfiguratie niet wegschrijven naar de bestaande /etc/default map. SetPartFlagsJob Set flags on partition %1. Stel vlaggen in op partitie %1. Set flags on %1MB %2 partition. Stel vlaggen in op %1MB %2 partitie. Set flags on new partition. Stel vlaggen in op nieuwe partitie. Clear flags on partition <strong>%1</strong>. Wis vlaggen op partitie <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Wis vlaggen op %1MB <strong>%2</strong> partitie. Clear flags on new partition. Wis vlaggen op nieuwe partitie. Flag partition <strong>%1</strong> as <strong>%2</strong>. Partitie <strong>%1</strong> als <strong>%2</strong> vlaggen. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Vlag %1MB <strong>%2</strong> partitie als <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Vlag nieuwe partitie als <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Vlaggen op partitie <strong>%1</strong> wissen. Clearing flags on %1MB <strong>%2</strong> partition. Vlaggen op %1MB <strong>%2</strong> partitie wissen. Clearing flags on new partition. Vlaggen op nieuwe partitie wissen. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Vlaggen <strong>%2</strong> op partitie <strong>%1</strong> instellen. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Vlaggen <strong>%3</strong> op %1MB <strong>%2</strong> partitie instellen. Setting flags <strong>%1</strong> on new partition. Vlaggen <strong>%1</strong> op nieuwe partitie instellen. The installer failed to set flags on partition %1. Het installatieprogramma kon geen vlaggen instellen op partitie %1. Could not open device '%1'. Kon apparaat '%1' niet openen. Could not open partition table on device '%1'. Kon de partitietabel op apparaat '%1' niet openen. Could not find partition '%1'. Kon partitie '%1' niet vinden. SetPartGeometryJob Update geometry of partition %1. Update geometrie van partitie %1. Failed to change the geometry of the partition. Kan de geometrie van de partitie niet wijzigen. SetPasswordJob Set password for user %1 Instellen wachtwoord voor gebruiker %1 Setting password for user %1. Wachtwoord instellen voor gebruiker %1. Bad destination system path. Onjuiste bestemming systeempad. rootMountPoint is %1 rootMountPoint is %1 Cannot disable root account. Kan root account niet uitschakelen. passwd terminated with error code %1. passwd is afgesloten met foutcode %1. Cannot set password for user %1. Kan het wachtwoord niet instellen voor gebruiker %1 usermod terminated with error code %1. usermod beëindigd met foutcode %1. SetTimezoneJob Set timezone to %1/%2 Instellen tijdzone naar %1/%2 Cannot access selected timezone path. Kan geen toegang krijgen tot het geselecteerde tijdzone pad. Bad path: %1 Onjuist pad: %1 Cannot set timezone. Kan tijdzone niet instellen. Link creation failed, target: %1; link name: %2 Link maken mislukt, doel: %1; koppeling naam: %2 Cannot set timezone, Kan de tijdzone niet instellen, Cannot open /etc/timezone for writing Kan niet schrijven naar /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. Dit is een overzicht van wat zal gebeuren wanneer je de installatieprocedure start. SummaryViewStep Summary Samenvatting UsersPage Your username is too long. De gebruikersnaam is te lang. Your username contains invalid characters. Only lowercase letters and numbers are allowed. De gebruikersnaam bevat ongeldige tekens. Enkel kleine letters en nummers zijn toegelaten. Your hostname is too short. De hostnaam is te kort. Your hostname is too long. De hostnaam is te lang. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. De hostnaam bevat ongeldige tekens. Enkel letters, cijfers en liggende streepjes zijn toegelaten. Your passwords do not match! Je wachtwoorden komen niet overeen! UsersViewStep Users Gebruikers WelcomePage Form Formulier &Language: Taa&l: &Release notes Uitgaveopme&rkingen &Known issues Ge&kende problemen &Support Onder&steuning &About &Over <h1>Welcome to the %1 installer.</h1> <h1>Welkom in het %1 installatieprogramma.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Welkom in het Calamares installatieprogramma voor %1.</h1> About %1 installer Over het %1 installatieprogramma <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>voor %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Met dank aan: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg en het <a href="https://www.transifex.com/calamares/calamares/">Calamares vertaalteam</a>.<br/><br/>De ontwikkeling van <a href="http://calamares.io/">Calamares</a> wordt gesponsord door <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 ondersteuning WelcomeViewStep Welcome Welkom calamares-3.1.12/lang/calamares_pl.ts000066400000000000000000003702351322271446000174550ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Środowisko uruchomieniowe</strong> systemu.<br><br>Starsze systemy x86 obsługują tylko <strong>BIOS</strong>.<br>Nowoczesne systemy zwykle używają <strong>EFI</strong>, lecz możliwe jest również ukazanie się BIOS, jeśli działa w trybie kompatybilnym. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Ten system został uruchomiony w środowisku rozruchowym <strong>EFI</strong>.<br><br>Aby skonfigurować uruchomienie ze środowiska EFI, instalator musi wdrożyć aplikację programu rozruchowego, takiego jak <strong>GRUB</strong> lub <strong>systemd-boot</strong> na <strong>Partycji Systemu EFI</strong>. Jest to automatyczne, chyba że wybierasz ręczne partycjonowanie, a w takim przypadku musisz wybrać ją lub utworzyć osobiście. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Ten system został uruchomiony w środowisku rozruchowym <strong>BIOS</strong>.<br><br>Aby skonfigurować uruchomienie ze środowiska BIOS, instalator musi zainstalować program rozruchowy, taki jak <strong>GRUB</strong> na początku partycji lub w <strong>Głównym Sektorze Rozruchowym</strong> blisko początku tablicy partycji (preferowane). Jest to automatyczne, chyba że wybierasz ręczne partycjonowanie, a w takim przypadku musisz ustawić ją osobiście. BootLoaderModel Master Boot Record of %1 Master Boot Record %1 Boot Partition Partycja rozruchowa System Partition Partycja systemowa Do not install a boot loader Nie instaluj programu rozruchowego %1 (%2) %1 (%2) Calamares::DebugWindow Form Formularz GlobalStorage Ogólne przechowywanie JobQueue Oczekujące zadania Modules Moduły Type: Rodzaj: none brak Interface: Interfejs: Tools Narzędzia Debug information Informacje debugowania Calamares::ExecutionViewStep Install Zainstaluj Calamares::JobThread Done Ukończono Calamares::ProcessJob Run command %1 %2 Uruchom polecenie %1 %2 Running command %1 %2 Wykonywanie polecenia %1 %2 External command crashed Zewnętrzne polecenie nie powiodło się Command %1 crashed. Output: %2 Polecenie %1 nie powiodło się. Wyjście: %2 External command failed to start Zewnętrzne polecenie nie uruchomiło się Command %1 failed to start. Polecenie %1 nie uruchomiło się. Internal error when starting command Wystąpił błąd wewnętrzny podczas uruchamiania polecenia Bad parameters for process job call. Błędne parametry wywołania zadania. External command failed to finish Nie udało się ukończyć zewnętrznego polecenia Command %1 failed to finish in %2s. Output: %3 Nie udało się ukończyć polecenia %1 w %2s. Wyjście: %3 External command finished with errors Zewnętrzne polecenie zakończone z błędami Command %1 finished with exit code %2. Output: %3 Polecenie %1 zakończone z kodem wyjścia %2. Wyjście: %3 Calamares::PythonJob Running %1 operation. Wykonuję operację %1. Bad working directory path Niepoprawna ścieżka katalogu roboczego Working directory %1 for python job %2 is not readable. Katalog roboczy %1 dla zadań pythona %2 jest nieosiągalny. Bad main script file Niepoprawny główny plik skryptu Main script file %1 for python job %2 is not readable. Główny plik skryptu %1 dla zadań pythona %2 jest nieczytelny. Boost.Python error in job "%1". Wystąpił błąd Boost.Python w zadaniu "%1". Calamares::ViewManager &Back &Wstecz &Next &Dalej &Cancel &Anuluj Cancel installation without changing the system. Anuluj instalację bez dokonywania zmian w systemie. Cancel installation? Anulować instalację? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Czy na pewno chcesz anulować obecny proces instalacji? Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. &Yes &Tak &No &Nie &Close Zam&knij Continue with setup? Kontynuować z programem instalacyjnym? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Instalator %1 zamierza przeprowadzić zmiany na Twoim dysku, aby zainstalować %2.<br/><strong>Nie będziesz mógł cofnąć tych zmian.</strong> &Install now &Zainstaluj teraz Go &back &Cofnij się &Done &Ukończono The installation is complete. Close the installer. Instalacja ukończona pomyślnie. Możesz zamknąć instalator. Error Błąd Installation Failed Wystąpił błąd instalacji CalamaresPython::Helper Unknown exception type Nieznany rodzaj wyjątku unparseable Python error nieparowalny błąd Pythona unparseable Python traceback nieparowalny traceback Pythona Unfetchable Python error. Nieosiągalny błąd Pythona. CalamaresWindow %1 Installer Instalator %1 Show debug information Pokaż informacje debugowania CheckFileSystemJob Checking file system on partition %1. Sprawdzanie systemu plików na partycji %1. The file system check on partition %1 failed. Wystąpił błąd sprawdzania systemu plików na partycji %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Ten komputer nie spełnia minimalnych wymagań, niezbędnych do instalacji %1.<br/>Instalacja nie może być kontynuowana. <a href="#details">Szczegóły...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Ten komputer nie spełnia wszystkich, zalecanych do instalacji %1 wymagań.<br/>Instalacja może być kontynuowana, ale niektóre opcje mogą być niedostępne. This program will ask you some questions and set up %2 on your computer. Ten program zada Ci garść pytań i ustawi %2 na Twoim komputerze. For best results, please ensure that this computer: Dla osiągnięcia najlepszych rezultatów upewnij się, że ten komputer: System requirements Wymagania systemowe ChoicePage Form Formularz After: Po: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ręczne partycjonowanie</strong><br/>Możesz samodzielnie utworzyć lub zmienić rozmiar istniejących partycji. Boot loader location: Położenie programu rozruchowego: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 zostanie zmniejszony do %2MB a nowa partycja %3MB zostanie utworzona dla %4. Select storage de&vice: &Wybierz urządzenie przechowywania: Current: Bieżący: Reuse %1 as home partition for %2. Użyj ponownie %1 jako partycji domowej dla %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Wybierz partycję do zmniejszenia, a następnie przeciągnij dolny pasek, aby zmienić jej rozmiar</strong> <strong>Select a partition to install on</strong> <strong>Wybierz partycję, na której przeprowadzona będzie instalacja</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Nigdzie w tym systemie nie można odnaleźć partycji systemowej EFI. Prosimy się cofnąć i użyć ręcznego partycjonowania dysku do ustawienia %1. The EFI system partition at %1 will be used for starting %2. Partycja systemowa EFI na %1 będzie użyta do uruchamiania %2. EFI system partition: Partycja systemowa EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. To urządzenie pamięci masowej prawdopodobnie nie posiada żadnego systemu operacyjnego. Co chcesz zrobić?<br/>Będziesz miał możliwość przejrzenia oraz zatwierdzenia swoich ustawień przed wykonaniem jakichkolwiek zmian na tym urządzeniu. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Wyczyść dysk</strong><br/>Ta operacja <font color="red">usunie</font> wszystkie dane obecnie znajdujące się na wybranym urządzeniu przechowywania. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. To urządzenie pamięci masowej posiada %1. Co chcesz zrobić?<br/>Będziesz miał możliwość przejrzenia oraz zatwierdzenia swoich ustawień przed wykonaniem jakichkolwiek zmian na tym urządzeniu. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Zainstaluj obok siebie</strong><br/>Instalator zmniejszy partycję, aby zrobić miejsce dla %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Zastąp partycję</strong><br/>Zastępowanie partycji poprzez %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. To urządzenie pamięci masowej posiada już system operacyjny. Co chcesz zrobić?<br/>Będziesz miał możliwość przejrzenia oraz zatwierdzenia swoich ustawień przed wykonaniem jakichkolwiek zmian na tym urządzeniu. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. To urządzenie pamięci masowej posiada kilka systemów operacyjnych. Co chcesz zrobić?<br/>Będziesz miał możliwość przejrzenia oraz zatwierdzenia swoich ustawień przed wykonaniem jakichkolwiek zmian na tym urządzeniu. ClearMountsJob Clear mounts for partitioning operations on %1 Wyczyść zamontowania dla operacji partycjonowania na %1 Clearing mounts for partitioning operations on %1. Czyszczenie montowań dla operacji partycjonowania na %1. Cleared all mounts for %1 Wyczyszczono wszystkie zamontowania dla %1 ClearTempMountsJob Clear all temporary mounts. Wyczyść wszystkie tymczasowe montowania. Clearing all temporary mounts. Usuwanie wszystkich tymczasowych punktów montowania. Cannot get list of temporary mounts. Nie można uzyskać listy tymczasowych montowań. Cleared all temporary mounts. Wyczyszczono wszystkie tymczasowe montowania. CreatePartitionDialog Create a Partition Utwórz partycję MiB MB Partition &Type: Rodzaj par&tycji: &Primary &Podstawowa E&xtended Ro&zszerzona Fi&le System: System p&lików: Flags: Flagi: &Mount Point: Punkt &montowania: Si&ze: Ro&zmiar: En&crypt Zaszy%fruj Logical Logiczna Primary Podstawowa GPT GPT Mountpoint already in use. Please select another one. Punkt montowania jest już używany. Proszę wybrać inny. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Utwórz nową partycję %2MB na %4 (%3) z systemem plików %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Utwórz nową partycję <strong>%2MB</strong> na <strong>%4</strong> (%3) z systemem plików <strong>%1</strong>. Creating new %1 partition on %2. Tworzenie nowej partycji %1 na %2. The installer failed to create partition on disk '%1'. Instalator nie mógł utworzyć partycji na dysku '%1'. Could not open device '%1'. Nie udało się otworzyć urządzenia '%1'. Could not open partition table. Nie udało się otworzyć tablicy partycji. The installer failed to create file system on partition %1. Instalator nie mógł utworzyć systemu plików na partycji %1. The installer failed to update partition table on disk '%1'. Instalator nie mógł zaktualizować tablicy partycji na dysku '%1'. CreatePartitionTableDialog Create Partition Table Utwórz tablicę partycji Creating a new partition table will delete all existing data on the disk. Utworzenie nowej tablicy partycji usunie wszystkie istniejące na dysku dane. What kind of partition table do you want to create? Jaki rodzaj tablicy partycji chcesz utworzyć? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Tablica partycji GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Utwórz nową tablicę partycję %1 na %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Utwórz nową tabelę partycji <strong>%1</strong> na <strong>%2</strong> (%3). Creating new %1 partition table on %2. Tworzenie nowej tablicy partycji %1 na %2. The installer failed to create a partition table on %1. Instalator nie mógł utworzyć tablicy partycji na %1. Could not open device %1. Nie udało się otworzyć urządzenia %1. CreateUserJob Create user %1 Utwórz użytkownika %1 Create user <strong>%1</strong>. Utwórz użytkownika <strong>%1</strong>. Creating user %1. Tworzenie użytkownika %1. Sudoers dir is not writable. Katalog sudoers nie ma prawa do zapisu. Cannot create sudoers file for writing. Nie można utworzyć pliku sudoers z możliwością zapisu. Cannot chmod sudoers file. Nie można wykonać chmod na pliku sudoers. Cannot open groups file for reading. Nie można otworzyć pliku groups do odczytu. Cannot create user %1. Nie można utworzyć użytkownika %1. useradd terminated with error code %1. Polecenie useradd zostało przerwane z kodem błędu %1. Cannot add user %1 to groups: %2. Nie można dodać użytkownika %1 do grup: %2 usermod terminated with error code %1. usermod zakończony z kodem błędu %1. Cannot set home directory ownership for user %1. Nie można ustawić właściciela katalogu domowego dla użytkownika %1. chown terminated with error code %1. Polecenie chown zostało przerwane z kodem błędu %1. DeletePartitionJob Delete partition %1. Usuń partycję %1. Delete partition <strong>%1</strong>. Usuń partycję <strong>%1</strong>. Deleting partition %1. Usuwanie partycji %1. The installer failed to delete partition %1. Instalator nie mógł usunąć partycji %1. Partition (%1) and device (%2) do not match. Partycja (%1) i urządzenie (%2) nie pasują do siebie. Could not open device %1. Nie udało się otworzyć urządzenia %1. Could not open partition table. Nie udało się otworzyć tablicy partycji. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Typ <strong>tabeli partycji</strong> na zaznaczonym nośniku danych.<br><br>Jedyną metodą na zmianę tabeli partycji jest jej wyczyszczenie i utworzenie jej od nowa, co spowoduje utratę wszystkich danych.<br>Ten instalator zachowa obecną tabelę partycji, jeżeli nie wybierzesz innej opcji.<br>W wypadku niepewności, w nowszych systemach zalecany jest GPT. This device has a <strong>%1</strong> partition table. To urządzenie ma <strong>%1</strong> tablicę partycji. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. To jest urządzenie <strong>pętli zwrotnej</strong>. To jest pseudo-urządzenie, które nie posiada tabeli partycji, która czyni plik dostępny jako urządzenie blokowe. Ten rodzaj instalacji zwykle zawiera tylko jeden system plików. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Instalator <strong>nie mógł znaleźć tabeli partycji</strong> na zaznaczonym nośniku danych.<br><br>Urządzenie nie posiada tabeli partycji bądź jest ona uszkodzona lub nieznanego rodzaju.<br>Instalator może utworzyć dla Ciebie nową tabelę partycji automatycznie, lub możesz uczynić to ręcznie. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Zalecany rodzaj tabeli partycji dla nowoczesnych systemów uruchamianych przez <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Ten rodzaj tabeli partycji jest zalecany tylko dla systemów uruchamianych ze środowiska uruchomieniowego <strong>BIOS</strong>. GPT jest zalecane w większości innych wypadków.<br><br><strong>Ostrzeżenie:</strong> tabele partycji MBR są przestarzałym standardem z ery MS-DOS.<br>Możesz posiadać tylko 4 partycje <em>podstawowe</em>, z których jedna może być partycją <em>rozszerzoną</em>, zawierającą wiele partycji <em>logicznych</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Zapisz konfigurację LUKS dla Dracut do %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Pominięto zapisywanie konfiguracji LUKS dla Dracut: partycja "/" nie jest szyfrowana Failed to open %1 Nie udało się otworzyć %1 DummyCppJob Dummy C++ Job Działanie obiektu Dummy C++ EditExistingPartitionDialog Edit Existing Partition Edycja istniejącej partycji Content: Zawartość: &Keep &Zachowaj Format Sformatuj Warning: Formatting the partition will erase all existing data. Ostrzeżenie: Sformatowanie partycji wymaże wszystkie istniejące na niej dane. &Mount Point: Punkt &montowania: Si&ze: Ro&zmiar: MiB MB Fi&le System: System p&lików: Flags: Flagi: Mountpoint already in use. Please select another one. Punkt montowania jest już używany. Proszę wybrać inny. EncryptWidget Form Formularz En&crypt system Zaszy&fruj system Passphrase Hasło Confirm passphrase Potwierdź hasło Please enter the same passphrase in both boxes. Użyj tego samego hasła w obu polach. FillGlobalStorageJob Set partition information Ustaw informacje partycji Install %1 on <strong>new</strong> %2 system partition. Zainstaluj %1 na <strong>nowej</strong> partycji systemowej %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Ustaw <strong>nową</strong> partycję %2 z punktem montowania <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Zainstaluj %2 na partycji systemowej %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Ustaw partycję %3 <strong>%1</strong> z punktem montowania <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Zainstaluj program rozruchowy na <strong>%1</strong>. Setting up mount points. Ustawianie punktów montowania. FinishedPage Form Form &Restart now &Uruchom ponownie teraz <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Wszystko gotowe.</h1><br/>%1 został zainstalowany na Twoim komputerze.<br/>Możesz teraz ponownie uruchomić komputer, aby przejść do nowego systemu, albo kontynuować używanie środowiska live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Instalacja nie powiodła się</h1><br/>Nie udało się zainstalować %1 na Twoim komputerze.<br/>Komunikat o błędzie: %2. FinishedViewStep Finish Koniec Installation Complete Instalacja zakończona The installation of %1 is complete. Instalacja %1 ukończyła się pomyślnie. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatuj partycję %1 (system plików: %2, rozmiar: %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Sformatuj partycję <strong>%3MB</strong> <strong>%1</strong> z systemem plików <strong>%2</strong>. Formatting partition %1 with file system %2. Formatowanie partycji %1 z systemem plików %2. The installer failed to format partition %1 on disk '%2'. Instalator nie mógł sformatować partycji %1 na dysku '%2'. Could not open device '%1'. Nie można otworzyć urządzenia '%1'. Could not open partition table. Nie udało się otworzyć tablicy partycji. The installer failed to create file system on partition %1. Instalator nie mógł utworzyć systemu plików na partycji %1. The installer failed to update partition table on disk '%1'. Instalator nie mógł zaktualizować tablicy partycji na dysku '%1'. InteractiveTerminalPage Konsole not installed Konsole jest niezainstalowany Please install the kde konsole and try again! Prosimy o zainstalowanie konsole KDE i ponownie spróbować! Executing script: &nbsp;<code>%1</code> Wykonywanie skryptu: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skrypt KeyboardPage Set keyboard model to %1.<br/> Ustaw model klawiatury na %1.<br/> Set keyboard layout to %1/%2. Ustaw model klawiatury na %1/%2. KeyboardViewStep Keyboard Klawiatura LCLocaleDialog System locale setting Systemowe ustawienia lokalne The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Systemowe ustawienia lokalne wpływają na ustawienia języka i znaków w niektórych elementach wiersza poleceń interfejsu użytkownika.<br/>Bieżące ustawienie to <strong>%1</strong>. &Cancel &Anuluj &OK &OK LicensePage Form Formularz I accept the terms and conditions above. Akceptuję powyższe warunki korzystania. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Umowy licencyjne</h1>Ten etap instalacji zainstaluje własnościowe oprogramowanie, którego dotyczą zasady licencji. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Przeczytaj znajdujące się poniżej Umowy Licencyjne Końcowego Użytkownika (EULA).<br/>Jeżeli nie zgadzasz się z tymi warunkami, nie możesz kontynuować. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Umowy licencyjne</h1>Ten etap instalacji pozwoli zainstalować własnościowe oprogramowanie, którego dotyczą zasady licencji w celu poprawienia doświadczenia i zapewnienia dodatkowych funkcji. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Przeczytaj znajdujące się poniżej Umowy Licencyjne Końcowego Użytkownika (EULA).<br/>Jeżeli nie zaakceptujesz tych warunków, własnościowe oprogramowanie nie zostanie zainstalowane, zamiast tego zostaną użyte otwartoźródłowe odpowiedniki. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>sterownik %1</strong><br/>autorstwa %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>sterownik graficzny %1</strong><br/><font color="Grey">autorstwa %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>wtyczka do przeglądarki %1</strong><br/><font color="Grey">autorstwa %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>kodek %1</strong><br/><font color="Grey">autorstwa %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>pakiet %1</strong><br/><font color="Grey">autorstwa %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">autorstwa %2</font> <a href="%1">view license agreement</a> <a href="%1">zobacz porozumienie licencyjne</a> LicenseViewStep License Licencja LocalePage The system language will be set to %1. Język systemu zostanie ustawiony na %1. The numbers and dates locale will be set to %1. Format liczb i daty zostanie ustawiony na %1. Region: Region: Zone: Strefa: &Change... &Zmień... Set timezone to %1/%2.<br/> Ustaw strefę czasową na %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Wczytywanie danych położenia Location Położenie MoveFileSystemJob Move file system of partition %1. Przenieś system plików partycji %1. Could not open file system on partition %1 for moving. Nie można otworzyć systemu plików na partycji %1 celem przeniesienia. Could not create target for moving file system on partition %1. Nie można utworzyć celu, by przenieść system plików na partycji %1. Moving of partition %1 failed, changes have been rolled back. Nie udało się przenieść partycji %1, zmiany zostały cofnięte. Moving of partition %1 failed. Roll back of the changes have failed. Nie udało się przenieść partycji %1. Próba cofnięcia zmian nie powiodła się. Updating boot sector after the moving of partition %1 failed. Nie udało się zaktualizować sektora rozruchu po przeniesieniu partycji %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Rozmiary sektora logicznego w źródle i w celu kopiowania są różne. Obecnie nie jest to wspierane. Source and target for copying do not overlap: Rollback is not required. Źródło i cel kopiowania nie nachodzą na siebie: Przywracanie nie jest wymagane. Could not open device %1 to rollback copying. Nie można otworzyć urządzenia %1, by wykonać przywracanie. NetInstallPage Name Nazwa Description Opis Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalacja sieciowa. (Wyłączona: Nie można pobrać listy pakietów, sprawdź swoje połączenie z siecią) NetInstallViewStep Package selection Wybór pakietów Page_Keyboard Form Form Keyboard Model: Model klawiatury: Type here to test your keyboard Napisz coś tutaj, aby sprawdzić swoją klawiaturę Page_UserSetup Form Form What is your name? Jak się nazywasz? What name do you want to use to log in? Jakiego imienia chcesz używać do logowania się? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Jeśli więcej niż jedna osoba będzie używać tego komputera, możesz utworzyć więcej kont już po instalacji.</small> Choose a password to keep your account safe. Wybierz hasło, aby chronić swoje konto. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Wpisz swoje hasło dwa razy, aby mieć pewność, że uniknąłeś literówek. Dobre hasło powinno zawierać mieszaninę liter, cyfr, znaków specjalnych; mieć przynajmniej 8 znaków i być regularnie zmieniane.</small> What is the name of this computer? Jaka jest nazwa tego komputera? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ta nazwa będzie używana, jeśli udostępnisz swój komputer w sieci.</small> Log in automatically without asking for the password. Zaloguj automatycznie bez proszenia o hasło. Use the same password for the administrator account. Użyj tego samego hasła dla konta administratora. Choose a password for the administrator account. Wybierz hasło do konta administratora. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Wpisz to samo hasło dwa razy, aby mieć pewność, że uniknąłeś literówek.</small> PartitionLabelsView Root Systemowa Home Domowa Boot Rozruchowa EFI system System EFI Swap Przestrzeń wymiany New partition for %1 Nowa partycja dla %1 New partition Nowa partycja %1 %2 %1 %2 PartitionModel Free Space Wolna powierzchnia New partition Nowa partycja Name Nazwa File System System plików Mount Point Punkt montowania Size Rozmiar PartitionPage Form Form Storage de&vice: Urządzenie przecho&wywania: &Revert All Changes P&rzywróć do pierwotnego stanu New Partition &Table Nowa &tablica partycji &Create &Utwórz &Edit &Edycja &Delete U&suń Install boot &loader on: Zainsta&luj program rozruchowy na: Are you sure you want to create a new partition table on %1? Czy na pewno chcesz utworzyć nową tablicę partycji na %1? PartitionViewStep Gathering system information... Zbieranie informacji o systemie... Partitions Partycje Install %1 <strong>alongside</strong> another operating system. Zainstaluj %1 <strong>obok</strong> innego systemu operacyjnego. <strong>Erase</strong> disk and install %1. <strong>Wyczyść</strong> dysk i zainstaluj %1. <strong>Replace</strong> a partition with %1. <strong>Zastąp</strong> partycję poprzez %1. <strong>Manual</strong> partitioning. <strong>Ręczne</strong> partycjonowanie. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Zainstaluj %1 <strong>obok</strong> innego systemu operacyjnego na dysku <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Wyczyść</strong> dysk <strong>%2</strong> (%3) i zainstaluj %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Zastąp</strong> partycję na dysku <strong>%2</strong> (%3) poprzez %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ręczne</strong> partycjonowanie na dysku <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Dysk <strong>%1</strong> (%2) Current: Bieżący: After: Po: No EFI system partition configured Nie skonfigurowano partycji systemowej EFI An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Partycja systemu EFI jest zalecana aby rozpocząć %1.<br/><br/>Aby ją skonfigurować, wróć i wybierz lub utwórz partycję z systemem plików FAT32 i flagą <strong>esp</strong> o punkcie montowania <strong>%2</strong>.<br/><br/>Możesz kontynuować bez ustawiania partycji systemu EFI, ale twój system może nie uruchomić się. EFI system partition flag not set Flaga partycji systemowej EFI nie została ustawiona An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Partycja systemu EFI jest konieczna, aby rozpocząć %1.<br/><br/>Partycja została skonfigurowana w punkcie montowania <strong>%2</strong>, ale nie została ustawiona flaga <strong>esp</strong>. Aby ustawić tę flagę, wróć i zmodyfikuj tę partycję.<br/><br/>Możesz kontynuować bez ustawienia tej flagi, ale Twój system może się nie uruchomić. Boot partition not encrypted Niezaszyfrowana partycja rozruchowa A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Oddzielna partycja rozruchowa została skonfigurowana razem z zaszyfrowaną partycją roota, ale partycja rozruchowa nie jest szyfrowana.<br/><br/>Nie jest to najbezpieczniejsze rozwiązanie, ponieważ ważne pliki systemowe znajdują się na niezaszyfrowanej partycji.<br/>Możesz kontynuować, ale odblokowywanie systemu nastąpi później, w trakcie uruchamiania.<br/>Aby zaszyfrować partycję rozruchową, wróć i utwórz ją ponownie zaznaczając opcję <strong>Szyfruj</strong> w oknie tworzenia partycji. QObject Default Keyboard Model Domyślny model klawiatury Default Domyślnie unknown nieznany extended rozszerzona unformatted niesformatowany swap przestrzeń wymiany Unpartitioned space or unknown partition table Przestrzeń bez partycji lub nieznana tabela partycji ReplaceWidget Form Formularz Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Wskaż gdzie zainstalować %1.<br/><font color="red">Uwaga: </font>na wybranej partycji zostaną usunięte wszystkie pliki. The selected item does not appear to be a valid partition. Wybrany element zdaje się nie być poprawną partycją. %1 cannot be installed on empty space. Please select an existing partition. Nie można zainstalować %1 na pustej przestrzeni. Prosimy wybrać istniejącą partycję. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. Nie można zainstalować %1 na rozszerzonej partycji. Prosimy wybrać istniejącą partycję podstawową lub logiczną. %1 cannot be installed on this partition. %1 nie może zostać zainstalowany na tej partycji. Data partition (%1) Partycja z danymi (%1) Unknown system partition (%1) Nieznana partycja systemowa (%1) %1 system partition (%2) %1 partycja systemowa (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partycja %1 jest zbyt mała dla %2. Prosimy wybrać partycję o pojemności przynajmniej %3 GB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Nigdzie w tym systemie nie można odnaleźć partycji systemowej EFI. Prosimy się cofnąć i użyć ręcznego partycjonowania dysku do ustawienia %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 zostanie zainstalowany na %2.<br/><font color="red">Uwaga: </font>wszystkie dane znajdujące się na partycji %2 zostaną utracone. The EFI system partition at %1 will be used for starting %2. Partycja systemowa EFI na %1 będzie użyta do uruchamiania %2. EFI system partition: Partycja systemowa EFI: RequirementsChecker Gathering system information... Zbieranie informacji o systemie... has at least %1 GB available drive space ma przynajmniej %1 GB dostępnego miejsca na dysku There is not enough drive space. At least %1 GB is required. Nie ma wystarczającej ilości miejsca na dysku. Wymagane jest przynajmniej %1 GB. has at least %1 GB working memory ma przynajmniej %1 GB pamięci roboczej The system does not have enough working memory. At least %1 GB is required. System nie posiada wystarczającej ilości pamięci roboczej. Wymagane jest przynajmniej %1 GB. is plugged in to a power source jest podłączony do źródła zasilania The system is not plugged in to a power source. System nie jest podłączony do źródła zasilania. is connected to the Internet jest podłączony do Internetu The system is not connected to the Internet. System nie jest podłączony do Internetu. The installer is not running with administrator rights. Instalator jest uruchomiony bez praw administratora. The screen is too small to display the installer. Zbyt niska rozdzielczość ekranu, aby wyświetlić instalator. ResizeFileSystemJob Resize file system on partition %1. Zmień rozmiar systemu plików na partycji %1. Parted failed to resize filesystem. Parted nie mógł zmienić rozmiaru systemu plików. Failed to resize filesystem. Nie można zmienić rozmiaru systemu plików. ResizePartitionJob Resize partition %1. Zmień rozmiar partycji %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Zmień rozmiar partycji <strong>%2MB</strong> <strong>%1</strong> do <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Zmiana rozmiaru partycji %1 z %2MB do %3MB. The installer failed to resize partition %1 on disk '%2'. Instalator nie mógł zmienić rozmiaru partycji %1 na dysku '%2'. Could not open device '%1'. Nie można otworzyć urządzenia '%1'. ScanningDialog Scanning storage devices... Skanowanie urządzeń przechowywania... Partitioning Partycjonowanie SetHostNameJob Set hostname %1 Ustaw nazwę komputera %1 Set hostname <strong>%1</strong>. Ustaw nazwę komputera <strong>%1</strong>. Setting hostname %1. Ustawianie nazwy komputera %1. Internal Error Błąd wewnętrzny Cannot write hostname to target system Nie można zapisać nazwy komputera w docelowym systemie SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Ustaw model klawiatury na %1, jej układ na %2-%3 Failed to write keyboard configuration for the virtual console. Błąd zapisu konfiguracji klawiatury dla konsoli wirtualnej. Failed to write to %1 Nie można zapisać do %1 Failed to write keyboard configuration for X11. Błąd zapisu konfiguracji klawiatury dla X11. Failed to write keyboard configuration to existing /etc/default directory. Błąd zapisu konfiguracji układu klawiatury dla istniejącego katalogu /etc/default. SetPartFlagsJob Set flags on partition %1. Ustaw flagi na partycji %1. Set flags on %1MB %2 partition. Ustaw flagi na partycji %1MB %2. Set flags on new partition. Ustaw flagi na nowej partycji. Clear flags on partition <strong>%1</strong>. Usuń flagi na partycji <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Wyczyść flagi z partycji %1MB <strong>%2</strong>. Clear flags on new partition. Wyczyść flagi na nowej partycji. Flag partition <strong>%1</strong> as <strong>%2</strong>. Oflaguj partycję <strong>%1</strong> jako <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Oflaguj partycję %1MB <strong>%2</strong> jako <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Oflaguj nową partycję jako <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Usuwanie flag na partycji <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Czyszczenie flag partycji %1MB <strong>%2</strong>. Clearing flags on new partition. Czyszczenie flag na nowej partycji. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Ustawianie flag <strong>%2</strong> na partycji <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Ustawienie flag <strong>%3</strong> na partycji %1MB <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Ustawianie flag <strong>%1</strong> na nowej partycji. The installer failed to set flags on partition %1. Instalator nie mógł ustawić flag na partycji %1. Could not open device '%1'. Nie udało się otworzyć urządzenia '%1'. Could not open partition table on device '%1'. Nie udało się otworzyć tablicy partycji na urządzeniu '%1'. Could not find partition '%1'. Nie udało się odnaleźć partycji '%1'. SetPartGeometryJob Update geometry of partition %1. Aktualizuj geometrię partycji %1. Failed to change the geometry of the partition. Nie udało się zmienić geometrii partycji. SetPasswordJob Set password for user %1 Ustaw hasło dla użytkownika %1 Setting password for user %1. Ustawianie hasła użytkownika %1. Bad destination system path. Błędna ścieżka docelowa systemu. rootMountPoint is %1 Punkt montowania / to %1 Cannot disable root account. Nie można wyłączyć konta administratora. passwd terminated with error code %1. Zakończono passwd z kodem błędu %1. Cannot set password for user %1. Nie można ustawić hasła dla użytkownika %1. usermod terminated with error code %1. Polecenie usermod przerwane z kodem błędu %1. SetTimezoneJob Set timezone to %1/%2 Ustaw strefę czasowa na %1/%2 Cannot access selected timezone path. Brak dostępu do wybranej ścieżki strefy czasowej. Bad path: %1 Niepoprawna ścieżka: %1 Cannot set timezone. Nie można ustawić strefy czasowej. Link creation failed, target: %1; link name: %2 Błąd tworzenia dowiązania, cel: %1; nazwa dowiązania: %2 Cannot set timezone, Nie można ustawić strefy czasowej, Cannot open /etc/timezone for writing Nie można otworzyć /etc/timezone celem zapisu SummaryPage This is an overview of what will happen once you start the install procedure. To jest podsumowanie czynności, które zostaną wykonane po rozpoczęciu przez Ciebie instalacji. SummaryViewStep Summary Podsumowanie UsersPage Your username is too long. Twoja nazwa użytkownika jest za długa. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Twoja nazwa użytkownika zawiera niepoprawne znaki. Dozwolone są tylko małe litery i cyfry. Your hostname is too short. Twoja nazwa komputera jest za krótka. Your hostname is too long. Twoja nazwa komputera jest za długa. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Twoja nazwa komputera zawiera niepoprawne znaki. Dozwolone są tylko litery, cyfry i myślniki. Your passwords do not match! Twoje hasła nie są zgodne! UsersViewStep Users Użytkownicy WelcomePage Form Formularz &Language: &Język: &Release notes Informacje o &wydaniu &Known issues &Znane problemy &Support &Wsparcie &About &Informacje <h1>Welcome to the %1 installer.</h1> <h1>Witamy w instalatorze %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Witamy w instalatorze Calamares dla systemu %1.</h1> About %1 installer O instalatorze %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>dla %3</strong><br/><br/>Prawa autorskie 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Prawa autorskie 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Podziękowania dla: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg i <a href="https://www.transifex.com/calamares/calamares/">zespołu tłumaczy Calamares</a>.<br/><br/><a href="http://calamares.io/">Projekt Calamares</a> jest sponsorowany przez <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support Wsparcie %1 WelcomeViewStep Welcome Witamy calamares-3.1.12/lang/calamares_pl_PL.ts000066400000000000000000003257001322271446000200450ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record %1 Boot Partition Partycja rozruchowa System Partition Partycja systemowa Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Moduły Type: none brak Interface: Tools Debug information Informacje debugowania Calamares::ExecutionViewStep Install Zainstaluj Calamares::JobThread Done Ukończono Calamares::ProcessJob Run command %1 %2 Uruchom polecenie %1 %2 Running command %1 %2 External command crashed Zewnętrzne polecenie nie powiodło się Command %1 crashed. Output: %2 Polecenie %1 nie powiodło się. Wyjście: %2 External command failed to start Zewnętrzne polecenie nie uruchomiło się Command %1 failed to start. Polecenie %1 nie uruchomiło się. Internal error when starting command Błąd wewnętrzny podczas uruchamiania polecenia Bad parameters for process job call. Błędne parametry wywołania zadania. External command failed to finish Nie udało się zakończyć zewnętrznego polecenia Command %1 failed to finish in %2s. Output: %3 Nie udało się zakończyć polecenia %1 w %2s. Wyjście: %3 External command finished with errors Zewnętrzne polecenie zakończone z błędami Command %1 finished with exit code %2. Output: %3 Polecenie %1 zakończone z kodem wyjścia %2. Wyjście: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Niepoprawna ścieżka folderu roboczego Working directory %1 for python job %2 is not readable. Folder roboczy %1 zadania pythona %2 jest nieosiągalny. Bad main script file Niepoprawny główny plik skryptu Main script file %1 for python job %2 is not readable. Główny plik skryptu %1 zadania pythona %2 jest nieczytelny. Boost.Python error in job "%1". Błąd Boost.Python w zadaniu "%1". Calamares::ViewManager &Back &Wstecz &Next &Dalej &Cancel &Anuluj Cancel installation without changing the system. Cancel installation? Przerwać instalację? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Czy naprawdę chcesz przerwać instalację? Instalator zakończy działanie i wszystkie zmiany zostaną utracone. &Yes &No &Close Continue with setup? Kontynuować instalację? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Zainstaluj Go &back &Wstecz &Done The installation is complete. Close the installer. Error Błąd Installation Failed Wystąpił błąd instalacji CalamaresPython::Helper Unknown exception type Nieznany wyjątek unparseable Python error Nieparsowalny błąd Pythona unparseable Python traceback nieparsowalny traceback Pythona Unfetchable Python error. Niepobieralny błąd Pythona. CalamaresWindow %1 Installer Instalator %1 Show debug information Pokaż informację debugowania CheckFileSystemJob Checking file system on partition %1. Sprawdzanie systemu plików na partycji %1. The file system check on partition %1 failed. Wystąpił błąd sprawdzania systemu plików na partycji %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements Wymagania systemowe ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Utwórz partycję MiB Partition &Type: Rodzaj par&tycji: &Primary &Podstawowa E&xtended Ro&zszerzona Fi&le System: Flags: &Mount Point: Punkt &montowania: Si&ze: Ro&zmiar: En&crypt Logical Logiczna Primary Podstawowa GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Instalator nie mógł utworzyć partycji na dysku '%1'. Could not open device '%1'. Nie udało się otworzyć urządzenia '%1'. Could not open partition table. Nie udało się otworzyć tablicy partycji. The installer failed to create file system on partition %1. Instalator nie mógł utworzyć systemu plików na partycji %1. The installer failed to update partition table on disk '%1'. Instalator nie mógł zaktualizować tablicy partycji na dysku '%1'. CreatePartitionTableDialog Create Partition Table Utwórz tablicę partycji Creating a new partition table will delete all existing data on the disk. Utworzenie nowej tablicy partycji, usunie wszystkie istniejące na dysku dane. What kind of partition table do you want to create? Jaki rodzaj tablicy partycji chcesz utworzyć? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Tablica partycji GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Instalator nie mógł utworzyć tablicy partycji na %1. Could not open device %1. Nie udało się otworzyć urządzenia %1. CreateUserJob Create user %1 Utwórz użytkownika %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Nie można zapisać do folderu sudoers. Cannot create sudoers file for writing. Nie można otworzyć pliku sudoers do zapisu. Cannot chmod sudoers file. Nie można wykonać chmod na pliku sudoers. Cannot open groups file for reading. Nie można otworzyć pliku groups do oczytu. Cannot create user %1. Nie można utworzyć użytkownika %1. useradd terminated with error code %1. useradd przerwany z kodem błędu %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Nie można ustawić właściciela folderu domowego dla użytkownika %1. chown terminated with error code %1. chown przerwany z kodem błędu %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Instalator nie mógł usunąć partycji %1. Partition (%1) and device (%2) do not match. Partycja (%1) i urządzenie (%2) są niezgodne. Could not open device %1. Nie udało się otworzyć urządzenia %1. Could not open partition table. Nie udało się otworzyć tablicy partycji. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Edycja istniejącej partycji Content: Zawartość: &Keep Format Sformatuj Warning: Formatting the partition will erase all existing data. Ostrzeżenie: Sformatowanie partycji wymaże wszystkie istniejące na niej dane. &Mount Point: Punkt &montowania: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Ustaw informacje partycji Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatuj partycję %1 (system plików: %2, rozmiar: %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Instalator nie mógł sformatować partycji %1 na dysku '%2'. Could not open device '%1'. Nie można otworzyć urządzenia '%1'. Could not open partition table. Nie udało się otworzyć tablicy partycji. The installer failed to create file system on partition %1. Instalator nie mógł utworzyć systemu plików na partycji %1. The installer failed to update partition table on disk '%1'. Instalator nie mógł zaktualizować tablicy partycji na dysku '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Model klawiatury %1.<br/> Set keyboard layout to %1/%2. Model klawiatury %1/%2. KeyboardViewStep Keyboard Klawiatura LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Region: Zone: Strefa: &Change... Set timezone to %1/%2.<br/> Strefa czasowa %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Wczytywanie danych położenia Location Położenie MoveFileSystemJob Move file system of partition %1. Przenieś system plików partycji %1. Could not open file system on partition %1 for moving. Nie można otworzyć systemu plików na partycji %1 celem przeniesienia. Could not create target for moving file system on partition %1. Nie można utworzyć celu, by przenieść system plików na partycji %1. Moving of partition %1 failed, changes have been rolled back. Nie udało się przenieść partycji %1, zmiany zostały cofnięte. Moving of partition %1 failed. Roll back of the changes have failed. Nie udało się przenieść partycji %1. Próba cofnięcia zmian nie powiodła się. Updating boot sector after the moving of partition %1 failed. Nie udało się zaktualizować boot sectora po przeniesieniu partycji %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Rozmiary sektora logicznego w źródle i celu kopiowania są różne. Obecnie nie jest to wspierane. Source and target for copying do not overlap: Rollback is not required. Źródło i cel kopiowania nie nachodzą na siebie: Przywracanie nie jest wymagane. Could not open device %1 to rollback copying. Nie można otworzyć urządzenia %1, by wykonać przywracanie. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Formularz Keyboard Model: Model klawiatury: Type here to test your keyboard Napisz coś tutaj, aby sprawdzić swoją klawiaturę Page_UserSetup Form Formularz What is your name? Jak się nazywasz? What name do you want to use to log in? Jakiego imienia chcesz używać do logowania się? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Jeśli więcej niż jedna osoba będzie używać tego komputera, możesz utworzyć więcej kont już po instalacji.</small> Choose a password to keep your account safe. Wybierz hasło, aby chronić swoje konto. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Wpisz swoje hasło dwa razy, by uniknąć literówek. Dobre hasło powinno zawierać miks liter, cyfr, znaków specjalnych, mieć przynajmniej 8 znaków i być regularnie zmieniane.</small> What is the name of this computer? Jaka jest nazwa tego komputera? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ta nazwa będzie widoczna, jeśli udostępnisz swój komputer w sieci.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. Wybierz hasło do konta administratora. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Wpisz to samo hasło dwa razy, by uniknąć literówek.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Wolna powierzchnia New partition Nowa partycja Name Nazwa File System System plików Mount Point Punkt montowania Size Rozmiar PartitionPage Form Formularz Storage de&vice: &Revert All Changes P&rzywróć do pierwotnego stanu New Partition &Table Nowa &tablica partycji &Create &Utwórz &Edit &Edycja &Delete U&suń Install boot &loader on: Are you sure you want to create a new partition table on %1? Na pewno utworzyć nową tablicę partycji na %1? PartitionViewStep Gathering system information... Zbieranie informacji o systemie... Partitions Partycje Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Domyślny model klawiatury Default Domyślnie unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Zmień rozmiar systemu plików na partycji %1. Parted failed to resize filesystem. Parted nie mógł zmienić rozmiaru systemu plików. Failed to resize filesystem. Nie można zmienić rozmiaru systemu plików. ResizePartitionJob Resize partition %1. Zmień rozmiar partycji %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Instalator nie mógł zmienić rozmiaru partycji %1 na dysku '%2'. Could not open device '%1'. Nie można otworzyć urządzenia '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Wybierz nazwę hosta %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Błąd wewnętrzny Cannot write hostname to target system Nie można zapisać nazwy hosta w systemie docelowym SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Aktualizuj geometrię partycji %1. Failed to change the geometry of the partition. Nie udało się zmienić geometrii partycji. SetPasswordJob Set password for user %1 Ustaw hasło użytkownika %1 Setting password for user %1. Bad destination system path. Błędna ścieżka docelowa. rootMountPoint is %1 Punkt montowania / to %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. Nie można ustawić hasła dla użytkownika %1. usermod terminated with error code %1. usermod przerwany z kodem błędu %1. SetTimezoneJob Set timezone to %1/%2 Strefa czasowa %1/%2 Cannot access selected timezone path. Brak dostępu do wybranej ścieżki strefy czasowej. Bad path: %1 Niepoprawna ścieżka: %1 Cannot set timezone. Nie można ustawić strefy czasowej. Link creation failed, target: %1; link name: %2 Błąd tworzenia dowiązania, cel: %1; nazwa dowiązania: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Podsumowanie UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Twoje hasła są niezgodne! UsersViewStep Users Użytkownicy WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_pt_BR.ts000066400000000000000000003715231322271446000200510ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. O <strong>ambiente de inicialização</strong> deste sistema.<br><br>Sistemas x86 antigos têm suporte apenas ao <strong>BIOS</strong>.<br>Sistemas modernos normalmente usam <strong>EFI</strong>, mas também podem mostrar o BIOS se forem iniciados no modo de compatibilidade. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Este sistema foi iniciado com um ambiente de inicialização <strong>EFI</strong>.<br><br>Para configurar o início a partir de um ambiente EFI, este instalador deverá instalar um gerenciador de inicialização, como o <strong>GRUB</strong> ou <strong>systemd-boot</strong> em uma <strong>Partição de Sistema EFI</strong>. Este processo é automático, a não ser que escolha o particionamento manual, que no caso permite-lhe escolher ou criá-lo manualmente. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Este sistema foi iniciado utilizando o <strong>BIOS</strong> como ambiente de inicialização.<br><br>Para configurar a inicialização em um ambiente BIOS, este instalador deve instalar um gerenciador de boot, como o <strong>GRUB</strong>, no começo de uma partição ou no <strong>Master Boot Record</strong>, perto do começo da tabela de partições (recomendado). Este processo é automático, a não ser que você escolha o particionamento manual, onde você deverá configurá-lo manualmente. BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partição de Boot System Partition Partição de Sistema Do not install a boot loader Não instalar um gerenciador de inicialização %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulário GlobalStorage Armazenamento Global JobQueue Fila de Trabalhos Modules Módulos Type: Tipo: none nenhum Interface: Interface: Tools Ferramentas Debug information Informações de depuração Calamares::ExecutionViewStep Install Instalar Calamares::JobThread Done Concluído Calamares::ProcessJob Run command %1 %2 Executar comando %1 %2 Running command %1 %2 Executando comando %1 %2 External command crashed Comando externo falhou Command %1 crashed. Output: %2 Comando %1 falhou Saída: %2 External command failed to start Comando externo falhou ao inciar Command %1 failed to start. Comando %1 falhou ao iniciar. Internal error when starting command Erro interno ao iniciar comando Bad parameters for process job call. Parâmetros ruins para a chamada da tarefa do processo. External command failed to finish Comando externo falhou ao finalizar Command %1 failed to finish in %2s. Output: %3 Comando %1 falhou ao finalizar em %2. Saída: %3 External command finished with errors Comando externo terminou com erros Command %1 finished with exit code %2. Output: %3 Comando %1 finalizou com o código de saída %2. Saída: %3 Calamares::PythonJob Running %1 operation. Executando operação %1. Bad working directory path Caminho de diretório de trabalho ruim Working directory %1 for python job %2 is not readable. Diretório de trabalho %1 para a tarefa do python %2 não é legível. Bad main script file Arquivo de script principal ruim Main script file %1 for python job %2 is not readable. Arquivo de script principal %1 para a tarefa do python %2 não é legível. Boost.Python error in job "%1". Boost.Python erro na tarefa "%1". Calamares::ViewManager &Back &Voltar &Next &Próximo &Cancel &Cancelar Cancel installation without changing the system. Cancelar instalação sem modificar o sistema. Cancel installation? Cancelar a instalação? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Você deseja realmente cancelar a instalação atual? O instalador será fechado e todas as alterações serão perdidas. &Yes &Sim &No &Não &Close &Fechar Continue with setup? Continuar com configuração? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> O instalador %1 está prestes a fazer alterações no disco a fim de instalar %2.<br/><strong>Você não será capaz de desfazer estas mudanças.</strong> &Install now &Instalar agora Go &back Voltar &Done Completo The installation is complete. Close the installer. A instalação está completa. Feche o instalador. Error Erro Installation Failed Falha na Instalação CalamaresPython::Helper Unknown exception type Tipo de exceção desconhecida unparseable Python error erro inanalisável do Python unparseable Python traceback rastreamento inanalisável do Python Unfetchable Python error. Erro inbuscável do Python. CalamaresWindow %1 Installer Instalador %1 Show debug information Exibir informações de depuração CheckFileSystemJob Checking file system on partition %1. Verificando sistema de arquivos na partição %1. The file system check on partition %1 failed. A verificação do sistema de arquivo na partição %1 falhou. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Este computador não satisfaz os requisitos mínimos para instalar %1. A instalação não pode continuar.<a href="#details">Detalhes...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Este computador não satisfaz alguns dos requisitos recomendados para instalar %1. A instalação pode continuar, mas alguns recursos podem ser desativados. This program will ask you some questions and set up %2 on your computer. Este programa irá fazer-lhe algumas perguntas e configurar %2 no computador. For best results, please ensure that this computer: Para melhores resultados, por favor, certifique-se de que este computador: System requirements Requisitos do sistema ChoicePage Form Formulário After: Depois: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionamento manual</strong><br/>Você pode criar ou redimensionar partições. Boot loader location: Local do gerenciador de inicialização: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 será reduzida para %2MB e uma nova partição de %3MB será criada para %4. Select storage de&vice: Selecione o dispositi&vo de armazenamento: Current: Atual: Reuse %1 as home partition for %2. Reutilizar %1 como partição home para %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Selecione uma partição para reduzir, então arraste a barra de baixo para redimensionar</strong> <strong>Select a partition to install on</strong> <strong>Selecione uma partição para instalação</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Uma partição de sistema EFI não pôde ser encontrada neste dispositivo. Por favor, volte e use o particionamento manual para gerenciar %1. The EFI system partition at %1 will be used for starting %2. A partição de sistema EFI em %1 será utilizada para iniciar %2. EFI system partition: Partição de sistema EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Parece que não há um sistema operacional neste dispositivo. O que gostaria de fazer?<br/>Você poderá revisar e confirmar suas opções antes que as alterações sejam feitas no dispositivo de armazenamento. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Apagar disco</strong><br/>Isto <font color="red">excluirá</font> todos os dados no dispositivo de armazenamento selecionado. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de armazenamento possui %1 nele. O que gostaria de fazer?<br/>Você poderá revisar e confirmar suas opções antes que as alterações sejam feitas no dispositivo de armazenamento. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalar lado a lado</strong><br/>O instalador irá reduzir uma partição para liberar espaço para %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Substituir uma partição</strong><br/>Substitui uma partição com %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Já há um sistema operacional neste dispositivo de armazenamento. O que gostaria de fazer?<br/>Você poderá revisar e confirmar suas opções antes que as alterações sejam feitas no dispositivo de armazenamento. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Há diversos sistemas operacionais neste dispositivo de armazenamento. O que gostaria de fazer?<br/>Você poderá revisar e confirmar suas opções antes que as alterações sejam feitas no dispositivo de armazenamento. ClearMountsJob Clear mounts for partitioning operations on %1 Limpar as montagens para as operações nas partições em %1 Clearing mounts for partitioning operations on %1. Limpando montagens para operações de particionamento em %1. Cleared all mounts for %1 Todos os pontos de montagem para %1 foram limpos ClearTempMountsJob Clear all temporary mounts. Limpar pontos de montagens temporários. Clearing all temporary mounts. Limpando todos os pontos de montagem temporários. Cannot get list of temporary mounts. Não foi possível listar os pontos de montagens. Cleared all temporary mounts. Pontos de montagens temporários limpos. CreatePartitionDialog Create a Partition Criar uma partição MiB MiB Partition &Type: &Tipo da partição: &Primary &Primária E&xtended E&xtendida Fi&le System: Sistema de Arquivos: Flags: Marcadores: &Mount Point: Ponto de &Montagem: Si&ze: Tamanho: En&crypt &Criptografar Logical Lógica Primary Primária GPT GPT Mountpoint already in use. Please select another one. Ponto de montagem já em uso. Por favor, selecione outro. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Criar nova partição de %2MB em %4 (%3) com o sistema de arquivos %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Criar nova partição de <strong>%2MB</strong> em <strong>%4</strong> (%3) com o sistema de arquivos <strong>%1</strong>. Creating new %1 partition on %2. Criando nova partição %1 em %2. The installer failed to create partition on disk '%1'. O instalador não conseguiu criar partições no disco '%1'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. Could not open partition table. Não foi possível abrir a tabela de partições. The installer failed to create file system on partition %1. O instalador não conseguiu criar o sistema de arquivos na partição %1. The installer failed to update partition table on disk '%1'. O instalador falhou ao atualizar a tabela de partições no disco '%1'. CreatePartitionTableDialog Create Partition Table Criar Tabela de Partições Creating a new partition table will delete all existing data on the disk. A criação de uma nova tabela de partições excluirá todos os dados no disco. What kind of partition table do you want to create? Que tipo de tabela de partições você deseja criar? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Criar nova tabela de partições %1 em %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Criar nova tabela de partições <strong>%1</strong> em <strong>%2</strong> (%3). Creating new %1 partition table on %2. Criando nova tabela de partições %1 em %2. The installer failed to create a partition table on %1. O instalador não conseguiu criar uma tabela de partições em %1. Could not open device %1. Não foi possível abrir o dispositivo %1. CreateUserJob Create user %1 Criar usuário %1 Create user <strong>%1</strong>. Criar usuário <strong>%1</strong>. Creating user %1. Criando usuário %1. Sudoers dir is not writable. O diretório do superusuário não é gravável. Cannot create sudoers file for writing. Não foi possível criar arquivo do superusuário para gravação. Cannot chmod sudoers file. Não foi possível alterar permissões do arquivo do superusuário. Cannot open groups file for reading. Não foi possível abrir arquivos do grupo para leitura. Cannot create user %1. Impossível criar o usuário %1. useradd terminated with error code %1. useradd terminou com código de erro %1. Cannot add user %1 to groups: %2. Não foi possível adicionar o usuário %1 aos grupos: %2. usermod terminated with error code %1. O usermod terminou com o código de erro %1. Cannot set home directory ownership for user %1. Impossível definir proprietário da pasta pessoal para o usuário %1. chown terminated with error code %1. chown terminou com código de erro %1. DeletePartitionJob Delete partition %1. Excluir a partição %1. Delete partition <strong>%1</strong>. Excluir a partição <strong>%1</strong>. Deleting partition %1. Excluindo a partição %1. The installer failed to delete partition %1. O instalador não conseguiu excluir a partição %1. Partition (%1) and device (%2) do not match. Partição (%1) e dispositivo (%2) não correspondem. Could not open device %1. Não foi possível abrir o dispositivo %1. Could not open partition table. Não foi possível abrir a tabela de partições. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. O tipo de <strong>tabela de partições</strong> no dispositivo de armazenamento selecionado.<br><br>O único modo de alterar o tipo de tabela de partições é apagar e recriar a mesma do começo, processo o qual exclui todos os dados do dispositivo.<br>Este instalador manterá a tabela de partições atual, a não ser que você escolha o contrário.<br>Em caso de dúvidas, em sistemas modernos o GPT é recomendado. This device has a <strong>%1</strong> partition table. Este dispositivo possui uma tabela de partições <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Este é um dispositivo de <strong>loop</strong>.<br><br>Este é um pseudo-dispositivo sem tabela de partições que faz um arquivo acessível como um dispositivo de bloco. Este tipo de configuração normalmente contém apenas um único sistema de arquivos. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. O instalador <strong>não pôde detectar uma tabela de partições</strong> no dispositivo de armazenamento selecionado.<br><br>O dispositivo ou não tem uma tabela de partições, ou a tabela de partições está corrompida, ou é de um tipo desconhecido.<br>Este instalador pode criar uma nova tabela de partições para você, tanto automaticamente, como pela página de particionamento manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Este é o tipo de tabela de partições recomendado para sistemas modernos que inicializam a partir de um ambiente <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Este tipo de tabela de partições só é aconselhável em sistemas antigos que iniciam a partir de um ambiente de inicialização <strong>BIOS</strong>. O GPT é recomendado na maioria dos outros casos.<br><br><strong>Aviso:</strong> a tabela de partições MBR é um padrão obsoleto da era do MS-DOS.<br>Apenas 4 partições <em>primárias</em> podem ser criadas, e dessas 4, uma pode ser uma partição <em>estendida</em>, que pode, por sua vez, conter várias partições <em>lógicas</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Escrever configuração LUKS para o Dracut em %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Pular escrita de configuração LUKS para o Dracut: a partição "/" não está criptografada Failed to open %1 Ocorreu uma falha ao abrir %1 DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editar Partição Existente Content: Conteúdo: &Keep Manter Format Formatar Warning: Formatting the partition will erase all existing data. Atenção: A formatação apagará todos os dados existentes. &Mount Point: Ponto de &Montagem: Si&ze: Tamanho: MiB MiB Fi&le System: Sistema de Arquivos: Flags: Marcadores: Mountpoint already in use. Please select another one. Ponto de montagem já em uso. Por favor, selecione outro. EncryptWidget Form Formulário En&crypt system &Criptografar sistema Passphrase Frase-chave Confirm passphrase Confirme a frase-chave Please enter the same passphrase in both boxes. Por favor, insira a mesma frase-chave nos dois campos. FillGlobalStorageJob Set partition information Definir informações da partição Install %1 on <strong>new</strong> %2 system partition. Instalar %1 em <strong>nova</strong> partição %2 do sistema. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Configurar <strong>nova</strong> partição %2 com ponto de montagem <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalar %2 em partição %3 do sistema <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Configurar partição %3 <strong>%1</strong> com ponto de montagem <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar gerenciador de inicialização em <strong>%1</strong>. Setting up mount points. Configurando pontos de montagem. FinishedPage Form Formulário &Restart now &Reiniciar agora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Tudo pronto.</h1><br/>%1 foi instalado no seu computador.<br/>Agora você pode reiniciar seu novo sistema ou continuar usando o ambiente Live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>A instalação falhou</h1><br/>%1 não foi instalado em seu computador.<br/>A mensagem de erro foi: %2. FinishedViewStep Finish Concluir Installation Complete Instalação Completa The installation of %1 is complete. A instalação do %1 está completa. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatar partição %1 (sistema de arquivos: %2, tamanho: %3 MB) em %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatar a partição de <strong>%3MB</strong> <strong>%1</strong> com o sistema de arquivos <strong>%2</strong>. Formatting partition %1 with file system %2. Formatando partição %1 com o sistema de arquivos %2. The installer failed to format partition %1 on disk '%2'. O instalador falhou em formatar a partição %1 no disco '%2'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. Could not open partition table. Não foi possível abrir a tabela de partições. The installer failed to create file system on partition %1. O instalador falhou ao criar o sistema de arquivos na partição %1. The installer failed to update partition table on disk '%1'. O instalador falhou ao atualizar a tabela de partições no disco '%1'. InteractiveTerminalPage Konsole not installed Konsole não instalado Please install the kde konsole and try again! Por favor, instale o Konsole do KDE e tente novamente! Executing script: &nbsp;<code>%1</code> Executando script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Definir o modelo de teclado para %1.<br/> Set keyboard layout to %1/%2. Definir o layout do teclado para %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Definição de localidade do sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. A configuração de localidade do sistema afeta a linguagem e o conjunto de caracteres para algumas linhas de comando e elementos da interface do usuário.<br/>A configuração atual é <strong>%1</strong>. &Cancel &Cancelar &OK &OK LicensePage Form Formulário I accept the terms and conditions above. Aceito os termos e condições acima. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Termos de licença</h1>Este procedimento de configuração irá instalar software proprietário, que está sujeito aos termos de licenciamento. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Por favor, revise os acordos de licença de usuário final (EULAs) acima.<br/>Se você não concordar com os termos, o procedimento de configuração não pode continuar. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Termos de licença</h1>Este procedimento de instalação pode instalar o software proprietário, que está sujeito a termos de licenciamento, a fim de fornecer recursos adicionais e melhorar a experiência do usuário. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Por favor, revise os acordos de licença de usuário final (EULAs) acima.<br/>Se você não concordar com os termos, o software proprietário não será instalado e as alternativas de código aberto serão utilizadas em seu lugar. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 driver gráfico</strong><br/><font color="Grey">por %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 plugin do navegador</strong><br/><font color="Grey">por %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">por %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>pacote %1</strong><br/><font color="Grey">por %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">por %2</font> <a href="%1">view license agreement</a> <a href="%1">mostrar termos de licença</a> LicenseViewStep License Licença LocalePage The system language will be set to %1. O idioma do sistema será definido como %1. The numbers and dates locale will be set to %1. O local dos números e datas será definido como %1. Region: Região: Zone: Área: &Change... &Mudar... Set timezone to %1/%2.<br/> Definir o fuso horário para %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Carregando dados de localização... Location Localização MoveFileSystemJob Move file system of partition %1. Mover sistema de arquivos para partição %1. Could not open file system on partition %1 for moving. Não foi possível abrir o sistema de arquivos na partição %1 para mover. Could not create target for moving file system on partition %1. Não foi possível criar o alvo para mover o sistema de aquivos na partição %1 Moving of partition %1 failed, changes have been rolled back. Falha ao mover partição %1, as alterações foram revertidas. Moving of partition %1 failed. Roll back of the changes have failed. Falha ao mover partição %1. As alterações não puderam ser revertidas. Updating boot sector after the moving of partition %1 failed. Atualização do setor de inicialização após movimentação da partição %1 falhou. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. O tamanho de setor lógico do destino e da fonte não são os mesmos. Esta operação não é suportada atualmente. Source and target for copying do not overlap: Rollback is not required. Origem e alvo da cópia não coincidem: a reversão não é necessária. Could not open device %1 to rollback copying. Não foi possível abrir o dispositivo %1 para reverter a cópia. NetInstallPage Name Nome Description Descrição Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalação pela Rede. (Desabilitada: Não foi possível adquirir lista de pacotes, verifique sua conexão com a internet) NetInstallViewStep Package selection Seleção de pacotes Page_Keyboard Form Formulário Keyboard Model: Modelo de teclado: Type here to test your keyboard Escreva aqui para testar o seu teclado Page_UserSetup Form Formulário What is your name? Qual é o seu nome? What name do you want to use to log in? Qual nome você quer usar para entrar? font-weight: normal fonte: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Se mais de uma pessoa usará este computador, você pode definir múltiplas contas após a instalação.</small> Choose a password to keep your account safe. Escolha uma senha para mantar a sua conta segura. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Digite a mesma senha duas vezes, de modo que possam ser verificados erros de digitação. Uma boa senha contém uma mistura de letras, números e sinais de pontuação, deve ter pelo menos oito caracteres e deve ser alterada em intervalos regulares.</small> What is the name of this computer? Qual é o nome deste computador? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Este nome será usado caso você deixe o computador visível a outros na rede.</small> Log in automatically without asking for the password. Entrar automaticamente sem perguntar pela senha. Use the same password for the administrator account. Usar a mesma senha para a conta de administrador. Choose a password for the administrator account. Escolha uma senha para a conta administradora. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Digite a mesma senha duas vezes para que possa ser verificada contra erros de digitação.</small> PartitionLabelsView Root Root Home Home Boot Inicialização EFI system Sistema EFI Swap Swap New partition for %1 Nova partição para %1 New partition Nova partição %1 %2 %1 %2 PartitionModel Free Space Espaço livre New partition Nova partição Name Nome File System Sistema de arquivos Mount Point Ponto de montagem Size Tamanho PartitionPage Form Formulário Storage de&vice: Dispositi&vo de armazenamento: &Revert All Changes &Reverter todas as alterações New Partition &Table Nova Tabela de Partições &Create &Criar &Edit &Editar &Delete &Deletar Install boot &loader on: Insta&lar o gerenciador de inicialização em: Are you sure you want to create a new partition table on %1? Você tem certeza de que deseja criar uma nova tabela de partições em %1? PartitionViewStep Gathering system information... Coletando informações do sistema... Partitions Partições Install %1 <strong>alongside</strong> another operating system. Instalar %1 <strong>ao lado de</strong> outro sistema operacional. <strong>Erase</strong> disk and install %1. <strong>Apagar</strong> disco e instalar %1. <strong>Replace</strong> a partition with %1. <strong>Substituir</strong> uma partição com %1. <strong>Manual</strong> partitioning. Particionamento <strong>manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalar %1 <strong>ao lado de</strong> outro sistema operacional no disco <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Apagar</strong> disco <strong>%2</strong> (%3) e instalar %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Substituir</strong> uma partição no disco <strong>%2</strong> (%3) com %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionamento <strong>manual</strong> no disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1</strong> (%2) Current: Atualmente: After: Depois: No EFI system partition configured Nenhuma partição de sistema EFI configurada An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Uma partição de sistema EFI é necessária para iniciar %1.<br/><br/>Para configurar uma partição de sistema EFI, volte, selecione ou crie um sistema de arquivos FAT32 com o marcador <strong>esp</strong> ativado e ponto de montagem <strong>%2</strong>.<br/><br/>Você pode continuar sem definir uma partição de sistema EFI, mas seu sistema pode não iniciar. EFI system partition flag not set Marcador da partição do sistema EFI não definida An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Uma partição de sistema EFI é necessária para iniciar %1.<br/><br/>Uma partição foi configurada com o ponto de montagem <strong>%2</strong>, mas seu marcador <strong>esp</strong> não foi definido.<br/>Para definir o marcador, volte e edite a partição.<br/><br/>Você pode continuar sem definir um marcador, mas seu sistema pode não iniciar. Boot partition not encrypted Partição de boot não criptografada A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Uma partição de inicialização separada foi configurada juntamente com uma partição raiz criptografada, mas a partição de inicialização não é criptografada.<br/><br/>Há preocupações de segurança com este tipo de configuração, porque arquivos de sistema importantes são mantidos em uma partição não criptografada.<br/>Você pode continuar se quiser, mas o desbloqueio do sistema de arquivos acontecerá mais tarde durante a inicialização do sistema.<br/>Para criptografar a partição de inicialização, volte e recrie-a, selecionando <strong>Criptografar</strong> na janela de criação da partição. QObject Default Keyboard Model Modelo de teclado padrão Default Padrão unknown desconhecido extended estendida unformatted não formatado swap swap Unpartitioned space or unknown partition table Espaço não particionado ou tabela de partições desconhecida ReplaceWidget Form Formulário Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Selecione onde instalar %1.<br/><font color="red">Atenção:</font> isto excluirá todos os arquivos existentes na partição selecionada. The selected item does not appear to be a valid partition. O item selecionado não parece ser uma partição válida. %1 cannot be installed on empty space. Please select an existing partition. %1 não pode ser instalado no espaço vazio. Por favor, selecione uma partição existente. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 não pode ser instalado em uma partição estendida. Por favor, selecione uma partição primária ou lógica existente. %1 cannot be installed on this partition. %1 não pode ser instalado nesta partição. Data partition (%1) Partição de dados (%1) Unknown system partition (%1) Partição de sistema desconhecida (%1) %1 system partition (%2) Partição de sistema %1 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>A partição %1 é muito pequena para %2. Por favor, selecione uma partição com capacidade mínima de %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Não foi encontrada uma partição de sistema EFI no sistema. Por favor, volte e use o particionamento manual para configurar %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 será instalado em %2.<br/><font color="red">Atenção: </font>todos os dados da partição %2 serão perdidos. The EFI system partition at %1 will be used for starting %2. A partição do sistema EFI em %1 será utilizada para iniciar %2. EFI system partition: Partição do sistema EFI: RequirementsChecker Gathering system information... Coletando informações do sistema... has at least %1 GB available drive space tenha pelo menos %1 GB de espaço disponível no dispositivo There is not enough drive space. At least %1 GB is required. Não há espaço suficiente no armazenamento. Pelo menos %1 GB é necessário. has at least %1 GB working memory tenha pelo menos %1 GB de memória The system does not have enough working memory. At least %1 GB is required. O sistema não tem memória de trabalho suficiente. Pelo menos %1 GB é necessário. is plugged in to a power source está conectado a uma fonte de energia The system is not plugged in to a power source. O sistema não está conectado a uma fonte de energia. is connected to the Internet está conectado à Internet The system is not connected to the Internet. O sistema não está conectado à Internet. The installer is not running with administrator rights. O instalador não está sendo executado com permissões de administrador. The screen is too small to display the installer. A tela é muito pequena para exibir o instalador. ResizeFileSystemJob Resize file system on partition %1. Redimensionar o sistema de arquivos na partição %1. Parted failed to resize filesystem. Parted falhou ao redimensionar o sistema de arquivos. Failed to resize filesystem. Falha ao redimensionar o sistema de arquivos. ResizePartitionJob Resize partition %1. Redimensionar partição %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar <strong>%2MB</strong> da partição <strong>%1</strong> para <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Redimensionando %2MB da partição %1 para %3MB. The installer failed to resize partition %1 on disk '%2'. O instalador falhou em redimensionar a partição %1 no disco '%2'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. ScanningDialog Scanning storage devices... Localizando dispositivos de armazenamento... Partitioning Particionando SetHostNameJob Set hostname %1 Definir nome da máquina %1 Set hostname <strong>%1</strong>. Definir nome da máquina <strong>%1</strong>. Setting hostname %1. Definindo nome da máquina %1 Internal Error Erro interno Cannot write hostname to target system Não é possível gravar o nome da máquina para o sistema alvo SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Definir modelo de teclado para %1, layout para %2-%3 Failed to write keyboard configuration for the virtual console. Falha ao gravar a configuração do teclado para o console virtual. Failed to write to %1 Falha ao gravar em %1 Failed to write keyboard configuration for X11. Falha ao gravar a configuração do teclado para X11. Failed to write keyboard configuration to existing /etc/default directory. Falha ao gravar a configuração do teclado no diretório /etc/default existente. SetPartFlagsJob Set flags on partition %1. Definir marcadores na partição %1. Set flags on %1MB %2 partition. Definir marcadores na partição %1MB %2. Set flags on new partition. Definir marcadores na nova partição. Clear flags on partition <strong>%1</strong>. Limpar marcadores na partição <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Limpar marcadores na partição %1MB <strong>%2</strong>. Clear flags on new partition. Limpar marcadores na nova partição. Flag partition <strong>%1</strong> as <strong>%2</strong>. Marcar partição <strong>%1</strong> como <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Marcar partição %1MB <strong>%2</strong> como <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Marcar nova partição como <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Limpando marcadores na partição <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Limpar marcadores na partição %1MB <strong>%2</strong>. Clearing flags on new partition. Limpando marcadores na nova partição. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Definindo marcadores <strong>%2</strong> na partição <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Definindo marcadores <strong>%3</strong> na partição %1MB <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Definindo marcadores <strong>%1</strong> na nova partição. The installer failed to set flags on partition %1. O instalador falhou em definir marcadores na partição %1. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. Could not open partition table on device '%1'. Não foi possível abrir a tabela de partições no dispositivo '%1'. Could not find partition '%1'. Não foi possível encontrar a partição '%1'. SetPartGeometryJob Update geometry of partition %1. Atualizar geometria da partição %1. Failed to change the geometry of the partition. Falha ao alterar a geometria da partição. SetPasswordJob Set password for user %1 Definir senha para usuário %1 Setting password for user %1. Definindo senha para usuário %1 Bad destination system path. O caminho para o sistema está mal direcionado. rootMountPoint is %1 rootMountPoint é %1 Cannot disable root account. Não é possível desativar a conta root. passwd terminated with error code %1. passwd terminado com código de erro %1. Cannot set password for user %1. Não foi possível definir senha para o usuário %1. usermod terminated with error code %1. usermod terminou com código de erro %1. SetTimezoneJob Set timezone to %1/%2 Definir fuso horário para %1/%2 Cannot access selected timezone path. Não é possível acessar o caminho do fuso horário selecionado. Bad path: %1 Caminho ruim: %1 Cannot set timezone. Não foi possível definir o fuso horário. Link creation failed, target: %1; link name: %2 Não foi possível criar o link, alvo: %1; nome: %2 Cannot set timezone, Não foi possível definir o fuso horário. Cannot open /etc/timezone for writing Não foi possível abrir /etc/timezone para gravação SummaryPage This is an overview of what will happen once you start the install procedure. Este é um resumo do que acontecerá assim que o processo de instalação for iniciado. SummaryViewStep Summary Resumo UsersPage Your username is too long. O nome de usuário é grande demais. Your username contains invalid characters. Only lowercase letters and numbers are allowed. O nome de usuário contém caracteres inválidos. Apenas letras minúsculas e números são permitidos. Your hostname is too short. O nome da máquina é muito curto. Your hostname is too long. O nome da máquina é muito grande. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. O nome da máquina contém caracteres inválidos. Apenas letras, números e traços são permitidos. Your passwords do not match! As senhas não estão iguais! UsersViewStep Users Usuários WelcomePage Form Formulário &Language: &Idioma: &Release notes &Notas de lançamento &Known issues &Problemas conhecidos &Support &Suporte &About S&obre <h1>Welcome to the %1 installer.</h1> <h1>Bem-vindo ao instalador %1 .</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Bem-vindo ao instalador da Calamares para %1.</h1> About %1 installer Sobre o instalador %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Agradecimentos: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Time de tradutores do Calamares</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> o desenvolvimento é patrocinado por <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 suporte WelcomeViewStep Welcome Bem-vindo calamares-3.1.12/lang/calamares_pt_PT.ts000066400000000000000000003716671322271446000201020ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. O <strong>ambiente de arranque</strong> deste sistema.<br><br>Sistemas x86 mais antigos apenas suportam <strong>BIOS</strong>.<br>Sistemas modernos normalmente usam <strong>EFI</strong>, mas também podem aparecer como BIOS se iniciados em modo de compatibilidade. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Este sistema foi iniciado com ambiente de arranque<strong>EFI</strong>.<br><br>Para configurar o arranque de um ambiente EFI, o instalador tem de implantar uma aplicação de carregar de arranque, tipo <strong>GRUB</strong> ou <strong>systemd-boot</strong> ou uma <strong>Partição de Sistema EFI</strong>. Isto é automático, a menos que escolha particionamento manual, e nesse caso tem de escolhê-la ou criar uma por si próprio. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Este sistema foi iniciado com um ambiente de arranque <strong>BIOS</strong>.<br><br>Para configurar um arranque de um ambiente BIOS, este instalador tem de instalar um carregador de arranque, tipo <strong>GRUB</strong>, quer no início da partição ou no <strong>Master Boot Record</strong> perto do início da tabela de partições (preferido). Isto é automático, a não ser que escolha particionamento manual, e nesse caso tem de o configurar por si próprio BootLoaderModel Master Boot Record of %1 Master Boot Record de %1 Boot Partition Partição de Arranque System Partition Partição do Sistema Do not install a boot loader Não instalar um carregador de arranque %1 (%2) %1 (%2) Calamares::DebugWindow Form Formulário GlobalStorage ArmazenamentoGlobal JobQueue FilaDeTrabalho Modules Módulos Type: Tipo: none nenhum Interface: Interface: Tools Ferramentas Debug information Informação de depuração Calamares::ExecutionViewStep Install Instalar Calamares::JobThread Done Concluído Calamares::ProcessJob Run command %1 %2 Correr comando %1 %2 Running command %1 %2 A executar comando %1 %2 External command crashed Comando externo crashou Command %1 crashed. Output: %2 Comando %1 crashou. Saída: %2 External command failed to start Comando externo falhou ao iniciar Command %1 failed to start. Comando% 1 falhou ao iniciar. Internal error when starting command Erro interno ao iniciar comando Bad parameters for process job call. Maus parâmetros para chamada de processamento de tarefa. External command failed to finish Comando externo não conseguiu terminar Command %1 failed to finish in %2s. Output: %3 Comando %1 falhou ao terminar em %2s. Saída: %3 External command finished with errors Comando externo terminou com erros Command %1 finished with exit code %2. Output: %3 Comando %1 finalizou com o código de saída %2. Saída: %3 Calamares::PythonJob Running %1 operation. Operação %1 em execução. Bad working directory path Caminho do directório de trabalho errado Working directory %1 for python job %2 is not readable. Directório de trabalho %1 para a tarefa python %2 não é legível. Bad main script file Ficheiro de script principal errado Main script file %1 for python job %2 is not readable. Ficheiro de script principal %1 para a tarefa python %2 não é legível. Boost.Python error in job "%1". Erro Boost.Python na tarefa "%1". Calamares::ViewManager &Back &Voltar &Next &Próximo &Cancel &Cancelar Cancel installation without changing the system. Cancelar instalar instalação sem modificar o sistema. Cancel installation? Cancelar a instalação? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Tem a certeza que pretende cancelar o atual processo de instalação? O instalador será encerrado e todas as alterações serão perdidas. &Yes &Sim &No &Não &Close &Fechar Continue with setup? Continuar com a configuração? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> O %1 instalador está prestes a fazer alterações ao seu disco em ordem para instalar %2.<br/><strong>Não será capaz de desfazer estas alterações.</strong> &Install now &Instalar agora Go &back Voltar &atrás &Done &Feito The installation is complete. Close the installer. A instalação está completa. Feche o instalador. Error Erro Installation Failed Falha na Instalação CalamaresPython::Helper Unknown exception type Tipo de exceção desconhecido unparseable Python error erro inanalisável do Python unparseable Python traceback rasto inanalisável do Python Unfetchable Python error. Erro inatingível do Python. CalamaresWindow %1 Installer %1 Instalador Show debug information Mostrar informação de depuração CheckFileSystemJob Checking file system on partition %1. Verificação do sistema de ficheiros na partição% 1. The file system check on partition %1 failed. A verificação do sistema de ficheiros na partição% 1 falhou. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Este computador não satisfaz os requisitos mínimos para instalar %1.<br/>A instalação não pode continuar. <a href="#details">Detalhes...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Este computador não satisfaz alguns dos requisitos recomendados para instalar %1.<br/>A instalação pode continuar, mas algumas funcionalidades poderão ser desativadas. This program will ask you some questions and set up %2 on your computer. Este programa vai fazer-lhe algumas perguntas e configurar o %2 no seu computador. For best results, please ensure that this computer: Para melhores resultados, por favor certifique-se que este computador: System requirements Requisitos de sistema ChoicePage Form Formulário After: Depois: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Particionamento manual</strong><br/>Pode criar ou redimensionar partições manualmente. Boot loader location: Localização do carregador de arranque: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 será encolhida para %2MB e uma nova %3MB partição será criada para %4. Select storage de&vice: Selecione o dis&positivo de armazenamento: Current: Atual: Reuse %1 as home partition for %2. Reutilizar %1 como partição home para %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Selecione uma partição para encolher, depois arraste a barra de fundo para redimensionar</strong> <strong>Select a partition to install on</strong> <strong>Selecione uma partição para instalar</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Nenhuma partição de sistema EFI foi encontrada neste sistema. Por favor volte atrás e use o particionamento manual para configurar %1. The EFI system partition at %1 will be used for starting %2. A partição de sistema EFI em %1 será usada para iniciar %2. EFI system partition: Partição de sistema EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de armazenamento aparenta não ter um sistema operativo. O que quer fazer?<br/>Poderá rever e confirmar as suas escolhas antes de qualquer alteração ser feita no dispositivo de armazenamento. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Apagar disco</strong><br/>Isto irá <font color="red">apagar</font> todos os dados atualmente apresentados no dispositivo de armazenamento selecionado. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de armazenamento tem %1 nele. O que quer fazer?<br/>Poderá rever e confirmar as suas escolhas antes de qualquer alteração ser feita no dispositivo de armazenamento. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalar paralelamente</strong><br/>O instalador irá encolher a partição para arranjar espaço para %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Substituir a partição</strong><br/>Substitui a partição com %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de armazenamento já tem um sistema operativo nele. O que quer fazer?<br/>Poderá rever e confirmar as suas escolhas antes de qualquer alteração ser feita no dispositivo de armazenamento. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Este dispositivo de armazenamento tem múltiplos sistemas operativos nele, O que quer fazer?<br/>Poderá rever e confirmar as suas escolhas antes de qualquer alteração ser feita no dispositivo de armazenamento. ClearMountsJob Clear mounts for partitioning operations on %1 Limpar montagens para operações de particionamento em %1 Clearing mounts for partitioning operations on %1. A clarear montagens para operações de particionamento em %1. Cleared all mounts for %1 Limpar todas as montagens para %1 ClearTempMountsJob Clear all temporary mounts. Clarear todas as montagens temporárias. Clearing all temporary mounts. A limpar todas as montagens temporárias. Cannot get list of temporary mounts. Não é possível obter a lista de montagens temporárias. Cleared all temporary mounts. Clareadas todas as montagens temporárias. CreatePartitionDialog Create a Partition Criar uma Partição MiB MiB Partition &Type: Partição &Tamanho: &Primary &Primário E&xtended E&stendida Fi&le System: Sistema de Fi&cheiros: Flags: Flags: &Mount Point: &Ponto de Montagem: Si&ze: Ta&manho: En&crypt En&criptar Logical Lógica Primary Primária GPT GPT Mountpoint already in use. Please select another one. Ponto de montagem já em uso. Por favor selecione outro. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Criar nova partição de %2MB em %4 (%3) com sistema de ficheiros %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Criar nova partição de <strong>%2MB</strong> em <strong>%4</strong> (%3) com sistema de ficheiros <strong>%1</strong>. Creating new %1 partition on %2. Criando nova partição %1 em %2. The installer failed to create partition on disk '%1'. O instalador falhou a criação da partição no disco '%1'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. Could not open partition table. Não foi possível abrir a tabela de partições. The installer failed to create file system on partition %1. O instalador falhou a criação do sistema de ficheiros na partição %1. The installer failed to update partition table on disk '%1'. O instalador falhou ao atualizar a tabela de partições no disco '%1'. CreatePartitionTableDialog Create Partition Table Criar Tabela de Partições Creating a new partition table will delete all existing data on the disk. Criar uma nova tabela de partições irá apagar todos os dados existentes no disco. What kind of partition table do you want to create? Que tipo de tabela de partições quer criar? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) Tabela de Partições GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Criar nova %1 tabela de partições em %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Criar nova <strong>%1</strong> tabela de partições <strong>%2</strong> (%3). Creating new %1 partition table on %2. A criar nova %1 tabela de partições em %2. The installer failed to create a partition table on %1. O instalador falhou a criação de uma tabela de partições em %1. Could not open device %1. Não foi possível abrir o dispositivo %1. CreateUserJob Create user %1 Criar utilizador %1 Create user <strong>%1</strong>. Criar utilizador <strong>%1</strong>. Creating user %1. A criar utilizador %1. Sudoers dir is not writable. O diretório dos super utilizadores não é gravável. Cannot create sudoers file for writing. Impossível criar ficheiro do super utilizador para escrita. Cannot chmod sudoers file. Impossível de usar chmod no ficheiro dos super utilizadores. Cannot open groups file for reading. Impossível abrir ficheiro dos grupos para leitura. Cannot create user %1. Não é possível criar utilizador %1. useradd terminated with error code %1. useradd terminou com código de erro %1. Cannot add user %1 to groups: %2. Não é possível adicionar o utilizador %1 aos grupos: %2. usermod terminated with error code %1. usermod terminou com código de erro %1. Cannot set home directory ownership for user %1. Impossível definir permissão da pasta pessoal para o utilizador %1. chown terminated with error code %1. chown terminou com código de erro %1. DeletePartitionJob Delete partition %1. Apagar partição %1. Delete partition <strong>%1</strong>. Apagar partição <strong>%1</strong>. Deleting partition %1. A apagar a partição %1. The installer failed to delete partition %1. O instalador não conseguiu apagar a partição %1. Partition (%1) and device (%2) do not match. Partição (%1) e dispositivo (%2) não correspondem. Could not open device %1. Não foi possível abrir o dispositivo %1. Could not open partition table. Não foi possível abrir tabela de partições. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. O tipo da <strong>tabela de partições</strong> no dispositivo de armazenamento selecionado.<br><br>A única maneira de mudar o tipo da tabela de partições é apagá-la e recriar a tabela de partições do nada, o que destrói todos os dados no dispositivo de armazenamento.<br>Este instalador manterá a tabela de partições atual a não ser que escolha explicitamente em contrário.<br>Se não tem a certeza, nos sistemas modernos é preferido o GPT. This device has a <strong>%1</strong> partition table. Este dispositivo tem uma tabela de partições <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Este é um dispositivo<strong>loop</strong>.<br><br>É um pseudo-dispositivo sem tabela de partições que torna um ficheiro acessível como um dispositivo de bloco. Este tipo de configuração normalmente apenas contém um único sistema de ficheiros. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Este instalador <strong>não consegue detetar uma tabela de partições</strong> no dispositivo de armazenamento selecionado.<br><br>O dispositivo ou não tem tabela de partições, ou a tabela de partições está corrompida ou é de tipo desconhecido.<br>Este instalador pode criar uma nova tabela de partições para si, quer automativamente, ou através da página de particionamento manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Este é o tipo de tabela de partições recomendado para sistema modernos que arrancam a partir de um ambiente <strong>EFI</strong> de arranque. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Este tipo de tabela de partições é aconselhável apenas em sistemas mais antigos que iniciam a partir de um ambiente de arranque <strong>BIOS</strong>. GPT é recomendado na maior parte dos outros casos.<br><br><strong>Aviso:</strong> A tabela de partições MBR é um standard obsoleto da era MS-DOS.<br>Apenas 4 partições <em>primárias</em> podem ser criadas, e dessa 4, apenas uma pode ser partição <em>estendida</em>, que por sua vez podem ser tornadas em várias partições <em>lógicas</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Escrever configuração LUKS para Dracut em %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Saltar escrita de configuração LUKS para Dracut: partição "/" não está encriptada Failed to open %1 Falha ao abrir %1 DummyCppJob Dummy C++ Job Tarefa Dummy C++ EditExistingPartitionDialog Edit Existing Partition Editar Partição Existente Content: Conteúdo: &Keep &Manter Format Formatar: Warning: Formatting the partition will erase all existing data. Atenção: Formatar a partição irá apagar todos os dados existentes. &Mount Point: &Ponto de Montagem: Si&ze: Ta&manho: MiB MiB Fi&le System: Si&stema de Ficheiros: Flags: Flags: Mountpoint already in use. Please select another one. Ponto de montagem já em uso. Por favor selecione outro. EncryptWidget Form Forma En&crypt system En&criptar systema Passphrase Frase-chave Confirm passphrase Confirmar frase-chave Please enter the same passphrase in both boxes. Por favor insira a mesma frase-passe em ambas as caixas. FillGlobalStorageJob Set partition information Definir informação da partição Install %1 on <strong>new</strong> %2 system partition. Instalar %1 na <strong>nova</strong> %2 partição de sistema. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Criar <strong>nova</strong> %2 partição com ponto de montagem <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalar %2 em %3 partição de sistema <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Criar %3 partitição <strong>%1</strong> com ponto de montagem <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalar carregador de arranque em <strong>%1</strong>. Setting up mount points. Definindo pontos de montagem. FinishedPage Form Formulário &Restart now &Reiniciar agora <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Tudo feito</h1><br/>%1 foi instalado no seu computador.<br/>Pode agora reiniciar para o seu novo sistema, ou continuar a usar o %2 ambiente Live. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Instalação Falhada</h1><br/>%1 não foi instalado no seu computador.<br/>A mensagem de erro foi: %2. FinishedViewStep Finish Finalizar Installation Complete Instalação Completa The installation of %1 is complete. A instalação de %1 está completa. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatar partição %1 (sistema de ficheiros: %2, tamanho: %3 MB) em %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatar <strong>%3MB</strong> partitição <strong>%1</strong> com sistema de ficheiros <strong>%2</strong>. Formatting partition %1 with file system %2. A formatar partição %1 com sistema de ficheiros %2. The installer failed to format partition %1 on disk '%2'. O instalador falhou ao formatar a partição %1 no disco '%2'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. Could not open partition table. Não foi possível abrir a tabela de partições. The installer failed to create file system on partition %1. O instalador falhou ao criar o sistema de ficheiros na partição %1. The installer failed to update partition table on disk '%1'. O instalador falhou ao atualizar a tabela de partições no disco '%1'. InteractiveTerminalPage Konsole not installed Konsole não instalado Please install the kde konsole and try again! Por favor instale a konsola kde e tente novamente! Executing script: &nbsp;<code>%1</code> A executar script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Definir o modelo do teclado para %1.<br/> Set keyboard layout to %1/%2. Definir esquema do teclado para %1/%2. KeyboardViewStep Keyboard Teclado LCLocaleDialog System locale setting Definição de localização do Sistema The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. A definição local do sistema afeta o idioma e conjunto de carateres para alguns elementos do interface da linha de comandos.<br/>A definição atual é <strong>%1</strong>. &Cancel &OK LicensePage Form Formulário I accept the terms and conditions above. Aceito os termos e condições acima descritos. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acordo de Licença</h1>Este procedimento instalará programas proprietários que estão sujeitos a termos de licenciamento. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Por favor reveja o Acordo de Utilização do Utilizador Final (EULA) acima.<br/>Se não concordar com os termos, o procedimento de instalação não pode continuar. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acordo de Licença</h1>Este procedimento pode instalar programas proprietários que estão sujeitos a termos de licenciamento com vista a proporcionar funcionalidades adicionais e melhorar a experiência do utilizador. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Por favor reveja o Acordo de Utilização do Utilizador Final (EULA) acima.<br/>Se não concordar com os termos, programas proprietários não serão instalados, e em vez disso serão usadas soluções alternativas de código aberto. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 controlador</strong><br/>por %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 controlador gráfico</strong><br/><font color="Grey">por %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 extra para navegador</strong><br/><font color="Grey">por %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">por %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pacote</strong><br/><font color="Grey">por %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">por %2</font> <a href="%1">view license agreement</a> <a href="%1">visualizar acordo de licença</a> LicenseViewStep License Licença LocalePage The system language will be set to %1. A linguagem do sistema será definida para %1. The numbers and dates locale will be set to %1. Os números e datas locais serão definidos para %1. Region: Região: Zone: Zona: &Change... &Alterar... Set timezone to %1/%2.<br/> Definir fuso horário para %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... A carregar dados de localização... Location Localização MoveFileSystemJob Move file system of partition %1. Mover sistema de ficheiros da partição %1. Could not open file system on partition %1 for moving. Não foi possível abrir o sistema de ficheiros na partição %1 para mover. Could not create target for moving file system on partition %1. Não foi possível criar o alvo para mover o sistema de ficheiros na partição %1. Moving of partition %1 failed, changes have been rolled back. A movimentação da partição %1 falhou, as alterações foram revertidas. Moving of partition %1 failed. Roll back of the changes have failed. A movimentação da partição %1 falhou. A reversão das alterações falhou. Updating boot sector after the moving of partition %1 failed. A atualizar sector de arranque após a movimentação da partição %1 ter falhado. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. O tamanho dos setores lógicos para copiar na fonte e no destino não são os mesmos. Isto não é suportado actualmente. Source and target for copying do not overlap: Rollback is not required. Fonte e alvo para cópia não se sobrepõem: A reversão não é necessária. Could not open device %1 to rollback copying. Não foi possível abrir o dispositivo %1 para reverter a cópia. NetInstallPage Name Nome Description Descrição Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalaçao de Rede. (Desativada: Incapaz de buscar listas de pacotes, verifique a sua ligação de rede) NetInstallViewStep Package selection Seleção de pacotes Page_Keyboard Form Formulário Keyboard Model: Modelo do Teclado: Type here to test your keyboard Escreva aqui para testar a configuração do teclado Page_UserSetup Form Formulário What is your name? Qual é o seu nome? What name do you want to use to log in? Que nome deseja usar para iniciar a sessão? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Se mais do que uma pessoa for usar este computador, pode criar contas múltiplas depois da instalação.</small> Choose a password to keep your account safe. Escolha uma palavra-passe para manter a sua conta segura. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Digite a mesma palavra-passe duas vezes, de modo a que possam ser verificados erros de digitação. Uma boa palavra-passe contém uma mistura de letras, números e sinais de pontuação, deve ter pelo menos oito caracteres de comprimento, e deve ser alterada em intervalos regulares.</small> What is the name of this computer? Qual o nome deste computador? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Este nome será usado se tornar este computador visível para outros numa rede.</small> Log in automatically without asking for the password. Iniciar sessão automaticamente sem pedir a palavra-passe. Use the same password for the administrator account. Usar a mesma palavra-passe para a conta de administrador. Choose a password for the administrator account. Escolha uma palavra-passe para a conta de administrador. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Introduza a mesma palavra-passe duas vezes, para que se possam verificar erros de digitação.</small> PartitionLabelsView Root Root Home Home Boot Arranque EFI system Sistema EFI Swap Swap New partition for %1 Nova partição para %1 New partition Nova partição %1 %2 %1 %2 PartitionModel Free Space Espaço Livre New partition Nova partição Name Nome File System Sistema de Ficheiros Mount Point Ponto de Montagem Size Tamanho PartitionPage Form Formulário Storage de&vice: Dis&positivo de armazenamento: &Revert All Changes &Reverter todas as alterações New Partition &Table Nova &Tabela de Partições &Create &Criar &Edit &Editar &Delete &Apagar Install boot &loader on: Instalar &carregador de arranque em: Are you sure you want to create a new partition table on %1? Tem certeza de que deseja criar uma nova tabela de partições em %1? PartitionViewStep Gathering system information... A recolher informações do sistema... Partitions Partições Install %1 <strong>alongside</strong> another operating system. Instalar %1 <strong>paralelamente</strong> a outro sistema operativo. <strong>Erase</strong> disk and install %1. <strong>Apagar</strong> disco e instalar %1. <strong>Replace</strong> a partition with %1. <strong>Substituir</strong> a partição com %1. <strong>Manual</strong> partitioning. Particionamento <strong>Manual</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalar %1 <strong>paralelamente</strong> a outro sistema operativo no disco <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Apagar</strong> disco <strong>%2</strong> (%3) e instalar %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Substituir</strong> a partição no disco <strong>%2</strong> (%3) com %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Particionamento <strong>Manual</strong> no disco <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disco <strong>%1</strong> (%2) Current: Atual: After: Depois: No EFI system partition configured Nenhuma partição de sistema EFI configurada An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. É necessária uma partição de sistema EFI para iniciar %1.<br/><br/>Para configurar uma partição de sistema EFI, volte atrás e selecione ou crie um sistema de ficheiros FAT32 com a flag <strong>esp</strong> ativada e ponto de montagem <strong>%2</strong>.<br/><br/>Pode continuar sem configurar uma partição de sistema EFI mas o seu sistema pode falhar o arranque. EFI system partition flag not set flag não definida da partição de sistema EFI An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. É necessária uma partição de sistema EFI para iniciar %1.<br/><br/>A partitição foi configurada com o ponto de montagem <strong>%2</strong> mas a sua flag <strong>esp</strong> não está definida.<br/>Para definir a flag, volte atrás e edite a partição.<br/><br/>Pode continuar sem definir a flag mas o seu sistema pode falhar o arranque. Boot partition not encrypted Partição de arranque não encriptada A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Foi preparada uma partição de arranque separada juntamente com uma partição root encriptada, mas a partição de arranque não está encriptada.<br/><br/>Existem preocupações de segurança com este tipo de configuração, por causa de importantes ficheiros de sistema serem guardados numa partição não encriptada.<br/>Se desejar pode continuar, mas o destrancar do sistema de ficheiros irá ocorrer mais tarde durante o arranque do sistema.<br/>Para encriptar a partição de arranque, volte atrás e recrie-a, e selecione <strong>Encriptar</strong> na janela de criação de partições. QObject Default Keyboard Model Modelo de Teclado Padrão Default Padrão unknown desconhecido extended estendido unformatted não formatado swap swap Unpartitioned space or unknown partition table Espaço não particionado ou tabela de partições desconhecida ReplaceWidget Form Formulário Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Selecione onde instalar %1.<br/><font color="red">Aviso: </font>isto irá apagar todos os ficheiros na partição selecionada. The selected item does not appear to be a valid partition. O item selecionado não aparenta ser uma partição válida. %1 cannot be installed on empty space. Please select an existing partition. %1 não pode ser instalado no espaço vazio. Por favor selecione uma partição existente. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 não pode ser instalado numa partição estendida. Por favor selecione uma partição primária ou partição lógica. %1 cannot be installed on this partition. %1 não pode ser instalado nesta partição. Data partition (%1) Partição de dados (%1) Unknown system partition (%1) Partição de sistema desconhecida (%1) %1 system partition (%2) %1 partição de sistema (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>A partição %1 é demasiado pequena para %2. Por favor selecione uma partição com pelo menos %3 GiB de capacidade. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Uma partição de sistema EFI não pode ser encontrada em nenhum sítio neste sistema. Por favor volte atrás e use o particionamento manual para instalar %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 será instalado na %2.<br/><font color="red">Aviso: </font>todos os dados na partição %2 serão perdidos. The EFI system partition at %1 will be used for starting %2. A partição de sistema EFI em %1 será usada para iniciar %2. EFI system partition: Partição de sistema EFI: RequirementsChecker Gathering system information... A recolher informação de sistema... has at least %1 GB available drive space tem pelo menos %1 GB de espaço livre em disco There is not enough drive space. At least %1 GB is required. Não existe espaço livre suficiente em disco. É necessário pelo menos %1 GB. has at least %1 GB working memory tem pelo menos %1 GB de memória disponível The system does not have enough working memory. At least %1 GB is required. O sistema não tem memória disponível suficiente. É necessário pelo menos %1 GB. is plugged in to a power source está ligado a uma fonte de energia The system is not plugged in to a power source. O sistema não está ligado a uma fonte de energia. is connected to the Internet está ligado à internet The system is not connected to the Internet. O sistema não está ligado à internet. The installer is not running with administrator rights. O instalador não está a correr com permissões de administrador. The screen is too small to display the installer. O ecrã tem um tamanho demasiado pequeno para mostrar o instalador. ResizeFileSystemJob Resize file system on partition %1. Redimensionar o sistema de ficheiros na partição %1. Parted failed to resize filesystem. O Parted falhou ao redimensionar o sistema de ficheiros. Failed to resize filesystem. Falhou ao redimensionar o sistema de ficheiros. ResizePartitionJob Resize partition %1. Redimensionar partição %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionar <strong>%2MB</strong> partição <strong>%1</strong> para <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. A redimensionar %2MB partição %1 para %3MB. The installer failed to resize partition %1 on disk '%2'. O instalador falhou o redimensionamento da partição %1 no disco '%2'. Could not open device '%1'. Não foi possível abrir o dispositivo '%1'. ScanningDialog Scanning storage devices... A examinar dispositivos de armazenamento... Partitioning Particionamento SetHostNameJob Set hostname %1 Configurar nome da máquina %1 Set hostname <strong>%1</strong>. Definir nome da máquina <strong>%1</strong>. Setting hostname %1. A definir nome da máquina %1. Internal Error Erro interno Cannot write hostname to target system Não é possível escrever o nome da máquina para o sistema selecionado SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Definir modelo do teclado para %1, disposição para %2-%3 Failed to write keyboard configuration for the virtual console. Falha ao escrever configuração do teclado para a consola virtual. Failed to write to %1 Falha ao escrever para %1 Failed to write keyboard configuration for X11. Falha ao escrever configuração do teclado para X11. Failed to write keyboard configuration to existing /etc/default directory. Falha ao escrever a configuração do teclado para a diretoria /etc/default existente. SetPartFlagsJob Set flags on partition %1. Definir flags na partição %1. Set flags on %1MB %2 partition. Definir flags na %1MB %2 partição. Set flags on new partition. Definir flags na nova partição. Clear flags on partition <strong>%1</strong>. Limpar flags na partitição <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Limpar flags na %1MB <strong>%2</strong> partição. Clear flags on new partition. Limpar flags na nova partição. Flag partition <strong>%1</strong> as <strong>%2</strong>. Definir flag da partição <strong>%1</strong> como <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag %1MB <strong>%2</strong> partição como <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Nova partição com flag <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. A limpar flags na partição <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. A limpar flags na %1MB <strong>%2</strong> partição. Clearing flags on new partition. A limpar flags na nova partição. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. A definir flags <strong>%2</strong> na partitição <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. A definir flags <strong>%3</strong> na %1MB <strong>%2</strong> partição. Setting flags <strong>%1</strong> on new partition. A definir flags <strong>%1</strong> na nova partição. The installer failed to set flags on partition %1. O instalador falhou ao definir flags na partição %1. Could not open device '%1'. Não foi possível abrir o dispositvo '%1'. Could not open partition table on device '%1'. Não foi possível abrir a tabela de partições no dispositivo '%1'. Could not find partition '%1'. Não foi possível encontrar a partição '%1'. SetPartGeometryJob Update geometry of partition %1. Atualizar geometria da partição %1. Failed to change the geometry of the partition. Falha na alteração da geometria da partição. SetPasswordJob Set password for user %1 Definir palavra-passe para o utilizador %1 Setting password for user %1. A definir palavra-passe para o utilizador %1. Bad destination system path. Mau destino do caminho do sistema. rootMountPoint is %1 rootMountPoint é %1 Cannot disable root account. Não é possível desativar a conta root. passwd terminated with error code %1. passwd terminado com código de erro %1. Cannot set password for user %1. Não é possível definir a palavra-passe para o utilizador %1. usermod terminated with error code %1. usermod terminou com código de erro %1. SetTimezoneJob Set timezone to %1/%2 Configurar fuso horário para %1/%2 Cannot access selected timezone path. Não é possível aceder ao caminho do fuso horário selecionado. Bad path: %1 Mau caminho: %1 Cannot set timezone. Não é possível definir o fuso horário. Link creation failed, target: %1; link name: %2 Falha na criação de ligação, alvo: %1; nome da ligação: %2 Cannot set timezone, Não é possível definir o fuso horário, Cannot open /etc/timezone for writing Não é possível abrir /etc/timezone para escrita SummaryPage This is an overview of what will happen once you start the install procedure. Isto é uma visão geral do que acontecerá assim que iniciar o procedimento de instalação. SummaryViewStep Summary Resumo UsersPage Your username is too long. O seu nome de utilizador é demasiado longo. Your username contains invalid characters. Only lowercase letters and numbers are allowed. O seu nome de utilizador contem caractéres inválidos. Apenas letras minúsculas e números são permitidos. Your hostname is too short. O nome da sua máquina é demasiado curto. Your hostname is too long. O nome da sua máquina é demasiado longo. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. O nome da sua máquina contém caratéres inválidos. Apenas letras, números e traços são permitidos. Your passwords do not match! As suas palavras-passe não coincidem! UsersViewStep Users Utilizadores WelcomePage Form Formulário &Language: &Idioma: &Release notes &Notas de lançamento &Known issues &Problemas conhecidos &Support &Suporte &About &Sobre <h1>Welcome to the %1 installer.</h1> <h1>Bem vindo ao instalador do %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Bem vindo ao instalador Calamares para %1.</h1> About %1 installer Sobre %1 instalador <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Direitos de Cópia 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Direitos de Cópia 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Agradecimentos a: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg e para <a href="https://www.transifex.com/calamares/calamares/">a equipa de tradutores do Calamares</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> desenvolvimento apoiado por <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 suporte WelcomeViewStep Welcome Bem-vindo calamares-3.1.12/lang/calamares_ro.ts000066400000000000000000003662451322271446000174700ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Mediul de boot</strong> al acestui sistem.<br><br>Sisteme x86 mai vechi suportă numai <strong>BIOS</strong>.<br>Sisteme moderne folosesc de obicei <strong>EFI</strong>, dar ar putea fi afișate ca BIOS dacă au fost configurate în modul de compatibilitate. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Acest sistem a fost pornit într-un mediu de boot <strong>EFI</strong>.<br><br>Pentru a configura pornirea dintr-un mediu EFI, acest program de instalare trebuie să creeze o aplicație pentru boot-are, cum ar fi <strong>GRUB</strong> sau <strong>systemd-boot</strong> pe o <strong>partiție de sistem EFI</strong>. Acest pas este automat, cu excepția cazului în care alegeți partiționarea manuală. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Sistemul a fost pornit într-un mediu de boot <strong>BIOS</strong>.<br><br>Pentru a configura pornirea de la un mediu BIOS, programul de instalare trebuie să instaleze un mediu de boot, cum ar fi <strong>GRUB</strong> fie la începutul unei partiții sau pe <strong>Master Boot Record</strong> în partea de început a unei tabele de partiții (preferabil). Acesta este un pas automat, cu excepția cazului în care alegeți partiționarea manuală. BootLoaderModel Master Boot Record of %1 Master boot record (MBR) al %1 Boot Partition Partiție de boot System Partition Partiție de sistem Do not install a boot loader Nu instala un bootloader %1 (%2) %1 (%2) Calamares::DebugWindow Form Formular GlobalStorage Stocare globală JobQueue Coadă de sarcini Modules Module Type: Tipul: none nimic Interface: Interfața: Tools Unelte Debug information Informație pentru depanare Calamares::ExecutionViewStep Install Instalează Calamares::JobThread Done Gata Calamares::ProcessJob Run command %1 %2 Rulează comanda %1 %2 Running command %1 %2 Se rulează comanda %1 %2 External command crashed Comandă externă a avut o pană Command %1 crashed. Output: %2 Comanda %1 în pană. Rezultat: %2 External command failed to start Comanda externă nu a pornit Command %1 failed to start. Comanda %1 nu a pornit. Internal error when starting command Eroare internă în pornirea comenzii Bad parameters for process job call. Parametri proști pentru apelul sarcinii de proces. External command failed to finish Comanda externă nu s-a terminat Command %1 failed to finish in %2s. Output: %3 Comanda %1 nu s-a terminat în %2s. Rezultat: %3 External command finished with errors Comanda externă s-a terminat cu erori Command %1 finished with exit code %2. Output: %3 Comanda %1 s-a terminat cu codul de ieșire %2. Rezultat: %3 Calamares::PythonJob Running %1 operation. Se rulează operațiunea %1. Bad working directory path Calea dosarului de lucru este proastă Working directory %1 for python job %2 is not readable. Dosarul de lucru %1 pentru sarcina python %2 nu este citibil. Bad main script file Fișierul script principal este prost Main script file %1 for python job %2 is not readable. Fișierul script peincipal %1 pentru sarcina Python %2 nu este citibil. Boost.Python error in job "%1". Eroare Boost.Python în sarcina „%1”. Calamares::ViewManager &Back &Înapoi &Next &Următorul &Cancel &Anulează Cancel installation without changing the system. Cancel installation? Anulez instalarea? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Doriți să anulați procesul curent de instalare? Programul de instalare va ieși, iar toate modificările vor fi pierdute. &Yes &No &Close Continue with setup? Continuați configurarea? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Programul de instalare %1 este pregătit să facă schimbări pe discul dumneavoastră pentru a instala %2.<br/><strong>Nu veți putea anula aceste schimbări.</strong> &Install now &Instalează acum Go &back Î&napoi &Done The installation is complete. Close the installer. Error Eroare Installation Failed Instalare eșuată CalamaresPython::Helper Unknown exception type Tip de excepție necunoscut unparseable Python error Eroare Python neanalizabilă unparseable Python traceback Traceback Python neanalizabil Unfetchable Python error. Eroare Python nepreluabilă CalamaresWindow %1 Installer Program de instalare %1 Show debug information Arată informația de depanare CheckFileSystemJob Checking file system on partition %1. Se verifică sistemul de fișiere pe partiția %1. The file system check on partition %1 failed. Verificarea sistemului de fișiere pe %1 a eșuat. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Acest calculator nu satisface cerințele minimale pentru instalarea %1.<br/>Instalarea nu poate continua. <a href="#details">Detalii...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Acest calculator nu satisface unele din cerințele recomandate pentru instalarea %1.<br/>Instalarea poate continua, dar unele funcții ar putea fi dezactivate. This program will ask you some questions and set up %2 on your computer. Acest program vă va pune mai multe întrebări și va seta %2 pe calculatorul dumneavoastră. For best results, please ensure that this computer: Pentru rezultate optime, asigurați-vă că acest calculator: System requirements Cerințe de sistem ChoicePage Form Formular After: După: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Partiționare manuală</strong><br/>Puteți crea sau redimensiona partițiile. Boot loader location: Locație boot loader: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 va fi micșorată la %2MB și o nouă partiție %3MB va fi creată pentru %4. Select storage de&vice: Selectează dispoziti&vul de stocare: Current: Actual: Reuse %1 as home partition for %2. Reutilizează %1 ca partiție home pentru %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Selectează o partiție de micșorat, apoi trageți bara din jos pentru a redimensiona</strong> <strong>Select a partition to install on</strong> <strong>Selectează o partiție pe care să se instaleze</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. O partiție de sistem EFI nu poate fi găsită nicăieri în acest sistem. Vă rugăm să reveniți și să partiționați manual pentru a seta %1. The EFI system partition at %1 will be used for starting %2. Partiția de sistem EFI de la %1 va fi folosită pentru a porni %2. EFI system partition: Partiție de sistem EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Acest dispozitiv de stocare nu pare să aibă un sistem de operare instalat. Ce doriți să faceți?<br/>Veți putea revedea și confirma alegerile făcute înainte să fie realizate schimbări pe dispozitivul de stocare. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Șterge discul</strong><br/>Aceasta va <font color="red">șterge</font> toate datele prezente pe dispozitivul de stocare selectat. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Acest dispozitiv de stocare are %1. Ce doriți să faceți?<br/>Veți putea revedea și confirma alegerile făcute înainte să fie realizate schimbări pe dispozitivul de stocare. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Instalează laolaltă</strong><br/>Instalatorul va micșora o partiție pentru a face loc pentru %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Înlocuiește o partiție</strong><br/>Înlocuiește o partiție cu %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Acest dispozitiv de stocare are deja un sistem de operare instalat. Ce doriți să faceți?<br/>Veți putea revedea și confirma alegerile făcute înainte de se realiza schimbări pe dispozitivul de stocare. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Acest dispozitiv de stocare are mai multe sisteme de operare instalate. Ce doriți să faceți?<br/>Veți putea revedea și confirma alegerile făcute înainte de a se realiza schimbări pe dispozitivul de stocare. ClearMountsJob Clear mounts for partitioning operations on %1 Eliminați montările pentru operațiunea de partiționare pe %1 Clearing mounts for partitioning operations on %1. Se elimină montările pentru operațiunile de partiționare pe %1. Cleared all mounts for %1 S-au eliminat toate punctele de montare pentru %1 ClearTempMountsJob Clear all temporary mounts. Elimină toate montările temporare. Clearing all temporary mounts. Se elimină toate montările temporare. Cannot get list of temporary mounts. Nu se poate obține o listă a montărilor temporare. Cleared all temporary mounts. S-au eliminat toate montările temporare. CreatePartitionDialog Create a Partition Creează o partiție MiB Partition &Type: &Tip de partiție: &Primary &Primară E&xtended E&xtinsă Fi&le System: Sis&tem de fișiere: Flags: Flags: &Mount Point: Punct de &Montare Si&ze: Mă&rime: En&crypt &Criptează Logical Logică Primary Primară GPT GPT Mountpoint already in use. Please select another one. Punct de montare existent. Vă rugăm alegeţi altul. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Creează o nouă partiție de %2MB pe %4 (3%) cu sistemul de operare %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creează o nouă partiție de <strong>%2MB</strong> pe <strong>%4</strong> (%3) cu sistemul de fișiere <strong>%1</strong>. Creating new %1 partition on %2. Se creează nouă partiție %1 pe %2. The installer failed to create partition on disk '%1'. Programul de instalare nu a putut crea partiția pe discul „%1”. Could not open device '%1'. Nu se poate deschide dispozitivul „%1”. Could not open partition table. Nu se poate deschide tabela de partiții. The installer failed to create file system on partition %1. Programul de instalare nu a putut crea sistemul de fișiere pe partiția %1. The installer failed to update partition table on disk '%1'. Programul de instalare nu a putut actualiza tabela de partiții pe discul „%1”. CreatePartitionTableDialog Create Partition Table Creează tabelă de partiții Creating a new partition table will delete all existing data on the disk. Crearea unei tabele de partiții va șterge toate datele de pe disc. What kind of partition table do you want to create? Ce fel de tabelă de partiții doriți să creați? Master Boot Record (MBR) Înregistrare de boot principală (MBR) GUID Partition Table (GPT) Tabelă de partiții GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Creați o nouă tabelă de partiții %1 pe %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creați o nouă tabelă de partiții <strong>%1</strong> pe <strong>%2</strong> (%3). Creating new %1 partition table on %2. Se creează o nouă tabelă de partiții %1 pe %2. The installer failed to create a partition table on %1. Programul de instalare nu a putut crea o tabelă de partiții pe %1. Could not open device %1. Nu se poate deschide dispozitivul %1. CreateUserJob Create user %1 Creează utilizatorul %1 Create user <strong>%1</strong>. Creează utilizatorul <strong>%1</strong>. Creating user %1. Se creează utilizator %1. Sudoers dir is not writable. Nu se poate scrie în dosarul sudoers. Cannot create sudoers file for writing. Nu se poate crea fișierul sudoers pentru scriere. Cannot chmod sudoers file. Nu se poate chmoda fișierul sudoers. Cannot open groups file for reading. Nu se poate deschide fișierul groups pentru citire. Cannot create user %1. Nu se poate crea utilizatorul %1. useradd terminated with error code %1. useradd s-a terminat cu codul de eroare %1. Cannot add user %1 to groups: %2. Nu s-a reușit adăugarea utilizatorului %1 la grupurile: %2 usermod terminated with error code %1. usermod s-a terminat cu codul de eroare %1. Cannot set home directory ownership for user %1. Nu se poate seta apartenența dosarului home pentru utilizatorul %1. chown terminated with error code %1. chown s-a terminat cu codul de eroare %1. DeletePartitionJob Delete partition %1. Șterge partiția %1. Delete partition <strong>%1</strong>. Șterge partiția <strong>%1</strong>. Deleting partition %1. Se șterge partiția %1. The installer failed to delete partition %1. Programul de instalare nu a putut șterge partiția %1. Partition (%1) and device (%2) do not match. Partiția (%1) și dispozitivul (%2) nu se potrivesc. Could not open device %1. Nu se poate deschide dispozitivul %1. Could not open partition table. Nu se poate deschide tabela de partiții. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Tipul de <strong>tabelă de partiții</strong> de pe dispozitivul de stocare selectat.<br><br>Singura metodă de a schimba tipul de tabelă de partiții este ștergerea și recrearea acesteia de la zero, ceea de distruge toate datele de pe dispozitivul de stocare.<br>Acest program de instalare va păstra tabela de partiții actuală cu excepția cazului în care alegeți altfel.<br>Dacă nu sunteți sigur, GPT este preferabil pentru sistemele moderne. This device has a <strong>%1</strong> partition table. Acest dispozitiv are o tabelă de partiții <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Acesta este un dispozitiv de tip <strong>loop</strong>.<br><br>Este un pseudo-dispozitiv fără tabelă de partiții care face un fișier accesibil ca un dispozitiv de tip bloc. Această schemă conține de obicei un singur sistem de fișiere. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Programul de instalare <strong>nu poate detecta o tabelă de partiții</strong> pe dispozitivul de stocare selectat.<br><br>Dispozitivul fie nu are o tabelă de partiții, sau tabela de partiții este coruptă sau de un tip necunoscut.<br>Acest program de instalare poate crea o nouă tabelă de partiție în mod automat sau prin intermediul paginii de partiționare manuală. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Acesta este tipul de tabelă de partiții recomandat pentru sisteme moderne ce pornesc de pe un mediu de boot <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Această tabelă de partiții este recomandabilă doar pentru sisteme mai vechi care pornesc de la un mediu de boot <strong>BIOS</strong>. GPT este recomandabil în cele mai multe cazuri.<br><br><strong>Atenție:</strong> tabela de partiții MBR partition este un standard învechit din epoca MS-DOS.<br>Acesta permite doar 4 partiții <em>primare</em>, iar din acestea 4 doar una poate fi de tip <em>extins</em>, care la rândul ei mai poate conține un număr mare de partiții <em>logice</em>. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Scrie configurația LUKS pentru Dracut pe %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Omite scrierea configurației LUKS pentru Dracut: partiția „/” nu este criptată Failed to open %1 Nu s-a reușit deschiderea %1 DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Editează partiție existentă Content: Conținut: &Keep &Păstrează Format Formatează Warning: Formatting the partition will erase all existing data. Atenție: Formatarea partiției va șterge toate datele existente. &Mount Point: Punct de &Montare: Si&ze: Mă&rime MiB Fi&le System: Sis&tem de fișiere: Flags: Flags: Mountpoint already in use. Please select another one. Punct de montare existent. Vă rugăm alegeţi altul. EncryptWidget Form Formular En&crypt system Sistem de &criptare Passphrase Frază secretă Confirm passphrase Confirmă fraza secretă Please enter the same passphrase in both boxes. Introduceți aceeași frază secretă în ambele căsuțe. FillGlobalStorageJob Set partition information Setează informația pentru partiție Install %1 on <strong>new</strong> %2 system partition. Instalează %1 pe <strong>noua</strong> partiție de sistem %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Setează <strong>noua</strong> partiție %2 cu punctul de montare <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Instalează %2 pe partiția de sistem %3 <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Setează partiția %3 <strong>%1</strong> cu punctul de montare <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Instalează bootloader-ul pe <strong>%1</strong>. Setting up mount points. Se setează puncte de montare. FinishedPage Form Formular &Restart now &Repornește acum <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Gata.</h1><br/>%1 a fost instalat pe calculatorul dumneavoastră.<br/>Puteți reporni noul sistem, sau puteți continua să folosiți sistemul de operare portabil %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Termină Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatează partiția %1 (sistem de fișiere: %2, mărime: %3 MB) pe %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatează partiția <strong>%1</strong>, de <strong>%3MB</strong> cu sistemul de fișiere <strong>%2</strong>. Formatting partition %1 with file system %2. Se formatează partiția %1 cu sistemul de fișiere %2. The installer failed to format partition %1 on disk '%2'. Programul de instalare nu a putut formata partiția %1 pe discul „%2”. Could not open device '%1'. Nu se poate deschide dispozitivul „%1. Could not open partition table. Nu se poate deschide tabela de partiții. The installer failed to create file system on partition %1. Programul de instalare nu a putut crea sistemul de fișiere pe partiția %1. The installer failed to update partition table on disk '%1'. Programul de instalare nu a putut actualiza tabela de partiții pe discul „%1”. InteractiveTerminalPage Konsole not installed Konsole nu este instalat Please install the kde konsole and try again! Vă rugăm să instalați kde konsole și încercați din nou! Executing script: &nbsp;<code>%1</code> Se execută scriptul: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Script KeyboardPage Set keyboard model to %1.<br/> Setează modelul tastaturii la %1.<br/> Set keyboard layout to %1/%2. Setează aranjamentul de tastatură la %1/%2. KeyboardViewStep Keyboard Tastatură LCLocaleDialog System locale setting Setările de localizare The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Setările de localizare ale sistemului afectează limba și setul de caractere folosit pentru unele elemente de interfață la linia de comandă.<br/>Setările actuale sunt <strong>%1</strong>. &Cancel &OK LicensePage Form Formular I accept the terms and conditions above. Sunt de acord cu termenii și condițiile de mai sus. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Acord de licențiere</h1>Această procedură va instala software proprietar supus unor termeni de licențiere. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Vă rugăm să citiți Licența de utilizare (EULA) de mai sus.<br>Dacă nu sunteți de acord cu termenii, procedura de instalare nu poate continua. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Acord de licențiere</h1>Această procedură de instalare poate instala software proprietar supus unor termeni de licențiere, pentru a putea oferi funcții suplimentare și pentru a îmbunătăți experiența utilizatorilor. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Vă rugăm să citiți Licența de utilizare (EULA) de mai sus.<br/>Dacă nu sunteți de acord cu termenii, softwareul proprietar nu va fi instalat și se vor folosi alternative open-source în loc. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 driver</strong><br/>de %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 driver grafic</strong><br/><font color="Grey">de %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 plugin de browser</strong><br/><font color="Grey">de %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">de %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 pachet</strong><br/><font color="Grey">de %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">de %2</font> <a href="%1">view license agreement</a> <a href="%1">vezi acordul de licențiere</a> LicenseViewStep License Licență LocalePage The system language will be set to %1. Limba sistemului va fi %1. The numbers and dates locale will be set to %1. Formatul numerelor și datelor calendaristice va fi %1. Region: Regiune: Zone: Zonă: &Change... S&chimbă Set timezone to %1/%2.<br/> Setează fusul orar la %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Se încarcă datele locației... Location Locație MoveFileSystemJob Move file system of partition %1. Mută sistemul de fișiere al partiției %1. Could not open file system on partition %1 for moving. Nu s-a putut deschide sistemul de fișiere pe partiția %1 pentru mutare. Could not create target for moving file system on partition %1. Nu s-a putut crea ținta pentru mutarea sistemului de fișiere pe partiția %1. Moving of partition %1 failed, changes have been rolled back. Mutarea partiției %1 a eșuat, schimbările au fost anulate. Moving of partition %1 failed. Roll back of the changes have failed. Mutarea partiției %1 a eșuat. Anularea schimbărilor a eșuat. Updating boot sector after the moving of partition %1 failed. Se actualizează sectorul de boot după eșecul mutării partiției %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Mărimile sectoarelor logice din sursa și ținta copierii nu sunt identice. Nu există suport momentan. Source and target for copying do not overlap: Rollback is not required. Sursa și ținta copierii nu se suprapun: nu este necesară retragerea schimbărilor. Could not open device %1 to rollback copying. Nu se poate deschide dispozitivul %1 pentru retragerea copierii. NetInstallPage Name Nume Description Despre Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Instalarea rețelei. (Dezactivat: Nu se pot obține listele de pachete, verificați conexiunea la rețea) NetInstallViewStep Package selection Selecția pachetelor Page_Keyboard Form Formular Keyboard Model: Modelul tastaturii: Type here to test your keyboard Tastați aici pentru a testa tastatura Page_UserSetup Form Formular What is your name? Cum vă numiți? What name do you want to use to log in? Ce nume doriți să utilizați pentru logare? font-weight: normal grosimea fontului: normală <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Dacă mai multe persoane vor utiliza acest calculator, puteți seta mai multe conturi după instalare.</small> Choose a password to keep your account safe. Alegeți o parolă pentru a menține contul în siguranță. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Introduceți parola de 2 ori pentru a se verifica greșelile de tipar. O parolă bună va conține o combinație de litere, numere și punctuație, ar trebui să aibă cel puțin 8 caractere și ar trebui schimbată la intervale regulate.</small> What is the name of this computer? Care este numele calculatorului? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Numele va fi folosit dacă faceți acest calculator vizibil pentru alții pe o rețea.</small> Log in automatically without asking for the password. Autentifică-mă automat, fără a-mi cere parola. Use the same password for the administrator account. Folosește aceeași parolă pentru contul de administrator. Choose a password for the administrator account. Alege o parolă pentru contul de administrator. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Introduceți parola de 2 ori pentru a se verifica greșelile de tipar.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system Sistem EFI Swap Swap New partition for %1 Noua partiție pentru %1 New partition Noua partiție %1 %2 %1 %2 PartitionModel Free Space Spațiu liber New partition Partiție nouă Name Nume File System Sistem de fișiere Mount Point Punct de montare Size Mărime PartitionPage Form Formular Storage de&vice: Dispoziti&v de stocare: &Revert All Changes &Retrage toate schimbările New Partition &Table &Tabelă nouă de partiții &Create &Crează &Edit &Editează &Delete &Șterge Install boot &loader on: Instalează boot&loaderul pe: Are you sure you want to create a new partition table on %1? Sigur doriți să creați o nouă tabelă de partiție pe %1? PartitionViewStep Gathering system information... Se adună informații despre sistem... Partitions Partiții Install %1 <strong>alongside</strong> another operating system. Instalează %1 <strong>laolaltă</strong> cu un alt sistem de operare. <strong>Erase</strong> disk and install %1. <strong>Șterge</strong> discul și instalează %1. <strong>Replace</strong> a partition with %1. <strong>Înlocuiește</strong> o partiție cu %1. <strong>Manual</strong> partitioning. Partiționare <strong>manuală</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Instalează %1 <strong>laolaltă</strong> cu un alt sistem de operare pe discul <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Șterge</strong> discul <strong>%2</strong> (%3) și instalează %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Înlocuiește</strong> o partiție pe discul <strong>%2</strong> (%3) cu %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Partiționare <strong>manuală</strong> a discului <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Discul <strong>%1</strong> (%2) Current: Actual: After: După: No EFI system partition configured Nicio partiție de sistem EFI nu a fost configurată An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Este necesară o partiție de sistem EFI pentru a porni %1.<br/><br/>Pentru a configura o partiție de sistem EFI, reveniți și selectați sau creați o partiție FAT32 cu flag-ul <strong>esp</strong> activat și montată la <strong>%2</strong>.<br/><br/>Puteți continua și fără configurarea unei partiții de sistem EFI, dar este posibil ca sistemul să nu pornească. EFI system partition flag not set Flag-ul de partiție de sistem pentru EFI nu a fost setat An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. O partiție de sistem EFI este necesară pentru a porni %1.<br/><br/>A fost configurată o partiție cu punct de montare la <strong>%2</strong> dar flag-ul <strong>esp</strong> al acesteia nu a fost setat.<br/>Pentru a seta flag-ul, reveniți și editați partiția.<br/><br/>Puteți continua și fără setarea flag-ului, dar este posibil ca sistemul să nu pornească. Boot partition not encrypted Partiția de boot nu este criptată A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. A fost creată o partiție de boot împreună cu o partiție root criptată, dar partiția de boot nu este criptată.<br/><br/>Sunt potențiale probleme de securitate cu un astfel de aranjament deoarece importante fișiere de sistem sunt păstrate pe o partiție necriptată.<br/>Puteți continua dacă doriți, dar descuierea sistemului se va petrece mai târziu în timpul pornirii.<br/>Pentru a cripta partiția de boot, reveniți și recreați-o, alegând opțiunea <strong>Criptează</strong> din fereastra de creare de partiții. QObject Default Keyboard Model Modelul tastaturii implicit Default Implicit unknown necunoscut extended extins unformatted neformatat swap swap Unpartitioned space or unknown partition table Spațiu nepartiționat sau tabelă de partiții necunoscută ReplaceWidget Form Formular Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Selectați locul în care să instalați %1.<br/><font color="red">Atenție: </font>aceasta va șterge toate fișierele de pe partiția selectată. The selected item does not appear to be a valid partition. Elementul selectat nu pare a fi o partiție validă. %1 cannot be installed on empty space. Please select an existing partition. %1 nu poate fi instalat în spațiul liber. Vă rugăm să alegeți o partiție existentă. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 nu poate fi instalat pe o partiție extinsă. Vă rugăm selectați o partiție primară existentă sau o partiție logică. %1 cannot be installed on this partition. %1 nu poate fi instalat pe această partiție. Data partition (%1) Partiție de date (%1) Unknown system partition (%1) Partiție de sistem necunoscută (%1) %1 system partition (%2) %1 partiție de sistem (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partiția %1 este prea mică pentru %2. Vă rugăm selectați o partiție cu o capacitate de cel puțin %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>O partiție de sistem EFI nu a putut fi găsită nicăieri pe sistem. Vă rugăm să reveniți și să utilizați partiționarea manuală pentru a seta %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 va fi instalat pe %2.<br/><font color="red">Atenție: </font>toate datele de pe partiția %2 se vor pierde. The EFI system partition at %1 will be used for starting %2. Partiția de sistem EFI de la %1 va fi folosită pentru a porni %2. EFI system partition: Partiție de sistem EFI: RequirementsChecker Gathering system information... Se adună informații despre sistem... has at least %1 GB available drive space are cel puțin %1 spațiu disponibil There is not enough drive space. At least %1 GB is required. Nu este suficient spațiu disponibil. Sunt necesari cel puțin %1 GB. has at least %1 GB working memory are cel puțin %1 GB de memorie utilizabilă The system does not have enough working memory. At least %1 GB is required. Sistemul nu are suficientă memorie utilizabilă. Sunt necesari cel puțin %1 GB. is plugged in to a power source este alimentat cu curent The system is not plugged in to a power source. Sistemul nu este alimentat cu curent. is connected to the Internet este conectat la Internet The system is not connected to the Internet. Sistemul nu este conectat la Internet. The installer is not running with administrator rights. Programul de instalare nu rulează cu privilegii de administrator. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Redimensionează sistemul de fișiere pe partiția %1. Parted failed to resize filesystem. Parted n-a redimensionat sistemul de fișiere. Failed to resize filesystem. Nu s-a redimensional sistemul de fișiere. ResizePartitionJob Resize partition %1. Redimensionează partiția %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Redimensionează partiția <strong>%1</strong> de la<strong>%2MB</strong> la <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Se redimensionează partiția %1 de la %2MG la %3MB. The installer failed to resize partition %1 on disk '%2'. Programul de instalare nu a redimensionat partiția %1 pe discul „%2”. Could not open device '%1'. Nu se poate deschide dispozitivul „%1”. ScanningDialog Scanning storage devices... Se scanează dispozitivele de stocare... Partitioning Partiționare SetHostNameJob Set hostname %1 Setează hostname %1 Set hostname <strong>%1</strong>. Setați un hostname <strong>%1</strong>. Setting hostname %1. Se setează hostname %1. Internal Error Eroare internă Cannot write hostname to target system Nu se poate scrie hostname pe sistemul țintă SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Setează modelul de tastatură la %1, cu aranjamentul %2-%3 Failed to write keyboard configuration for the virtual console. Nu s-a reușit scrierea configurației de tastatură pentru consola virtuală. Failed to write to %1 Nu s-a reușit scrierea %1 Failed to write keyboard configuration for X11. Nu s-a reușit scrierea configurației de tastatură pentru X11. Failed to write keyboard configuration to existing /etc/default directory. Nu s-a reușit scrierea configurației de tastatură în directorul existent /etc/default. SetPartFlagsJob Set flags on partition %1. Setează flag-uri pentru partiția %1. Set flags on %1MB %2 partition. Setează flagurile pe partiția %2 de %1MB. Set flags on new partition. Setează flagurile pe noua partiție. Clear flags on partition <strong>%1</strong>. Șterge flag-urile partiției <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Elimină flagurile pe partiția <strong>%2</strong> de %1MB. Clear flags on new partition. Elimină flagurile pentru noua partiție. Flag partition <strong>%1</strong> as <strong>%2</strong>. Marchează partiția <strong>%1</strong> cu flag-ul <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Marchează partiția <strong>%2</strong> de %1MB ca <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Marchează noua partiție ca <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Se șterg flag-urile pentru partiția <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Se elimină flagurile pe partiția <strong>%2</strong> de %1MB. Clearing flags on new partition. Se elimină flagurile de pe noua partiție. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Se setează flag-urile <strong>%2</strong> pentru partiția <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Se setează flagurile <strong>%3</strong> pe partiția <strong>%2</strong> de %1MB. Setting flags <strong>%1</strong> on new partition. Se setează flagurile <strong>%1</strong> pe noua partiție. The installer failed to set flags on partition %1. Programul de instalare a eșuat în setarea flag-urilor pentru partiția %1. Could not open device '%1'. Nu s-a putut deschide dispozitivul „%1”. Could not open partition table on device '%1'. Nu s-a putut deschide tabela de partiții pentru dispozitivul „%1”. Could not find partition '%1'. Nu a fost găsită partiția „%1”. SetPartGeometryJob Update geometry of partition %1. Actualizează geometria partiției %1. Failed to change the geometry of the partition. Nu se poate schimba geometria partiției. SetPasswordJob Set password for user %1 Setează parola pentru utilizatorul %1 Setting password for user %1. Se setează parola pentru utilizatorul %1. Bad destination system path. Cale de sistem destinație proastă. rootMountPoint is %1 rootMountPoint este %1 Cannot disable root account. Nu pot dezactiva contul root passwd terminated with error code %1. eroare la setarea parolei cod %1 Cannot set password for user %1. Nu se poate seta parola pentru utilizatorul %1. usermod terminated with error code %1. usermod s-a terminat cu codul de eroare %1. SetTimezoneJob Set timezone to %1/%2 Setează fusul orar la %1/%2 Cannot access selected timezone path. Nu se poate accesa calea fusului selectat. Bad path: %1 Cale proastă: %1 Cannot set timezone. Nu se poate seta fusul orar. Link creation failed, target: %1; link name: %2 Crearea legăturii eșuată, ținta: %1; numele legăturii: 2 Cannot set timezone, Nu se poate seta fusul orar, Cannot open /etc/timezone for writing Nu se poate deschide /etc/timezone pentru scriere SummaryPage This is an overview of what will happen once you start the install procedure. Acesta este un rezumat a ce se va întâmpla după ce începeți procedura de instalare. SummaryViewStep Summary Sumar UsersPage Your username is too long. Numele de utilizator este prea lung. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Numele de utilizator conține caractere invalide. Folosiți doar litere mici și numere. Your hostname is too short. Hostname este prea scurt. Your hostname is too long. Hostname este prea lung. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Hostname conține caractere invalide. Folosiți doar litere, numere și cratime. Your passwords do not match! Parolele nu se potrivesc! UsersViewStep Users Utilizatori WelcomePage Form Formular &Language: &Limbă: &Release notes &Note asupra ediției &Known issues &Probleme cunoscute &Support &Suport &About &Despre <h1>Welcome to the %1 installer.</h1> <h1>Bine ați venit la programul de instalare pentru %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Despre programul de instalare %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 suport WelcomeViewStep Welcome Bine ați venit calamares-3.1.12/lang/calamares_ru.ts000066400000000000000000004172711322271446000174720ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Среда загрузки</strong> данной системы.<br><br>Старые системы x86 поддерживают только <strong>BIOS</strong>.<br>Современные системы обычно используют <strong>EFI</strong>, но также могут имитировать BIOS, если среда загрузки запущена в режиме совместимости. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Эта система использует среду загрузки <strong>EFI</strong>.<br><br>Чтобы настроить запуск из под среды EFI, установщик использует приложения загрузки, такое как <strong>GRUB</strong> или <strong>systemd-boot</strong> на <strong>системном разделе EFI</strong>. Процесс автоматизирован, но вы можете использовать ручной режим, где вы сами будете должны выбрать или создать его. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Эта система запущена в <strong>BIOS</strong> среде загрузки.<br><br> Чтобы настроить запуск из под среды BIOS, установщик должен установить загручик, такой как <strong>GRUB</strong>, либо в начале раздела, либо в <strong>Master Boot Record</strong>, находящийся в начале таблицы разделов (по умолчанию). Процесс автоматизирован, но вы можете выбрать ручной режим, где будете должны настроить его сами. BootLoaderModel Master Boot Record of %1 Главная загрузочная запись %1 Boot Partition Загрузочный раздел System Partition Системный раздел Do not install a boot loader Не устанавливать загрузчик %1 (%2) %1 (%2) Calamares::DebugWindow Form Форма GlobalStorage Глобальное хранилище JobQueue Очередь заданий Modules Модули Type: Тип: none нет Interface: Интерфейс: Tools Инструменты Debug information Отладочная информация Calamares::ExecutionViewStep Install Установить Calamares::JobThread Done Готово Calamares::ProcessJob Run command %1 %2 Выполнить команду %1 %2 Running command %1 %2 Выполняется команда %1 %2 External command crashed Во внешней команде произошел сбой Command %1 crashed. Output: %2 В команде %1 произошел сбой. Вывод: %2 External command failed to start Невозможно запустить внешнюю команду Command %1 failed to start. Невозможно запустить команду %1. Internal error when starting command Внутрення ошибка при запуске команды Bad parameters for process job call. Неверные параметры для вызова процесса. External command failed to finish Невозможно завершить внешнюю команду Command %1 failed to finish in %2s. Output: %3 Команда %1 не завершилась за %2 с. Вывод: %3 External command finished with errors Внешняя команда завершилась с ошибками Command %1 finished with exit code %2. Output: %3 Команда %1 завершлась с кодом возврата %2. Вывод: %3 Calamares::PythonJob Running %1 operation. Выполняется действие %1. Bad working directory path Неверный путь к рабочему каталогу Working directory %1 for python job %2 is not readable. Рабочий каталог %1 для задачи python %2 недоступен для чтения. Bad main script file Ошибочный главный файл сценария Main script file %1 for python job %2 is not readable. Главный файл сценария %1 для задачи python %2 недоступен для чтения. Boost.Python error in job "%1". Boost.Python ошибка в задаче "%1". Calamares::ViewManager &Back &Назад &Next &Далее &Cancel О&тмена Cancel installation without changing the system. Cancel installation? Отменить установку? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Действительно прервать процесс установки? Программа установки сразу прекратит работу, все изменения будут потеряны. &Yes &Да &No &Нет &Close &Закрыть Continue with setup? Продолжить установку? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Программа установки %1 готова внести изменения на Ваш диск, чтобы установить %2.<br/><strong>Отменить эти изменения будет невозможно.</strong> &Install now Приступить к &установке Go &back &Назад &Done The installation is complete. Close the installer. Установка завершена. Закройте установщик. Error Ошибка Installation Failed Установка завершилась неудачей CalamaresPython::Helper Unknown exception type Неизвестный тип исключения unparseable Python error неподдающаяся обработке ошибка Python unparseable Python traceback неподдающийся обработке traceback Python Unfetchable Python error. Неизвестная ошибка Python CalamaresWindow %1 Installer Программа установки %1 Show debug information Показать отладочную информацию CheckFileSystemJob Checking file system on partition %1. Проверка файловой системы на разделе %1. The file system check on partition %1 failed. Проверка файловой системы на разделе %1 завершилась неудачей. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Этот компьютер не соответствует минимальным требованиям для установки %1.<br/>Невозможно продолжить установку. <a href="#details">Подробнее...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Этот компьютер соответствует не всем рекомендуемым требованиям для установки %1.<br/>Можно продолжить установку, но некоторые возможности могут быть недоступны. This program will ask you some questions and set up %2 on your computer. Эта программа задаст вам несколько вопросов и поможет установить %2 на ваш компьютер. For best results, please ensure that this computer: Для наилучших результатов, убедитесь, что этот компьютер: System requirements Системные требования ChoicePage Form Форма After: После: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ручная разметка</strong><br/>Вы можете самостоятельно создавать разделы или изменять их размеры. Boot loader location: Расположение загрузчика: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 будет уменьшен до %2MB и новый раздел %3MB будет создан для %4. Select storage de&vice: Выбрать устройство &хранения: Current: Текущий: Reuse %1 as home partition for %2. Использовать %1 как домашний раздел для %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Выберите раздел для уменьшения, затем двигайте ползунок, изменяя размер</strong> <strong>Select a partition to install on</strong> <strong>Выберите раздел для установки</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Не найдено системного раздела EFI. Пожалуйста, вернитесь назад и выполните ручную разметку %1. The EFI system partition at %1 will be used for starting %2. Системный раздел EFI на %1 будет использован для запуска %2. EFI system partition: Системный раздел EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Видимо, на этом устройстве нет операционной системы. Что Вы хотите сделать?<br/>Вы сможете изменить или подтвердить свой выбор до того, как на устройстве будут сделаны какие-либо изменения. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Стереть диск</strong><br/>Это <font color="red">удалит</font> все данные, которые сейчас находятся на выбранном устройстве. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. На этом устройстве есть %1. Что Вы хотите сделать?<br/>Вы сможете изменить или подтвердить свой выбор до того, как на устройстве будут сделаны какие-либо изменения. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Установить рядом</strong><br/>Программа установки уменьшит раздел, чтобы освободить место для %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Заменить раздел</strong><br/>Меняет раздел на %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. На этом устройстве уже есть операционная система. Что Вы хотите сделать?<br/>Вы сможете изменить или подтвердить свой выбор до того, как на устройстве будут сделаны какие-либо изменения. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. На этом устройстве есть несколько операционных систем. Что Вы хотите сделать?<br/>Вы сможете изменить или подтвердить свой выбор до того, как на устройстве будут сделаны какие-либо изменения. ClearMountsJob Clear mounts for partitioning operations on %1 Освободить точки монтирования для выполнения разметки на %1 Clearing mounts for partitioning operations on %1. Освобождаются точки монтирования для выполнения разметки на %1. Cleared all mounts for %1 Освобождены все точки монтирования для %1 ClearTempMountsJob Clear all temporary mounts. Освободить все временные точки монтирования. Clearing all temporary mounts. Освобождаются все временные точки монтирования. Cannot get list of temporary mounts. Не удалось получить список временных точек монтирования. Cleared all temporary mounts. Освобождены все временные точки монтирования. CreatePartitionDialog Create a Partition Создать раздел MiB Partition &Type: &Тип раздела: &Primary &Основной E&xtended &Расширенный Fi&le System: &Файловая система: Flags: Флаги: &Mount Point: Точка &монтирования Si&ze: Ра&змер: En&crypt Ши&фровать Logical Логический Primary Основной GPT GPT Mountpoint already in use. Please select another one. Точка монтирования уже занята. Пожалуйста, выберете другую. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Создать новый раздел %2 MB на %4 (%3) с файловой системой %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Создать новый раздел <strong>%2 MB</strong> на <strong>%4</strong> (%3) с файловой системой <strong>%1</strong>. Creating new %1 partition on %2. Создается новый %1 раздел на %2. The installer failed to create partition on disk '%1'. Программа установки не смогла создать раздел на диске '%1'. Could not open device '%1'. Не удалось открыть устройство '%1'. Could not open partition table. Не удалось открыть таблицу разделов. The installer failed to create file system on partition %1. Программа установки не смогла создать файловую систему на разделе %1. The installer failed to update partition table on disk '%1'. Программа установки не смогла обновить таблицу разделов на диске '%1'. CreatePartitionTableDialog Create Partition Table Создать таблицу разделов Creating a new partition table will delete all existing data on the disk. При создании новой таблицы разделов будут удалены все данные на диске. What kind of partition table do you want to create? Какой тип таблицы разделов Вы желаете создать? Master Boot Record (MBR) Главная загрузочная запись (MBR) GUID Partition Table (GPT) Таблица разделов GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Создать новую таблицу разделов %1 на %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Создать новую таблицу разделов <strong>%1</strong> на <strong>%2</strong> (%3). Creating new %1 partition table on %2. Создается новая таблица разделов %1 на %2. The installer failed to create a partition table on %1. Программа установки не смогла создать таблицу разделов на %1. Could not open device %1. Не удалось открыть устройство %1. CreateUserJob Create user %1 Создать учетную запись %1 Create user <strong>%1</strong>. Создать учетную запись <strong>%1</strong>. Creating user %1. Создается учетная запись %1. Sudoers dir is not writable. Каталог sudoers не доступен для записи. Cannot create sudoers file for writing. Не удалось записать файл sudoers. Cannot chmod sudoers file. Не удалось применить chmod к файлу sudoers. Cannot open groups file for reading. Не удалось открыть файл groups для чтения. Cannot create user %1. Не удалось создать учетную запись пользователя %1. useradd terminated with error code %1. Команда useradd завершилась с кодом ошибки %1. Cannot add user %1 to groups: %2. Не удается добавить пользователя %1 в группы: %2. usermod terminated with error code %1. Команда usermod завершилась с кодом ошибки %1. Cannot set home directory ownership for user %1. Не удалось задать владельца домашней папки пользователя %1. chown terminated with error code %1. Команда chown завершилась с кодом ошибки %1. DeletePartitionJob Delete partition %1. Удалить раздел %1. Delete partition <strong>%1</strong>. Удалить раздел <strong>%1</strong>. Deleting partition %1. Удаляется раздел %1. The installer failed to delete partition %1. Программе установки не удалось удалить раздел %1. Partition (%1) and device (%2) do not match. Раздел (%1) и устройство (%2) не совпадают. Could not open device %1. Не удалось открыть устройство %1. Could not open partition table. Не удалось открыть таблицу разделов. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Тип <strong>таблицы разделов</strong> на выбраном устройстве хранения.<br><br>Смена типа раздела возможна только путем удаления и пересоздания всей таблицы разделов, что уничтожит все данные на устройстве.<br>Этот установщик не затронет текущую таблицу разделов, кроме как вы сами решите иначе.<br>По умолчанию, современные системы используют GPT-разметку. This device has a <strong>%1</strong> partition table. На этом устройстве имеется <strong>%1</strong> таблица разделов. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Это <strong>loop</strong> устройство.<br><br>Это псевдо-устройство без таблицы разделов позволяет использовать обычный файл как блочное устройство. При таком виде подключения обычно имеется только одна файловая система. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Программа установки <strong>не обнаружила таблицы разделов</strong> на выбранном устройстве хранения.<br><br>На этом устройстве либо нет таблицы разделов, либо она повреждена, либо неизвестного типа.<br>Эта программа установки может создать для Вас новую таблицу разделов автоматически или через страницу ручной разметки. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Это рекомендуемый тип таблицы разделов для современных систем, которые используют окружение <strong>EFI</strong> для загрузки. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Этот тип таблицы разделов рекомендуется только для старых систем, запускаемых из среды загрузки <strong>BIOS</strong>. В большинстве случаев вместо этого лучше использовать GPT.<br><br><strong>Внимание:</strong> MBR стандарт таблицы разделов является устаревшим.<br>Он допускает максимум 4 <em>первичных</em> раздела, только один из них может быть <em>расширенным</em> и содержать много <em>логических</em> под-разделов. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Пропустить сохранение LUKS настроек для Dracut: "/" раздел не зашифрован Failed to open %1 Не удалось открыть %1 DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Редактировать существующий раздел Content: Содержит: &Keep О&ставить Format Форматировать Warning: Formatting the partition will erase all existing data. Внимание: Форматирование раздела уничтожит все данные. &Mount Point: Точка &монтирования: Si&ze: Ра&змер: MiB Fi&le System: &Файловая система: Flags: Флаги: Mountpoint already in use. Please select another one. EncryptWidget Form Форма En&crypt system Система &шифрования Passphrase Пароль Confirm passphrase Подтвердите пароль Please enter the same passphrase in both boxes. Пожалуйста, введите один и тот же пароль в оба поля. FillGlobalStorageJob Set partition information Установить сведения о разделе Install %1 on <strong>new</strong> %2 system partition. Установить %1 на <strong>новый</strong> системный раздел %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Настроить <strong>новый</strong> %2 раздел с точкой монтирования <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Установить %2 на %3 системный раздел <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Настроить %3 раздел <strong>%1</strong> с точкой монтирования <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Установить загрузчик на <strong>%1</strong>. Setting up mount points. Настраиваются точки монтирования. FinishedPage Form Геометрия &Restart now П&ерезагрузить <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Готово.</h1><br/>Система %1 установлена на Ваш компьютер.<br/>Вы можете перезагрузить компьютер и использовать Вашу новую систему или продолжить работу в Live окружении %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Завершить Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Форматировать раздел %1 (файловая система: %2, размер: %3 МБ) на %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Форматировать раздел <strong>%1</strong> размером <strong>%3MB</strong> с файловой системой <strong>%2</strong>. Formatting partition %1 with file system %2. Форматируется раздел %1 под файловую систему %2. The installer failed to format partition %1 on disk '%2'. Программе установки не удалось отформатировать раздел %1 на диске '%2'. Could not open device '%1'. Не удалось открыть устройство '%1'. Could not open partition table. Не удалось открыть таблицу разделов. The installer failed to create file system on partition %1. Программе установки не удалось создать файловую систему на разделе %1. The installer failed to update partition table on disk '%1'. Программе установки не удалось обновить таблицу разделов на диске '%1'. InteractiveTerminalPage Konsole not installed Программа Konsole не установлена Please install the kde konsole and try again! Пожалуйста, установите программу Konsole и попробуйте еще раз! Executing script: &nbsp;<code>%1</code> Выполняется сценарий: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Скрипт KeyboardPage Set keyboard model to %1.<br/> Установить модель клавиатуры на %1.<br/> Set keyboard layout to %1/%2. Установить раскладку клавиатуры на %1/%2. KeyboardViewStep Keyboard Клавиатура LCLocaleDialog System locale setting Общие региональные настройки The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Общие региональные настройки влияют на язык и кодировку для отдельных элементов интерфейса командной строки.<br/>Текущий выбор <strong>%1</strong>. &Cancel &OK LicensePage Form Форма I accept the terms and conditions above. Я принимаю приведенные выше условия. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Лицензионное соглашение</h1>На этом этапе будет установлено программное обеспечение с проприетарной лицензией. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Ознакомьтесь с приведенными выше Лицензионными соглашениями пользователя (EULA).<br/>Если не согласны с условиями, продолжение установки невозможно. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Лицензионное соглашение</h1>На этом этапе можно установить программное обеспечение с проприетарной лицензией, дающее дополнительные возможности и повышающее удобство работы. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Ознакомьтесь выше, с Лицензионными соглашениями конечного пользователя (EULA).<br/>Если вы не согласны с условиями, проприетарное программное обеспечение будет заменено на альтернативное открытое программное обеспечение. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>драйвер %1</strong><br/>от %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>видео драйвер %1</strong><br/><font color="Grey">от %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>плагин браузера %1</strong><br/><font color="Grey">от %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>кодек %1</strong><br/><font color="Grey">от %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>пакет %1</strong><br/><font color="Grey">от %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">от %2</font> <a href="%1">view license agreement</a> <a href="%1">посмотреть лицензионное соглашение</a> LicenseViewStep License Лицензия LocalePage The system language will be set to %1. Системным языком будет установлен %1. The numbers and dates locale will be set to %1. Региональным форматом чисел и дат будет установлен %1. Region: Регион: Zone: Зона: &Change... И&зменить... Set timezone to %1/%2.<br/> Установить часовой пояс на %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Загружаю данные о местоположениях... Location Местоположение MoveFileSystemJob Move file system of partition %1. Переместить файловую систему раздела %1. Could not open file system on partition %1 for moving. Не удалось открыть файловую систему на разделе %1 для перемещения. Could not create target for moving file system on partition %1. Не удалось создать цель для перемещения файловой системы на разделе %1. Moving of partition %1 failed, changes have been rolled back. Перемещение раздела %1 завершилось неудачей, все изменения были отменены. Moving of partition %1 failed. Roll back of the changes have failed. Перемещение раздела %1 завершилось неудачей. Попытка отменить изменения также завершилась неудачей. Updating boot sector after the moving of partition %1 failed. Обновление загрузочного сектора после перемещения раздела %1 завершилось неудачей. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Размеры логических секторов на источнике и цели не совпадают. Такое перемещение пока не поддерживается. Source and target for copying do not overlap: Rollback is not required. Источник и цель для копирования не перекрывают друг друга. Создание отката не требуется. Could not open device %1 to rollback copying. Не могу открыть устройство %1 для копирования отката. NetInstallPage Name Имя Description Описание Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Установка по сети. (Отключено: не удается получить список пакетов, проверьте сетевое подключение) NetInstallViewStep Package selection Выбор пакетов Page_Keyboard Form Геометрия Keyboard Model: Тип клавиатуры: Type here to test your keyboard Эта область - для тестирования клавиатуры Page_UserSetup Form Геометрия What is your name? Как Вас зовут? What name do you want to use to log in? Какое имя Вы хотите использовать для входа? font-weight: normal Гарнитура: обычная <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Если этот компьютер используется несколькими людьми, Вы сможете создать соответствующие учетные записи сразу после установки.</small> Choose a password to keep your account safe. Выберите пароль для защиты вашей учетной записи. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Введите одинаковый пароль дважды, это необходимо для исключения ошибок. Хороший пароль состоит из смеси букв, цифр и знаков пунктуации; должен иметь длину от 8 знаков и его стоит периодически изменять.</small> What is the name of this computer? Какое имя у компьютера? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Это имя будет использовано, если Вы сделаете этот компьютер видимым в сети.</small> Log in automatically without asking for the password. Автоматический вход, без запроса пароля. Use the same password for the administrator account. Использовать тот же пароль для аккаунта администратора. Choose a password for the administrator account. Выберите пароль администратора <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Введите пароль дважды, чтобы исключить ошибки ввода.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system Система EFI Swap Swap New partition for %1 Новый раздел для %1 New partition Новый раздел %1 %2 %1 %2 PartitionModel Free Space Доступное место New partition Новый раздел Name Имя File System Файловая система Mount Point Точка монтирования Size Размер PartitionPage Form Геометрия Storage de&vice: &Устройство: &Revert All Changes &Отменить все изменения New Partition &Table Новая &таблица разделов &Create &Создать &Edit &Править &Delete &Удалить Install boot &loader on: Установить &загрузчик в: Are you sure you want to create a new partition table on %1? Вы уверены, что хотите создать новую таблицу разделов на %1? PartitionViewStep Gathering system information... Сбор информации о системе... Partitions Разделы Install %1 <strong>alongside</strong> another operating system. Установить %1 <strong>параллельно</strong> к другой операционной системе. <strong>Erase</strong> disk and install %1. <strong>Очистить</strong> диск и установить %1. <strong>Replace</strong> a partition with %1. <strong>Заменить</strong> раздел на %1. <strong>Manual</strong> partitioning. <strong>Ручная</strong> разметка. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Установить %1 <strong>параллельно</strong> к другой операционной системе на диске <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Очистить</strong> диск <strong>%2</strong> (%3) и установить %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Заменить</strong> раздел на диске <strong>%2</strong> (%3) на %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ручная</strong> разметка диска <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Диск <strong>%1</strong> (%2) Current: Текущий: After: После: No EFI system partition configured Нет настроенного системного раздела EFI An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Чтобы начать, необходим системный раздел EFI %1.<br/><br/>Для настройки системного раздела EFI, вернитесь, выберите или создайте файловую систему FAT32 с установленным флагом <strong>esp</strong> и точкой монтирования <strong>%2</strong>.<br/><br/>Вы можете продолжить и без настройки системного раздела EFI, но Ваша система может не загрузиться. EFI system partition flag not set Не установлен флаг системного раздела EFI An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Чтобы начать, необходим системный раздел EFI %1.<br/><br/>Был настроен раздел с точкой монтирования <strong>%2</strong>, но его флаг <strong>esp</strong> не установлен.<br/>Для установки флага вернитесь и отредактируйте раздел.<br/><br/>Вы можете продолжить и без установки флага, но Ваша система может не загрузиться. Boot partition not encrypted Загрузочный раздел не зашифрован A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Включено шифрование корневого раздела, но использован отдельный загрузочный раздел без шифрования.<br/><br/>При такой конфигурации возникают проблемы с безопасностью, потому что важные системные файлы хранятся на разделе без шифрования.<br/>Если хотите, можете продолжить, но файловая система будет разблокирована позднее во время загрузки системы.<br/>Чтобы включить шифрование загрузочного раздела, вернитесь назад и снова создайте его, отметив <strong>Шифровать</strong> в окне создания раздела. QObject Default Keyboard Model Модель клавиатуры по умолчанию Default По умолчанию unknown неизвестный extended расширенный unformatted неформатированный swap swap Unpartitioned space or unknown partition table Неразмеченное место или неизвестная таблица разделов ReplaceWidget Form Форма Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Выберите, где установить %1.<br/><font color="red">Внимание: </font>это удалит все файлы на выбранном разделе. The selected item does not appear to be a valid partition. Выбранный элемент, видимо, не является действующим разделом. %1 cannot be installed on empty space. Please select an existing partition. %1 не может быть установлен вне раздела. Пожалуйста выберите существующий раздел. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 не может быть установлен прямо в расширенный раздел. Выберите существующий основной или логический раздел. %1 cannot be installed on this partition. %1 не может быть установлен в этот раздел. Data partition (%1) Раздел данных (%1) Unknown system partition (%1) Неизвестный системный раздел (%1) %1 system partition (%2) %1 системный раздел (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Раздел %1 слишком мал для %2. Пожалуйста выберите раздел объемом не менее %3 Гиб. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Не найден системный раздел EFI. Вернитесь назад и выполните ручную разметку для установки %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 будет установлен в %2.<br/><font color="red">Внимание: </font>все данные на разделе %2 будут потеряны. The EFI system partition at %1 will be used for starting %2. Системный раздел EFI на %1 будет использован для запуска %2. EFI system partition: Системный раздел EFI: RequirementsChecker Gathering system information... Сбор информации о системе... has at least %1 GB available drive space доступно как минимум %1 ГБ свободного дискового пространства There is not enough drive space. At least %1 GB is required. Недостаточно места на дисках. Необходимо как минимум %1 ГБ. has at least %1 GB working memory доступно как минимум %1 ГБ оперативной памяти The system does not have enough working memory. At least %1 GB is required. Недостаточно оперативной памяти. Необходимо как минимум %1 ГБ. is plugged in to a power source подключено сетевое питание The system is not plugged in to a power source. Сетевое питание не подключено. is connected to the Internet присутствует выход в сеть Интернет The system is not connected to the Internet. Отсутствует выход в Интернет. The installer is not running with administrator rights. Программа установки не запущена с привилегиями администратора. The screen is too small to display the installer. Слишком маленький экран для окна установщика. ResizeFileSystemJob Resize file system on partition %1. Изменить файловую систему на разделе %1. Parted failed to resize filesystem. Parted не смог изменить размер файловой системы. Failed to resize filesystem. Ошибка смены размера файловой системы. ResizePartitionJob Resize partition %1. Изменить размер раздела %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Изменить размер <strong>%2MB</strong> раздела <strong>%1</strong> на <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Изменяю размер раздела %1 с %2MB на %3MB. The installer failed to resize partition %1 on disk '%2'. Программе установки не удалось изменить размер раздела %1 на диске '%2'. Could not open device '%1'. Не удалось открыть устройство '%1'. ScanningDialog Scanning storage devices... Сканируются устройства хранения... Partitioning Разметка SetHostNameJob Set hostname %1 Задать имя компьютера в сети %1 Set hostname <strong>%1</strong>. Задать имя компьютера в сети <strong>%1</strong>. Setting hostname %1. Задаю имя компьютера в сети для %1. Internal Error Внутренняя ошибка Cannot write hostname to target system Не возможно записать имя компьютера в целевую систему SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Установить модель клавиатуры на %1, раскладку на %2-%3 Failed to write keyboard configuration for the virtual console. Не удалось записать параметры клавиатуры для виртуальной консоли. Failed to write to %1 Не удалось записать на %1 Failed to write keyboard configuration for X11. Не удалось записать параметры клавиатуры для X11. Failed to write keyboard configuration to existing /etc/default directory. Не удалось записать параметры клавиатуры в существующий каталог /etc/default. SetPartFlagsJob Set flags on partition %1. Установить флаги на разделе %1. Set flags on %1MB %2 partition. Установить флаги %1MB раздела %2. Set flags on new partition. Установить флаги нового раздела. Clear flags on partition <strong>%1</strong>. Очистить флаги раздела <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Очистить флаги %1MB раздела <strong>%2</strong>. Clear flags on new partition. Сбросить флаги нового раздела. Flag partition <strong>%1</strong> as <strong>%2</strong>. Отметить раздел <strong>%1</strong> флагом как <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Отметить %1MB раздел <strong>%2</strong> флагом как <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Отметить новый раздел флагом как <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Очистка флагов раздела <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Очистка флагов %1MB раздела <strong>%2</strong>. Clearing flags on new partition. Сброс флагов нового раздела. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Установка флагов <strong>%2</strong> на раздел <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Установка флагов <strong>%3</strong> %1MB раздела <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Установка флагов <strong>%1</strong> нового раздела. The installer failed to set flags on partition %1. Установщик не смог установить флаги на раздел %1. Could not open device '%1'. Не удалось открыть устройство '%1'. Could not open partition table on device '%1'. Не удалось открыть таблицу разделов устройства '%1'. Could not find partition '%1'. Не удалось найти раздел '%1'. SetPartGeometryJob Update geometry of partition %1. Обновить геометрию раздела %1. Failed to change the geometry of the partition. Ошибка изменения геометрии раздела. SetPasswordJob Set password for user %1 Задать пароль для пользователя %1 Setting password for user %1. Устанавливаю пароль для учетной записи %1. Bad destination system path. Неверный путь целевой системы. rootMountPoint is %1 Точка монтирования корневого раздела %1 Cannot disable root account. Невозможно отключить учетную запись root passwd terminated with error code %1. Cannot set password for user %1. Не удалось задать пароль для пользователя %1. usermod terminated with error code %1. Команда usermod завершилась с кодом ошибки %1. SetTimezoneJob Set timezone to %1/%2 Установить часовой пояс на %1/%2 Cannot access selected timezone path. Нет доступа к указанному часовому поясу. Bad path: %1 Неправильный путь: %1 Cannot set timezone. Невозможно установить часовой пояс. Link creation failed, target: %1; link name: %2 Не удалось создать ссылку, цель: %1; имя ссылки: %2 Cannot set timezone, Часовой пояс не установлен, Cannot open /etc/timezone for writing Невозможно открыть /etc/timezone для записи SummaryPage This is an overview of what will happen once you start the install procedure. Это обзор изменений, которые будут применены при запуске процедуры установки. SummaryViewStep Summary Итог UsersPage Your username is too long. Ваше имя пользователя слишком длинное. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Ваше имя пользователя содержит недопустимые символы. Допускаются только строчные буквы и цифры. Your hostname is too short. Имя вашего компьютера слишком коротко. Your hostname is too long. Имя вашего компьютера слишком длинное. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Имя вашего компьютера содержит недопустимые символы. Разрешены буквы, цифры и тире. Your passwords do not match! Пароли не совпадают! UsersViewStep Users Пользователи WelcomePage Form Форма &Language: &Язык: &Release notes &Примечания к выпуску &Known issues &Известные проблемы &Support П&оддержка &About <h1>Welcome to the %1 installer.</h1> <h1>Добро пожаловать в программу установки %1 .</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Добро пожаловать в установщик Calamares для %1 .</h1> About %1 installer О программе установки %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 поддержка WelcomeViewStep Welcome Добро пожаловать calamares-3.1.12/lang/calamares_sk.ts000066400000000000000000003717731322271446000174670ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. <strong>Zavádzacie prostredie</strong> tohto systému.<br><br>Staršie systémy architektúry x86 podporujú iba <strong>BIOS</strong>.<br>Moderné systémy obvykle používajú <strong>EFI</strong>, ale tiež sa môžu zobraziť ako BIOS, ak sú spustené v režime kompatiblitiy. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Tento systém bol spustený so zavádzacím prostredím <strong>EFI</strong>.<br><br>Na konfiguráciu spustenia z prostredia EFI, musí inštalátor umiestniť aplikáciu zavádzača, ako je <strong>GRUB</strong> alebo <strong>systemd-boot</strong> na <strong>oddiel systému EFI</strong>. Toto je vykonané automaticky, pokiaľ nezvolíte ručné rozdelenie oddielov, v tom prípade ho musíte zvoliť alebo vytvoriť ručne. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Tento systém bol spustený so zavádzacím prostredím <strong>BIOS</strong>.<br><br>Na konfiguráciu spustenia z prostredia BIOS, musí inštalátor nainštalovať zavádzač, ako je <strong>GRUB</strong>, buď na začiatok oddielu alebo na <strong>hlavný zavádzací záznam (MBR)</strong> pri začiatku tabuľky oddielov (preferované). Toto je vykonané automaticky, pokiaľ nezvolíte ručné rozdelenie oddielov, v tom prípade ho musíte nainštalovať ručne. BootLoaderModel Master Boot Record of %1 Hlavný zavádzací záznam (MBR) zariadenia %1 Boot Partition Zavádzací oddiel System Partition Systémový oddiel Do not install a boot loader Neinštalovať zavádzač %1 (%2) %1 (%2) Calamares::DebugWindow Form Forma GlobalStorage Globálne úložisko JobQueue Fronta úloh Modules Moduly Type: Typ: none žiadny Interface: Rozhranie: Tools Nástroje Debug information Ladiace informácie Calamares::ExecutionViewStep Install Inštalácia Calamares::JobThread Done Hotovo Calamares::ProcessJob Run command %1 %2 Spustenie príkazu %1 %2 Running command %1 %2 Spúšťa sa príkaz %1 %2 External command crashed Externý príkaz nečakane skončil Command %1 crashed. Output: %2 Príkaz %1 nečakane skončil. Výstup: %2 External command failed to start Zlyhalo spustenie externého príkazu Command %1 failed to start. Zlyhalo spustenie príkazu %1. Internal error when starting command Vnútorná chyba pri spúšťaní príkazu Bad parameters for process job call. Nesprávne parametre pre volanie úlohy procesu. External command failed to finish Zlyhalo dokončenie externého príkazu Command %1 failed to finish in %2s. Output: %3 Zlyhalo dokončenie príkazu %1 v trvaní %2s. Výstup: %3 External command finished with errors Externý príkaz bol dokončený s chybami Command %1 finished with exit code %2. Output: %3 Príkaz %1 bol dokončený s konečným kódom %2. Výstup: %3 Calamares::PythonJob Running %1 operation. Spúšťa sa operácia %1. Bad working directory path Nesprávna cesta k pracovnému adresáru Working directory %1 for python job %2 is not readable. Pracovný adresár %1 pre úlohu jazyka python %2 nie je možné čítať. Bad main script file Nesprávny súbor hlavného skriptu Main script file %1 for python job %2 is not readable. Súbor hlavného skriptu %1 pre úlohu jazyka python %2 nie je možné čítať. Boost.Python error in job "%1". Chyba knižnice Boost.Python v úlohe „%1“. Calamares::ViewManager &Back &Späť &Next Ď&alej &Cancel &Zrušiť Cancel installation without changing the system. Zruší inštaláciu bez zmeny systému. Cancel installation? Zrušiť inštaláciu? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Skutočne chcete zrušiť aktuálny priebeh inštalácie? Inštalátor sa ukončí a všetky zmeny budú stratené. &Yes _Áno &No _Nie &Close _Zavrieť Continue with setup? Pokračovať v inštalácii? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Inštalátor distribúcie %1 sa chystá vykonať zmeny na vašom disku, aby nainštaloval distribúciu %2. <br/><strong>Tieto zmeny nebudete môcť vrátiť späť.</strong> &Install now &Inštalovať teraz Go &back Prejsť s&päť &Done _Dokončiť The installation is complete. Close the installer. Inštalácia je dokončená. Zatvorí inštalátor. Error Chyba Installation Failed Inštalácia zlyhala CalamaresPython::Helper Unknown exception type Neznámy typ výnimky unparseable Python error Neanalyzovateľná chyba jazyka Python unparseable Python traceback Neanalyzovateľný ladiaci výstup jazyka Python Unfetchable Python error. Nezískateľná chyba jazyka Python. CalamaresWindow %1 Installer Inštalátor distribúcie %1 Show debug information Zobraziť ladiace informácie CheckFileSystemJob Checking file system on partition %1. Kontroluje sa systém súborov na oddieli %1. The file system check on partition %1 failed. Kontrola systému súborov na oddieli %1 zlyhala. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Tento počítač nespĺňa minimálne požiadavky pre inštaláciu distribúcie %1.<br/>Inštalácia nemôže pokračovať. <a href="#details">Podrobnosti...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Tento počítač nespĺňa niektoré z odporúčaných požiadaviek pre inštaláciu distribúcie %1.<br/>Inštalácia môže pokračovať, ale niektoré funkcie môžu byť zakázané. This program will ask you some questions and set up %2 on your computer. Tento program sa vás spýta na niekoľko otázok a nainštaluje distribúciu %2 do vášho počítača. For best results, please ensure that this computer: Pre čo najlepší výsledok, sa prosím, uistite, že tento počítač: System requirements Systémové požiadavky ChoicePage Form Forma After: Potom: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ručné rozdelenie oddielov</strong><br/>Môžete vytvoriť alebo zmeniť veľkosť oddielov podľa seba. Boot loader location: Umiestnenie zavádzača: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Oddiel %1 bude zmenšený na %2MB a nový %3MB oddiel bude vytvorený pre distribúciu %4. Select storage de&vice: Vyberte úložné &zariadenie: Current: Teraz: Reuse %1 as home partition for %2. Opakované použitie oddielu %1 ako domovského pre distribúciu %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Vyberte oddiel na zmenšenie a potom potiahnutím spodného pruhu zmeňte veľkosť</strong> <strong>Select a partition to install on</strong> <strong>Vyberte oddiel, na ktorý sa má inštalovať</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Oddiel systému EFI sa nedá v tomto počítači nájsť. Prosím, prejdite späť a použite ručné rozdelenie oddielov na inštaláciu distribúcie %1. The EFI system partition at %1 will be used for starting %2. Oddie lsystému EFI na %1 bude použitý na spustenie distribúcie %2. EFI system partition: Oddiel systému EFI: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Zdá sa, že toto úložné zariadenie neobsahuje operačný systém. Čo by ste chceli urobiť?<br/>Budete môcť skontrolovať a potvrdiť vaše voľby pred uplatnením akejkoľvek zmeny na úložnom zariadení. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Vymazanie disku</strong><br/>Týmto sa <font color="red">odstránia</font> všetky údaje momentálne sa nachádzajúce na vybratom úložnom zariadení. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Toto úložné zariadenie obsahuje operačný systém %1. Čo by ste chceli urobiť?<br/>Budete môcť skontrolovať a potvrdiť vaše voľby pred uplatnením akejkoľvek zmeny na úložnom zariadení. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Inštalácia popri súčasnom systéme</strong><br/>Inštalátor zmenší oddiel a uvoľní miesto pre distribúciu %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Nahradenie oddielu</strong><br/>Nahradí oddiel distribúciou %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Toto úložné zariadenie už obsahuje operačný systém. Čo by ste chceli urobiť?<br/>Budete môcť skontrolovať a potvrdiť vaše voľby pred uplatnením akejkoľvek zmeny na úložnom zariadení. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Toto úložné zariadenie obsahuje viacero operačných systémov. Čo by ste chceli urobiť?<br/>Budete môcť skontrolovať a potvrdiť vaše voľby pred uplatnením akejkoľvek zmeny na úložnom zariadení. ClearMountsJob Clear mounts for partitioning operations on %1 Vymazať pripojenia pre operácie rozdelenia oddielov na zariadení %1 Clearing mounts for partitioning operations on %1. Vymazávajú sa pripojenia pre operácie rozdelenia oddielov na zariadení %1. Cleared all mounts for %1 Vymazané všetky pripojenia pre zariadenie %1 ClearTempMountsJob Clear all temporary mounts. Vymazanie všetkých dočasných pripojení. Clearing all temporary mounts. Vymazávajú sa všetky dočasné pripojenia. Cannot get list of temporary mounts. Nedá sa získať zoznam dočasných pripojení. Cleared all temporary mounts. Vymazané všetky dočasné pripojenia. CreatePartitionDialog Create a Partition Vytvorenie oddielu MiB MiB Partition &Type: &Typ oddielu: &Primary &Primárny E&xtended Ro&zšírený Fi&le System: &Systém súborov: Flags: Značky: &Mount Point: Bo&d pripojenia: Si&ze: Veľ&kosť: En&crypt Zaši&frovať Logical Logický Primary Primárny GPT GPT Mountpoint already in use. Please select another one. Bod pripojenia sa už používa. Prosím, vyberte iný. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Vytvoriť nový %2MB oddiel na zariadení %4 (%3) so systémom súborov %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Vytvoriť nový <strong>%2MB</strong> oddiel na zariadení <strong>%4</strong> (%3) so systémom súborov <strong>%1</strong>. Creating new %1 partition on %2. Vytvára sa nový %1 oddiel na zariadení %2. The installer failed to create partition on disk '%1'. Inštalátor zlyhal pri vytváraní oddielu na disku „%1“. Could not open device '%1'. Nepodarilo sa otvoriť zariadenie „%1“. Could not open partition table. Nepodarilo sa otvoriť tabuľku oddielov. The installer failed to create file system on partition %1. Inštalátor zlyhal pri vytváraní systému súborov na oddieli %1. The installer failed to update partition table on disk '%1'. Inštalátor zlyhal pri aktualizovaní tabuľky oddielov na disku „%1“. CreatePartitionTableDialog Create Partition Table Vytvorenie tabuľky oddielov Creating a new partition table will delete all existing data on the disk. Vytvorením novej tabuľky oddielov sa odstránia všetky existujúce údaje na disku. What kind of partition table do you want to create? Ktorý typ tabuľky oddielov chcete vytvoriť? Master Boot Record (MBR) Hlavný zavádzací záznam (MBR) GUID Partition Table (GPT) Tabuľka oddielov GUID (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Vytvoriť novú tabuľku oddielov typu %1 na zariadení %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Vytvoriť novú <strong>%1</strong> tabuľku oddielov na zariadení <strong>%2</strong> (%3). Creating new %1 partition table on %2. Vytvára sa nová tabuľka oddielov typu %1 na zariadení %2. The installer failed to create a partition table on %1. Inštalátor zlyhal pri vytváraní tabuľky oddielov na zariadení %1. Could not open device %1. Nepodarilo sa otvoriť zariadenie %1. CreateUserJob Create user %1 Vytvoriť používateľa %1 Create user <strong>%1</strong>. Vytvoriť používateľa <strong>%1</strong>. Creating user %1. Vytvára sa používateľ %1. Sudoers dir is not writable. Adresár Sudoers nie je zapisovateľný. Cannot create sudoers file for writing. Nedá sa vytvoriť súbor sudoers na zapisovanie. Cannot chmod sudoers file. Nedá sa vykonať príkaz chmod na súbori sudoers. Cannot open groups file for reading. Nedá sa otvoriť súbor skupín na čítanie. Cannot create user %1. Nedá sa vytvoriť používateľ %1. useradd terminated with error code %1. Príkaz useradd ukončený s chybovým kódom %1. Cannot add user %1 to groups: %2. Nedá sa pridať používateľ %1 do skupín: %2. usermod terminated with error code %1. Príkaz usermod ukončený s chybovým kódom %1. Cannot set home directory ownership for user %1. Nedá sa nastaviť vlastníctvo domovského adresára pre používateľa %1. chown terminated with error code %1. Príkaz chown ukončený s chybovým kódom %1. DeletePartitionJob Delete partition %1. Odstrániť oddiel %1. Delete partition <strong>%1</strong>. Odstrániť oddiel <strong>%1</strong>. Deleting partition %1. Odstraňuje sa oddiel %1. The installer failed to delete partition %1. Inštalátor zlyhal pri odstraňovaní oddielu %1. Partition (%1) and device (%2) do not match. Oddiel (%1) a zariadenie (%2) sa nezhodujú.. Could not open device %1. Nepodarilo sa otvoriť zariadenie %1. Could not open partition table. Nepodarilo sa otvoriť tabuľku oddielov. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Typ <strong>tabuľky oddielov</strong> na vybratom úložnom zariadení.<br><br>Jediným spôsobom ako zmeniť tabuľku oddielov je vymazanie a znovu vytvorenie tabuľky oddielov od začiatku, čím sa zničia všetky údaje úložnom zariadení.<br>Inštalátor ponechá aktuálnu tabuľku oddielov, pokiaľ sa výlučne nerozhodnete inak.<br>Ak nie ste si istý, na moderných systémoch sa preferuje typ tabuľky oddielov GPT. This device has a <strong>%1</strong> partition table. Toto zariadenie obsahuje tabuľku oddielov <strong>%1</strong>. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Toto je <strong>slučkové</strong> zariadenie.<br><br>Je to pseudo-zariadenie bez tabuľky oddielov, čo umožňuje prístup k súborom ako na blokovom zariadení. Tento druh inštalácie obvykle obsahuje iba jeden systém súborov. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Inštalátor <strong>nemôže rozpoznať tabuľku oddielov</strong> na vybratom úložnom zariadení.<br><br>Zariadenie buď neobsahuje žiadnu tabuľku oddielov, alebo je tabuľka oddielov poškodená, alebo je neznámeho typu.<br>Inštalátor môže vytvoriť novú tabuľku oddielov buď automaticky alebo prostredníctvom stránky s ručným rozdelením oddielov. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Toto je odporúčaná tabuľka oddielov pre moderné systémy, ktoré sa spúšťajú zo zavádzacieho prostredia <strong>EFI</strong>. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Tento typ tabuľky oddielov je vhodný iba pre staršie systémy, ktoré sa spúšťajú zo zavádzacieho prostredia <strong>BIOS</strong>. GPT je odporúčaná vo väčšine ďalších prípadov.<br><br><strong>Upozornenie:</strong> Tabuľka oddielov MBR je zastaralý štandard z éry operačného systému MS-DOS.<br>Môžu byť vytvorené iba 4 <em>primárne</em> oddiely a z nich môže byť jeden <em>rozšíreným</em> oddielom, ktorý môže následne obsahovať viacero <em>logických</em> oddielov. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Zápis konfigurácie LUKS pre nástroj Dracut do %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Vynechanie zápisu konfigurácie LUKS pre nástroj Dracut: oddiel „/“ nie je zašifrovaný Failed to open %1 Zlyhalo otvorenie %1 DummyCppJob Dummy C++ Job Fiktívna úloha jazyka C++ EditExistingPartitionDialog Edit Existing Partition Úprava existujúceho oddielu Content: Obsah: &Keep &Ponechať Format Formátovať Warning: Formatting the partition will erase all existing data. Upozornenie: Naformátovaním oddielu sa vymažú všetky existujúce údaje. &Mount Point: Bod pripoje&nia: Si&ze: V&eľkosť: MiB MiB Fi&le System: S&ystém súborov: Flags: Značky: Mountpoint already in use. Please select another one. Bod pripojenia sa už používa. Prosím, vyberte iný. EncryptWidget Form Forma En&crypt system &Zašifrovať systém Passphrase Heslo Confirm passphrase Potvrdenie hesla Please enter the same passphrase in both boxes. Prosím, zadajte rovnaké heslo do oboch polí. FillGlobalStorageJob Set partition information Nastaviť informácie o oddieli Install %1 on <strong>new</strong> %2 system partition. Inštalovať distribúciu %1 na <strong>novom</strong> %2 systémovom oddieli. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Nastaviť <strong>nový</strong> %2 oddiel s bodom pripojenia <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Inštalovať distribúciu %2 na %3 systémovom oddieli <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Nastaviť %3 oddiel <strong>%1</strong> s bodom pripojenia <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Inštalovať zavádzač do <strong>%1</strong>. Setting up mount points. Nastavujú sa body pripojení. FinishedPage Form Forma &Restart now &Reštartovať teraz <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Všetko je dokončené.</h1><br/>Distribúcia %1 bola nainštalovaná do vášho počítača.<br/>Teraz môžete reštartovať počítač a spustiť váš nový systém, alebo pokračovať v používaní živého prostredia distribúcie %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Inštalácia zlyhala</h1><br/>Distribúcia %1 nebola nainštalovaná do vášho počítača.<br/>Chybová hláška: %2. FinishedViewStep Finish Dokončenie Installation Complete Inštalácia dokončená The installation of %1 is complete. Inštalácia distribúcie %1s je dokončená. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Naformátovanie oddielu %1 (systém súborov: %2, veľkosť: %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Naformátovanie <strong>%3MB</strong> oddielu <strong>%1</strong> so systémom súborov <strong>%2</strong>. Formatting partition %1 with file system %2. Formátuje sa oddiel %1 so systémom súborov %2. The installer failed to format partition %1 on disk '%2'. Inštalátor zlyhal pri formátovaní oddielu %1 na disku „%2“. Could not open device '%1'. Nepodarilo sa otvoriť zariadenie „%1“. Could not open partition table. Nepodarilo sa otvoriť tabuľku oddielov. The installer failed to create file system on partition %1. Inštalátor zlyhal pri vytváraní systému súborov na oddieli %1. The installer failed to update partition table on disk '%1'. Inštalátor zlyhal pri aktualizovaní tabuľky oddielov na disku „%1“. InteractiveTerminalPage Konsole not installed Aplikácia Konsole nie je nainštalovaná Please install the kde konsole and try again! Prosím, nainštalujte aplikáciu kde konsole a skúste to znovu! Executing script: &nbsp;<code>%1</code> Spúšťa sa skript: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skript KeyboardPage Set keyboard model to %1.<br/> Nastavenie modelu klávesnice na %1.<br/> Set keyboard layout to %1/%2. Nastavenie rozloženia klávesnice na %1/%2. KeyboardViewStep Keyboard Klávesnica LCLocaleDialog System locale setting Miestne nastavenie systému The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Miestne nastavenie systému ovplyvní jazyk a znakovú sadu niektorých prvkov používateľského rozhrania v príkazovom riadku.<br/>Aktuálne nastavenie je <strong>%1</strong>. &Cancel &Zrušiť &OK &OK LicensePage Form Forma I accept the terms and conditions above. Prijímam podmienky vyššie. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Licenčné podmienky</h1>Tento proces inštalácie môže nainštalovať uzavretý softvér, ktorý je predmetom licenčných podmienok. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Prosím, prečítajte si licenčnú zmluvu koncového používateľa (EULAs) vyššie.<br/>Ak nesúhlasíte s podmienkami, proces inštalácie nemôže pokračovať. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Licenčné podmienky</h1>Tento proces inštalácie môže nainštalovať uzavretý softvér, ktorý je predmetom licenčných podmienok v rámci poskytovania dodatočných funkcií a vylepšenia používateľských skúseností. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Prosím, prečítajte si licenčnú zmluvu koncového používateľa (EULAs) vyššie.<br/>Ak nesúhlasíte s podmienkami, uzavretý softvér nebude nainštalovaný a namiesto neho budú použité alternatívy s otvoreným zdrojom. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>Ovládač %1</strong><br/>vytvoril %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>Ovládač grafickej karty %1</strong><br/><font color="Grey">vytvoril %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>Zásuvný modul prehliadača %1</strong><br/><font color="Grey">vytvoril %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>Kodek %1</strong><br/><font color="Grey">vytvoril %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>Balík %1</strong><br/><font color="Grey">vytvoril %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">vytvoril %2</font> <a href="%1">view license agreement</a> <a href="%1">Zobraziť licenčné podmienky</a> LicenseViewStep License Licencia LocalePage The system language will be set to %1. Jazyk systému bude nastavený na %1. The numbers and dates locale will be set to %1. Miestne nastavenie čísel a dátumov bude nastavené na %1. Region: Oblasť: Zone: Zóna: &Change... Z&meniť... Set timezone to %1/%2.<br/> Nastavenie časovej zóny na %1/%2.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Načítavajú sa údaje umiestnenia... Location Umiestnenie MoveFileSystemJob Move file system of partition %1. Presun systému súborov oddielu %1. Could not open file system on partition %1 for moving. Nepodarilo sa otvoriť systém súborov na oddieli %1 pre presun. Could not create target for moving file system on partition %1. Nepodarilo sa vytvoriť cieľ pre presun systému súborov na oddieli %1. Moving of partition %1 failed, changes have been rolled back. Presun oddielu %1 zlyhal. Zmeny boli odvolané. Moving of partition %1 failed. Roll back of the changes have failed. Presun oddielu %1 zlyhal. Odvolanie zmien zlyhalo. Updating boot sector after the moving of partition %1 failed. Zlyhala aktualizácia zavádzacieho sektoru po presune oddielu %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Veľkosti logických sektorov v zdroji a cieli kopírovania nie sú rovnaké. Toto nie je momentálne podporované. Source and target for copying do not overlap: Rollback is not required. Zdroj a cieľ kopírovania sa neprekrývajú. Odvolanie nie je potrebné. Could not open device %1 to rollback copying. Nepodarilo sa otvoriť zariadenie %1 na odvolanie kopírovania. NetInstallPage Name Názov Description Popis Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Sieťová inštalácia. (Zakázaná: Nie je možné získať zoznamy balíkov. Skontrolujte vaše sieťové pripojenie.) NetInstallViewStep Package selection Výber balíkov Page_Keyboard Form Forma Keyboard Model: Model klávesnice: Type here to test your keyboard Tu môžete písať na odskúšanie vašej klávesnice Page_UserSetup Form Forma What is your name? Aké je vaše meno? What name do you want to use to log in? Aké meno chcete použiť na prihlásenie? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ak bude tento počítač používať viac ako jedna osoba, môžete nastaviť viacero účtov po inštalácii.</small> Choose a password to keep your account safe. Zvoľte heslo pre zachovanie vášho účtu v bezpečí. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Zadajte rovnaké heslo dvakrát, aby sa predišlo preklepom. Dobré heslo by malo obsahovať mix písmen, čísel a diakritiky, malo by mať dĺžku aspoň osem znakov a malo by byť pravidelne menené.</small> What is the name of this computer? Aký je názov tohto počítača? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Tento názov bude použitý, keď sprístupníte počítač v sieti.</small> Log in automatically without asking for the password. Prihlásiť automaticky bez pýtania hesla. Use the same password for the administrator account. Použiť rovnaké heslo pre účet správcu. Choose a password for the administrator account. Zvoľte heslo pre účet správcu. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Zadajte rovnaké heslo dvakrát, aby sa predišlo preklepom.</small> PartitionLabelsView Root Koreňový adresár Home Domovský adresár Boot Zavádzač EFI system Systém EFI Swap Odkladací priestor New partition for %1 Nový oddiel pre %1 New partition Nový oddiel %1 %2 %1 %2 PartitionModel Free Space Voľné miesto New partition Nový oddiel Name Názov File System Systém súborov Mount Point Bod pripojenia Size Veľkosť PartitionPage Form Forma Storage de&vice: Úložné zar&iadenie: &Revert All Changes V&rátiť všetky zmeny New Partition &Table Nová &tabuľka oddielov &Create &Vytvoriť &Edit &Upraviť &Delete O&dstrániť Install boot &loader on: Nainštalovať &zavádzač na: Are you sure you want to create a new partition table on %1? Naozaj chcete vytvoriť novú tabuľku oddielov na zariadení %1? PartitionViewStep Gathering system information... Zbierajú sa informácie o počítači... Partitions Oddiely Install %1 <strong>alongside</strong> another operating system. Inštalácia distribúcie %1 <strong>popri</strong> inom operačnom systéme. <strong>Erase</strong> disk and install %1. <strong>Vymazanie</strong> disku a inštalácia distribúcie %1. <strong>Replace</strong> a partition with %1. <strong>Nahradenie</strong> oddielu distribúciou %1. <strong>Manual</strong> partitioning. <strong>Ručné</strong> rozdelenie oddielov. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Inštalácia distribúcie %1 <strong>popri</strong> inom operačnom systéme na disku <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Vymazanie</strong> disku <strong>%2</strong> (%3) a inštalácia distribúcie %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Nahradenie</strong> oddielu na disku <strong>%2</strong> (%3) distribúciou %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Ručné</strong> rozdelenie oddielov na disku <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Teraz: After: Potom: No EFI system partition configured Nie je nakonfigurovaný žiadny oddiel systému EFI An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. Oddiel systému EFI je potrebný pre spustenie distribúcie %1.<br/><br/>Na konfiguráciu oddielu systému EFI prejdite späť a vyberte alebo vytvorte systém súborov FAT32 s povolenou značkou <strong>esp</strong> a bod pripojenia <strong>%2</strong>.<br/><br/>Môžete porkačovať bez nastavenia oddielu systému EFI, ale váš systém môže pri spustení zlyhať. EFI system partition flag not set Značka oddielu systému EFI nie je nastavená An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Oddiel systému EFI je potrebný pre spustenie distribúcie %1.<br/><br/>Oddiel bol nakonfigurovaný s bodom pripojenia <strong>%2</strong>, ale nemá nastavenú značku <strong>esp</strong>.<br/>Na nastavenie značky prejdite späť a upravte oddiel.<br/><br/>Môžete porkačovať bez nastavenia značky, ale váš systém môže pri spustení zlyhať. Boot partition not encrypted Zavádzací oddiel nie je zašifrovaný A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Spolu so zašifrovaným koreňovým oddielom bol nainštalovaný oddelený zavádzací oddiel, ktorý ale nie je zašifrovaný.<br/><br/>S týmto typom inštalácie je ohrozená bezpečnosť, pretože dôležité systémové súbory sú uchovávané na nezašifrovanom oddieli.<br/>Ak si to želáte, môžete pokračovať, ale neskôr, počas spúšťania systému sa vykoná odomknutie systému súborov.<br/>Na zašifrovanie zavádzacieho oddielu prejdite späť a vytvorte ju znovu vybratím voľby <strong>Zašifrovať</strong> v okne vytvárania oddielu. QObject Default Keyboard Model Predvolený model klávesnice Default Predvolený unknown neznámy extended rozšírený unformatted nenaformátovaný swap odkladací Unpartitioned space or unknown partition table Nerozdelené miesto alebo neznáma tabuľka oddielov ReplaceWidget Form Forma Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Vyberte, kde sa má nainštalovať distribúcia %1.<br/><font color="red">Upozornenie: </font>týmto sa odstránia všetky súbory na vybratom oddieli. The selected item does not appear to be a valid partition. Zdá sa, že vybratá položka nie je platným oddielom. %1 cannot be installed on empty space. Please select an existing partition. Distribúcia %1 sa nedá nainštalovať na prázdne miesto. Prosím, vyberte existujúci oddiel. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. Distribúcia %1 sa nedá nainštalovať na rozšírený oddiel. Prosím, vyberte existujúci primárny alebo logický oddiel. %1 cannot be installed on this partition. Distribúcia %1 sa nedá nainštalovať na tento oddiel. Data partition (%1) Údajový oddiel (%1) Unknown system partition (%1) Neznámy systémový oddiel (%1) %1 system partition (%2) Systémový oddiel operačného systému %1 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Oddiel %1 je príliš malý pre distribúciu %2. Prosím, vyberte oddiel s kapacitou aspoň %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Oddiel systému EFI sa nedá v tomto počítači nájsť. Prosím, prejdite späť a použite ručné rozdelenie oddielov na inštaláciu distribúcie %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>Distribúcia %1 bude nainštalovaná na oddiel %2.<br/><font color="red">Upozornenie: </font>všetky údaje na oddieli %2 budú stratené. The EFI system partition at %1 will be used for starting %2. Oddiel systému EFI na %1 bude použitý pre spustenie distribúcie %2. EFI system partition: Oddiel systému EFI: RequirementsChecker Gathering system information... Zbierajú sa informácie o počítači... has at least %1 GB available drive space obsahuje aspoň %1 GB voľného miesta na disku There is not enough drive space. At least %1 GB is required. Nie je dostatok miesta na disku. Vyžaduje sa aspoň %1 GB. has at least %1 GB working memory obsahuje aspoň %1 GB voľnej operačnej pamäte The system does not have enough working memory. At least %1 GB is required. Počítač neobsahuje dostatok operačnej pamäte. Vyžaduje sa aspoň %1 GB. is plugged in to a power source je pripojený k zdroju napájania The system is not plugged in to a power source. Počítač nie je pripojený k zdroju napájania. is connected to the Internet je pripojený k internetu The system is not connected to the Internet. Počítač nie je pripojený k internetu. The installer is not running with administrator rights. Inštalátor nie je spustený s právami správcu. The screen is too small to display the installer. Obrazovka je príliš malá na to, aby bolo možné zobraziť inštalátor. ResizeFileSystemJob Resize file system on partition %1. Zmena veľkosti súborového systému na oddieli %1. Parted failed to resize filesystem. Program Parted zlyhal pri zmene veľkosti systému súborov. Failed to resize filesystem. Zlyhala zmena veľkosti systému súborov. ResizePartitionJob Resize partition %1. Zmena veľkosti oddielu %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Zmena veľkosti <strong>%2MB</strong> oddielu <strong>%1</strong> na <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Mení sa veľkosť %2MB oddielu %1 na %3MB. The installer failed to resize partition %1 on disk '%2'. Inštalátor zlyhal pri zmene veľkosti oddielu %1 na disku „%2“. Could not open device '%1'. Nepodarilo sa otvoriť zariadenie „%1“. ScanningDialog Scanning storage devices... Prehľadávajú sa úložné zariadenia... Partitioning Rozdelenie oddielov SetHostNameJob Set hostname %1 Nastavenie názvu hostiteľa %1 Set hostname <strong>%1</strong>. Nastavenie názvu hostiteľa <strong>%1</strong>. Setting hostname %1. Nastavuje sa názov hostiteľa %1. Internal Error Vnútorná chyba Cannot write hostname to target system Nedá sa zapísať názov hostiteľa do cieľového systému SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Nastavenie modelu klávesnice na %1 a rozloženia na %2-%3 Failed to write keyboard configuration for the virtual console. Zlyhalo zapísanie konfigurácie klávesnice pre virtuálnu konzolu. Failed to write to %1 Zlyhalo zapísanie do %1 Failed to write keyboard configuration for X11. Zlyhalo zapísanie konfigurácie klávesnice pre server X11. Failed to write keyboard configuration to existing /etc/default directory. Zlyhalo zapísanie konfigurácie klávesnice do existujúceho adresára /etc/default. SetPartFlagsJob Set flags on partition %1. Nastavenie značiek na oddieli %1. Set flags on %1MB %2 partition. Nastavenie značiek na %1MB oddieli %2. Set flags on new partition. Nastavenie značiek na novom oddieli. Clear flags on partition <strong>%1</strong>. Vymazanie značiek na oddieli <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Vymazanie značiek na %1MB oddieli <strong>%2</strong>. Clear flags on new partition. Vymazanie značiek na novom oddieli. Flag partition <strong>%1</strong> as <strong>%2</strong>. Označenie oddielu <strong>%1</strong> ako <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Označenie %1MB oddielu <strong>%2</strong> ako <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Označenie nového oddielu ako <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Vymazávajú sa značky na oddieli <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Vymazávajú sa značky na %1MB oddieli <strong>%2</strong>. Clearing flags on new partition. Vymazávajú sa značky na novom oddieli. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Nastavujú sa značky <strong>%2</strong> na oddieli <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Nastavujú sa značky <strong>%3</strong> na %1MB oddieli <strong>%2</strong>. Setting flags <strong>%1</strong> on new partition. Nastavujú sa značky <strong>%1</strong> na novom oddieli. The installer failed to set flags on partition %1. Inštalátor zlyhal pri nastavovaní značiek na oddieli %1. Could not open device '%1'. Nepodarilo sa otvoriť zariadenie „%1“. Could not open partition table on device '%1'. Nepodarilo sa otvoriť tabuľku oddielov na zariadení „%1“. Could not find partition '%1'. Nepodarilo sa nájsť oddiel „%1“. SetPartGeometryJob Update geometry of partition %1. Aktualizovanie geometrie oddielu %1. Failed to change the geometry of the partition. Zlyhala zmena geometrie oddielu. SetPasswordJob Set password for user %1 Nastavenie hesla pre používateľa %1 Setting password for user %1. Nastavuje sa heslo pre používateľa %1. Bad destination system path. Nesprávny cieľ systémovej cesty. rootMountPoint is %1 rootMountPoint je %1 Cannot disable root account. Nedá sa zakázať účet správcu. passwd terminated with error code %1. Príkaz passwd ukončený s chybovým kódom %1. Cannot set password for user %1. Nedá sa nastaviť heslo pre používateľa %1. usermod terminated with error code %1. Príkaz usermod ukončený s chybovým kódom %1. SetTimezoneJob Set timezone to %1/%2 Nastavenie časovej zóny na %1/%2 Cannot access selected timezone path. Nedá sa získať prístup k vybratej ceste časovej zóny. Bad path: %1 Nesprávna cesta: %1 Cannot set timezone. Nedá sa nastaviť časová zóna. Link creation failed, target: %1; link name: %2 Zlyhalo vytvorenie odakzu, cieľ: %1; názov odkazu: %2 Cannot set timezone, Nedá sa nastaviť časová zóna, Cannot open /etc/timezone for writing Nedá sa otvoriť cesta /etc/timezone pre zapisovanie SummaryPage This is an overview of what will happen once you start the install procedure. Toto je prehľad toho, čo sa stane, keď spustíte inštaláciu. SummaryViewStep Summary Súhrn UsersPage Your username is too long. Vaše používateľské meno je príliš dlhé. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Vaše používateľské meno obsahuje neplatné znaky. Povolené sú iba písmená, čísla a pomlčky. Your hostname is too short. Váš názov hostiteľa je príliš krátky. Your hostname is too long. Váš názov hostiteľa je príliš dlhý. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Váš názov hostiteľa obsahuje neplatné znaky. Povolené sú iba písmená, čísla a pomlčky. Your passwords do not match! Vaše heslá sa nezhodujú! UsersViewStep Users Používatelia WelcomePage Form Forma &Language: &Jazyk: &Release notes &Poznámky k vydaniu &Known issues &Známe problémy &Support Po&dpora &About &O inštalátore <h1>Welcome to the %1 installer.</h1> <h1>Vitajte v inštalátore distribúcie %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>Vitajte v aplikácii Calamares, inštalátore distribúcie %1.</h1> About %1 installer O inštalátore %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Autorské práva 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Autorské práva 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Poďakovanie: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg a <a href="https://www.transifex.com/calamares/calamares/">prekladateľký tím inštalátora Calamares</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> je vyvýjaný s podporou projektu <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Oslobodzujúci softvér. %1 support Podpora distribúcie %1 WelcomeViewStep Welcome Vitajte calamares-3.1.12/lang/calamares_sl.ts000066400000000000000000003242051322271446000174540ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition Zagonski razdelek System Partition Sistemski razdelek Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Končano Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Zunanji ukaz se je sesul Command %1 crashed. Output: %2 Sesutje ukaza %1. Izpis: %2 External command failed to start Zunanjega ukaza ni bilo mogoče zagnati Command %1 failed to start. Ukaz %1 se ni zagnal. Internal error when starting command Notranja napaka ob zagonu ukaza Bad parameters for process job call. Nepravilni parametri za klic procesa opravila. External command failed to finish Zunanji ukaz se ni uspel zaključiti Command %1 failed to finish in %2s. Output: %3 Zunanji ukaz %1 se ni uspel zaključiti v %2s. Izpis: %3 External command finished with errors Zunanji ukaz se je zaključil z napakami Command %1 finished with exit code %2. Output: %3 Ukaz %1 se je zaključil z izhodno kodo %2. Izpis: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Nepravilna pot delovne mape Working directory %1 for python job %2 is not readable. Ni mogoče brati delovne mape %1 za pythonovo opravilo %2. Bad main script file Nepravilna datoteka glavnega skripta Main script file %1 for python job %2 is not readable. Ni mogoče brati datoteke %1 glavnega skripta za pythonovo opravilo %2. Boost.Python error in job "%1". Napaka Boost.Python v opravilu "%1". Calamares::ViewManager &Back &Nazaj &Next &Naprej &Cancel Cancel installation without changing the system. Cancel installation? Preklic namestitve? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ali res želite preklicati trenutni namestitveni proces? Namestilni program se bo končal in vse spremembe bodo izgubljene. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Napaka Installation Failed Namestitev je spodletela CalamaresPython::Helper Unknown exception type Neznana vrsta izjeme unparseable Python error nerazčlenljiva napaka Python unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer %1 Namestilnik Show debug information CheckFileSystemJob Checking file system on partition %1. Preverjanje datotečnega sistema na razdelku %1. The file system check on partition %1 failed. Preverjanje datotečnega sistema na razdelku %1 je spodletelo. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Počisti vse začasne priklope. Clearing all temporary mounts. Cannot get list of temporary mounts. Ni možno dobiti seznama začasnih priklopov. Cleared all temporary mounts. Vsi začasni priklopi so bili počiščeni. CreatePartitionDialog Create a Partition Ustvari razdelek MiB Partition &Type: &Vrsta razdelka: &Primary &Primaren E&xtended R&azširjen Fi&le System: Flags: &Mount Point: &Priklopna točka: Si&ze: Ve&likost En&crypt Logical Logičen Primary Primaren GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Namestilniku ni uspelo ustvariti razdelka na disku '%1'. Could not open device '%1'. Ni mogoče odpreti naprave '%1'. Could not open partition table. Ni mogoče odpreti razpredelnice razdelkov. The installer failed to create file system on partition %1. Namestilniku ni uspelo ustvariti datotečnega sistema na razdelku %1. The installer failed to update partition table on disk '%1'. Namestilniku ni uspelo posodobiti razpredelnice razdelkov na disku '%1'. CreatePartitionTableDialog Create Partition Table Ustvari razpredelnico razdelkov Creating a new partition table will delete all existing data on the disk. Ustvarjanje nove razpredelnice razdelkov bo izbrisalo vse obstoječe podatke na disku. What kind of partition table do you want to create? Kakšna vrsta razpredelnice razdelkov naj se ustvari? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Razpredelnica razdelkov (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Namestilniku ni uspelo ustvariti razpredelnice razdelkov na %1. Could not open device %1. Naprave %1 ni mogoče odpreti. CreateUserJob Create user %1 Ustvari uporabnika %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Mapa sudoers ni zapisljiva. Cannot create sudoers file for writing. Ni mogoče ustvariti datoteke sudoers za pisanje. Cannot chmod sudoers file. Na datoteki sudoers ni mogoče izvesti opravila chmod. Cannot open groups file for reading. Datoteke skupin ni bilo mogoče odpreti za branje. Cannot create user %1. Ni mogoče ustvariti uporabnika %1. useradd terminated with error code %1. useradd se je prekinil s kodo napake %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Ni mogoče nastaviti lastništva domače mape za uporabnika %1. chown terminated with error code %1. chown se je prekinil s kodo napake %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Namestilniku ni uspelo izbrisati razdelka %1. Partition (%1) and device (%2) do not match. Razdelek (%1) in naprava (%2) si ne ustrezata. Could not open device %1. Ni mogoče odpreti naprave %1. Could not open partition table. Ni mogoče odpreti razpredelnice razdelkov. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Uredi obstoječi razdelek Content: Vsebina: &Keep Format Formatiraj Warning: Formatting the partition will erase all existing data. Opozorilo: Formatiranje razdelka bo izbrisalo vse obstoječe podatke. &Mount Point: &Priklopna točka: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Nastavi informacije razdelka Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatiraj razdelek %1 (datotečni sistem: %2, velikost %3 MB) na %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Namestilniku ni uspelo formatirati razdelka %1 na disku '%2'. Could not open device '%1'. Ni mogoče odpreti naprave '%1'. Could not open partition table. Ni mogoče odpreti razpredelnice razdelkov. The installer failed to create file system on partition %1. Namestilniku ni uspelo ustvariti datotečnega sistema na razdelku %1. The installer failed to update partition table on disk '%1'. Namestilniku ni uspelo posodobiti razpredelnice razdelkov na disku '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Nastavi model tipkovnice na %1.<br/> Set keyboard layout to %1/%2. Nastavi razporeditev tipkovnice na %1/%2. KeyboardViewStep Keyboard Tipkovnica LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Območje: Zone: Časovni pas: &Change... Set timezone to %1/%2.<br/> Nastavi časovni pas na %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Nalaganje podatkov položaja ... Location Položaj MoveFileSystemJob Move file system of partition %1. Premakni datotečni sistem razdelka %1. Could not open file system on partition %1 for moving. Ni mogoče odpreti datotečnega sistema na razdelku %1 za premikanje. Could not create target for moving file system on partition %1. Ni mogoče ustvariti cilja za premikanje datotečnega sistema na razdelku %1. Moving of partition %1 failed, changes have been rolled back. Premikanje razdelka %1 je spodletelo, povrnjeno je bilo prejšnje stanje. Moving of partition %1 failed. Roll back of the changes have failed. Premikanje razdelka %1 je spodletelo. Povrnitev prejšnjega stanja je spodletela. Updating boot sector after the moving of partition %1 failed. Posodabljanje zagonskega sektorja, potem ko je spodletelo premikanje razdelka %1. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Velikosti logičnih sektorjev v viru in cilju za kopiranje niso enake. To trenutno ni podprto. Source and target for copying do not overlap: Rollback is not required. Vir in cilj za kopiranje se ne prekrivata: razveljavitev ni potrebna. Could not open device %1 to rollback copying. Ni mogoče odpreti naprave %1 za razveljavitev kopiranja. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Oblika Keyboard Model: Model tipkovnice: Type here to test your keyboard Tipkajte tukaj za testiranje tipkovnice Page_UserSetup Form Oblika What is your name? Vaše ime? What name do you want to use to log in? Katero ime želite uporabiti za prijavljanje? font-weight: normal Debelina pisave: normalna <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Če bo ta računalnik uporabljala več kot ena oseba, lahko po namestitvi nastavite nadaljnje račune</small> Choose a password to keep your account safe. Izberite geslo za zaščito vašega računa. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Geslo vnesite dvakrat, da se zavarujete pred morebitnimi tipkarskimi napakami. Dobro geslo vsebuje mešanico črk, številk in ločil ter ima najmanj osem znakov. Priporočljivo je, da ga spreminjate v rednih časovnih razmikih.</small> What is the name of this computer? Ime računalnika? <small>This name will be used if you make the computer visible to others on a network.</small> <small>To ime bo uporabljeno, če bo vaš računalnik viden drugim napravam v omrežju.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. Izberite geslo za skrbniški račun. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Geslo vnesite dvakrat, da se zavarujete pred morebitnimi tipkarskimi napakami.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Razpoložljiv prostor New partition Nov razdelek Name Ime File System Datotečni sistem Mount Point Priklopna točka Size Velikost PartitionPage Form Oblika Storage de&vice: &Revert All Changes &Povrni vse spremembe New Partition &Table Nov razdelek &Razpredelnica &Create &Ustvari &Edit &Urejaj &Delete &Izbriši Install boot &loader on: Are you sure you want to create a new partition table on %1? Ali ste prepričani, da želite ustvariti novo razpredelnico razdelkov na %1? PartitionViewStep Gathering system information... Zbiranje informacij o sistemu ... Partitions Razdelki Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Privzeti model tipkovnice Default Privzeto unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_sr.ts000066400000000000000000003255721322271446000174720ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition Подизна партиција System Partition Системска партиција Do not install a boot loader Не инсталирај подизни учитавач %1 (%2) %1 (%2) Calamares::DebugWindow Form Форма GlobalStorage JobQueue Modules Модули Type: Тип: none ништа Interface: Сучеље: Tools Алатке Debug information Calamares::ExecutionViewStep Install Инсталирај Calamares::JobThread Done Завршено Calamares::ProcessJob Run command %1 %2 Покрени команду %1 %2 Running command %1 %2 Извршавам команду %1 %2 External command crashed Спољашња наредба се срушила Command %1 crashed. Output: %2 Наредба %1 се срушила. Излаз: %2 External command failed to start Покретање спољашње наредбе није успело Command %1 failed to start. Покретање наредбе %1 није успело Internal error when starting command Интерна грешка при покретању наредбе Bad parameters for process job call. Лоши параметри при позиву посла процеса. External command failed to finish Спољашња наредба није завршила Command %1 failed to finish in %2s. Output: %3 Наредба %1 није завршила у %2s. Излаз: %3 External command finished with errors Спољашња наредба извршена уз грешке Command %1 finished with exit code %2. Output: %3 Наредба %1 извршена са излазним кодом %2. Излаз: %3 Calamares::PythonJob Running %1 operation. Извршавам %1 операцију. Bad working directory path Лоша путања радног директоријума Working directory %1 for python job %2 is not readable. Радни директоријум %1 за питонов посао %2 није читљив. Bad main script file Лош фајл главне скрипте Main script file %1 for python job %2 is not readable. Фајл главне скрипте %1 за питонов посао %2 није читљив. Boost.Python error in job "%1". Boost.Python грешка у послу „%1“. Calamares::ViewManager &Back &Назад &Next &Следеће &Cancel &Откажи Cancel installation without changing the system. Cancel installation? Отказати инсталацију? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Да ли стварно желите да прекинете текући процес инсталације? Инсталер ће бити затворен и све промене ће бити изгубљене. &Yes &No &Close Continue with setup? Наставити са подешавањем? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now &Инсталирај сада Go &back Иди &назад &Done The installation is complete. Close the installer. Error Грешка Installation Failed Инсталација није успела CalamaresPython::Helper Unknown exception type Непознат тип изузетка unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer %1 инсталер Show debug information CheckFileSystemJob Checking file system on partition %1. Провера фајл система на партицији %1. The file system check on partition %1 failed. Провера фајл система на партицији %1 није успела. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: За најбоље резултате обезбедите да овај рачунар: System requirements Системски захтеви ChoicePage Form Форма After: После: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Ручно партиционисање</strong><br/>Сами можете креирати или мењати партције. Boot loader location: Подизни учитавач на: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 биће змањена на %2MB а нова %3MB партиција биће направљена за %4. Select storage de&vice: Изаберите у&ређај за смештање: Current: Тренутно: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Уклони тачке припајања за операције партиције на %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Уклоњене све тачке припајања за %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Направи партицију MiB Partition &Type: &Тип партиције &Primary &Примарна E&xtended П&роширена Fi&le System: Flags: &Mount Point: Тачка &припајања: Si&ze: Вели&чина En&crypt Logical Логичка Primary Примарна GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Инсталација није успела да направи партицију на диску '%1'. Could not open device '%1'. Није могуће отворити уређај '%1'. Could not open partition table. Није могуће отворити табелу партиција The installer failed to create file system on partition %1. Инсталација није успела да направи фајл систем на партицији %1. The installer failed to update partition table on disk '%1'. Инсталација није успела да ажурира табелу партиција на диску '%1'. CreatePartitionTableDialog Create Partition Table Направи табелу партиција Creating a new partition table will delete all existing data on the disk. Прављење нове партиције табела ће обрисати све постојеће податке на диску. What kind of partition table do you want to create? Какву табелу партиција желите да направите? Master Boot Record (MBR) GUID Partition Table (GPT) GUID партициона табела (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Инсталација није успела да направи табелу партиција на %1. Could not open device %1. Није могуће отворити уређај %1. CreateUserJob Create user %1 Направи корисника %1 Create user <strong>%1</strong>. Creating user %1. Правим корисника %1 Sudoers dir is not writable. Није могуће писати у "Судоерс" директоријуму. Cannot create sudoers file for writing. Cannot chmod sudoers file. Није могуће променити мод (chmod) над "судоерс" фајлом Cannot open groups file for reading. Cannot create user %1. Није могуће направити корисника %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: Садржај: &Keep &Очувај Format Форматирај Warning: Formatting the partition will erase all existing data. Упозорење: Форматирање партиције ће обрисати све постојеће податке. &Mount Point: &Тачка монтирања: Si&ze: &Величина: MiB Fi&le System: Фајл &систем: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Заврши Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Скрипта KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Тастатура LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License Лиценца LocalePage The system language will be set to %1. Системски језик биће постављен на %1 The numbers and dates locale will be set to %1. Region: Регион: Zone: Зона: &Change... &Измени... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location Локација MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Назив Description Опис Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Избор пакета Page_Keyboard Form Keyboard Model: Type here to test your keyboard куцајте овде да тестирате тастатуру Page_UserSetup Form Форма What is your name? Како се зовете? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. Изаберите лозинку да обезбедите свој налог. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? Како ћете звати ваш рачунар? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: Тренутно: After: После: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default подразумевано unknown непознато extended проширена unformatted неформатирана swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning Партиционисање SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Интерна грешка Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Сажетак UsersPage Your username is too long. Ваше корисничко име је предугачко. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Име вашег "домаћина" - hostname је прекратко. Your hostname is too long. Ваше име домаћина је предуго - hostname Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Ваше име "домаћина" - hostname садржи недозвољене карактере. Могуће је користити само слова, бројеве и цртице. Your passwords do not match! Лозинке се не поклапају! UsersViewStep Users Корисници WelcomePage Form Форма &Language: &Језик: &Release notes &Known issues &Познати проблеми &Support По&дршка &About &О програму <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer О %1 инсталатеру <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 подршка WelcomeViewStep Welcome Добродошли calamares-3.1.12/lang/calamares_sr@latin.ts000066400000000000000000003222171322271446000206130ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record na %1 Boot Partition Particija za pokretanje sistema System Partition Sistemska particija Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Gotovo Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Izvršavanje eksterne komande nije uspjelo Command %1 crashed. Output: %2 Izvršavanje komande %1 nije uspjelo. Povratna poruka: %2 External command failed to start Pokretanje komande nije uspjelo Command %1 failed to start. Neuspješno pokretanje komande %1. Internal error when starting command Interna greška kod pokretanja komande Bad parameters for process job call. Pogrešni parametri kod poziva funkcije u procesu. External command failed to finish Izvršavanje eksterne komande nije dovršeno Command %1 failed to finish in %2s. Output: %3 Izvršavanje komande %1 nije dovršeno u %2s. Povratna poruka: %3 External command finished with errors Greška u izvršavanju eksterne komande Command %1 finished with exit code %2. Output: %3 Greška u izvršavanju komande %1, izlazni kod: %2. Povratna poruka: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Neispravna putanja do radne datoteke Working directory %1 for python job %2 is not readable. Nemoguće pročitati radnu datoteku %1 za funkciju %2 u Python-u. Bad main script file Neispravan glavna datoteka za skriptu Main script file %1 for python job %2 is not readable. Glavna datoteka za skriptu %1 za Python funkciju %2 se ne može pročitati. Boost.Python error in job "%1". Boost.Python greška u funkciji %1 Calamares::ViewManager &Back &Nazad &Next &Dalje &Cancel &Prekini Cancel installation without changing the system. Cancel installation? Prekini instalaciju? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Da li stvarno želite prekinuti trenutni proces instalacije? Instaler će se zatvoriti i sve promjene će biti izgubljene. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Greška Installation Failed Neuspješna instalacija CalamaresPython::Helper Unknown exception type Nepoznat tip izuzetka unparseable Python error unparseable Python error unparseable Python traceback unparseable Python traceback Unfetchable Python error. Unfetchable Python error. CalamaresWindow %1 Installer %1 Instaler Show debug information CheckFileSystemJob Checking file system on partition %1. Provjeravam fajl sistem na particiji %1. The file system check on partition %1 failed. Provjera fajl sistema na particiji %1 nije uspjela. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Skini tačke montiranja za operacije nad particijama na %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 Sve tačke montiranja na %1 skinute ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition Kreiraj particiju MiB Partition &Type: &Tip particije &Primary &Primarna E&xtended P&roširena Fi&le System: Flags: &Mount Point: Tačka &montiranja: Si&ze: Veli&čina En&crypt Logical Logička Primary Primarna GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Instaler nije uspeo napraviti particiju na disku '%1'. Could not open device '%1'. Nemoguće otvoriti uređaj '%1'. Could not open partition table. Nemoguće otvoriti tabelu particija. The installer failed to create file system on partition %1. Instaler ne može napraviti fajl sistem na particiji %1. The installer failed to update partition table on disk '%1'. Instaler ne može promjeniti tabelu particija na disku '%1'. CreatePartitionTableDialog Create Partition Table Napravi novu tabelu particija Creating a new partition table will delete all existing data on the disk. Kreiranje nove tabele particija će obrisati sve podatke na disku. What kind of partition table do you want to create? Kakvu tabelu particija želite da napravite? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Instaler nije uspjeo da napravi tabelu particija na %1. Could not open device %1. Nemoguće otvoriti uređaj %1. CreateUserJob Create user %1 Napravi korisnika %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Nemoguće mijenjati fajlove u sudoers direktorijumu Cannot create sudoers file for writing. Nemoguće napraviti sudoers fajl Cannot chmod sudoers file. Nemoguće uraditi chmod nad sudoers fajlom. Cannot open groups file for reading. Nemoguće otvoriti groups fajl Cannot create user %1. Nemoguće napraviti korisnika %1. useradd terminated with error code %1. Komanda useradd prekinuta sa kodom greške %1 Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. Nemoguće postaviti vlasništvo nad početnim direktorijumom za korisnika %1. chown terminated with error code %1. Komanda chown prekinuta sa kodom greške %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Instaler nije uspjeo obrisati particiju %1. Partition (%1) and device (%2) do not match. Particija (%1) i uređaj (%2) se ne slažu. Could not open device %1. Nemoguće otvoriti uređaj %1. Could not open partition table. Nemoguće otvoriti tabelu particija. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Promjeni postojeću particiju: Content: Sadržaj: &Keep Format Formatiraj Warning: Formatting the partition will erase all existing data. Upozorenje: Formatiranje particije će obrisati sve podatke. &Mount Point: Tačka za &montiranje: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Instaler nije uspeo formatirati particiju %1 na disku '%2'. Could not open device '%1'. Ne mogu otvoriti uređaj '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard Tastatura LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Regija: Zone: Zona: &Change... Set timezone to %1/%2.<br/> Postavi vremensku zonu na %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Očitavam podatke o lokaciji... Location Lokacija MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Premještanje particije %1 nije uspjelo, promjene su poništene. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Model tastature: Type here to test your keyboard Test tastature Page_UserSetup Form What is your name? Kako se zovete? What name do you want to use to log in? Koje ime želite koristiti da se prijavite? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Ako će više osoba koristiti ovaj računar, možete postaviti više korisničkih naloga nakon instalacije.</small> Choose a password to keep your account safe. Odaberite lozinku da biste zaštitili Vaš korisnički nalog. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Upišite istu lozinku dvaput, da ne bi došlo do greške kod kucanja. Dobra lozinka se sastoji od mešavine slova, brojeva i interpunkcijskih znakova; trebala bi biti duga bar osam znakova, i trebalo bi da ju menjate redovno</small> What is the name of this computer? Kako želite nazvati ovaj računar? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Ovo ime će biti vidljivo drugim računarima na mreži</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Unesite istu lozinku dvaput, da ne bi došlp do greške kod kucanja</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space Slobodan prostor New partition Nova particija Name Naziv File System Mount Point Size Veličina PartitionPage Form Storage de&vice: &Revert All Changes &Vrati sve promjene New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Particije Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Promjeni veličinu particije %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Postavi ime računara %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary Izveštaj UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! Vaše lozinke se ne poklapaju UsersViewStep Users Korisnici WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_sv.ts000066400000000000000000003475211322271446000174740ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. Systemets <strong>uppstartsmiljö</strong>.<br><br>Äldre x86-system stödjer endast <strong>BIOS</strong>.<br>Moderna system stödjer vanligen <strong>EFI</strong>, men kan också vara i kompabilitetsläge för BIOS. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Detta system startades med en <strong>EFI-miljö</strong>.<br><br>För att ställa in uppstart från en EFI-miljö måste en uppstartsladdare användas, t.ex. <strong>GRUB</strong> eller <strong>systemd-boot</strong> eller en <strong>EFI-systempartition</strong>. Detta sker automatiskt, såvida du inte väljer att partitionera manuellt. Då måste du själv installera en uppstartsladdare. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Detta system startades med en <strong>BIOS-miljö</strong>. <br><br>För att ställa in uppstart från en BIOS-miljö måste en uppstartsladdare som t.ex. <strong>GRUB</strong> installeras, antingen i början av en partition eller på <strong>huvudstartsektorn (MBR)</strong> i början av partitionstabellen. Detta sker automatiskt, såvida du inte väljer manuell partitionering. Då måste du själv installera en uppstartsladdare. BootLoaderModel Master Boot Record of %1 Master Boot Record på %1 Boot Partition Uppstartspartition System Partition Systempartition Do not install a boot loader Installera inte en uppstartsladdare %1 (%2) %1 (%2) Calamares::DebugWindow Form Form GlobalStorage GlobalStorage JobQueue JobQueue Modules Moduler Type: Typ: none ingen Interface: Gränssnitt: Tools Verktyg Debug information Avlusningsinformation Calamares::ExecutionViewStep Install Installera Calamares::JobThread Done Klar Calamares::ProcessJob Run command %1 %2 Kör kommando %1 %2 Running command %1 %2 Kör kommando %1 %2 External command crashed Externt kommando kraschade Command %1 crashed. Output: %2 Kommando %1 kraschade. Utdata: %2 External command failed to start Externt kommando misslyckades med att starta Command %1 failed to start. Kommando %1 misslyckades med att starta. Internal error when starting command Internt fel under kommandostart Bad parameters for process job call. Ogiltiga parametrar för processens uppgiftsanrop. External command failed to finish Externt kommando misslyckades med att avsluta. Command %1 failed to finish in %2s. Output: %3 Kommando %1 kunde inte avslutas efter %2s. Utdata: %3 External command finished with errors Externt kommando avslutade med fel Command %1 finished with exit code %2. Output: %3 Kommando %1 avslutades med kod %2. Utdata: %3 Calamares::PythonJob Running %1 operation. Kör %1-operation Bad working directory path Arbetskatalogens sökväg är ogiltig Working directory %1 for python job %2 is not readable. Arbetskatalog %1 för pythonuppgift %2 är inte läsbar. Bad main script file Ogiltig huvudskriptfil Main script file %1 for python job %2 is not readable. Huvudskriptfil %1 för pythonuppgift %2 är inte läsbar. Boost.Python error in job "%1". Boost.Python-fel i uppgift "%'1". Calamares::ViewManager &Back &Bakåt &Next &Nästa &Cancel Avbryt Cancel installation without changing the system. Cancel installation? Avbryt installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Är du säker på att du vill avsluta installationen i förtid? Alla ändringar kommer att gå förlorade. &Yes &No &Close Continue with setup? Fortsätt med installation? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1-installeraren är på väg att göra ändringar för att installera %2.<br/><strong>Du kommer inte att kunna ångra dessa ändringar!strong> &Install now &Installera nu Go &back Gå &bakåt &Done The installation is complete. Close the installer. Error Fel Installation Failed Installationen misslyckades CalamaresPython::Helper Unknown exception type Okänd undantagstyp unparseable Python error Otolkbart Pythonfel unparseable Python traceback Otolkbar Python-traceback Unfetchable Python error. Ohämtbart Pythonfel CalamaresWindow %1 Installer %1-installationsprogram Show debug information Visa avlusningsinformation CheckFileSystemJob Checking file system on partition %1. Kontrollerar filsystem på partition %1. The file system check on partition %1 failed. Filsystemkontrollen på partition %1 misslyckades. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Denna dator uppfyller inte minimikraven för att installera %1.<br/>Installationen kan inte fortsätta. <a href="#details">Detaljer...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Denna dator uppfyller inte alla rekommenderade krav för att installera %1.<br/>Installationen kan fortsätta, men alla alternativ och funktioner kanske inte kan användas. This program will ask you some questions and set up %2 on your computer. Detta program kommer att ställa dig några frågor och installera %2 på din dator. For best results, please ensure that this computer: För bästa resultat, vänligen se till att datorn: System requirements Systemkrav ChoicePage Form Formulär After: Efter: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Manuell partitionering</strong><br/>Du kan själv skapa och ändra storlek på partitionerna. Boot loader location: Sökväg till uppstartshanterare: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 kommer att förminskas till %2 MB och en ny %3 MB-partition kommer att skapas för %4. Select storage de&vice: Välj lagringsenhet: Current: Nuvarande: Reuse %1 as home partition for %2. Återanvänd %1 som hempartition för %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Välj en partition att minska, sen dra i nedre fältet för att ändra storlek</strong> <strong>Select a partition to install on</strong> <strong>Välj en partition att installera på</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Ingen EFI-partition kunde inte hittas på systemet. Gå tillbaka och partitionera din lagringsenhet manuellt för att ställa in %1. The EFI system partition at %1 will be used for starting %2. EFI-partitionen %1 kommer att användas för att starta %2. EFI system partition: EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denna lagringsenhet ser inte ut att ha ett operativsystem installerat. Vad vill du göra?<br/>Du kommer kunna granska och bekräfta dina val innan någon ändring görs på lagringseneheten. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Rensa lagringsenhet</strong><br/>Detta kommer <font color="red">radera</font> all existerande data på den valda lagringsenheten. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denna lagringsenhet har %1 på sig. Vad vill du göra?<br/>Du kommer kunna granska och bekräfta dina val innan någon ändring görs på lagringsenheten. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Installera på sidan om</strong><br/>Installationshanteraren kommer krympa en partition för att göra utrymme för %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Ersätt en partition</strong><br/>Ersätter en partition med %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denna lagringsenhet har redan ett operativsystem på sig. Vad vill du göra?<br/>Du kommer kunna granska och bekräfta dina val innan någon ändring sker på lagringsenheten. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Denna lagringsenhet har flera operativsystem på sig. Vad vill du göra?<br/>Du kommer kunna granska och bekräfta dina val innan någon ändring sker på lagringsenheten. ClearMountsJob Clear mounts for partitioning operations on %1 Rensa monteringspunkter för partitionering på %1 Clearing mounts for partitioning operations on %1. Rensar monteringspunkter för partitionering på %1. Cleared all mounts for %1 Rensade alla monteringspunkter för %1 ClearTempMountsJob Clear all temporary mounts. Rensa alla tillfälliga monteringspunkter. Clearing all temporary mounts. Rensar alla tillfälliga monteringspunkter. Cannot get list of temporary mounts. Kunde inte hämta tillfälliga monteringspunkter. Cleared all temporary mounts. Rensade alla tillfälliga monteringspunkter CreatePartitionDialog Create a Partition Skapa en partition MiB Partition &Type: Partitions&typ: &Primary &Primär E&xtended Utökad Fi&le System: Fi&lsystem: Flags: Flaggor: &Mount Point: &Monteringspunkt: Si&ze: Storlek: En&crypt Kr%yptera Logical Logisk Primary Primär GPT GPT Mountpoint already in use. Please select another one. Monteringspunkt används redan. Välj en annan. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Skapa ny %2MB partition på %4 (%3) med filsystem %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Skapa ny <strong>%2MB</strong> partition på <strong>%4 (%3)</strong> med filsystem <strong>%1</strong>. Creating new %1 partition on %2. Skapar ny %1 partition på %2. The installer failed to create partition on disk '%1'. Installationsprogrammet kunde inte skapa partition på disk '%1'. Could not open device '%1'. Kunde inte öppna enhet '%1'. Could not open partition table. Kunde inte öppna partitionstabell. The installer failed to create file system on partition %1. Installationsprogrammet kunde inte skapa filsystem på partition %1. The installer failed to update partition table on disk '%1'. Installationsprogrammet kunde inte uppdatera partitionstabell på disk '%1'. CreatePartitionTableDialog Create Partition Table Skapa partitionstabell Creating a new partition table will delete all existing data on the disk. Skapa en ny partitionstabell och ta bort alla befintliga data på disken. What kind of partition table do you want to create? Vilken typ av partitionstabell vill du skapa? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID-partitionstabell (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Skapa ny %1 partitionstabell på %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Skapa ny <strong>%1</strong> partitionstabell på <strong>%2</strong> (%3). Creating new %1 partition table on %2. Skapar ny %1 partitionstabell på %2. The installer failed to create a partition table on %1. Installationsprogrammet kunde inte skapa en partitionstabell på %1. Could not open device %1. Kunde inte öppna enhet %1. CreateUserJob Create user %1 Skapar användare %1 Create user <strong>%1</strong>. Skapa användare <strong>%1</strong>. Creating user %1. Skapar användare %1 Sudoers dir is not writable. Sudoerkatalogen är inte skrivbar. Cannot create sudoers file for writing. Kunde inte skapa sudoerfil för skrivning. Cannot chmod sudoers file. Kunde inte chmodda sudoerfilen. Cannot open groups file for reading. Kunde inte öppna gruppfilen för läsning. Cannot create user %1. Kunde inte skapa användaren %1. useradd terminated with error code %1. useradd stoppades med felkod %1. Cannot add user %1 to groups: %2. Kan inte lägga till användare %1 till grupper: %2. usermod terminated with error code %1. usermod avslutade med felkod %1. Cannot set home directory ownership for user %1. Kunde inte ge användaren %1 äganderätt till sin hemkatalog. chown terminated with error code %1. chown stoppades med felkod %1. DeletePartitionJob Delete partition %1. Ta bort partition %1. Delete partition <strong>%1</strong>. Ta bort partition <strong>%1</strong>. Deleting partition %1. Tar bort partition %1. The installer failed to delete partition %1. Installationsprogrammet kunde inte ta bort partition %1. Partition (%1) and device (%2) do not match. Partition (%1) och enhet (%2) matchar inte. Could not open device %1. Kunde inte öppna enhet %1. Could not open partition table. Kunde inte öppna partitionstabell. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Typen av <strong>partitionstabell</strong> på den valda lagringsenheten.<br><br>Det enda sättet attt ändra typen av partitionstabell är genom att radera och återskapa partitionstabellen från början, vilket förstör all data på lagringsenheten.<br>Installationshanteraren kommer behålla den nuvarande partitionstabellen om du inte väljer något annat.<br>På moderna system är GPT att föredra. This device has a <strong>%1</strong> partition table. Denna enhet har en <strong>%1</strong> partitionstabell. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Ändra befintlig partition Content: Innehåll: &Keep Behåll Format Format Warning: Formatting the partition will erase all existing data. Varning: Formatering av partitionen kommer att radera alla data. &Mount Point: &Monteringspunkt Si&ze: Storlek: MiB Fi&le System: Fi&lsystem: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Lösenord Confirm passphrase Bekräfta lösenord Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Ange partitionsinformation Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Installera uppstartshanterare på <strong>%1</strong>. Setting up mount points. Ställer in monteringspunkter. FinishedPage Form Formulär &Restart now Sta&rta om nu <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Klappat och klart.</h1><br/>%1 har installerats på din dator.<br/>Du kan nu starta om till ditt nya system, eller fortsätta att använda %2 i liveläge. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Slutför Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Formatera partition %1 (filsystem: %2, storlek: %3 MB) på %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. Formatera partition %1 med filsystem %2. The installer failed to format partition %1 on disk '%2'. Installationsprogrammet misslyckades att formatera partition %1 på disk '%2'. Could not open device '%1'. Kunde inte öppna enhet '%1'. Could not open partition table. Kunde inte öppna partitionstabell. The installer failed to create file system on partition %1. Installationsprogrammet misslyckades att skapa filsystem på partition %1. The installer failed to update partition table on disk '%1'. Installationsprogrammet misslyckades med att uppdatera partitionstabellen på disk '%1'. InteractiveTerminalPage Konsole not installed Konsole inte installerat Please install the kde konsole and try again! Installera KDE:s Konsole och försök igen. Executing script: &nbsp;<code>%1</code> Kör skript: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Skript KeyboardPage Set keyboard model to %1.<br/> Sätt tangenbordsmodell till %1.<br/> Set keyboard layout to %1/%2. Sätt tangentbordslayout till %1/%2. KeyboardViewStep Keyboard Tangentbord LCLocaleDialog System locale setting Systemspråksinställning The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Systemspråket påverkar vilket språk och teckenuppsättning somliga kommandoradsprogram använder.<br/>Det nuvarande språket är <strong>%1</strong>. &Cancel &OK LicensePage Form Formulär I accept the terms and conditions above. Jag accepterar villkoren och avtalet ovan. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1-drivrutin</strong><br/>från %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafikdrivrutin</strong><br/><font color="Grey">från %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 insticksprogram</strong><br/><font color="Grey">från %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">från %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1-paket</strong><br/><font color="Grey">från %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">från %2</font> <a href="%1">view license agreement</a> <a href="%1">visa licensavtal</a> LicenseViewStep License Licens LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Region: Zone: Zon: &Change... Ändra... Set timezone to %1/%2.<br/> Sätt tidszon till %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Laddar platsdata... Location Plats MoveFileSystemJob Move file system of partition %1. Flytta filsystemet för partition %1. Could not open file system on partition %1 for moving. Kunde inte öppna filsystemet på partition %1 för flyttning. Could not create target for moving file system on partition %1. Kunde inte skapa mål för flyttning av filsystemet på partition %1. Moving of partition %1 failed, changes have been rolled back. Flytten av partition %1 misslyckades, ändringar har återställts. Moving of partition %1 failed. Roll back of the changes have failed. Flytten av partition %1 misslyckades. Återställning av ändringar misslyckades. Updating boot sector after the moving of partition %1 failed. Uppdaterar bootsektor efter att flytten av partition %1 misslyckades. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. De logiska sektorstorlekarna i källan och målet för kopiering är inte den samma. Det finns just nu inget stöd för detta. Source and target for copying do not overlap: Rollback is not required. Källa och mål för kopiering överlappar inte: Ingen återställning krävs. Could not open device %1 to rollback copying. Kunde inte öppna enhet %1 för återställning av kopiering. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Form Keyboard Model: Tangentbordsmodell: Type here to test your keyboard Skriv här för att testa ditt tangentbord Page_UserSetup Form Form What is your name? Vad heter du? What name do you want to use to log in? Vilket namn vill du använda för att logga in? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Om fler än en person kommer att använda denna dator kan du skapa fler konton efter installationen.</small> Choose a password to keep your account safe. Välj ett lösenord för att hålla ditt konto säkert. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Ange samma lösenord två gånger, så att det kan kontrolleras för stavfel. Ett bra lösenord innehåller en blandning av bokstäver, nummer och interpunktion, bör vara minst åtta tecken långt, och bör ändras regelbundet.</small> What is the name of this computer? Vad är namnet på datorn? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Detta namn används om du gör datorn synlig för andra i ett nätverk.</small> Log in automatically without asking for the password. Logga in automatiskt utan att fråga efter lösenord. Use the same password for the administrator account. Använd samma lösenord för administratörskontot. Choose a password for the administrator account. Välj ett lösenord för administratörskontot. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Ange samma lösenord två gånger, så att det kan kontrolleras för stavfel.</small> PartitionLabelsView Root Root Home Hem Boot Boot EFI system EFI-system Swap Swap New partition for %1 Ny partition för %1 New partition %1 %2 %1 %2 PartitionModel Free Space Ledigt utrymme New partition Ny partition Name Namn File System Filsystem Mount Point Monteringspunkt Size Storlek PartitionPage Form Form Storage de&vice: Lagringsenhet: &Revert All Changes Återställ alla ändringar New Partition &Table Ny partitions&tabell &Create Skapa &Edit Ändra &Delete Ta bort Install boot &loader on: Installera uppstartshanterare på: Are you sure you want to create a new partition table on %1? Är du säker på att du vill skapa en ny partitionstabell på %1? PartitionViewStep Gathering system information... Samlar systeminformation... Partitions Partitioner Install %1 <strong>alongside</strong> another operating system. Installera %1 <strong>bredvid</strong> ett annat operativsystem. <strong>Erase</strong> disk and install %1. <strong>Rensa</strong> disken och installera %1. <strong>Replace</strong> a partition with %1. <strong>Ersätt</strong> en partition med %1. <strong>Manual</strong> partitioning. <strong>Manuell</strong> partitionering. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Installera %1 <strong>bredvid</strong> ett annat operativsystem på disken <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Rensa</strong> disken <strong>%2</strong> (%3) och installera %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Ersätt</strong> en partition på disken <strong>%2</strong> (%3) med %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manuell</strong> partitionering på disken <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Nuvarande: After: Efter: No EFI system partition configured Ingen EFI system partition konfigurerad An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Standardtangentbordsmodell Default Standard unknown okänd extended utökad unformatted oformaterad swap Unpartitioned space or unknown partition table Opartitionerat utrymme eller okänd partitionstabell ReplaceWidget Form Formulär Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Välj var du vill installera %1.<br/><font color="red">Varning: </font>detta kommer att radera alla filer på den valda partitionen. The selected item does not appear to be a valid partition. Det valda alternativet verkar inte vara en giltig partition. %1 cannot be installed on empty space. Please select an existing partition. %1 kan inte installeras i tomt utrymme. Välj en existerande partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 kan inte installeras på en utökad partition. Välj en existerande primär eller logisk partition. %1 cannot be installed on this partition. %1 kan inte installeras på den här partitionen. Data partition (%1) Datapartition (%1) Unknown system partition (%1) Okänd systempartition (%1) %1 system partition (%2) Systempartition för %1 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>Partitionen %1 är för liten för %2. Välj en partition med minst storleken %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 kommer att installeras på %2.<br/><font color="red">Varning: </font>all data på partition %2 kommer att gå förlorad. The EFI system partition at %1 will be used for starting %2. EFI-systempartitionen %1 kommer att användas för att starta %2. EFI system partition: EFI-systempartition: RequirementsChecker Gathering system information... Samlar systeminformation... has at least %1 GB available drive space har minst %1 GB tillgängligt utrymme på hårddisken There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory har minst %1 GB arbetsminne The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source är ansluten till en strömkälla The system is not plugged in to a power source. Systemet är inte anslutet till någon strömkälla. is connected to the Internet är ansluten till internet The system is not connected to the Internet. Systemet är inte anslutet till internet. The installer is not running with administrator rights. Installationsprogammet körs inte med administratörsrättigheter. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Ändra storlek på partition %1. Parted failed to resize filesystem. Parted misslyckades med att ändra storleken. Failed to resize filesystem. Misslyckades med att ändra storleken. ResizePartitionJob Resize partition %1. Ändra storlek på partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. Ändrar storlek på %2 MB-partitionen %1 till %3 MB. The installer failed to resize partition %1 on disk '%2'. Installationsprogrammet misslyckades med att ändra storleken på partition %1 på disk '%2'. Could not open device '%1'. Kunde inte öppna enhet '%1'. ScanningDialog Scanning storage devices... Skannar lagringsenheter... Partitioning Partitionering SetHostNameJob Set hostname %1 Ange värdnamn %1 Set hostname <strong>%1</strong>. Ange värdnamn <strong>%1</strong>. Setting hostname %1. Anger värdnamn %1. Internal Error Internt fel Cannot write hostname to target system Kan inte skriva värdnamn till målsystem SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Sätt tangentbordsmodell till %1, layout till %2-%3 Failed to write keyboard configuration for the virtual console. Misslyckades med att skriva tangentbordskonfiguration för konsolen. Failed to write to %1 Misslyckades med att skriva %1 Failed to write keyboard configuration for X11. Misslyckades med att skriva tangentbordskonfiguration för X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Kunde inte öppna enhet "%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Uppdatera geometrin för partitionen %1. Failed to change the geometry of the partition. Misslyckades med att ändra partitionens geometri. SetPasswordJob Set password for user %1 Ange lösenord för användare %1 Setting password for user %1. Ställer in lösenord för användaren %1. Bad destination system path. Ogiltig systemsökväg till målet. rootMountPoint is %1 rootMonteringspunkt är %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. Kan inte ställa in lösenord för användare %1. usermod terminated with error code %1. usermod avslutade med felkod %1. SetTimezoneJob Set timezone to %1/%2 Sätt tidszon till %1/%2 Cannot access selected timezone path. Kan inte komma åt vald tidszonssökväg. Bad path: %1 Ogiltig sökväg: %1 Cannot set timezone. Kan inte ställa in tidszon. Link creation failed, target: %1; link name: %2 Skapande av länk misslyckades, mål: %1; länknamn: %2 Cannot set timezone, Kan inte ställa in tidszon, Cannot open /etc/timezone for writing Kunde inte öppna /etc/timezone för skrivning SummaryPage This is an overview of what will happen once you start the install procedure. Detta är en överblick av vad som kommer att ske när du startar installationsprocessen. SummaryViewStep Summary Översikt UsersPage Your username is too long. Ditt användarnamn är för långt. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Ditt användarnamn innehåller otillåtna tecken! Endast små bokstäver och siffror tillåts. Your hostname is too short. Ditt värdnamn är för kort. Your hostname is too long. Ditt värdnamn är för långt. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Ditt värdnamn innehåller otillåtna tecken! Endast bokstäver, siffror och bindestreck tillåts. Your passwords do not match! Dina lösenord matchar inte! UsersViewStep Users Användare WelcomePage Form Formulär &Language: Språk: &Release notes Versionsinfomation &Known issues &Kända problem &Support %Support &About Om <h1>Welcome to the %1 installer.</h1> <h1>V&auml;lkommen till %1-installeraren.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer Om %1-installationsprogrammet <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1-support WelcomeViewStep Welcome Välkommen calamares-3.1.12/lang/calamares_th.ts000066400000000000000000003547361322271446000174650ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Master Boot Record ของ %1 Boot Partition พาร์ทิชัน Boot System Partition พาร์ทิชันระบบ Do not install a boot loader ไม่ต้องติดตั้งบูตโหลดเดอร์ %1 (%2) %1 (%2) Calamares::DebugWindow Form ฟอร์ม GlobalStorage GlobalStorage JobQueue JobQueue Modules Modules Type: none Interface: Tools Debug information ข้อมูลดีบั๊ก Calamares::ExecutionViewStep Install ติดตั้ง Calamares::JobThread Done เสร็จสิ้น Calamares::ProcessJob Run command %1 %2 ทำคำสั่ง %1 %2 Running command %1 %2 กำลังเรียกใช้คำสั่ง %1 %2 External command crashed คำสั่งภายนอกล้มเหลว Command %1 crashed. Output: %2 คำสั่ง %1 ล้มเหลว ผลลัพธ์: %2 External command failed to start การเริ่มต้นคำสั่งภายนอกล้มเหลว Command %1 failed to start. การเริ่มต้นคำสั่ง %1 ล้มเหลว Internal error when starting command เกิดข้อผิดพลาดภายในขณะเริ่มต้นคำสั่ง Bad parameters for process job call. พารามิเตอร์ไม่ถูกต้องสำหรับการเรียกการทำงาน External command failed to finish การจบคำสั่งภายนอกล้มเหลว Command %1 failed to finish in %2s. Output: %3 คำสั่ง %1 ล้มเหลวที่จะจบใน %2 วินาที ผลลัพธ์: %3 External command finished with errors คำสั่งภายนอกจบพร้อมกับข้อผิดพลาด Command %1 finished with exit code %2. Output: %3 คำสั่ง %1 จบพร้อมกับรหัสสิ้นสุดการทำงาน %2. ผลลัพธ์: %3 Calamares::PythonJob Running %1 operation. การปฏิบัติการ %1 กำลังทำงาน Bad working directory path เส้นทางไดเรคทอรีที่ใช้ทำงานไม่ถูกต้อง Working directory %1 for python job %2 is not readable. ไม่สามารถอ่านไดเรคทอรีที่ใช้ทำงาน %1 สำหรับ python %2 ได้ Bad main script file ไฟล์สคริปต์หลักไม่ถูกต้อง Main script file %1 for python job %2 is not readable. ไม่สามารถอ่านไฟล์สคริปต์หลัก %1 สำหรับ python %2 ได้ Boost.Python error in job "%1". Boost.Python ผิดพลาดที่งาน "%1". Calamares::ViewManager &Back &B ย้อนกลับ &Next &N ถัดไป &Cancel &C ยกเลิก Cancel installation without changing the system. Cancel installation? ยกเลิกการติดตั้ง? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. คุณต้องการยกเลิกกระบวนการติดตั้งที่กำลังดำเนินการอยู่หรือไม่? ตัวติดตั้งจะสิ้นสุดการทำงานและไม่บันทึกการเปลี่ยนแปลงที่ได้ดำเนินการก่อนหน้านี้ &Yes &No &Close Continue with setup? ดำเนินการติดตั้งต่อหรือไม่? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ตัวติดตั้ง %1 กำลังพยายามที่จะทำการเปลี่ยนแปลงในดิสก์ของคุณเพื่อติดตั้ง %2<br/><strong>คุณจะไม่สามารถยกเลิกการเปลี่ยนแปลงเหล่านี้ได้</strong> &Install now &ติดตั้งตอนนี้ Go &back กลั&บไป &Done The installation is complete. Close the installer. Error ข้อผิดพลาด Installation Failed การติดตั้งล้มเหลว CalamaresPython::Helper Unknown exception type ข้อผิดพลาดไม่ทราบประเภท unparseable Python error ข้อผิดพลาด unparseable Python unparseable Python traceback ประวัติย้อนหลัง unparseable Python Unfetchable Python error. ข้อผิดพลาด Unfetchable Python CalamaresWindow %1 Installer ตัวติดตั้ง %1 Show debug information แสดงข้อมูลการดีบั๊ก CheckFileSystemJob Checking file system on partition %1. กำลังตรวจสอบระบบไฟล์บนพาร์ทิชัน %1. The file system check on partition %1 failed. การตรวจสอบระบบไฟล์บนพาร์ทิชัน %1 ล้มเหลว CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> ขณะที่กำลังติดตั้ง ตัวติดตั้งฟ้องว่า คอมพิวเตอร์นี้มีความต้องการไม่เพียงพอที่จะติดตั้ง %1.<br/>ไม่สามารถทำการติดตั้งต่อไปได้ <a href="#details">รายละเอียด...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. ขณะที่กำลังติดตั้ง ตัวติดตั้งฟ้องว่า คอมพิวเตอร์มีความต้องการไม่เพียงพอที่จะติดตั้ง %1<br/>ไม่สามารถทำการติดตั้งต่อไปได้ และฟีเจอร์บางอย่างจะถูกปิดไว้ This program will ask you some questions and set up %2 on your computer. โปรแกรมนี้จะถามคุณบางอย่าง เพื่อติดตั้ง %2 ไว้ในคอมพิวเตอร์ของคุณ For best results, please ensure that this computer: สำหรับผลลัพธ์ที่ดีขึ้น โปรดตรวจสอบให้แน่ใจว่าคอมพิวเตอร์เครื่องนี้: System requirements ความต้องการของระบบ ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 ล้างจุดเชื่อมต่อสำหรับการแบ่งพาร์ทิชันบน %1 Clearing mounts for partitioning operations on %1. กำลังล้างจุดเชื่อมต่อสำหรับการดำเนินงานเกี่ยวกับพาร์ทิชันบน %1 Cleared all mounts for %1 ล้างจุดเชื่อมต่อทั้งหมดแล้วสำหรับ %1 ClearTempMountsJob Clear all temporary mounts. ล้างจุดเชื่อมต่อชั่วคราวทั้งหมด Clearing all temporary mounts. กำลังล้างจุดเชื่อมต่อชั่วคราวทุกจุด Cannot get list of temporary mounts. ไม่สามารถดึงรายการจุดเชื่อมต่อชั่วคราวได้ Cleared all temporary mounts. จุดเชื่อมต่อชั่วคราวทั้งหมดถูกล้างแล้ว CreatePartitionDialog Create a Partition สร้างพาร์ทิชัน MiB Partition &Type: &T พาร์ทิชันและประเภท: &Primary &P หลัก E&xtended &X ขยาย Fi&le System: Flags: &Mount Point: &M จุดเชื่อมต่อ: Si&ze: &Z ขนาด: En&crypt Logical โลจิคอล Primary หลัก GPT GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. ตัวติดตั้งไม่สามารถสร้างพาร์ทิชันบนดิสก์ '%1' Could not open device '%1'. ไม่สามารถเปิดอุปกรณ์ '%1' Could not open partition table. ไม่สามารถเปิดตารางพาร์ทิชัน The installer failed to create file system on partition %1. ตัวติดตั้งไม่สามารถสร้างระบบไฟล์บนพาร์ทิชัน %1 The installer failed to update partition table on disk '%1'. ตัวติดตั้งไม่สามารถอัพเดทตารางพาร์ทิชันบนดิสก์ '%1' CreatePartitionTableDialog Create Partition Table สร้างตารางพาร์ทิชัน Creating a new partition table will delete all existing data on the disk. การสร้างตารางพาร์ทิชันใหม่จะลบข้อมูลทั้งหมดบนดิสก์ What kind of partition table do you want to create? คุณต้องการสร้างตารางพาร์ทิชันชนิดใด? Master Boot Record (MBR) Master Boot Record (MBR) GUID Partition Table (GPT) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. ตัวติดตั้งไม่สามารถสร้างตารางพาร์ทิชันบน %1 Could not open device %1. ไม่สามารถเปิดอุปกรณ์ %1 CreateUserJob Create user %1 สร้างผู้ใช้ %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. ไม่สามารถเขียนไดเรคทอรี Sudoers ได้ Cannot create sudoers file for writing. ไม่สามารถสร้างไฟล์ sudoers เพื่อเขียนได้ Cannot chmod sudoers file. ไม่สามารถ chmod ไฟล์ sudoers Cannot open groups file for reading. ไม่สามารถเปิดไฟล์ groups เพื่ออ่านได้ Cannot create user %1. ไม่สามารถสร้างผู้ใช้ %1 useradd terminated with error code %1. useradd จบด้วยโค้ดข้อผิดพลาด %1 Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. ไม่สามารถตั้งค่าความเป็นเจ้าของไดเรคทอรี home สำหรับผู้ใช้ %1 chown terminated with error code %1. chown จบด้วยโค้ดข้อผิดพลาด %1 DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. ตัวติดตั้งไม่สามารถลบพาร์ทิชัน %1 Partition (%1) and device (%2) do not match. พาร์ทิชัน (%1) ไม่ตรงกับอุปกรณ์ (%2) Could not open device %1. ไม่สามารถเปิดอุปกรณ์ %1 Could not open partition table. ไม่สามารถเปิดตารางพาร์ทิชัน DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition แก้ไขพาร์ทิชันที่มีอยู่เดิม Content: เนื้อหา: &Keep Format ฟอร์แมท Warning: Formatting the partition will erase all existing data. คำเตือน: การฟอร์แมทพาร์ทิชันจะลบข้อมูลที่มีอยู่เดิมทั้งหมด &Mount Point: &M จุดเชื่อมต่อ: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information ตั้งค่าข้อมูลพาร์ทิชัน Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form ฟอร์ม &Restart now &R เริ่มต้นใหม่ทันที <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>เสร็จสิ้น</h1><br/>%1 ติดตั้งบนคอมพิวเตอร์ของคุณเรียบร้อย<br/>คุณสามารถเริ่มทำงานเพื่อเข้าระบบใหม่ของคุณ หรือดำเนินการใช้ %2 Live environment ต่อไป <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. ฟอร์แมทพาร์ทิชัน %1 (ระบบไฟล์: %2, ขนาด: %3 MB) บน %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. ตัวติดตั้งไม่สามารถฟอร์แมทพาร์ทิชัน %1 บนดิสก์ '%2' Could not open device '%1'. ไม่สามารถเปิดอุปกรณ์ '%1' Could not open partition table. ไม่สามารถเปิดตารางพาร์ทิชัน The installer failed to create file system on partition %1. ตัวติดตั้งไม่สามารถสร้างระบบไฟล์บนพาร์ทิชัน %1 The installer failed to update partition table on disk '%1'. ตัวติดตั้งไม่สามารถอัพเดทตารางพาร์ทิชันบนดิสก์ '%1' InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> ตั้งค่าโมเดลแป้นพิมพ์เป็น %1<br/> Set keyboard layout to %1/%2. ตั้งค่าแบบแป้นพิมพ์เป็น %1/%2 KeyboardViewStep Keyboard แป้นพิมพ์ LCLocaleDialog System locale setting การตั้งค่า locale ระบบ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form แบบฟอร์ม I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: ภูมิภาค: Zone: โซน: &Change... &C เปลี่ยนแปลง... Set timezone to %1/%2.<br/> ตั้งโซนเวลาเป็น %1/%2<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... กำลังโหลดข้อมูลตำแหน่ง... Location ตำแหน่ง MoveFileSystemJob Move file system of partition %1. เคลื่อนย้ายระบบไฟล์ของพาร์ทิชัน %1 Could not open file system on partition %1 for moving. ไม่สามารถเปิดระบบไฟล์บนพาร์ทิชัน %1 เพื่อการเคลื่อนย้าย Could not create target for moving file system on partition %1. ไม่สามารถสร้างเป้าหมายเพื่อเคลื่อนย้ายระบบไฟล์บนพาร์ทิชัน %1 Moving of partition %1 failed, changes have been rolled back. การเคลื่อนย้ายพาร์ทิชัน %1 ล้มเหลว การเปลี่ยนแปลงถูกย้อนกลับเป็นค่าก่อนหน้า Moving of partition %1 failed. Roll back of the changes have failed. การเคลื่อนย้ายพาร์ทิชัน %1 ล้มเหลว กระบวนการย้อนกลับการเปลี่ยนแปลงล้มเหลว Updating boot sector after the moving of partition %1 failed. กำลังอัพเดท boot sector หลังจากที่การเคลื่อนย้ายพาร์ทิชัน %1 ล้มเหลว The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. ในขณะนี้ไม่สนับสนุนการคัดลอกที่ขนาด logical sector ในต้นทางและเป้าหมายไม่เหมือนกัน Source and target for copying do not overlap: Rollback is not required. ต้นทางและเป้าหมายสำหรับการคัดลอกไม่ซ้อนทับกัน ไม่จำเป็นต้องใช้การย้อนกลับการคัดลอก Could not open device %1 to rollback copying. ไม่สามารถเปิดอุปกรณ์ %1 เพื่อย้อนกลับการคัดลอก NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form ฟอร์ม Keyboard Model: โมเดลแป้นพิมพ์: Type here to test your keyboard พิมพ์ที่นี่เพื่อทดสอบแป้นพิมพ์ของคุณ Page_UserSetup Form ฟอร์ม What is your name? ชื่อของคุณคือ? What name do you want to use to log in? ชื่อที่คุณต้องการใช้ในการล็อกอิน? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>ถ้ามีผู้ใช้มากกว่า 1 คนจะใช้คอมพิวเตอร์เครื่องนี้ คุณสามารถตั้งค่าบัญชีผู้ใช้คนอื่นๆ ได้หลังจากการติดตั้ง</small> Choose a password to keep your account safe. เลือกรหัสผ่านเพื่อรักษาบัญชีผู้ใช้ของคุณให้ปลอดภัย <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>ใส่รหัสผ่านเดียวกันซ้ำ 2 ครั้ง เพื่อเป็นการตรวจสอบข้อผิดพลาดจากการพิมพ์ รหัสผ่านที่ดีจะต้องมีการผสมกันระหว่าง ตัวอักษรภาษาอังกฤษ ตัวเลข และสัญลักษณ์ ควรมีความยาวอย่างน้อย 8 ตัวอักขระ และควรมีการเปลี่ยนรหัสผ่านเป็นประจำ</small> What is the name of this computer? คอมพิวเตอร์เครื่องนี้ชื่อ? <small>This name will be used if you make the computer visible to others on a network.</small> <small>ชื่อนี้จะถูกใช้ถ้าคุณตั้งค่าให้เครื่องอื่นๆ มองเห็นคอมพิวเตอร์ของคุณบนเครือข่าย</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. เลือกรหัสผ่านสำหรับบัญชีผู้ใช้ผู้ดูแลระบบ <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>ใส่รหัสผ่านเดิมซ้ำ 2 ครั้ง เพื่อเป็นการตรวจสอบข้อผิดพลาดที่เกิดจากการพิมพ์</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space พื้นที่ว่าง New partition พาร์ทิชันใหม่ Name ชื่อ File System ระบบไฟล์ Mount Point จุดเชื่อมต่อ Size ขนาด PartitionPage Form ฟอร์ม Storage de&vice: &Revert All Changes &R คืนค่าการเปลี่ยนแปลงทั้งหมด New Partition &Table &T ตารางพาร์ทิชันใหม่ &Create &C สร้าง &Edit &E แก้ไข &Delete &D ลบ Install boot &loader on: Are you sure you want to create a new partition table on %1? คุณแน่ใจว่าจะสร้างตารางพาร์ทิชันใหม่บน %1? PartitionViewStep Gathering system information... กำลังรวบรวมข้อมูลของระบบ... Partitions พาร์ทิชัน Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model โมเดลแป้นพิมพ์ค่าเริ่มต้น Default ค่าเริ่มต้น unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. เปลี่ยนขนาดระบบไฟล์บนพาร์ทิชัน %1 Parted failed to resize filesystem. Parted ไม่สามารถเปลี่ยนขนาดระบบไฟล์ได้ Failed to resize filesystem. ไม่สามารถเปลี่ยนขนาดระบบไฟล์ได้ ResizePartitionJob Resize partition %1. เปลี่ยนขนาดพาร์ทิชัน %1 Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. ตัวติดตั้งไม่สามารถเปลี่ยนขนาดพาร์ทิชัน %1 บนดิสก์ '%2' Could not open device '%1'. ไม่สามารถเปิดอุปกรณ์ '%1' ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 ตั้งค่าชื่อโฮสต์ %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error ข้อผิดพลาดภายใน Cannot write hostname to target system ไม่สามารถเขียนชื่อโฮสต์ไปที่ระบบเป้าหมาย SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 ตั้งค่าโมเดลแป้นพิมพ์เป็น %1 แบบ %2-%3 Failed to write keyboard configuration for the virtual console. ไม่สามารถเขียนการตั้งค่าแป้นพิมพ์สำหรับคอนโซลเสมือน Failed to write to %1 ไม่สามารถเขียนไปที่ %1 Failed to write keyboard configuration for X11. ไม่สามาถเขียนการตั้งค่าแป้นพิมพ์สำหรับ X11 Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. อัพเดทรูปทรงเรขาคณิตของพาร์ทิชัน %1 Failed to change the geometry of the partition. ไม่สามารถเปลี่ยนรูปทรงเรขาคณิตของพาร์ทิชัน SetPasswordJob Set password for user %1 ตั้งรหัสผ่านสำหรับผู้ใช้ %1 Setting password for user %1. Bad destination system path. path ของระบบเป้าหมายไม่ถูกต้อง rootMountPoint is %1 rootMountPoint คือ %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. ไม่สามารถตั้งค่ารหัสผ่านสำหรับผู้ใช้ %1 usermod terminated with error code %1. usermod จบด้วยโค้ดข้อผิดพลาด %1 SetTimezoneJob Set timezone to %1/%2 ตั้งโซนเวลาเป็น %1/%2 Cannot access selected timezone path. ไม่สามารถเข้าถึง path โซนเวลาที่เลือก Bad path: %1 path ไม่ถูกต้อง: %1 Cannot set timezone. ไม่สามารถตั้งค่าโซนเวลาได้ Link creation failed, target: %1; link name: %2 การสร้างการเชื่อมโยงล้มเหลว เป้าหมาย: %1 ชื่อการเชื่อมโยง: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary สาระสำคัญ UsersPage Your username is too long. ชื่อผู้ใช้ของคุณยาวเกินไป Your username contains invalid characters. Only lowercase letters and numbers are allowed. ชื่อผู้ใช้ของคุณมีตัวอักษรที่ไม่ถูกต้อง ใช้ได้เฉพาะตัวอักษรภาษาอังกฤษตัวเล็กและตัวเลขเท่านั้น Your hostname is too short. ชื่อโฮสต์ของคุณสั้นเกินไป Your hostname is too long. ชื่อโฮสต์ของคุณยาวเกินไป Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. ชื่อโฮสต์ของคุณมีตัวอักษรที่ไม่ถูกต้อง ใช้ได้เฉพาะตัวอักษรภาษาอังกฤษ ตัวเลข และขีดกลาง "-" เท่านั้น Your passwords do not match! รหัสผ่านของคุณไม่ตรงกัน! UsersViewStep Users ผู้ใช้ WelcomePage Form แบบฟอร์ม &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_tr_TR.ts000066400000000000000000003664621322271446000201030ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. Bu sistemdeki<br> <strong>önyükleme arayüzü</strong> sadece eski x86 sistem ve <strong>BIOS</strong> destekler. <br>Modern sistemler genellikle <strong>EFI</strong> kullanır fakat önyükleme arayüzü uyumlu modda ise BIOS seçilebilir. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. Bu sistem, bir <strong>EFI</strong> önyükleme arayüzü ile başladı.<br><br>EFI ortamından başlangıcı yapılandırmak için, bu yükleyici <strong>EFI Sistem Bölümü</strong> üzerinde <strong>GRUB</strong> veya <strong>systemd-boot</strong> gibi bir önyükleyici oluşturmalıdır. Bunu otomatik olarak yapabileceğiniz gibi elle disk bölümleri oluşturarak ta yapabilirsiniz. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. Bu sistem, bir <strong>BIOS</strong> önyükleme arayüzü ile başladı.<br><br>BIOS ortamında önyükleme için, yükleyici bölümün başında veya bölüm tablosu başlangıcına yakın <strong>Master Boot Record</strong> üzerine <strong>GRUB</strong> gibi bir önyükleyici yüklemeniz gerekir (önerilir). Eğer bu işlemin otomatik olarak yapılmasını istemez iseniz elle bölümleme yapabilirsiniz. BootLoaderModel Master Boot Record of %1 %1 Üzerine Önyükleyici Kur Boot Partition Önyükleyici Disk Bölümü System Partition Sistem Disk Bölümü Do not install a boot loader Bir önyükleyici kurmayın %1 (%2) %1 (%2) Calamares::DebugWindow Form Biçim GlobalStorage KüreselDepo JobQueue İşKuyruğu Modules Eklentiler Type: Tipi: none hiçbiri Interface: Arayüz: Tools Araçlar Debug information Hata ayıklama bilgisi Calamares::ExecutionViewStep Install Sistem Kuruluyor Calamares::JobThread Done Sistem kurulumu tamamlandı, kurulum aracından çıkabilirsiniz. Calamares::ProcessJob Run command %1 %2 %1 Komutu çalışıyor %2 Running command %1 %2 %1 Komutu çalışıyor %2 External command crashed Komut çöküş bildirdi Command %1 crashed. Output: %2 Komut çöktü. %1 Çıktı: %2 External command failed to start Komut çalışmadı başarısız oldu Command %1 failed to start. Komut Başlamayamadı. %1 Internal error when starting command Dahili komut çalışırken hata oluştu Bad parameters for process job call. Çalışma adımları başarısız oldu. External command failed to finish Tamamlama komutu başarısız oldu Command %1 failed to finish in %2s. Output: %3 Komut başarısız %1 Bitirilirken %2s. Çıktı: %3 External command finished with errors Komut tamamlandı ancak hatalar oluştu Command %1 finished with exit code %2. Output: %3 Komut tamamlandı %1 Çıkış kodu %2. Çıktı: %3 Calamares::PythonJob Running %1 operation. %1 işlemleri yapılıyor. Bad working directory path Dizin yolu kötü çalışıyor Working directory %1 for python job %2 is not readable. %2 python işleri için %1 dizinleme çalışırken okunamadı. Bad main script file Sorunlu betik dosyası Main script file %1 for python job %2 is not readable. %2 python işleri için %1 sorunlu betik okunamadı. Boost.Python error in job "%1". Boost.Python iş hatası "%1". Calamares::ViewManager &Back &Geri &Next &Sonraki &Cancel &Vazgeç Cancel installation without changing the system. Sistemi değiştirmeden kurulumu iptal edin. Cancel installation? Yüklemeyi iptal et? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Yükleme işlemini gerçekten iptal etmek istiyor musunuz? Yükleyiciden çıkınca tüm değişiklikler kaybedilecek. &Yes &Evet &No &Hayır &Close &Kapat Continue with setup? Kuruluma devam et? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 sistem yükleyici %2 yüklemek için diskinizde değişiklik yapacak.<br/><strong>Bu değişiklikleri geri almak mümkün olmayacak.</strong> &Install now &Şimdi yükle Go &back Geri &git &Done &Tamam The installation is complete. Close the installer. Yükleme işi tamamlandı. Sistem yükleyiciyi kapatın. Error Hata Installation Failed Kurulum Başarısız CalamaresPython::Helper Unknown exception type Bilinmeyen Özel Durum Tipi unparseable Python error Python hata ayıklaması unparseable Python traceback Python geri çekme ayıklaması Unfetchable Python error. Okunamayan Python hatası. CalamaresWindow %1 Installer %1 Yükleniyor Show debug information Hata ayıklama bilgisini göster CheckFileSystemJob Checking file system on partition %1. Bölüm üzerindeki dosya sistemi kontrol ediliyor %1. The file system check on partition %1 failed. Bölüm üzerinde dosya sistemi kontrolü başarısız oldu %1. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Bu bilgisayara %1 yüklemek için minimum gereksinimler karşılanamadı. Kurulum devam edemiyor. <a href="#detaylar">Detaylar...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Bu bilgisayara %1 yüklemek için önerilen gereksinimlerin bazıları karşılanamadı.<br/> Kuruluma devam edebilirsiniz fakat bazı özellikler devre dışı kalabilir. This program will ask you some questions and set up %2 on your computer. Bu program size bazı sorular soracak ve bilgisayarınıza %2 kuracak. For best results, please ensure that this computer: En iyi sonucu elde etmek için bilgisayarınızın aşağıdaki gereksinimleri karşıladığından emin olunuz: System requirements Sistem gereksinimleri ChoicePage Form Biçim After: Sonra: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>Elle bölümleme</strong><br/>Bölümler oluşturabilir ve boyutlandırabilirsiniz. Boot loader location: Önyükleyici konumu: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 %2MB küçülecek ve %4 için %3MB bir disk bölümü oluşturacak. Select storage de&vice: Depolama ay&gıtı seç: Current: Geçerli: Reuse %1 as home partition for %2. %2 ev bölümü olarak %1 yeniden kullanılsın. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Küçültmek için bir bölüm seçip alttaki çubuğu sürükleyerek boyutlandır</strong> <strong>Select a partition to install on</strong> <strong>Yükleyeceğin disk bölümünü seç</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. Bu sistemde EFI disk bölümü bulunamadı. Lütfen geri dönün ve %1 kurmak için gelişmiş kurulum seçeneğini kullanın. The EFI system partition at %1 will be used for starting %2. %1 EFI sistem bölümü %2 başlatmak için kullanılacaktır. EFI system partition: EFI sistem bölümü: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Bu depolama aygıtı üzerinde yüklü herhangi bir işletim sistemi tespit etmedik. Ne yapmak istersiniz?<br/>Yaptığınız değişiklikler disk bölümü üzerine uygulanmadan önce gözden geçirme fırsatınız olacak. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>Diski sil</strong><br/>Seçili depolama bölümündeki mevcut veriler şu anda <font color="red">silinecektir.</font> This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Bu depolama aygıtı üzerinde %1 vardır. Ne yapmak istersiniz?<br/>Yaptığınız değişiklikler disk bölümü üzerine uygulanmadan önce gözden geçirme fırsatınız olacak. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Yanına yükleyin</strong><br/>Sistem yükleyici disk bölümünü küçülterek %1 için yer açacak. <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>Varolan bir disk bölümüne kur</strong><br/>Varolan bir disk bölümü üzerine %1 kur. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Bu depolama aygıtı üzerinde bir işletim sistemi yüklü. Ne yapmak istersiniz? <br/>Yaptığınız değişiklikler disk bölümü üzerine uygulanmadan önce gözden geçirme fırsatınız olacak. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. Bu depolama aygıtı üzerinde birden fazla işletim sistemi var. Ne yapmak istersiniz? <br/>Yaptığınız değişiklikler disk bölümü üzerine uygulanmadan önce gözden geçirme fırsatınız olacak. ClearMountsJob Clear mounts for partitioning operations on %1 %1 bölümleme işlemleri için sorunsuz bağla Clearing mounts for partitioning operations on %1. %1 bölümleme işlemleri için bağlama noktaları temizleniyor. Cleared all mounts for %1 %1 için tüm bağlı bölümler ayrıldı ClearTempMountsJob Clear all temporary mounts. Tüm geçici bağları temizleyin. Clearing all temporary mounts. Geçici olarak bağlananlar temizleniyor. Cannot get list of temporary mounts. Geçici bağların listesi alınamadı. Cleared all temporary mounts. Tüm geçici bağlar temizlendi. CreatePartitionDialog Create a Partition Yeni Bölüm Oluştur MiB MB Partition &Type: Bölüm &Tip: &Primary &Birincil E&xtended U&zatılmış Fi&le System: D&osya Sistemi: Flags: Bayraklar: &Mount Point: &Bağlama Noktası: Si&ze: Bo&yut: En&crypt Şif&rele Logical Mantıksal Primary Birincil GPT GPT Mountpoint already in use. Please select another one. Bağlama noktası zaten kullanımda. Lütfen diğerini seçiniz. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. %4 üzerinde (%3) ile %1 dosya sisteminde %2MB bölüm oluştur. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. <strong>%4</strong> üzerinde (%3) ile <strong>%1</strong> dosya sisteminde <strong>%2MB</strong> bölüm oluştur. Creating new %1 partition on %2. %2 üzerinde %1 yeni disk bölümü oluştur. The installer failed to create partition on disk '%1'. Yükleyici '%1' diski üzerinde yeni bölüm oluşturamadı. Could not open device '%1'. '%1' aygıtı açılamadı. Could not open partition table. Bölümleme tablosu açılamadı The installer failed to create file system on partition %1. Yükleyici %1 bölümünde dosya sistemi oluşturamadı. The installer failed to update partition table on disk '%1'. Yükleyici '%1' diskinde bölümleme tablosunu güncelleyemedi. CreatePartitionTableDialog Create Partition Table Bölümleme Tablosu Oluştur Creating a new partition table will delete all existing data on the disk. Yeni bir bölüm tablosu oluşturmak disk üzerindeki tüm verileri silecektir. What kind of partition table do you want to create? Ne tür bölüm tablosu oluşturmak istiyorsunuz? Master Boot Record (MBR) Önyükleme Bölümü (MBR) GUID Partition Table (GPT) GUID Bölüm Tablosu (GPT) CreatePartitionTableJob Create new %1 partition table on %2. %2 üzerinde %1 yeni disk tablosu oluştur. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). <strong>%2</strong> (%3) üzerinde <strong>%1</strong> yeni disk tablosu oluştur. Creating new %1 partition table on %2. %2 üzerinde %1 yeni disk tablosu oluştur. The installer failed to create a partition table on %1. Yükleyici %1 üzerinde yeni bir bölüm tablosu oluşturamadı. Could not open device %1. %1 aygıtı açılamadı. CreateUserJob Create user %1 %1 Kullanıcısı oluşturuluyor... Create user <strong>%1</strong>. <strong>%1</strong> kullanıcı oluştur. Creating user %1. %1 Kullanıcısı oluşturuluyor... Sudoers dir is not writable. Sudoers dosyası yazılabilir değil. Cannot create sudoers file for writing. sudoers dosyası oluşturulamadı ve yazılamadı. Cannot chmod sudoers file. Sudoers dosya izinleri ayarlanamadı. Cannot open groups file for reading. groups dosyası okunamadı. Cannot create user %1. %1 Kullanıcısı oluşturulamadı... useradd terminated with error code %1. useradd komutu şu hata ile çöktü %1. Cannot add user %1 to groups: %2. %1 Kullanıcısı şu gruba eklenemedi: %2. usermod terminated with error code %1. usermod %1 hata koduyla çöktü. Cannot set home directory ownership for user %1. %1 Kullanıcısı için ev dizini sahipliği ayarlanamadı. chown terminated with error code %1. chown %1 hata koduyla sonlandırıldı. DeletePartitionJob Delete partition %1. %1 disk bölümünü sil. Delete partition <strong>%1</strong>. <strong>%1</strong> disk bölümünü sil. Deleting partition %1. %1 disk bölümü siliniyor. The installer failed to delete partition %1. Yükleyici %1 bölümünü silemedi. Partition (%1) and device (%2) do not match. Bölüm (%1) ve aygıt (%2) eşleşmedi. Could not open device %1. %1 aygıtı açılamadı. Could not open partition table. Bölüm tablosu açılamadı. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. Seçili depolama aygıtında bir <strong>bölümleme tablosu</strong> oluştur.<br><br>Bölümleme tablosu oluşturmanın tek yolu aygıt üzerindeki bölümleri silmek, verileri yoketmek ve yeni bölümleme tablosu oluşturmaktır.<br>Sistem yükleyici aksi bir seçeneğe başvurmaz iseniz geçerli bölümlemeyi koruyacaktır.<br>Emin değilseniz, modern sistemler için GPT tercih edebilirsiniz. This device has a <strong>%1</strong> partition table. Bu aygıt bir <strong>%1</strong> bölümleme tablosuna sahip. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. Bu bir <strong>döngüsel</strong> aygıttır.<br><br>Bu bir pseudo-device aygıt olup disk bölümlemesi yoktur ve dosyalara erişim sağlayan blok bir aygıttır. Kurulum genelde sadece bir tek dosya sistemini içerir. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. Sistem yükleyici seçili depolama aygıtında bir bölümleme tablosu tespit edemedi.<br><br>Aygıt üzerinde bir disk bölümleme tablosu hiç oluşturulmamış ya da disk yapısı bilinmeyen bir tiptedir.<br>Sistem yükleyiciyi kullanarak elle ya da otomatik olarak bir disk bölümü tablosu oluşturabilirsiniz. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>Bu bölümleme tablosu modern sistemlerdeki <strong>EFI</strong> önyükleme arayüzünü başlatmak için önerilir. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>Bu bölümleme tablosu <strong>BIOS</strong>önyükleme arayüzü kullanan eski sistemlerde tercih edilir. Birçok durumda GPT tavsiye edilmektedir.<br><br><strong>Uyarı:</strong> MBR bölüm tablosu eski tip MS-DOS biçimi için standarttır.<br>Sadece 4 <em>birincil</em> birim oluşturulabilir ve 4 ten fazla bölüm için <em>uzatılmış</em> bölümler oluşturulmalıdır, böylece daha çok <em>mantıksal</em> bölüm oluşturulabilir. DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 %1 aygıtına Dracut için LUKS yapılandırmasını yaz Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Dracut için LUKS yapılandırma işlemi atlanıyor: "/" diski şifrelenemedi Failed to open %1 %1 Açılamadı DummyCppJob Dummy C++ Job Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Mevcut Bölümü Düzenle Content: İçerik: &Keep &Tut Format Biçimle Warning: Formatting the partition will erase all existing data. Uyarı: Biçimlenen bölümdeki tüm veriler silinecek. &Mount Point: &Bağlama Noktası: Si&ze: Bo&yut: MiB MB Fi&le System: D&osya Sistemi: Flags: Bayraklar: Mountpoint already in use. Please select another one. Bağlama noktası zaten kullanımda. Lütfen diğerini seçiniz. EncryptWidget Form Biçim En&crypt system Sistemi Şif&rele Passphrase Parola Confirm passphrase Parolayı doğrula Please enter the same passphrase in both boxes. Her iki kutuya da aynı parolayı giriniz. FillGlobalStorageJob Set partition information Bölüm bilgilendirmesini ayarla Install %1 on <strong>new</strong> %2 system partition. %2 <strong>yeni</strong> sistem diskine %1 yükle. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. %2 <strong>yeni</strong> disk bölümünü <strong>%1</strong> ile ayarlayıp bağla. Install %2 on %3 system partition <strong>%1</strong>. %3 <strong>%1</strong> sistem diskine %2 yükle. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. %3 diskine<strong>%1</strong> ile <strong>%2</strong> bağlama noktası ayarla. Install boot loader on <strong>%1</strong>. <strong>%1</strong> üzerine sistem ön yükleyiciyi kur. Setting up mount points. Bağlama noktalarını ayarla. FinishedPage Form Biçim &Restart now &Şimdi yeniden başlat <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Tüm işlem tamamlandı.</h1><br/>%1 bilgisayarınıza yüklendi<br/>Yeni kurduğunuz sistemi kullanmak için yeniden başlatabilir veya %2 Çalışan sistem ile devam edebilirsiniz. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Yükleme Başarısız</h1><br/>%1 bilgisayarınıza yüklenemedi.<br/>Hata mesajı çıktısı: %2. FinishedViewStep Finish Kurulum Tamam Installation Complete Kurulum Tamamlandı The installation of %1 is complete. Kurulum %1 oranında tamamlandı. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. %1 Bölümü biçimle (dosya sistemi: %2 boyut: %3) %4 üzerinde. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. <strong>%1</strong> diskine <strong>%2</strong> dosya sistemi ile <strong>%3MB</strong> bölüm oluştur. Formatting partition %1 with file system %2. %1 disk bölümü %2 dosya sistemi ile biçimlendiriliyor. The installer failed to format partition %1 on disk '%2'. Yükleyici %1 bölümünü '%2' diski üzerinde biçimlendiremedi. Could not open device '%1'. '%1' aygıtı açılamadı. Could not open partition table. Bölüm tablosu açılamadı. The installer failed to create file system on partition %1. Yükleyici %1 bölümünde dosya sistemi oluşturamadı. The installer failed to update partition table on disk '%1'. Yükleyici '%1' diskinde bölümleme tablosunu güncelleyemedi. InteractiveTerminalPage Konsole not installed Konsole uygulaması yüklü değil Please install the kde konsole and try again! Lütfen kde konsole uygulamasını yükleyin ve tekrar deneyin! Executing script: &nbsp;<code>%1</code> Komut durumu: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script Betik KeyboardPage Set keyboard model to %1.<br/> %1 Klavye düzeni olarak seçildi.<br/> Set keyboard layout to %1/%2. Alt klavye türevi olarak %1/%2 seçildi. KeyboardViewStep Keyboard Klavye Düzeni LCLocaleDialog System locale setting Sistem yerel ayarları The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. Sistem yerel ayarı, bazı uçbirim, kullanıcı ayarlamaları ve başkaca dil seçeneklerini belirler ve etkiler. <br/>Varsayılan geçerli ayarlar <strong>%1</strong>. &Cancel &Vazgeç &OK &TAMAM LicensePage Form Form I accept the terms and conditions above. Yukarıdaki şartları ve koşulları kabul ediyorum. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>Lisans Anlaşması</h1> Sistem yükleyici uygulaması belli lisans şartlarına bağlıdır ve şimdi sisteminizi kuracaktır. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. Yukarıdaki son kullanıcı lisans sözleşmesini (EULA) gözden geçiriniz.<br/>Şartları kabul etmiyorsanız kurulum devam etmeyecektir. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>Lisans Sözleşmesi</h1>Bu kurulum işlemi kullanıcı deneyimini ölçümlemek, ek özellikler sağlamak ve geliştirmek amacıyla lisansa tabi özel yazılım yükleyebilir. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. Yukarıdaki Son Kullanıcı Lisans Sözleşmelerini (EULA) gözden geçirin.<br/>Eğer şartları kabul etmiyorsanız kapalı kaynak yazılımların yerine açık kaynak alternatifleri yüklenecektir. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 sürücü</strong><br/>by %2 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 grafik sürücü</strong><br/><font color="Grey">by %2</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 tarayıcı eklentisi</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 kodek</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 paketi</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> <a href="%1">lisans şartlarını incele</a> LicenseViewStep License Lisans LocalePage The system language will be set to %1. Sistem dili %1 olarak ayarlanacak. The numbers and dates locale will be set to %1. Sayılar ve günler için sistem yereli %1 olarak ayarlanacak. Region: Bölge: Zone: Şehir: &Change... &Değiştir... Set timezone to %1/%2.<br/> Bölge ve zaman dilimi %1/%2 olarak ayarlandı.<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... Yerel verileri yükleniyor... Location Sistem Yereli MoveFileSystemJob Move file system of partition %1. %1 Bölümüne dosya sistemini taşı. Could not open file system on partition %1 for moving. %1 üzerindeki bölümden taşımak için dosya sistemi açılamadı. Could not create target for moving file system on partition %1. %1 bölümüne dosya sistemini taşımak için hedef oluşturulamadı. Moving of partition %1 failed, changes have been rolled back. %1 bölümüne taşırken hata oluştu, değişiklikler geri alındı. Moving of partition %1 failed. Roll back of the changes have failed. %1 bölümüne taşırken hata oluştu, değişiklikler geri alınırken işlem başarısız oldu. Updating boot sector after the moving of partition %1 failed. boot sektör güncellendikten sonra %1 bölüme taşınamadı. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Kaynak ve hedefin mantıksal sektör boyutu kopyalama için aynı değil. Bu şu anda desteklenmiyor. Source and target for copying do not overlap: Rollback is not required. Kopyalamak için kaynak ve hedef eşleşmedi: Değişiklikler geri alınamadı. Could not open device %1 to rollback copying. %1 kopyalanıp geri alınırken aygıt açılamadı. NetInstallPage Name İsim Description Açıklama Network Installation. (Disabled: Unable to fetch package lists, check your network connection) Ağ Üzerinden Kurulum. (Devre Dışı: Paket listeleri alınamıyor, ağ bağlantısını kontrol ediniz) NetInstallViewStep Package selection Paket seçimi Page_Keyboard Form Form Keyboard Model: Klavye Modeli: Type here to test your keyboard Klavye seçiminizi burada test edebilirsiniz Page_UserSetup Form Form What is your name? Adınız nedir? What name do you want to use to log in? Giriş için hangi adı kullanmak istersiniz? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>Birden fazla kişi bu bilgisayarı kullanacak ise, kurulumdan sonra yeni hesaplar oluşturabilirsiniz.</small> Choose a password to keep your account safe. Hesabınızın güvenliğini sağlamak için bir parola belirleyiniz. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>Yazım hatası ihtimaline karşı parolanızı iki kere yazınız. Güçlü bir parola en az sekiz karakter olmalı ve rakamları, harfleri, karakterleri içermelidir, düzenli aralıklarla değiştirilmelidir.</small> What is the name of this computer? Bu bilgisayarın adı nedir? <small>This name will be used if you make the computer visible to others on a network.</small> <small>Bilgisayarınız herhangi bir ağ üzerinde görünür ise bu adı kullanacak.</small> Log in automatically without asking for the password. Şifre sormadan otomatik olarak giriş yap. Use the same password for the administrator account. Yönetici ile kullanıcı aynı şifreyi kullansın. Choose a password for the administrator account. Yönetici-Root hesabı için bir parola belirle. <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>Yazım hatası ihtimaline karşı aynı şifreyi tekrar giriniz.</small> PartitionLabelsView Root Root Home Home Boot Boot EFI system EFI sistem Swap Swap-Takas New partition for %1 %1 için yeni disk bölümü New partition Yeni disk bölümü %1 %2 %1 %2 PartitionModel Free Space Boş Alan New partition Yeni bölüm Name İsim File System Dosya Sistemi Mount Point Bağlama Noktası Size Boyut PartitionPage Form Form Storage de&vice: Depolama ay&gıtı: &Revert All Changes &Tüm Değişiklikleri Geri Al New Partition &Table Yeni Bölüm &Tablo &Create &Oluştur &Edit &Düzenle &Delete &Sil Install boot &loader on: Şuraya ön &yükleyici kur: Are you sure you want to create a new partition table on %1? %1 tablosunda yeni bölüm oluşturmaya devam etmek istiyor musunuz? PartitionViewStep Gathering system information... Sistem bilgileri toplanıyor... Partitions Disk Bölümleme Install %1 <strong>alongside</strong> another operating system. Diğer işletim sisteminin <strong>yanına</strong> %1 yükle. <strong>Erase</strong> disk and install %1. Diski <strong>sil</strong> ve %1 yükle. <strong>Replace</strong> a partition with %1. %1 ile disk bölümünün üzerine <strong>yaz</strong>. <strong>Manual</strong> partitioning. <strong>Manuel</strong> bölümleme. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>%2</strong> (%3) diskindeki diğer işletim sisteminin <strong>yanına</strong> %1 yükle. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>%2</strong> (%3) diski <strong>sil</strong> ve %1 yükle. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>%2</strong> (%3) disk bölümünün %1 ile <strong>üzerine yaz</strong>. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>%1</strong> (%2) disk bölümünü <strong>manuel</strong> bölümle. Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) Current: Geçerli: After: Sonra: No EFI system partition configured EFI sistem bölümü yapılandırılmamış An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. %1 başlatmak için bir EFI sistem bölümü gereklidir.<br/><br/>EFI sistem bölümünü yapılandırmak için geri dönün ve seçim yapın veya FAT32 dosya sistemi ile <strong>esp</strong> etiketiyle <strong>%2</strong> noktasına bağlayın.<br/><br/>Bir EFI sistem bölümü kurmadan devam edebilirsiniz fakat işletim sistemi başlatılamayabilir. EFI system partition flag not set EFI sistem bölümü bayrağı ayarlanmadı An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. %1 başlatmak için bir EFI sistem bölümü gereklidir.<br/><br/>Bir bağlama noktası <strong>%2</strong> olarak yapılandırıldı fakat <strong>esp</strong>bayrağı ayarlanmadı.<br/>Bayrağı ayarlamak için, geri dönün ve bölümü düzenleyin.<br/><br/>Sen bayrağı ayarlamadan devam edebilirsin fakat işletim sistemi başlatılamayabilir. Boot partition not encrypted Önyükleme yani boot diski şifrelenmedi A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. Ayrı bir önyükleme yani boot disk bölümü, şifrenmiş bir kök bölüm ile birlikte ayarlandı, fakat önyükleme bölümü şifrelenmedi.<br/><br/>Bu tip kurulumun güvenlik endişeleri vardır, çünkü önemli sistem dosyaları şifrelenmemiş bir bölümde saklanır.<br/>İsterseniz kuruluma devam edebilirsiniz, fakat dosya sistemi kilidi daha sonra sistem başlatılırken açılacak.<br/> Önyükleme bölümünü şifrelemek için geri dönün ve bölüm oluşturma penceresinde <strong>Şifreleme</strong>seçeneği ile yeniden oluşturun. QObject Default Keyboard Model Varsayılan Klavye Modeli Default Varsayılan unknown bilinmeyen extended uzatılmış unformatted biçimlenmemiş swap Swap-Takas Unpartitioned space or unknown partition table Bölümlenmemiş alan veya bilinmeyen bölüm tablosu ReplaceWidget Form Biçim Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. %1 kurulacak diski seçin.<br/><font color="red">Uyarı: </font>Bu işlem seçili disk üzerindeki tüm dosyaları silecek. The selected item does not appear to be a valid partition. Seçili nesne, geçerli bir disk bölümü olarak görünmüyor. %1 cannot be installed on empty space. Please select an existing partition. %1 tanımlanmamış boş bir alana kurulamaz. Lütfen geçerli bir disk bölümü seçin. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 uzatılmış bir disk bölümüne kurulamaz. Geçerli bir, birincil disk ya da mantıksal disk bölümü seçiniz. %1 cannot be installed on this partition. %1 bu disk bölümüne yüklenemedi. Data partition (%1) Veri diski (%1) Unknown system partition (%1) Bilinmeyen sistem bölümü (%1) %1 system partition (%2) %1 sistem bölümü (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>disk bölümü %2 için %1 daha küçük. Lütfen, en az %3 GB kapasiteli bir disk bölümü seçiniz. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>Bu sistemde EFI disk bölümü bulamadı. Lütfen geri dönün ve %1 kurmak için gelişmiş kurulum seçeneğini kullanın. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%2 üzerine %1 kuracak.<br/><font color="red">Uyarı: </font>%2 diskindeki tüm veriler kaybedilecek. The EFI system partition at %1 will be used for starting %2. %1 EFI sistem bölümü %2 başlatmak için kullanılacaktır. EFI system partition: EFI sistem bölümü: RequirementsChecker Gathering system information... Sistem bilgileri toplanıyor... has at least %1 GB available drive space En az %1 GB disk alanı olduğundan... There is not enough drive space. At least %1 GB is required. Yeterli disk alanı mevcut değil. En az %1 GB disk alanı gereklidir. has at least %1 GB working memory En az %1 GB bellek bulunduğundan... The system does not have enough working memory. At least %1 GB is required. Yeterli ram bellek gereksinimi karşılanamıyor. En az %1 GB ram bellek gereklidir. is plugged in to a power source Bir güç kaynağına takılı olduğundan... The system is not plugged in to a power source. Sistem güç kaynağına bağlı değil. is connected to the Internet İnternete bağlı olduğundan... The system is not connected to the Internet. Sistem internete bağlı değil. The installer is not running with administrator rights. Sistem yükleyici yönetici haklarına sahip olmadan çalışmıyor. The screen is too small to display the installer. Ekran, sistem yükleyiciyi görüntülemek için çok küçük. ResizeFileSystemJob Resize file system on partition %1. %1 bölümünde dosya sistemini yeniden boyutlandır. Parted failed to resize filesystem. Parted dosya sistemini yeniden boyutlandıramadı. Failed to resize filesystem. Dosya sistemi boyutlandırılamadı. ResizePartitionJob Resize partition %1. %1 bölümünü yeniden boyutlandır. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. <strong>%2MB</strong> <strong>%1</strong> disk bölümünü <strong>%3MB</strong> olarak yeniden boyutlandır. Resizing %2MB partition %1 to %3MB. %1 disk bölümü %2 boyutundan %3 boyutuna ayarlanıyor. The installer failed to resize partition %1 on disk '%2'. Yükleyici %1 bölümünü '%2' diski üzerinde yeniden boyutlandırılamadı. Could not open device '%1'. '%1' aygıtı açılamadı. ScanningDialog Scanning storage devices... Depolama aygıtları taranıyor... Partitioning Bölümleme SetHostNameJob Set hostname %1 %1 sunucu-adı ayarla Set hostname <strong>%1</strong>. <strong>%1</strong> sunucu-adı ayarla. Setting hostname %1. %1 sunucu-adı ayarlanıyor. Internal Error Dahili Hata Cannot write hostname to target system Hedef sisteme sunucu-adı yazılamadı SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Klavye düzeni %1 olarak, alt türevi %2-%3 olarak ayarlandı. Failed to write keyboard configuration for the virtual console. Uçbirim için klavye yapılandırmasını kaydetmek başarısız oldu. Failed to write to %1 %1 üzerine kaydedilemedi Failed to write keyboard configuration for X11. X11 için klavye yapılandırmaları kaydedilemedi. Failed to write keyboard configuration to existing /etc/default directory. /etc/default dizine klavye yapılandırması yazılamadı. SetPartFlagsJob Set flags on partition %1. %1 bölüm bayrağını ayarla. Set flags on %1MB %2 partition. %1MB %2 Disk bölümüne bayrak ayarla. Set flags on new partition. Yeni disk bölümüne bayrak ayarla. Clear flags on partition <strong>%1</strong>. <strong>%1</strong> bölüm bayrağını kaldır. Clear flags on %1MB <strong>%2</strong> partition. %1MB <strong>%2</strong> disk bölümünden bayrakları temizle. Clear flags on new partition. Yeni disk bölümünden bayrakları temizle. Flag partition <strong>%1</strong> as <strong>%2</strong>. Bayrak bölüm <strong>%1</strong> olarak <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. %1MB <strong>%2</strong> disk bölüm bayrağı <strong>%3</strong> olarak belirlendi. Flag new partition as <strong>%1</strong>. Yeni disk bölümü <strong>%1</strong> olarak belirlendi. Clearing flags on partition <strong>%1</strong>. <strong>%1</strong> bölümünden bayraklar kaldırılıyor. Clearing flags on %1MB <strong>%2</strong> partition. %1MB <strong>%2</strong> disk bölümünden bayraklar temizleniyor. Clearing flags on new partition. Yeni disk bölümünden bayraklar temizleniyor. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. <strong>%2</strong> bayrakları <strong>%1</strong> bölümüne ayarlandı. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. <strong>%3</strong> bayrağı %1MB <strong>%2</strong> disk bölümüne ayarlanıyor. Setting flags <strong>%1</strong> on new partition. Yeni disk bölümüne <strong>%1</strong> bayrağı ayarlanıyor. The installer failed to set flags on partition %1. Yükleyici %1 bölüm bayraklarını ayarlamakta başarısız oldu. Could not open device '%1'. '%1' aygıtı açılamadı. Could not open partition table on device '%1'. '%1' aygıtında bölümleme tablosu açılamadı. Could not find partition '%1'. '%1' bölümü bulunamadı. SetPartGeometryJob Update geometry of partition %1. %1 bölümün güncelleme grafiği. Failed to change the geometry of the partition. Bölüm değişiklikleri grafiklendirilemedi. SetPasswordJob Set password for user %1 %1 Kullanıcı için parola ayarla Setting password for user %1. %1 Kullanıcısı için parola ayarlanıyor. Bad destination system path. Hedef sistem yolu bozuk. rootMountPoint is %1 rootBağlamaNoktası %1 Cannot disable root account. root hesap devre dışı bırakılamaz. passwd terminated with error code %1. passwd %1 hata kodu ile sonlandı. Cannot set password for user %1. %1 Kullanıcısı için parola ayarlanamadı. usermod terminated with error code %1. usermod %1 hata koduyla çöktü. SetTimezoneJob Set timezone to %1/%2 %1/%2 Zaman dilimi ayarla Cannot access selected timezone path. Seçilen zaman dilimini yoluna erişilemedi. Bad path: %1 Hatalı yol: %1 Cannot set timezone. Zaman dilimi ayarlanamadı. Link creation failed, target: %1; link name: %2 Link oluşturulamadı, hedef: %1; link adı: %2 Cannot set timezone, Bölge ve zaman dilimi ayarlanmadı, Cannot open /etc/timezone for writing /etc/timezone açılamadığından düzenlenemedi SummaryPage This is an overview of what will happen once you start the install procedure. Yükleme işlemleri başladıktan sonra yapılacak işlere genel bir bakış. SummaryViewStep Summary Kurulum Bilgileri UsersPage Your username is too long. Kullanıcı adınız çok uzun. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Kullanıcı adınız geçersiz karakterler içeriyor. Sadece küçük harfleri ve sayıları kullanabilirsiniz. Your hostname is too short. Makine adınız çok kısa. Your hostname is too long. Makine adınız çok uzun. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Makine adınız geçersiz karakterler içeriyor. Sadece küçük harfleri ve sayıları ve tire işaretini kullanabilirsiniz. Your passwords do not match! Parolanız eşleşmiyor! UsersViewStep Users Kullanıcı Tercihleri WelcomePage Form Biçim &Language: &Dil: &Release notes &Sürüm notları &Known issues &Bilinen hatalar &Support &Destek &About &Hakkında <h1>Welcome to the %1 installer.</h1> <h1>%1 Sistem Yükleyiciye Hoşgeldiniz.</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>%1 Calamares Sistem Yükleyici .</h1> About %1 installer %1 sistem yükleyici hakkında <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>%3 sürüm</strong><br/><br/>Telif Hakkı 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Telif Hakkı 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Teşekkürler: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg ve<a href="https://www.transifex.com/calamares/calamares/">Calamares çeviri takımı</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> gelişim sponsoru <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Özgür Yazılım. %1 support %1 destek WelcomeViewStep Welcome Hoşgeldiniz calamares-3.1.12/lang/calamares_uk.ts000066400000000000000000003137471322271446000174660ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition Розділ Boot System Partition Системний розділ Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Зроблено Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer %1 Установник Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users Користувачі WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_ur.ts000066400000000000000000003136231322271446000174660ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_uz.ts000066400000000000000000003136231322271446000174760ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. BootLoaderModel Master Boot Record of %1 Boot Partition System Partition Do not install a boot loader %1 (%2) Calamares::DebugWindow Form GlobalStorage JobQueue Modules Type: none Interface: Tools Debug information Calamares::ExecutionViewStep Install Calamares::JobThread Done Calamares::ProcessJob Run command %1 %2 Running command %1 %2 External command crashed Command %1 crashed. Output: %2 External command failed to start Command %1 failed to start. Internal error when starting command Bad parameters for process job call. External command failed to finish Command %1 failed to finish in %2s. Output: %3 External command finished with errors Command %1 finished with exit code %2. Output: %3 Calamares::PythonJob Running %1 operation. Bad working directory path Working directory %1 for python job %2 is not readable. Bad main script file Main script file %1 for python job %2 is not readable. Boost.Python error in job "%1". Calamares::ViewManager &Back &Next &Cancel Cancel installation without changing the system. Cancel installation? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. &Yes &No &Close Continue with setup? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> &Install now Go &back &Done The installation is complete. Close the installer. Error Installation Failed CalamaresPython::Helper Unknown exception type unparseable Python error unparseable Python traceback Unfetchable Python error. CalamaresWindow %1 Installer Show debug information CheckFileSystemJob Checking file system on partition %1. The file system check on partition %1 failed. CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This program will ask you some questions and set up %2 on your computer. For best results, please ensure that this computer: System requirements ChoicePage Form After: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Boot loader location: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. Select storage de&vice: Current: Reuse %1 as home partition for %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>Select a partition to install on</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. The EFI system partition at %1 will be used for starting %2. EFI system partition: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>Replace a partition</strong><br/>Replaces a partition with %1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ClearMountsJob Clear mounts for partitioning operations on %1 Clearing mounts for partitioning operations on %1. Cleared all mounts for %1 ClearTempMountsJob Clear all temporary mounts. Clearing all temporary mounts. Cannot get list of temporary mounts. Cleared all temporary mounts. CreatePartitionDialog Create a Partition MiB Partition &Type: &Primary E&xtended Fi&le System: Flags: &Mount Point: Si&ze: En&crypt Logical Primary GPT Mountpoint already in use. Please select another one. CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. Creating new %1 partition on %2. The installer failed to create partition on disk '%1'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. CreatePartitionTableDialog Create Partition Table Creating a new partition table will delete all existing data on the disk. What kind of partition table do you want to create? Master Boot Record (MBR) GUID Partition Table (GPT) CreatePartitionTableJob Create new %1 partition table on %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). Creating new %1 partition table on %2. The installer failed to create a partition table on %1. Could not open device %1. CreateUserJob Create user %1 Create user <strong>%1</strong>. Creating user %1. Sudoers dir is not writable. Cannot create sudoers file for writing. Cannot chmod sudoers file. Cannot open groups file for reading. Cannot create user %1. useradd terminated with error code %1. Cannot add user %1 to groups: %2. usermod terminated with error code %1. Cannot set home directory ownership for user %1. chown terminated with error code %1. DeletePartitionJob Delete partition %1. Delete partition <strong>%1</strong>. Deleting partition %1. The installer failed to delete partition %1. Partition (%1) and device (%2) do not match. Could not open device %1. Could not open partition table. DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. This device has a <strong>%1</strong> partition table. This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. DeviceModel %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Failed to open %1 DummyCppJob Dummy C++ Job EditExistingPartitionDialog Edit Existing Partition Content: &Keep Format Warning: Formatting the partition will erase all existing data. &Mount Point: Si&ze: MiB Fi&le System: Flags: Mountpoint already in use. Please select another one. EncryptWidget Form En&crypt system Passphrase Confirm passphrase Please enter the same passphrase in both boxes. FillGlobalStorageJob Set partition information Install %1 on <strong>new</strong> %2 system partition. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Install boot loader on <strong>%1</strong>. Setting up mount points. FinishedPage Form &Restart now <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. FinishedViewStep Finish Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. Formatting partition %1 with file system %2. The installer failed to format partition %1 on disk '%2'. Could not open device '%1'. Could not open partition table. The installer failed to create file system on partition %1. The installer failed to update partition table on disk '%1'. InteractiveTerminalPage Konsole not installed Please install the kde konsole and try again! Executing script: &nbsp;<code>%1</code> InteractiveTerminalViewStep Script KeyboardPage Set keyboard model to %1.<br/> Set keyboard layout to %1/%2. KeyboardViewStep Keyboard LCLocaleDialog System locale setting The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. &Cancel &OK LicensePage Form I accept the terms and conditions above. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <a href="%1">view license agreement</a> LicenseViewStep License LocalePage The system language will be set to %1. The numbers and dates locale will be set to %1. Region: Zone: &Change... Set timezone to %1/%2.<br/> %1 (%2) Language (Country) LocaleViewStep Loading location data... Location MoveFileSystemJob Move file system of partition %1. Could not open file system on partition %1 for moving. Could not create target for moving file system on partition %1. Moving of partition %1 failed, changes have been rolled back. Moving of partition %1 failed. Roll back of the changes have failed. Updating boot sector after the moving of partition %1 failed. The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. Source and target for copying do not overlap: Rollback is not required. Could not open device %1 to rollback copying. NetInstallPage Name Description Network Installation. (Disabled: Unable to fetch package lists, check your network connection) NetInstallViewStep Package selection Page_Keyboard Form Keyboard Model: Type here to test your keyboard Page_UserSetup Form What is your name? What name do you want to use to log in? font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> Choose a password to keep your account safe. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> What is the name of this computer? <small>This name will be used if you make the computer visible to others on a network.</small> Log in automatically without asking for the password. Use the same password for the administrator account. Choose a password for the administrator account. <small>Enter the same password twice, so that it can be checked for typing errors.</small> PartitionLabelsView Root Home Boot EFI system Swap New partition for %1 New partition %1 %2 PartitionModel Free Space New partition Name File System Mount Point Size PartitionPage Form Storage de&vice: &Revert All Changes New Partition &Table &Create &Edit &Delete Install boot &loader on: Are you sure you want to create a new partition table on %1? PartitionViewStep Gathering system information... Partitions Install %1 <strong>alongside</strong> another operating system. <strong>Erase</strong> disk and install %1. <strong>Replace</strong> a partition with %1. <strong>Manual</strong> partitioning. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) Current: After: No EFI system partition configured An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. EFI system partition flag not set An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. Boot partition not encrypted A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. QObject Default Keyboard Model Default unknown extended unformatted swap Unpartitioned space or unknown partition table ReplaceWidget Form Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. The selected item does not appear to be a valid partition. %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on this partition. Data partition (%1) Unknown system partition (%1) %1 system partition (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. The EFI system partition at %1 will be used for starting %2. EFI system partition: RequirementsChecker Gathering system information... has at least %1 GB available drive space There is not enough drive space. At least %1 GB is required. has at least %1 GB working memory The system does not have enough working memory. At least %1 GB is required. is plugged in to a power source The system is not plugged in to a power source. is connected to the Internet The system is not connected to the Internet. The installer is not running with administrator rights. The screen is too small to display the installer. ResizeFileSystemJob Resize file system on partition %1. Parted failed to resize filesystem. Failed to resize filesystem. ResizePartitionJob Resize partition %1. Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. Resizing %2MB partition %1 to %3MB. The installer failed to resize partition %1 on disk '%2'. Could not open device '%1'. ScanningDialog Scanning storage devices... Partitioning SetHostNameJob Set hostname %1 Set hostname <strong>%1</strong>. Setting hostname %1. Internal Error Cannot write hostname to target system SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 Failed to write keyboard configuration for the virtual console. Failed to write to %1 Failed to write keyboard configuration for X11. Failed to write keyboard configuration to existing /etc/default directory. SetPartFlagsJob Set flags on partition %1. Set flags on %1MB %2 partition. Set flags on new partition. Clear flags on partition <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. Clear flags on new partition. Flag partition <strong>%1</strong> as <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. Flag new partition as <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. Clearing flags on new partition. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. Setting flags <strong>%1</strong> on new partition. The installer failed to set flags on partition %1. Could not open device '%1'. Could not open partition table on device '%1'. Could not find partition '%1'. SetPartGeometryJob Update geometry of partition %1. Failed to change the geometry of the partition. SetPasswordJob Set password for user %1 Setting password for user %1. Bad destination system path. rootMountPoint is %1 Cannot disable root account. passwd terminated with error code %1. Cannot set password for user %1. usermod terminated with error code %1. SetTimezoneJob Set timezone to %1/%2 Cannot access selected timezone path. Bad path: %1 Cannot set timezone. Link creation failed, target: %1; link name: %2 Cannot set timezone, Cannot open /etc/timezone for writing SummaryPage This is an overview of what will happen once you start the install procedure. SummaryViewStep Summary UsersPage Your username is too long. Your username contains invalid characters. Only lowercase letters and numbers are allowed. Your hostname is too short. Your hostname is too long. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. Your passwords do not match! UsersViewStep Users WelcomePage Form &Language: &Release notes &Known issues &Support &About <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the Calamares installer for %1.</h1> About %1 installer <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support WelcomeViewStep Welcome calamares-3.1.12/lang/calamares_zh_CN.ts000066400000000000000000003601561322271446000200440ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. 这个系统的<strong>引导环境</strong>。<br><br>较旧的 x86 系统只支持 <strong>BIOS</strong>。<br>现代的系统则通常使用 <strong>EFI</strong>,但若引导时使用了兼容模式,也可以显示为 BIOS。 This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. 这个系统从 <strong>EFI</strong> 引导环境启动。<br><br>目前市面上大多数的民用设备都使用 EFI,并同时与之使用 GPT 分区表。<br>要从 EFI 环境引导的话,本安装程序必须部署一个引导器(如 <strong>GRUB</strong> 或 <strong>systemd-boot</strong>)到 <strong>EFI 系统分区</strong>。这个步骤是自动的,除非您选择手动分区——此时您必须自行选择或创建。 This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. 这个系统从 <strong>BIOS</strong> 引导环境启动。<br><br> 要从 BIOS 环境引导,本安装程序必须安装引导器(如 <strong>GRUB</strong>),一般而言要么安装在分区的开头,要么就是在靠进分区表开头的 <strong>主引导记录</strong>(推荐)中。这个步骤是自动的,除非您选择手动分区——此时您必须自行配置。 BootLoaderModel Master Boot Record of %1 主引导记录 %1 Boot Partition 引导分区 System Partition 系统分区 Do not install a boot loader 不要安装引导程序 %1 (%2) %1 (%2) Calamares::DebugWindow Form 表单 GlobalStorage 全局存储 JobQueue 任务队列 Modules 模块 Type: 类型: none Interface: 接口: Tools 工具 Debug information 调试信息 Calamares::ExecutionViewStep Install 安装 Calamares::JobThread Done 完成 Calamares::ProcessJob Run command %1 %2 运行命令 %1 %2 Running command %1 %2 正在运行命令 %1 %2 External command crashed 外部命令崩溃 Command %1 crashed. Output: %2 命令 %1 已崩溃。 输出: %2 External command failed to start 外部命令启动失败 Command %1 failed to start. 命令 %1 启动失败。 Internal error when starting command 启动命令时出现内部错误 Bad parameters for process job call. 呼叫进程任务出现错误参数 External command failed to finish 外部命令结束失败 Command %1 failed to finish in %2s. Output: %3 命令 %1 未能在 %2 秒内结束。 输出: %3 External command finished with errors 外部命令完成且有错误信息 Command %1 finished with exit code %2. Output: %3 命令 %1 以退出代码 %2 完成。 输出: %3 Calamares::PythonJob Running %1 operation. 正在运行 %1 个操作。 Bad working directory path 错误的工作目录路径 Working directory %1 for python job %2 is not readable. 用于 python 任务 %2 的工作目录 %1 不可读。 Bad main script file 错误的主脚本文件 Main script file %1 for python job %2 is not readable. 用于 python 任务 %2 的主脚本文件 %1 不可读。 Boost.Python error in job "%1". 任务“%1”出现 Boost.Python 错误。 Calamares::ViewManager &Back 后退(&B) &Next 下一步(&N) &Cancel 取消(&C) Cancel installation without changing the system. 取消安装,并不做任何更改。 Cancel installation? 取消安装? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 确定要取消当前的安装吗? 安装程序将退出,所有修改都会丢失。 &Yes &是 &No &否 &Close &关闭 Continue with setup? 要继续安装吗? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 安装程序将在您的磁盘上做出变更以安装 %2。<br/><strong>您将无法复原这些变更。</strong> &Install now 现在安装 (&I) Go &back 返回 (&B) &Done &完成 The installation is complete. Close the installer. 安装过程已完毕。请关闭安装器。 Error 错误 Installation Failed 安装失败 CalamaresPython::Helper Unknown exception type 未知异常类型 unparseable Python error 无法解析的 Python 错误 unparseable Python traceback 无法解析的 Python 回溯 Unfetchable Python error. 无法获取的 Python 错误。 CalamaresWindow %1 Installer %1 安装程序 Show debug information 显示调试信息 CheckFileSystemJob Checking file system on partition %1. 正在检查分区 %1 的文件系统。 The file system check on partition %1 failed. 检查分区 %1 上的文件系统失败。 CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> 此电脑未满足安装 %1 的最低需求。<br/>安装无法继续。<a href="#details">详细信息...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. 此电脑未满足一些安装 %1 的推荐需求。<br/>可以继续安装,但一些功能可能会被停用。 This program will ask you some questions and set up %2 on your computer. 本程序将会问您一些问题并在您的电脑上安装及设置 %2 。 For best results, please ensure that this computer: 为了更好的体验,请确定这台电脑: System requirements 系统需求 ChoicePage Form 表单 After: 之后: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>手动分区</strong><br/>您可以自行创建或重新调整分区大小。 Boot loader location: 引导程序位置: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 将会被缩减到 %2 MB,同时将为 %4 创建空间为 %3MB 的新分区。 Select storage de&vice: 选择存储器(&V): Current: 当前: Reuse %1 as home partition for %2. 将 %1 重用为 %2 的家分区。 <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>选择要缩小的分区,然后拖动底栏改变大小</strong> <strong>Select a partition to install on</strong> <strong>选择要安装到的分区</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. 在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 The EFI system partition at %1 will be used for starting %2. %1 处的 EFI 系统分区将被用来启动 %2。 EFI system partition: EFI 系统分区: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 这个存储器上似乎还没有操作系统。您想要怎么做?<br/>在任何变更应用到存储器上前,您都可以重新查看并确认您的选择。 <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>抹除磁盘</strong><br/>这将会<font color="red">删除</font>目前选定的存储器上所有的数据。 This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 这个存储器上已经有 %1 了。您想要怎么做?<br/>在任何变更应用到存储器上前,您都可以重新查看并确认您的选择。 <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>并存安装</strong><br/>安装程序将会缩小一个分区,为 %1 腾出空间。 <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>取代一个分区</strong><br/>以 %1 <strong>替代</strong>一个分区。 This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 这个存储器上已经有一个操作系统了。您想要怎么做?<br/>在任何变更应用到存储器上前,您都可以重新查看并确认您的选择。 This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 这个存储器上已经有多个操作系统了。您想要怎么做?<br/>在任何变更应用到存储器上前,您都可以重新查看并确认您的选择。 ClearMountsJob Clear mounts for partitioning operations on %1 清理挂载了的分区以在 %1 进行分区操作 Clearing mounts for partitioning operations on %1. 正在清理挂载了的分区以在 %1 进行分区操作。 Cleared all mounts for %1 已清除 %1 的所有挂载点 ClearTempMountsJob Clear all temporary mounts. 清除所有临时挂载点。 Clearing all temporary mounts. 正在清除所有临时挂载点。 Cannot get list of temporary mounts. 无法获取临时挂载点列表。 Cleared all temporary mounts. 所有临时挂载点都已经清除。 CreatePartitionDialog Create a Partition 创建分区 MiB MiB Partition &Type: 分区类型(&T): &Primary 主分区(&P) E&xtended 扩展分区(&E) Fi&le System: 文件系统 (&L): Flags: 标记: &Mount Point: 挂载点(&M): Si&ze: 大小(&Z): En&crypt 加密(&C) Logical 逻辑分区 Primary 主分区 GPT GPT Mountpoint already in use. Please select another one. 挂载点已被占用。请选择另一个。 CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. 在 %4 (%3) 上创建新的 %2MB 分区,使用 %1 文件系统。 Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. 文件系统在 <strong>%4</strong> (%3) 上创建新的 <strong>%2MB</strong> 分区,使用 <strong>%1</strong>文件系统。 Creating new %1 partition on %2. 正在 %2 上创建新的 %1 分区。 The installer failed to create partition on disk '%1'. 安装程序在磁盘“%1”创建分区失败。 Could not open device '%1'. 无法打开设备“%1”。 Could not open partition table. 无法打开分区表。 The installer failed to create file system on partition %1. 安装程序在分区 %1 创建文件系统失败。 The installer failed to update partition table on disk '%1'. 安装程序更新磁盘“%1”分区表失败。 CreatePartitionTableDialog Create Partition Table 创建分区表 Creating a new partition table will delete all existing data on the disk. 创建新分区表将删除磁盘上所有已有数据。 What kind of partition table do you want to create? 您想要创建哪种分区表? Master Boot Record (MBR) 主引导记录 (MBR) GUID Partition Table (GPT) GUID 分区表 (GPT) CreatePartitionTableJob Create new %1 partition table on %2. 在 %2 上创建新的 %1 分区表。 Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). 在 <strong>%2</strong> (%3) 上创建新的 <strong>%1</strong> 分区表。 Creating new %1 partition table on %2. 正在 %2 上创建新的 %1 分区表。 The installer failed to create a partition table on %1. 安装程序于 %1 创建分区表失败。 Could not open device %1. 无法打开设备 %1。 CreateUserJob Create user %1 创建用户 %1 Create user <strong>%1</strong>. 创建用户 <strong>%1</strong>。 Creating user %1. 正在创建用户 %1。 Sudoers dir is not writable. Sudoers 目录不可写。 Cannot create sudoers file for writing. 无法创建要写入的 sudoers 文件。 Cannot chmod sudoers file. 无法修改 sudoers 文件权限。 Cannot open groups file for reading. 无法打开要读取的 groups 文件。 Cannot create user %1. 无法创建用户 %1。 useradd terminated with error code %1. useradd 以错误代码 %1 中止。 Cannot add user %1 to groups: %2. 无法将用户 %1 加入到群组:%2. usermod terminated with error code %1. usermod 终止,错误代码 %1. Cannot set home directory ownership for user %1. 无法设置用户 %1 的主文件夹所有者。 chown terminated with error code %1. chown 以错误代码 %1 中止。 DeletePartitionJob Delete partition %1. 删除分区 %1。 Delete partition <strong>%1</strong>. 删除分区 <strong>%1</strong>。 Deleting partition %1. 正在删除分区 %1。 The installer failed to delete partition %1. 安装程序删除分区 %1 失败。 Partition (%1) and device (%2) do not match. 分区 (%1) 与设备 (%2) 不匹配。 Could not open device %1. 无法打开设备 %1。 Could not open partition table. 无法打开分区表。 DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. 目前选定存储器的<strong>分区表</strong>类型。<br><br>变更分区表类型的唯一方法就是抹除再重新从头建立分区表,这会破坏在该存储器上所有的数据。<br>除非您特别选择,否则本安装程序将会保留目前的分区表。<br>若不确定,在现代的系统上,建议使用 GPT。 This device has a <strong>%1</strong> partition table. 此设备上有一个 <strong>%1</strong> 分区表。 This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. 选定的存储器是一个 <strong>回环</strong> 设备。<br><br>此伪设备不含一个真正的分区表,它只是能让一个文件可如块设备那样访问。这种配置一般只包含一个单独的文件系统。 This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. 本安装程序在选定的存储器上<strong>探测不到分区表</strong>。<br><br>此设备要不是没有分区表,就是其分区表已毁损又或者是一个未知类型的分区表。<br>本安装程序将会为您建立一个新的分区表,可以自动或通过手动分割页面完成。 <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>此分区表类型推荐用于使用 <strong>EFI</strong> 引导环境的系统。 <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>此分区表类型只建议用于使用 <strong>BIOS</strong> 引导环境的较旧系统,否则一般建议使用 GPT。<br> <strong>警告:</strong>MSDOS 分区表是一个有着重大缺点、已被弃用的标准。<br>MSDOS 分区表上只能创建 4 个<u>主要</u>分区,其中一个可以是<u>拓展</u>分区,此分区可以再分为许多<u>逻辑</u>分区。 DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 将 Dracut 的 LUKS 配置写入到 %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted Dracut 的“/”分区未加密,因而跳过写入 LUKS 配置 Failed to open %1 无法打开 %1 DummyCppJob Dummy C++ Job 虚设 C++ 任务 EditExistingPartitionDialog Edit Existing Partition 编辑已有分区 Content: 内容: &Keep 保留 (&K) Format 格式化 Warning: Formatting the partition will erase all existing data. 警告:格式化分区将删除所有已有数据。 &Mount Point: 挂载点(&M): Si&ze: 尺寸 (&Z): MiB MiB Fi&le System: 文件系统 (&L): Flags: 标记: Mountpoint already in use. Please select another one. 挂载点已被占用。请选择另一个。 EncryptWidget Form 表单 En&crypt system 加密系统 Passphrase 密码 Confirm passphrase 确认密码 Please enter the same passphrase in both boxes. 请在两个输入框中输入同样的密码。 FillGlobalStorageJob Set partition information 设置分区信息 Install %1 on <strong>new</strong> %2 system partition. 在 <strong>新的</strong>系统分区 %2 上安装 %1。 Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. 设置 <strong>新的</strong> 含挂载点 <strong>%1</strong> 的 %2 分区。 Install %2 on %3 system partition <strong>%1</strong>. 在 %3 系统割区 <strong>%1</strong> 上安装 %2。 Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. 为分区 %3 <strong>%1</strong> 设置挂载点 <strong>%2</strong>。 Install boot loader on <strong>%1</strong>. 在 <strong>%1</strong>上安装引导程序。 Setting up mount points. 正在设置挂载点。 FinishedPage Form 表单 &Restart now 现在重启(&R) <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>一切都结束了。</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可能会想要重新启动到您的新系统中,或是继续使用 %2 Live 环境。 <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 FinishedViewStep Finish 结束 Installation Complete The installation of %1 is complete. FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. 格式化在 %4 的分区 %1 (文件系统:%2,大小:%3 MB)。 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. 以文件系统 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分区 <strong>%1</strong>。 Formatting partition %1 with file system %2. 正在使用 %2 文件系统格式化分区 %1。 The installer failed to format partition %1 on disk '%2'. 安装程序格式化磁盘“%2”上的分区 %1 失败。 Could not open device '%1'. 无法打开设备“%1”。 Could not open partition table. 无法打开分区表。 The installer failed to create file system on partition %1. 安装程序于分区 %1 创建文件系统失败。 The installer failed to update partition table on disk '%1'. 安装程序于磁盘“%1”更新分区表失败。 InteractiveTerminalPage Konsole not installed 未安装 Konsole Please install the kde konsole and try again! 请安装 KDE Konsole 然后重试! Executing script: &nbsp;<code>%1</code> 正在运行脚本:&nbsp;<code>%1</code> InteractiveTerminalViewStep Script 脚本 KeyboardPage Set keyboard model to %1.<br/> 设置键盘型号为 %1。<br/> Set keyboard layout to %1/%2. 设置键盘布局为 %1/%2。 KeyboardViewStep Keyboard 键盘 LCLocaleDialog System locale setting 系统语区设置 The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. 系统语言区域设置会影响部份命令行用户界面的语言及字符集。<br/>目前的设置为 <strong>%1</strong>。 &Cancel &OK LicensePage Form 表单 I accept the terms and conditions above. 我同意如上条款。 <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>许可协定</h1>此安装程序将会安装受授权条款所限制的专有软件。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. 请仔细上方的最终用户许可协定 (EULA)。<br/>若您不同意上述条款,安装程序将不会继续。 <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>许可协定</h1>此安装程序可以安装受授权条款限制的专有软件,以提供额外的功能并增强用户体验。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. 请仔细上方的最终用户许可协定 (EULA)。<br/>若您不同意上述条款,将不会安装专有软件,而会使用其开源替代品。 <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 驱动程序</strong><br/>由 %2 提供 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 显卡驱动程序</strong><br/><font color="Grey">由 %2 提供</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 浏览器插件</strong><br/><font color="Grey">由 %2 提供</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 编解码器</strong><br/><font color="Grey">由 %2 提供</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 软件包</strong><br/><font color="Grey">由 %2 提供</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">由 %2 提供</font> <a href="%1">view license agreement</a> <a href="%1">查看许可协定</a> LicenseViewStep License 许可证 LocalePage The system language will be set to %1. 系统语言将设置为 %1。 The numbers and dates locale will be set to %1. 数字和日期地域将设置为 %1。 Region: 地区: Zone: 区域: &Change... 更改 (&C) ... Set timezone to %1/%2.<br/> 设置时区为 %1/%2。<br/> %1 (%2) Language (Country) %1(%2) LocaleViewStep Loading location data... 加载位置数据... Location 位置 MoveFileSystemJob Move file system of partition %1. 移动分区 %1 的文件系统。 Could not open file system on partition %1 for moving. 无法打开分区 %1 的文件系统来进行移动。 Could not create target for moving file system on partition %1. 无法创建目标来移动分区 %1 的文件系统。 Moving of partition %1 failed, changes have been rolled back. 移动分区 %1 失败,修改已经回滚。 Moving of partition %1 failed. Roll back of the changes have failed. 移动分区 %1 失败。回滚修改失败。 Updating boot sector after the moving of partition %1 failed. 移动分区 %1 后更新启动扇区失败。 The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. 源的逻辑扇区大小与目标不同。目前并不支持。 Source and target for copying do not overlap: Rollback is not required. 要复制的源和目标没有交集:不需要回滚。 Could not open device %1 to rollback copying. 无法打开设备 %1 来回滚复制。 NetInstallPage Name 名称 Description 描述 Network Installation. (Disabled: Unable to fetch package lists, check your network connection) 网络安装。(已禁用:无法获取软件包列表,请检查网络连接) NetInstallViewStep Package selection 软件包选择 Page_Keyboard Form 窗体 Keyboard Model: 键盘型号: Type here to test your keyboard 在此处数据以测试键盘 Page_UserSetup Form 窗体 What is your name? 您的姓名? What name do you want to use to log in? 您想要使用的登录用户名是? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>如果有多人要使用此计算机,您可以在安装后设置多个账户。</small> Choose a password to keep your account safe. 选择一个密码来保证您的账户安全。 <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。</small> What is the name of this computer? 计算机名称为? <small>This name will be used if you make the computer visible to others on a network.</small> <small>将计算机设置为对其他网络上计算机可见时将使用此名称。</small> Log in automatically without asking for the password. 不询问密码自动登录。 Use the same password for the administrator account. 为管理员帐号使用同样的密码。 Choose a password for the administrator account. 选择管理员账户的密码。 <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>输入相同密码两次,以检查输入错误。</small> PartitionLabelsView Root 根目录 Home 主目录 Boot 引导 EFI system EFI 系统 Swap 交换 New partition for %1 %1 的新分区 New partition 新建分区 %1 %2 %1 %2 PartitionModel Free Space 空闲空间 New partition 新建分区 Name 名称 File System 文件系统 Mount Point 挂载点 Size 大小 PartitionPage Form 窗体 Storage de&vice: 存储器(&V): &Revert All Changes 撤销所有修改(&R) New Partition &Table 新建分区表(&T) &Create 创建(&C) &Edit 编辑(&E) &Delete 删除(&D) Install boot &loader on: 安装引导程序于(&L): Are you sure you want to create a new partition table on %1? 您是否确定要在 %1 上创建新分区表? PartitionViewStep Gathering system information... 正在收集系统信息... Partitions 分区 Install %1 <strong>alongside</strong> another operating system. 将 %1 安装在其他操作系统<strong>旁边</strong>。 <strong>Erase</strong> disk and install %1. <strong>抹除</strong>磁盘并安装 %1。 <strong>Replace</strong> a partition with %1. 以 %1 <strong>替代</strong>一个分区。 <strong>Manual</strong> partitioning. <strong>手动</strong>分区 Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). 将 %1 安装在磁盘 <strong>%2</strong> (%3) 上的另一个操作系统<strong>旁边</strong>。 <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>抹除</strong> 磁盘 <strong>%2</strong> (%3) 并且安装 %1。 <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. 以 %1 <strong>替代</strong> 一个在磁盘 <strong>%2</strong> (%3) 上的分区。 <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). 在磁盘 <strong>%1</strong> (%2) 上<strong>手动</strong>分区。 Disk <strong>%1</strong> (%2) 磁盘 <strong>%1</strong> (%2) Current: 当前: After: 之后: No EFI system partition configured 未配置 EFI 系统分区 An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. 必须有 EFI 系统分区才能启动 %1 。<br/><br/>要配置 EFI 系统分区,后退一步,然后创建或选中一个 FAT32 分区并为之设置 <strong>esp</strong> 标记及挂载点 <strong>%2</strong>。<br/><br/>你可以不创建 EFI 系统分区并继续安装,但是你的系统可能无法启动。 EFI system partition flag not set 未设置 EFI 系统分区标记 An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. 必须有 EFI 系统分区才能启动 %1 。<br/><br/>已有挂载点为 <strong>%2</strong> 的分区,但是未设置 <strong>esp</strong> 标记。<br/>要设置此标记,后退并编辑分区。<br/><br/>你可以不创建 EFI 系统分区并继续安装,但是你的系统可能无法启动。 Boot partition not encrypted 引导分区未加密 A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. 您尝试用单独的引导分区配合已加密的根分区使用,但引导分区未加密。<br/><br/>这种配置方式可能存在安全隐患,因为重要的系统文件存储在了未加密的分区上。<br/>您可以继续保持此配置,但是系统解密将在系统启动时而不是引导时进行。<br/>要加密引导分区,请返回上一步并重新创建此分区,并在分区创建窗口选中 <strong>加密</strong> 选项。 QObject Default Keyboard Model 默认键盘型号 Default 默认 unknown 未知 extended 扩展分区 unformatted 未格式化 swap 临时存储空间 Unpartitioned space or unknown partition table 尚未分区的空间或分区表未知 ReplaceWidget Form 表单 Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. <b>选择要安装 %1 的地方。</b><br/><font color="red">警告:</font>这将会删除所有已选取的分区上的文件。 The selected item does not appear to be a valid partition. 选中项似乎不是有效分区。 %1 cannot be installed on empty space. Please select an existing partition. 无法在空白空间中安装 %1。请选取一个存在的分区。 %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. 无法在拓展分区上安装 %1。请选取一个存在的主要或逻辑分区。 %1 cannot be installed on this partition. 无法安装 %1 到此分区。 Data partition (%1) 数据分区 (%1) Unknown system partition (%1) 未知系统分区 (%1) %1 system partition (%2) %1 系统分区 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>分区 %1 对 %2 来说太小了。请选取一个容量至少有 %3 GiB 的分区。 <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>即将安装 %1 到 %2 上。<br/><font color="red">警告: </font>分区 %2 上的所有数据都将丢失。 The EFI system partition at %1 will be used for starting %2. 将使用 %1 处的 EFI 系统分区启动 %2。 EFI system partition: EFI 系统分区: RequirementsChecker Gathering system information... 正在收集系统信息 ... has at least %1 GB available drive space 至少 %1 GB 可用磁盘空间 There is not enough drive space. At least %1 GB is required. 没有足够的磁盘空间。至少需要 %1 GB。 has at least %1 GB working memory 至少 %1 GB 可用内存 The system does not have enough working memory. At least %1 GB is required. 系统没有足够的内存。至少需要 %1 GB。 is plugged in to a power source 已连接到电源 The system is not plugged in to a power source. 系统未连接到电源。 is connected to the Internet 已连接到互联网 The system is not connected to the Internet. 系统未连接到互联网。 The installer is not running with administrator rights. 安装器未以管理员权限运行 The screen is too small to display the installer. 屏幕不能完整显示安装器。 ResizeFileSystemJob Resize file system on partition %1. 调整分区 %1 的文件系统大小。 Parted failed to resize filesystem. Parted 调整文件系统大小失败。 Failed to resize filesystem. 调整文件系统大小失败。 ResizePartitionJob Resize partition %1. 调整分区 %1 大小。 Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. 正将 <strong>%2MB</strong> 的分区<strong>%1</strong>为 <strong>%3MB</strong>。 Resizing %2MB partition %1 to %3MB. 正将 %2MB 的分区%1为 %3MB。 The installer failed to resize partition %1 on disk '%2'. 安装程序调整磁盘“%2”上的分区 %1 大小失败。 Could not open device '%1'. 无法打开设备“%1”。 ScanningDialog Scanning storage devices... 正在扫描存储器… Partitioning 正在分区 SetHostNameJob Set hostname %1 设置主机名 %1 Set hostname <strong>%1</strong>. 设置主机名 <strong>%1</strong>。 Setting hostname %1. 正在设置主机名 %1。 Internal Error 内部错误 Cannot write hostname to target system 无法向目标系统写入主机名 SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 将键盘型号设置为 %1,布局设置为 %2-%3 Failed to write keyboard configuration for the virtual console. 无法将键盘配置写入到虚拟控制台。 Failed to write to %1 写入到 %1 失败 Failed to write keyboard configuration for X11. 无法为 X11 写入键盘配置。 Failed to write keyboard configuration to existing /etc/default directory. 无法将键盘配置写入到现有的 /etc/default 目录。 SetPartFlagsJob Set flags on partition %1. 设置分区 %1 的标记. Set flags on %1MB %2 partition. 设置 %1MB %2 分区的标记. Set flags on new partition. 设置新分区的标记. Clear flags on partition <strong>%1</strong>. 清空分区 <strong>%1</strong> 上的标记. Clear flags on %1MB <strong>%2</strong> partition. 删除 %1MB <strong>%2</strong> 分区的标记. Clear flags on new partition. 删除新分区的标记. Flag partition <strong>%1</strong> as <strong>%2</strong>. 将分区 <strong>%2</strong> 标记为 <strong>%1</strong>。 Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. 将 %1MB <strong>%2</strong> 分区标记为 <strong>%3</strong>. Flag new partition as <strong>%1</strong>. 将新分区标记为 <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. 正在清理分区 <strong>%1</strong> 上的标记。 Clearing flags on %1MB <strong>%2</strong> partition. 正在删除 %1MB <strong>%2</strong> 分区的标记. Clearing flags on new partition. 正在删除新分区的标记. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. 正在为分区 <strong>%1</strong> 设置标记 <strong>%2</strong>。 Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. 正在将 %1MB <strong>%2</strong> 分区标记为 <strong>%3</strong>. Setting flags <strong>%1</strong> on new partition. 正在将新分区标记为 <strong>%1</strong>. The installer failed to set flags on partition %1. 安装程序没有成功设置分区 %1 的标记. Could not open device '%1'. 无法打开设备 '%1'. Could not open partition table on device '%1'. 无法打开设备 '%1' 的分区表。 Could not find partition '%1'. 无法找到分区 '%1'。 SetPartGeometryJob Update geometry of partition %1. 更新分区 %1 布局。 Failed to change the geometry of the partition. 更改分区布局失败。 SetPasswordJob Set password for user %1 设置用户 %1 的密码 Setting password for user %1. 正在为用户 %1 设置密码。 Bad destination system path. 非法的目标系统路径。 rootMountPoint is %1 根挂载点为 %1 Cannot disable root account. 无法禁用 root 帐号。 passwd terminated with error code %1. passwd 以错误代码 %1 终止。 Cannot set password for user %1. 无法设置用户 %1 的密码。 usermod terminated with error code %1. usermod 以错误代码 %1 中止。 SetTimezoneJob Set timezone to %1/%2 设置时区为 %1/%2 Cannot access selected timezone path. 无法访问指定的时区路径。 Bad path: %1 非法路径:%1 Cannot set timezone. 无法设置时区。 Link creation failed, target: %1; link name: %2 链接创建失败,目标:%1,链接名称:%2 Cannot set timezone, 无法设置时区, Cannot open /etc/timezone for writing 无法打开要写入的 /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. 这是您开始安装后所会发生的事情的概览。 SummaryViewStep Summary 摘要 UsersPage Your username is too long. 用户名太长。 Your username contains invalid characters. Only lowercase letters and numbers are allowed. 您的用户名含有无效的字符。只能使用小写字母和数字。 Your hostname is too short. 主机名太短。 Your hostname is too long. 主机名太长。 Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. 您的主机名称含有无效的字符。只能使用字母、数字和短横。 Your passwords do not match! 密码不匹配! UsersViewStep Users 用户 WelcomePage Form 表单 &Language: 语言(&L) : &Release notes 发行注记(&R) &Known issues 已知问题(&K) &Support 支持信息(&S) &About 关于(&A) <h1>Welcome to the %1 installer.</h1> <h1>欢迎使用 %1 安装程序。</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>欢迎使用 Calamares 安装程序 - %1。</h1> About %1 installer 关于 %1 安装程序 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>于 %3</strong><br/><br/>版权 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>版权 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>鸣谢: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg 和 <a href="https://www.transifex.com/calamares/calamares/">Calamares 翻译团队</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> 开发赞助来自 <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. %1 support %1 的支持信息 WelcomeViewStep Welcome 欢迎 calamares-3.1.12/lang/calamares_zh_TW.ts000066400000000000000000003620661322271446000201000ustar00rootroot00000000000000 BootInfoWidget The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現代的系統則通常使用 <strong>EFI</strong>,但若開機環境是以相容模式執行,其也可能顯示為 BIOS。 This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. 這個系統以 <strong>EFI</strong> 開機環境啟動。<br><br>要設定從 EFI 環境開機,本安裝程式必須部署一個開機載入器應用程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>上。這是自動的,除非您選擇手動分割,在這種情況下,您必須自行選取或建立它。 This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. 這個系統以 <strong>BIOS</strong> 開機環境開始。<br><br>要從 BIOS 環境開機開機,本安裝程式必須安裝開機載入器,像是 <strong>GRUB</strong>,且通常不是安裝在分割區的開頭就是在靠進分割表開頭的 <strong>主開機記錄</strong>(推薦)。這是自動的,除非您選擇手動分割,在這種情況下,您必須自行設定它。 BootLoaderModel Master Boot Record of %1 %1 的主要開機紀錄 (MBR) Boot Partition 開機磁區 System Partition 系統磁區 Do not install a boot loader 無法安裝開機載入器 %1 (%2) %1 (%2) Calamares::DebugWindow Form 型式 GlobalStorage 全域儲存 JobQueue 工作佇列 Modules 模組 Type: 類型: none Interface: 介面: Tools 工具 Debug information 除錯資訊 Calamares::ExecutionViewStep Install 安裝 Calamares::JobThread Done 完成 Calamares::ProcessJob Run command %1 %2 執行命令 %1 %2 Running command %1 %2 正在執行命令 %1 %2 External command crashed 外部指令崩潰 Command %1 crashed. Output: %2 指令 %1 崩潰。 輸出: %2 External command failed to start 無法開始外部指令 Command %1 failed to start. 無法開始指令 %1 Internal error when starting command 開始指令時發生內部錯誤 Bad parameters for process job call. 呼叫程序的參數無效。 External command failed to finish 無法完成外部指令 Command %1 failed to finish in %2s. Output: %3 指令 %1 無法在 %2 秒內完成。 輸出: %3 External command finished with errors 外部指令以錯誤方式完成 Command %1 finished with exit code %2. Output: %3 指令 %1 以退出狀態 %2 完成。 輸出: %3 Calamares::PythonJob Running %1 operation. 正在執行 %1 操作。 Bad working directory path 不良的工作目錄路徑 Working directory %1 for python job %2 is not readable. Python 行程 %2 作用中的目錄 %1 不具讀取權限。 Bad main script file 錯誤的主要腳本檔 Main script file %1 for python job %2 is not readable. Python 行程 %2 的主要腳本檔 %1 無法讀取。 Boost.Python error in job "%1". 行程 %1 中 Boost.Python 錯誤。 Calamares::ViewManager &Back 返回 (&B) &Next 下一步 (&N) &Cancel 取消(&C) Cancel installation without changing the system. 不變更系統並取消安裝。 Cancel installation? 取消安裝? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 您真的想要取消目前的安裝程序嗎? 安裝程式將會退出且所有變動將會遺失。 &Yes 是(&Y) &No 否(&N) &Close 關閉(&C) Continue with setup? 繼續安裝? The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> &Install now 現在安裝 (&I) Go &back 上一步 (&B) &Done 完成(&D) The installation is complete. Close the installer. 安裝完成。關閉安裝程式。 Error 錯誤 Installation Failed 安裝失敗 CalamaresPython::Helper Unknown exception type 未知的例外型別 unparseable Python error 無法解析的 Python 錯誤 unparseable Python traceback 無法解析的 Python 回溯紀錄 Unfetchable Python error. 無法讀取的 Python 錯誤。 CalamaresWindow %1 Installer %1 安裝程式 Show debug information 顯示除錯資訊 CheckFileSystemJob Checking file system on partition %1. 正在檢查分割區 %1 上的檔案系統。 The file system check on partition %1 failed. 在分割區 %1 上的檔案系統檢查失敗。 CheckerWidget This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。<a href="#details">詳細資訊...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. 此電腦未滿足一些安裝 %1 的推薦需求。<br/>安裝可以繼續,但部份功能可能會被停用。 This program will ask you some questions and set up %2 on your computer. 本程式將會問您一些問題並在您的電腦上安裝及設定 %2 。 For best results, please ensure that this computer: 為了得到最佳的結果,請確保此電腦: System requirements 系統需求 ChoicePage Form 表單 After: 之後: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. <strong>手動分割</strong><br/>您可以自行建立或重新調整分割區大小。 Boot loader location: 開機載入器位置: %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. %1 將會被縮減容量到 %2MB 而一個新的 %3MB 分割區將會被建立為 %4。 Select storage de&vice: 選取儲存裝置(&V): Current: 目前: Reuse %1 as home partition for %2. 重新使用 %1 作為 %2 的家目錄分割區。 <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> <strong>選取要縮減的分割區,然後拖曳底部條狀物來調整大小</strong> <strong>Select a partition to install on</strong> <strong>選取分割區以安裝在其上</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. 在這個系統上找不到任何的 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 The EFI system partition at %1 will be used for starting %2. 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 EFI system partition: EFI 系統分割區: This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 這個儲存裝置上似乎還沒有作業系統。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. <strong>抹除磁碟</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置上所有的資料。 This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 這個儲存裝置上已經有 %1 了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. <strong>並存安裝</strong><br/>安裝程式將會縮減一個分割區以讓出空間給 %1。 <strong>Replace a partition</strong><br/>Replaces a partition with %1. <strong>取代一個分割區</strong><br/>用 %1 取代一個分割區。 This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 這個儲存裝置上已經有一個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. 這個儲存裝置上已經有多個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 ClearMountsJob Clear mounts for partitioning operations on %1 為了準備分割區操作而完全卸載 %1 Clearing mounts for partitioning operations on %1. 正在為了準備分割區操作而完全卸載 %1 Cleared all mounts for %1 已清除所有與 %1 相關的掛載 ClearTempMountsJob Clear all temporary mounts. 清除所有暫時掛載。 Clearing all temporary mounts. 正在清除所有暫時掛載。 Cannot get list of temporary mounts. 無法取得暫時掛載的列表。 Cleared all temporary mounts. 已清除所有暫時掛載。 CreatePartitionDialog Create a Partition 建立一個分割區 MiB MiB Partition &Type: 分割區與類型 (&T): &Primary 主要分割區 (&P) E&xtended 延伸分割區 (&x) Fi&le System: 檔案系統 (&I): Flags: 旗標: &Mount Point: 掛載點 (&M): Si&ze: 容量大小 (&z) : En&crypt 加密(&C) Logical 邏輯磁區 Primary 主要磁區 GPT GPT Mountpoint already in use. Please select another one. 掛載點使用中。請選擇其他的。 CreatePartitionJob Create new %2MB partition on %4 (%3) with file system %1. 以 %1 檔案系統在 %4 (%3) 上建立新的 %2MB 分割區。 Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. 以 <strong>%1</strong> 檔案系統在 <strong>%4</strong> (%3) 上建立新的 <strong>%2MB</strong> 分割區。 Creating new %1 partition on %2. 正在 %2 上建立新的 %1 分割區。 The installer failed to create partition on disk '%1'. 安裝程式在磁碟 '%1' 上建立分割區失敗。 Could not open device '%1'. 無法開啟裝置 '%1'。 Could not open partition table. 無法開啟分割區表格。 The installer failed to create file system on partition %1. 安裝程式在分割區 %1 上建立檔案系統失敗。 The installer failed to update partition table on disk '%1'. 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 CreatePartitionTableDialog Create Partition Table 建立分割區表格 Creating a new partition table will delete all existing data on the disk. 新增一個分割區表格將會刪除硬碟上所有已存在的資料 What kind of partition table do you want to create? 您想要建立哪一種分割區表格? Master Boot Record (MBR) 主要開機紀錄 (MBR) GUID Partition Table (GPT) GUID 分割區表格 (GPT) CreatePartitionTableJob Create new %1 partition table on %2. 在 %2 上建立新的 %1 分割表。 Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). 在 <strong>%2</strong> (%3) 上建立新的 <strong>%1</strong> 分割表。 Creating new %1 partition table on %2. 正在 %2 上建立新的 %1 分割表。 The installer failed to create a partition table on %1. 安裝程式在 %1 上建立分割區表格失敗。 Could not open device %1. 無法開啟裝置 %1 。 CreateUserJob Create user %1 建立使用者 %1 Create user <strong>%1</strong>. 建立使用者 <strong>%1</strong>。 Creating user %1. 正在建立使用者 %1。 Sudoers dir is not writable. Sudoers 目錄不可寫入。 Cannot create sudoers file for writing. 無法建立要寫入的 sudoers 檔案。 Cannot chmod sudoers file. 無法修改 sudoers 檔案權限。 Cannot open groups file for reading. 無法開啟要讀取的 groups 檔案。 Cannot create user %1. 無法建立使用者 %1 。 useradd terminated with error code %1. useradd 以錯誤代碼 %1 終止。 Cannot add user %1 to groups: %2. 無法將使用者 %1 加入至群組:%2。 usermod terminated with error code %1. usermod 以錯誤代碼 %1 終止。 Cannot set home directory ownership for user %1. 無法將使用者 %1 設定為家目錄的擁有者。 chown terminated with error code %1. chown 以錯誤代碼 %1 終止。 DeletePartitionJob Delete partition %1. 刪除分割區 %1。 Delete partition <strong>%1</strong>. 刪除分割區 <strong>%1</strong>。 Deleting partition %1. 正在刪除分割區 %1。 The installer failed to delete partition %1. 安裝程式刪除分割區 %1 失敗。 Partition (%1) and device (%2) do not match. 分割區 (%1) 及裝置 (%2) 不符合。 Could not open device %1. 無法開啟裝置 %1 。 Could not open partition table. 無法開啟分割區表格。 DeviceInfoWidget The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. 選定的儲存裝置上的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置上所有的資料。<br>除非您特別選擇,否則本安裝程式將會保留目前的分割表。<br>若不確定,在現代的系統上,建議使用 GPT。 This device has a <strong>%1</strong> partition table. 此裝置已有一個 <strong>%1</strong> 分割表了。 This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. 這是一個 <strong>迴圈</strong> 裝置。<br><br>它是一個沒有分割表,但讓檔案可以被像塊裝置一樣存取的偽裝置。此種設定通常只包含一個單一的檔案系統。 This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. 本安裝程式在選定的儲存裝置上<strong>偵測不到分割表</strong>。<br><br>此裝置要不是沒有分割表,就是其分割表已毀損又或者是一個未知類型的分割表。<br>本安裝程式將會為您建立一個新的分割表,不論是自動或是透過手動分割頁面。 <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. <br><br>這是對 <strong>EFI</strong> 開機環境而言的現代系統建議分割表類型。 <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. <br><br>這個分割表類型只被建議在從 <strong>BIOS</strong> 開機環境啟動的較舊系統上使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是一個被棄用的 MS-DOS 時代的標準。<br>只能有 4 個<em>主要</em>分割區被建立,其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 DeviceModel %1 - %2 (%3) %1 - %2 (%3) DracutLuksCfgJob Write LUKS configuration for Dracut to %1 為 Dracut 寫入 LUKS 設定到 %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted 跳過為 Dracut 寫入 LUKS 設定:"/" 分割區未加密 Failed to open %1 開啟 %1 失敗 DummyCppJob Dummy C++ Job 虛設 C++ 排程 EditExistingPartitionDialog Edit Existing Partition 編輯已經存在的分割區 Content: 內容: &Keep 保持(&K) Format 格式化 Warning: Formatting the partition will erase all existing data. 警告:格式化該分割區換抹除所有已存在的資料。 &Mount Point: 掛載點 (&M): Si&ze: 容量大小 (&Z) : MiB MiB Fi&le System: 檔案系統 (&I): Flags: 旗標: Mountpoint already in use. Please select another one. 掛載點使用中。請選擇其他的。 EncryptWidget Form 形式 En&crypt system 加密系統(&C) Passphrase 通關密語 Confirm passphrase 確認通關密語 Please enter the same passphrase in both boxes. 請在兩個框框中輸入相同的通關密語。 FillGlobalStorageJob Set partition information 設定分割區資訊 Install %1 on <strong>new</strong> %2 system partition. 在 <strong>新的</strong>系統分割區 %2 上安裝 %1。 Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. 設定 <strong>新的</strong> 不含掛載點 <strong>%1</strong> 的 %2 分割區。 Install %2 on %3 system partition <strong>%1</strong>. 在 %3 系統分割區 <strong>%1</strong> 上安裝 %2。 Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong>。 Install boot loader on <strong>%1</strong>. 安裝開機載入器於 <strong>%1</strong>。 Setting up mount points. 正在設定掛載點。 FinishedPage Form 型式 &Restart now 現在重新啟動 (&R) <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>都完成了。</h1><br/>%1 已經安裝在您的電腦上了。<br/>您現在可能會想要重新啟動到您的新系統中,或是繼續使用 %2 Live 環境。 <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>安裝失敗</h1><br/>%1 並未安裝到您的電腦上。<br/>錯誤訊息為:%2。 FinishedViewStep Finish 完成 Installation Complete 安裝完成 The installation of %1 is complete. %1 的安裝已完成。 FormatPartitionJob Format partition %1 (file system: %2, size: %3 MB) on %4. 格式化在 %4 的分割區 %1 (檔案系統: %2 ,大小: %3 MB)。 Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. 以檔案系統 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分割區 <strong>%1</strong>。 Formatting partition %1 with file system %2. 正在以 %2 檔案系統格式化分割區 %1。 The installer failed to format partition %1 on disk '%2'. 安裝程式格式化在磁碟 '%2' 上的分割區 %1 失敗。 Could not open device '%1'. 無法開啟裝置 '%1'。 Could not open partition table. 無法開啟分割區表格。 The installer failed to create file system on partition %1. 安裝程式在分割區 %1 上建立檔案系統失敗。 The installer failed to update partition table on disk '%1'. 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 InteractiveTerminalPage Konsole not installed 未安裝 Konsole Please install the kde konsole and try again! 請安裝 kde konsole 然後再試一次! Executing script: &nbsp;<code>%1</code> 正在執行指令稿:&nbsp;<code>%1</code> InteractiveTerminalViewStep Script 指令稿 KeyboardPage Set keyboard model to %1.<br/> 設定鍵盤型號為 %1 。<br/> Set keyboard layout to %1/%2. 設定鍵盤佈局為 %1/%2 。 KeyboardViewStep Keyboard 鍵盤 LCLocaleDialog System locale setting 系統語系設定 The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. 系統語系設定會影響部份命令列使用者介面的語言及字元集。<br/>目前的設定為 <strong>%1</strong>。 &Cancel 取消(&C) &OK 確定(&O) LicensePage Form 表單 I accept the terms and conditions above. 我接受上述的條款與條件。 <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. <h1>授權協定</h1>此安裝程式將會安裝受授權條款所限制的專有軟體。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. 請仔細上方的最終用戶授權協定 (EULA)。<br/>若您不同意上述條款,安裝程式將不會繼續。 <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. <h1>授權協定</h1>此安裝程式可以安裝受授權條款限制的專有軟體,以提供額外的功農與增強使用者體驗。 Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. 請仔細上方的最終用戶授權協定 (EULA)。<br/>若您不同意上述條款,將不會安裝專有軟體,而會使用其開放原始螞碼版本作為替代。 <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver <strong>%1 驅動程式</strong><br/>由 %2 所提供 <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver <strong>%1 顯示卡驅動程式</strong><br/><font color="Grey">由 %2 所提供</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> <strong>%1 瀏覽器外掛程式</strong><br/><font color="Grey">由 %2 所提供</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> <strong>%1 編解碼器</strong><br/><font color="Grey">由 %2 所提供</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> <strong>%1 軟體包</strong><br/><font color="Grey">由 %2 所提供</font> <strong>%1</strong><br/><font color="Grey">by %2</font> <strong>%1</strong><br/><font color="Grey">由 %2 所提供</font> <a href="%1">view license agreement</a> <a href="%1">檢視授權協定</a> LicenseViewStep License 授權條款 LocalePage The system language will be set to %1. 系統語言將會設定為 %1。 The numbers and dates locale will be set to %1. 數字與日期語系將會被設定為 %1。 Region: 地區 Zone: 時區 &Change... 變更...(&C) Set timezone to %1/%2.<br/> 設定時區為 %1/%2 。<br/> %1 (%2) Language (Country) %1 (%2) LocaleViewStep Loading location data... 讀取位置資料 ... Location 位置 MoveFileSystemJob Move file system of partition %1. 移動分割區 %1 的檔案系統。 Could not open file system on partition %1 for moving. 無法開啟在分割區 %1 上的檔案系統來進行移動。 Could not create target for moving file system on partition %1. 無法建立目標以移動分割區 %1 上的檔案系統。 Moving of partition %1 failed, changes have been rolled back. 移動分割區 %1 失敗,所作的修改已回復原狀。 Moving of partition %1 failed. Roll back of the changes have failed. 移動分割區 %1 失敗。恢復所作的修改失敗。 Updating boot sector after the moving of partition %1 failed. 在移動分割區 %1 失敗後,正在更新開機磁區。 The logical sector sizes in the source and target for copying are not the same. This is currently unsupported. 要複製的來源與目標的邏輯磁區大小不相同。目前尚不支援。 Source and target for copying do not overlap: Rollback is not required. 要複製的來源和目標並無交集:不需要恢復所作的修改。 Could not open device %1 to rollback copying. 無法開啟裝置 %1 以恢復所作的複製。 NetInstallPage Name 名稱 Description 描述 Network Installation. (Disabled: Unable to fetch package lists, check your network connection) 網路安裝。(已停用:無法擷取軟體包清單,請檢查您的網路連線) NetInstallViewStep Package selection 軟體包選擇 Page_Keyboard Form Form Keyboard Model: 鍵盤型號: Type here to test your keyboard 在此輸入以測試您的鍵盤 Page_UserSetup Form Form What is your name? 該如何稱呼您? What name do you want to use to log in? 您想使用何種登入名稱? font-weight: normal font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> Choose a password to keep your account safe. 輸入密碼以確保帳號的安全性。 <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> <small>輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。</small> What is the name of this computer? 這部電腦的名字是? <small>This name will be used if you make the computer visible to others on a network.</small> <small>若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。</small> Log in automatically without asking for the password. 不詢問密碼自動登入。 Use the same password for the administrator account. 為管理員帳號使用同樣的密碼。 Choose a password for the administrator account. 替系統管理員帳號設定一組密碼 <small>Enter the same password twice, so that it can be checked for typing errors.</small> <small>輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。</small> PartitionLabelsView Root 根目錄 Home 家目錄 Boot Boot EFI system EFI 系統 Swap Swap New partition for %1 %1 的新分割區 New partition 新分割區 %1 %2 %1 %2 PartitionModel Free Space 剩餘空間 New partition 新分割區 Name 名稱 File System 檔案系統 Mount Point 掛載點 Size 大小 PartitionPage Form Form Storage de&vice: 儲存裝置(&V): &Revert All Changes 將所有變更恢復原狀 (&R) New Partition &Table 新的分割表格 (&T) &Create 新增 (&C) &Edit 編輯 (&E) &Delete 刪除 (&D) Install boot &loader on: 安裝開機載入器在(&L): Are you sure you want to create a new partition table on %1? 您是否確定要在 %1 上建立一個新的分割區表格? PartitionViewStep Gathering system information... 蒐集系統資訊中... Partitions 分割區 Install %1 <strong>alongside</strong> another operating system. 將 %1 安裝在其他作業系統<strong>旁邊</strong>。 <strong>Erase</strong> disk and install %1. <strong>抹除</strong>磁碟並安裝 %1。 <strong>Replace</strong> a partition with %1. 以 %1 <strong>取代</strong>一個分割區。 <strong>Manual</strong> partitioning. <strong>手動</strong>分割 Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). 將 %1 安裝在磁碟 <strong>%2</strong> (%3) 上的另一個作業系統<strong>旁邊</strong>。 <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>抹除</strong> 磁碟 <strong>%2</strong> (%3) 並且安裝 %1。 <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. 以 %1 <strong>取代</strong> 一個在磁碟 <strong>%2</strong> (%3) 上的分割區。 <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). 在磁碟 <strong>%1</strong> (%2) 上<strong>手動</strong>分割。 Disk <strong>%1</strong> (%2) 磁碟 <strong>%1</strong> (%2) Current: 目前: After: 之後: No EFI system partition configured 未設定 EFI 系統分割區 An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. 需要一個 EFI 系統分割區以啟動 %1。<br/><br/>要設定 EFI 系統分割區,回到上一步並選取或建立一個包含啟用的 <strong>esp</strong> 旗標以及掛載點 <strong>%2</strong> 的 FAT32 檔案系統。<br/><br/>您也可以不設定 EFI 系統分割區並繼續,但是您的系統可能會啟動失敗。 EFI system partition flag not set EFI 系統分割區旗標未設定 An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. 需要一個 EFI 系統分割區以啟動 %1。<br/><br/>有一個掛載點設定為 <strong>%2</strong> 但未設定 <strong>esp</strong> 旗標的分割區。<br/>要設定此旗標,回到上一步並編輯分割區。<br/><br/>您也可以不設定旗標而繼續,但您的系統可能會啟動失敗。 Boot partition not encrypted 開機分割區未加密 A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. 單獨的開機分割區會與加密的根分割區一起設定,但是開機分割區並不會被加密。<br/><br/>這種設定可能會造成安全性問題,因為系統檔案放在未加密的分割區中。<br/>若您想要,您可以繼續,但是檔案系統的解鎖會在系統啟動後才發生。<br/>要加密開機分割區,回到上一頁並重新建立它,在分割區建立視窗中選取<strong>加密</strong>。 QObject Default Keyboard Model 預設鍵盤型號 Default 預設值 unknown 未知 extended 延伸分割區 unformatted 未格式化 swap swap Unpartitioned space or unknown partition table 尚未分割的空間或是未知的分割表 ReplaceWidget Form 表單 Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. 選取要在哪裡安裝 %1。<br/><font color="red">警告:</font>這將會刪除所有在選定分割區中的檔案。 The selected item does not appear to be a valid partition. 選定的項目似乎不是一個有效的分割區。 %1 cannot be installed on empty space. Please select an existing partition. %1 無法在空白的空間中安裝。請選取一個存在的分割區。 %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 無法在延伸分割區上安裝。請選取一個存在的主要或邏輯分割區。 %1 cannot be installed on this partition. %1 無法在此分割區上安裝。 Data partition (%1) 資料分割區 (%1) Unknown system partition (%1) 未知的系統分割區 (%1) %1 system partition (%2) %1 系統分割區 (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>分割區 %1 對 %2 來說太小了。請選取一個容量至少有 %3 GiB 的分割區。 <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>在這個系統上找不到任何的 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 將會安裝在 %2 上。<br/><font color="red">警告: </font>所有在分割區 %2 上的資料都將會遺失。 The EFI system partition at %1 will be used for starting %2. 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 EFI system partition: EFI 系統分割區: RequirementsChecker Gathering system information... 收集系統資訊中... has at least %1 GB available drive space 有至少 %1 GB 的可用磁碟空間 There is not enough drive space. At least %1 GB is required. 沒有足夠的磁碟空間。至少需要 %1 GB。 has at least %1 GB working memory 有至少 %1 GB 的可用記憶體 The system does not have enough working memory. At least %1 GB is required. 系統沒有足夠的記憶體。至少需要 %1 GB。 is plugged in to a power source 已插入外接電源 The system is not plugged in to a power source. 系統未插入外接電源。 is connected to the Internet 已連上網際網路 The system is not connected to the Internet. 系統未連上網際網路 The installer is not running with administrator rights. 安裝程式並未以管理員權限執行。 The screen is too small to display the installer. 螢幕太小了,沒辦法顯示安裝程式。 ResizeFileSystemJob Resize file system on partition %1. 調整分割區 %1 上的檔案系統大小。 Parted failed to resize filesystem. Parted 調整檔案系統大小失敗。 Failed to resize filesystem. 調整檔案系統大小失敗。 ResizePartitionJob Resize partition %1. 調整分割區 %1 大小。 Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. 重新調整 <strong>%2MB</strong> 的分割區 <strong>%1</strong> 到 <strong>%3MB</strong>。 Resizing %2MB partition %1 to %3MB. 調整 %2MB 分割區 %1 至 %3MB。 The installer failed to resize partition %1 on disk '%2'. 安裝程式調整在磁碟 '%2' 上的分割區 %1 的大小失敗。 Could not open device '%1'. 無法開啟裝置 '%1'。 ScanningDialog Scanning storage devices... 正在掃描儲存裝置... Partitioning 正在分割 SetHostNameJob Set hostname %1 設定主機名 %1 Set hostname <strong>%1</strong>. 設定主機名稱 <strong>%1</strong>。 Setting hostname %1. 正在設定主機名稱 %1。 Internal Error 內部錯誤 Cannot write hostname to target system 無法寫入主機名稱到目標系統 SetKeyboardLayoutJob Set keyboard model to %1, layout to %2-%3 將鍵盤型號設定為 %1,佈局為 %2-%3 Failed to write keyboard configuration for the virtual console. 為虛擬終端機寫入鍵盤設定失敗。 Failed to write to %1 寫入到 %1 失敗 Failed to write keyboard configuration for X11. 為 X11 寫入鍵盤設定失敗。 Failed to write keyboard configuration to existing /etc/default directory. 寫入鍵盤設定到已存在的 /etc/default 目錄失敗。 SetPartFlagsJob Set flags on partition %1. 在分割區 %1 上設定旗標。 Set flags on %1MB %2 partition. 在 %1MB 的 %2 分割區上設定旗標。 Set flags on new partition. 在新分割區上設定旗標。 Clear flags on partition <strong>%1</strong>. 在分割區 <strong>%1</strong> 上清除旗標。 Clear flags on %1MB <strong>%2</strong> partition. 清除在 %1MB 的 <strong>%2</strong> 分割區上的旗標。 Clear flags on new partition. 清除在新分割區上的旗標。 Flag partition <strong>%1</strong> as <strong>%2</strong>. 將分割區 <strong>%1</strong> 的旗標設定為 <strong>%2</strong>。 Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. 將 %1MB 的 <strong>%2</strong> 分割區旗標設定為 <strong>%3</strong>。 Flag new partition as <strong>%1</strong>. 將新割區旗標設定為 <strong>%1</strong>。 Clearing flags on partition <strong>%1</strong>. 正在分割區 <strong>%1</strong> 上清除旗標。 Clearing flags on %1MB <strong>%2</strong> partition. 清除在 %1MB 的 <strong>%2</strong> 分割區上的旗標。 Clearing flags on new partition. 清除在新分割區上的旗標。 Setting flags <strong>%2</strong> on partition <strong>%1</strong>. 正在分割區 <strong>%1</strong> 上設定旗標。 Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. 正在 %1MB 的 <strong>%2</strong> 分割區上設定旗標 <strong>%3</strong>。 Setting flags <strong>%1</strong> on new partition. 正在新分割區上設定旗標 <strong>%1</strong>。 The installer failed to set flags on partition %1. 安裝程式在分割區 %1 上設定旗標失敗。 Could not open device '%1'. 無法開啟裝置「%1」。 Could not open partition table on device '%1'. 無法開啟在裝置「%1」上的分割區表格。 Could not find partition '%1'. 找不到分割區「%1」。 SetPartGeometryJob Update geometry of partition %1. 更新分割區 %1 佈局。 Failed to change the geometry of the partition. 更改分割區佈局失敗。 SetPasswordJob Set password for user %1 為使用者 %1 設定密碼 Setting password for user %1. 正在為使用者 %1 設定密碼。 Bad destination system path. 非法的目標系統路徑。 rootMountPoint is %1 根掛載點為 %1 Cannot disable root account. 無法停用 root 帳號。 passwd terminated with error code %1. passwd 以錯誤代碼 %1 終止。 Cannot set password for user %1. 無法為使用者 %1 設定密碼。 usermod terminated with error code %1. usermod 以錯誤代碼 %1 終止。 SetTimezoneJob Set timezone to %1/%2 設定時區為 %1/%2 Cannot access selected timezone path. 無法存取指定的時區路徑。 Bad path: %1 非法路徑:%1 Cannot set timezone. 無法設定時區。 Link creation failed, target: %1; link name: %2 連結建立失敗,目標:%1;連結名稱:%2 Cannot set timezone, 無法設定時區。 Cannot open /etc/timezone for writing 無法開啟要寫入的 /etc/timezone SummaryPage This is an overview of what will happen once you start the install procedure. 這是您開始安裝後所會發生的事的概覽。 SummaryViewStep Summary 總覽 UsersPage Your username is too long. 您的使用者名稱太長了。 Your username contains invalid characters. Only lowercase letters and numbers are allowed. 您的使用者名稱含有無效的字元。只能使用小寫字母及數字。 Your hostname is too short. 您的主機名稱太短了。 Your hostname is too long. 您的主機名稱太長了。 Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. 您的主機名稱含有無效的字元。只能使用字母、數字及破折號。 Your passwords do not match! 密碼不符! UsersViewStep Users 使用者 WelcomePage Form 表單 &Language: 語言(&L): &Release notes 發行註記(&R) &Known issues 已知問題(&K) &Support 支援(&S) &About 關於(&A) <h1>Welcome to the %1 installer.</h1> <h1>歡迎使用 %1 安裝程式。</h1> <h1>Welcome to the Calamares installer for %1.</h1> <h1>歡迎使用 %1 的 Calamares 安裝程式。</h1> About %1 installer 關於 %1 安裝程式 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="http://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>為 %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>感謝:Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg 與 <a href="https://www.transifex.com/calamares/calamares/">Calamares 翻譯團隊</a>。<br/><br/><a href="http://calamares.io/">Calamares</a> 開發由 <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 贊助。 %1 support %1 支援 WelcomeViewStep Welcome 歡迎 calamares-3.1.12/lang/python.pot000066400000000000000000000030471322271446000165210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generate machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Processing packages (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Installing one package." msgstr[1] "Installing %(num)d packages." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Removing one package." msgstr[1] "Removing %(num)d packages." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Install packages." calamares-3.1.12/lang/python/000077500000000000000000000000001322271446000157715ustar00rootroot00000000000000calamares-3.1.12/lang/python/ar/000077500000000000000000000000001322271446000163735ustar00rootroot00000000000000calamares-3.1.12/lang/python/ar/LC_MESSAGES/000077500000000000000000000000001322271446000201605ustar00rootroot00000000000000calamares-3.1.12/lang/python/ar/LC_MESSAGES/python.mo000066400000000000000000000007671322271446000220500ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ar Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5; calamares-3.1.12/lang/python/ar/LC_MESSAGES/python.po000066400000000000000000000027741322271446000220530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/ast/000077500000000000000000000000001322271446000165605ustar00rootroot00000000000000calamares-3.1.12/lang/python/ast/LC_MESSAGES/000077500000000000000000000000001322271446000203455ustar00rootroot00000000000000calamares-3.1.12/lang/python/ast/LC_MESSAGES/python.mo000066400000000000000000000012341322271446000222230ustar00rootroot00000000000000<\pqOlDummy python job.Dummy python step {}Generate machine-id.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: enolp , 2017 Language-Team: Asturian (https://www.transifex.com/calamares/teams/20061/ast/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ast Plural-Forms: nplurals=2; plural=(n != 1); Trabayu maniquín de python.Pasu maniquín de python {}Xenerar machine-id.calamares-3.1.12/lang/python/ast/LC_MESSAGES/python.po000066400000000000000000000027061322271446000222330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: enolp , 2017\n" "Language-Team: Asturian (https://www.transifex.com/calamares/teams/20061/ast/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Xenerar machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Trabayu maniquín de python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Pasu maniquín de python {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/bg/000077500000000000000000000000001322271446000163615ustar00rootroot00000000000000calamares-3.1.12/lang/python/bg/LC_MESSAGES/000077500000000000000000000000001322271446000201465ustar00rootroot00000000000000calamares-3.1.12/lang/python/bg/LC_MESSAGES/python.mo000066400000000000000000000006471322271446000220330ustar00rootroot00000000000000$,8m9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: bg Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/bg/LC_MESSAGES/python.po000066400000000000000000000025041322271446000220300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/ca/000077500000000000000000000000001322271446000163545ustar00rootroot00000000000000calamares-3.1.12/lang/python/ca/LC_MESSAGES/000077500000000000000000000000001322271446000201415ustar00rootroot00000000000000calamares-3.1.12/lang/python/ca/LC_MESSAGES/python.mo000066400000000000000000000021121322271446000220130ustar00rootroot00000000000000\ 4+L0xHc#}5*/Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Davidmp , 2017 Language-Team: Catalan (https://www.transifex.com/calamares/teams/20061/ca/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ca Plural-Forms: nplurals=2; plural=(n != 1); Tasca de python fictícia.Pas de python fitctici {}Generació de l'id. de la màquina.Instal·la els paquets.Instal·lant un paquet.Instal·lant %(num)d paquets.Processant paquets (%(count)d / %(total)d)Eliminant un paquet.Eliminant %(num)d paquets.calamares-3.1.12/lang/python/ca/LC_MESSAGES/python.po000066400000000000000000000031621322271446000220240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Davidmp , 2017\n" "Language-Team: Catalan (https://www.transifex.com/calamares/teams/20061/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generació de l'id. de la màquina." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Tasca de python fictícia." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Pas de python fitctici {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Processant paquets (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Instal·lant un paquet." msgstr[1] "Instal·lant %(num)d paquets." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Eliminant un paquet." msgstr[1] "Eliminant %(num)d paquets." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instal·la els paquets." calamares-3.1.12/lang/python/cs_CZ/000077500000000000000000000000001322271446000167725ustar00rootroot00000000000000calamares-3.1.12/lang/python/cs_CZ/LC_MESSAGES/000077500000000000000000000000001322271446000205575ustar00rootroot00000000000000calamares-3.1.12/lang/python/cs_CZ/LC_MESSAGES/python.mo000066400000000000000000000014051322271446000224350ustar00rootroot00000000000000DlDummy python job.Dummy python step {}Generate machine-id.Install packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: pavelrz , 2017 Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: cs_CZ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; Testovací úloha python.Testovací krok {} python.Vytvořit machine-id.Instalovat balíčky.calamares-3.1.12/lang/python/cs_CZ/LC_MESSAGES/python.po000066400000000000000000000030361322271446000224420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: pavelrz , 2017\n" "Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Vytvořit machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Testovací úloha python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Testovací krok {} python." #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instalovat balíčky." calamares-3.1.12/lang/python/da/000077500000000000000000000000001322271446000163555ustar00rootroot00000000000000calamares-3.1.12/lang/python/da/LC_MESSAGES/000077500000000000000000000000001322271446000201425ustar00rootroot00000000000000calamares-3.1.12/lang/python/da/LC_MESSAGES/python.mo000066400000000000000000000020511322271446000220160ustar00rootroot00000000000000\ 4+L0xTf{0*)Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Dan Johansen (Strit) , 2017 Language-Team: Danish (https://www.transifex.com/calamares/teams/20061/da/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: da Plural-Forms: nplurals=2; plural=(n != 1); Dummy python-job.Dummy python-trin {}Generere maskine-id.Installér pakker.Installerer én pakke.Installer %(num)d pakker.Forarbejder pakker (%(count)d / %(total)d)Fjerner én pakke.Fjerne %(num)d pakker.calamares-3.1.12/lang/python/da/LC_MESSAGES/python.po000066400000000000000000000031211322271446000220200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Dan Johansen (Strit) , 2017\n" "Language-Team: Danish (https://www.transifex.com/calamares/teams/20061/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generere maskine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python-job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python-trin {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Forarbejder pakker (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Installerer én pakke." msgstr[1] "Installer %(num)d pakker." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Fjerner én pakke." msgstr[1] "Fjerne %(num)d pakker." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Installér pakker." calamares-3.1.12/lang/python/de/000077500000000000000000000000001322271446000163615ustar00rootroot00000000000000calamares-3.1.12/lang/python/de/LC_MESSAGES/000077500000000000000000000000001322271446000201465ustar00rootroot00000000000000calamares-3.1.12/lang/python/de/LC_MESSAGES/python.mo000066400000000000000000000006441322271446000220300ustar00rootroot00000000000000$,8j9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: de Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/de/LC_MESSAGES/python.po000066400000000000000000000025011322271446000220250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/el/000077500000000000000000000000001322271446000163715ustar00rootroot00000000000000calamares-3.1.12/lang/python/el/LC_MESSAGES/000077500000000000000000000000001322271446000201565ustar00rootroot00000000000000calamares-3.1.12/lang/python/el/LC_MESSAGES/python.mo000066400000000000000000000006431322271446000220370ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Greek (https://www.transifex.com/calamares/teams/20061/el/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: el Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/el/LC_MESSAGES/python.po000066400000000000000000000025001322271446000220340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Greek (https://www.transifex.com/calamares/teams/20061/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/en_GB/000077500000000000000000000000001322271446000167435ustar00rootroot00000000000000calamares-3.1.12/lang/python/en_GB/LC_MESSAGES/000077500000000000000000000000001322271446000205305ustar00rootroot00000000000000calamares-3.1.12/lang/python/en_GB/LC_MESSAGES/python.mo000066400000000000000000000006741322271446000224150ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: en_GB Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/en_GB/LC_MESSAGES/python.po000066400000000000000000000025311322271446000224120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/es/000077500000000000000000000000001322271446000164005ustar00rootroot00000000000000calamares-3.1.12/lang/python/es/LC_MESSAGES/000077500000000000000000000000001322271446000201655ustar00rootroot00000000000000calamares-3.1.12/lang/python/es/LC_MESSAGES/python.mo000066400000000000000000000021071322271446000220430ustar00rootroot00000000000000\ 4+L0xGa#|3+3Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: strel , 2017 Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es Plural-Forms: nplurals=2; plural=(n != 1); Tarea de python ficticia.Paso {} de python ficticioGenerar identificación-de-maquina.Instalar paquetes.Instalando un paquete.Instalando %(num)d paquetes.Procesando paquetes (%(count)d / %(total)d)Eliminando un paquete.Eliminando %(num)d paquetes.calamares-3.1.12/lang/python/es/LC_MESSAGES/python.po000066400000000000000000000031571322271446000220540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: strel , 2017\n" "Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generar identificación-de-maquina." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Tarea de python ficticia." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Paso {} de python ficticio" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Procesando paquetes (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Instalando un paquete." msgstr[1] "Instalando %(num)d paquetes." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Eliminando un paquete." msgstr[1] "Eliminando %(num)d paquetes." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instalar paquetes." calamares-3.1.12/lang/python/es_ES/000077500000000000000000000000001322271446000167675ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_ES/LC_MESSAGES/000077500000000000000000000000001322271446000205545ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_ES/LC_MESSAGES/python.mo000066400000000000000000000006631322271446000224370ustar00rootroot00000000000000$,8y9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Spain) (https://www.transifex.com/calamares/teams/20061/es_ES/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_ES Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/es_ES/LC_MESSAGES/python.po000066400000000000000000000025201322271446000224340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/calamares/teams/20061/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/es_MX/000077500000000000000000000000001322271446000170045ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_MX/LC_MESSAGES/000077500000000000000000000000001322271446000205715ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_MX/LC_MESSAGES/python.mo000066400000000000000000000006641322271446000224550ustar00rootroot00000000000000$,8z9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_MX Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/es_MX/LC_MESSAGES/python.po000066400000000000000000000025211322271446000224520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/es_PR/000077500000000000000000000000001322271446000170015ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_PR/LC_MESSAGES/000077500000000000000000000000001322271446000205665ustar00rootroot00000000000000calamares-3.1.12/lang/python/es_PR/LC_MESSAGES/python.mo000066400000000000000000000006711322271446000224500ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Puerto Rico) (https://www.transifex.com/calamares/teams/20061/es_PR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_PR Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/es_PR/LC_MESSAGES/python.po000066400000000000000000000025261322271446000224540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Puerto Rico) (https://www.transifex.com/calamares/teams/20061/es_PR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_PR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/et/000077500000000000000000000000001322271446000164015ustar00rootroot00000000000000calamares-3.1.12/lang/python/et/LC_MESSAGES/000077500000000000000000000000001322271446000201665ustar00rootroot00000000000000calamares-3.1.12/lang/python/et/LC_MESSAGES/python.mo000066400000000000000000000006461322271446000220520ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: et Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/et/LC_MESSAGES/python.po000066400000000000000000000025031322271446000220470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/eu/000077500000000000000000000000001322271446000164025ustar00rootroot00000000000000calamares-3.1.12/lang/python/eu/LC_MESSAGES/000077500000000000000000000000001322271446000201675ustar00rootroot00000000000000calamares-3.1.12/lang/python/eu/LC_MESSAGES/python.mo000066400000000000000000000006441322271446000220510ustar00rootroot00000000000000$,8j9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: eu Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/eu/LC_MESSAGES/python.po000066400000000000000000000025011322271446000220460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/fa/000077500000000000000000000000001322271446000163575ustar00rootroot00000000000000calamares-3.1.12/lang/python/fa/LC_MESSAGES/000077500000000000000000000000001322271446000201445ustar00rootroot00000000000000calamares-3.1.12/lang/python/fa/LC_MESSAGES/python.mo000066400000000000000000000006361322271446000220270ustar00rootroot00000000000000$,8d9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Persian (https://www.transifex.com/calamares/teams/20061/fa/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fa Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/lang/python/fa/LC_MESSAGES/python.po000066400000000000000000000024411322271446000220260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Persian (https://www.transifex.com/calamares/teams/20061/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/fi_FI/000077500000000000000000000000001322271446000167455ustar00rootroot00000000000000calamares-3.1.12/lang/python/fi_FI/LC_MESSAGES/000077500000000000000000000000001322271446000205325ustar00rootroot00000000000000calamares-3.1.12/lang/python/fi_FI/LC_MESSAGES/python.mo000066400000000000000000000006651322271446000224170ustar00rootroot00000000000000$,8{9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Finnish (Finland) (https://www.transifex.com/calamares/teams/20061/fi_FI/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fi_FI Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/fi_FI/LC_MESSAGES/python.po000066400000000000000000000025221322271446000224140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Finnish (Finland) (https://www.transifex.com/calamares/teams/20061/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/fr/000077500000000000000000000000001322271446000164005ustar00rootroot00000000000000calamares-3.1.12/lang/python/fr/LC_MESSAGES/000077500000000000000000000000001322271446000201655ustar00rootroot00000000000000calamares-3.1.12/lang/python/fr/LC_MESSAGES/python.mo000066400000000000000000000006431322271446000220460ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fr Plural-Forms: nplurals=2; plural=(n > 1); calamares-3.1.12/lang/python/fr/LC_MESSAGES/python.po000066400000000000000000000025001322271446000220430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/fr_CH/000077500000000000000000000000001322271446000167525ustar00rootroot00000000000000calamares-3.1.12/lang/python/fr_CH/LC_MESSAGES/000077500000000000000000000000001322271446000205375ustar00rootroot00000000000000calamares-3.1.12/lang/python/fr_CH/LC_MESSAGES/python.mo000066400000000000000000000006671322271446000224260ustar00rootroot00000000000000$,8}9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: French (Switzerland) (https://www.transifex.com/calamares/teams/20061/fr_CH/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fr_CH Plural-Forms: nplurals=2; plural=(n > 1); calamares-3.1.12/lang/python/fr_CH/LC_MESSAGES/python.po000066400000000000000000000025241322271446000224230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: French (Switzerland) (https://www.transifex.com/calamares/teams/20061/fr_CH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_CH\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/gl/000077500000000000000000000000001322271446000163735ustar00rootroot00000000000000calamares-3.1.12/lang/python/gl/LC_MESSAGES/000077500000000000000000000000001322271446000201605ustar00rootroot00000000000000calamares-3.1.12/lang/python/gl/LC_MESSAGES/python.mo000066400000000000000000000006461322271446000220440ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Galician (https://www.transifex.com/calamares/teams/20061/gl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: gl Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/gl/LC_MESSAGES/python.po000066400000000000000000000025031322271446000220410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Galician (https://www.transifex.com/calamares/teams/20061/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/gu/000077500000000000000000000000001322271446000164045ustar00rootroot00000000000000calamares-3.1.12/lang/python/gu/LC_MESSAGES/000077500000000000000000000000001322271446000201715ustar00rootroot00000000000000calamares-3.1.12/lang/python/gu/LC_MESSAGES/python.mo000066400000000000000000000006461322271446000220550ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Gujarati (https://www.transifex.com/calamares/teams/20061/gu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: gu Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/gu/LC_MESSAGES/python.po000066400000000000000000000025031322271446000220520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Gujarati (https://www.transifex.com/calamares/teams/20061/gu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/he/000077500000000000000000000000001322271446000163655ustar00rootroot00000000000000calamares-3.1.12/lang/python/he/LC_MESSAGES/000077500000000000000000000000001322271446000201525ustar00rootroot00000000000000calamares-3.1.12/lang/python/he/LC_MESSAGES/python.mo000066400000000000000000000021701322271446000220300ustar00rootroot00000000000000\ 4+L0xMl1>+:=Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Eli Shleifer , 2017 Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: he Plural-Forms: nplurals=2; plural=(n != 1); משימת דמה של Python.צעד דמה של Python {}חולל מספר סידורי של המכונה.התקן חבילות.מתקין חבילה אחת.מתקין %(num)d חבילות.מעבד חבילות (%(count)d/%(total)d)מסיר חבילה אחת.מסיר %(num)d חבילות.calamares-3.1.12/lang/python/he/LC_MESSAGES/python.po000066400000000000000000000032401322271446000220320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Eli Shleifer , 2017\n" "Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "חולל מספר סידורי של המכונה." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "משימת דמה של Python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "צעד דמה של Python {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "מעבד חבילות (%(count)d/%(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "מתקין חבילה אחת." msgstr[1] "מתקין %(num)d חבילות." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "מסיר חבילה אחת." msgstr[1] "מסיר %(num)d חבילות." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "התקן חבילות." calamares-3.1.12/lang/python/hi/000077500000000000000000000000001322271446000163715ustar00rootroot00000000000000calamares-3.1.12/lang/python/hi/LC_MESSAGES/000077500000000000000000000000001322271446000201565ustar00rootroot00000000000000calamares-3.1.12/lang/python/hi/LC_MESSAGES/python.mo000066400000000000000000000006431322271446000220370ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hi Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/hi/LC_MESSAGES/python.po000066400000000000000000000025001322271446000220340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/hr/000077500000000000000000000000001322271446000164025ustar00rootroot00000000000000calamares-3.1.12/lang/python/hr/LC_MESSAGES/000077500000000000000000000000001322271446000201675ustar00rootroot00000000000000calamares-3.1.12/lang/python/hr/LC_MESSAGES/python.mo000066400000000000000000000022531322271446000220470ustar00rootroot00000000000000\ 4+L0xG)?AiDummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Lovro Kudelić , 2017 Language-Team: Croatian (https://www.transifex.com/calamares/teams/20061/hr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hr Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; Testni python posao.Testni python korak {}Generiraj ID računala.Instaliraj pakete.Instaliram paket.Instaliram %(num)d pakete.Instaliram %(num)d pakete.Obrađujem pakete (%(count)d / %(total)d)Uklanjam paket.Uklanjam %(num)d pakete.Uklanjam %(num)d pakete.calamares-3.1.12/lang/python/hr/LC_MESSAGES/python.po000066400000000000000000000033531322271446000220540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Lovro Kudelić , 2017\n" "Language-Team: Croatian (https://www.transifex.com/calamares/teams/20061/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generiraj ID računala." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Testni python posao." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Testni python korak {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Obrađujem pakete (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Instaliram paket." msgstr[1] "Instaliram %(num)d pakete." msgstr[2] "Instaliram %(num)d pakete." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Uklanjam paket." msgstr[1] "Uklanjam %(num)d pakete." msgstr[2] "Uklanjam %(num)d pakete." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instaliraj pakete." calamares-3.1.12/lang/python/hu/000077500000000000000000000000001322271446000164055ustar00rootroot00000000000000calamares-3.1.12/lang/python/hu/LC_MESSAGES/000077500000000000000000000000001322271446000201725ustar00rootroot00000000000000calamares-3.1.12/lang/python/hu/LC_MESSAGES/python.mo000066400000000000000000000015371322271446000220560ustar00rootroot00000000000000L |+#(.0Dummy python job.Dummy python step {}Generate machine-id.Install packages.Processing packages (%(count)d / %(total)d)Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: miku84 , 2017 Language-Team: Hungarian (https://www.transifex.com/calamares/teams/20061/hu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hu Plural-Forms: nplurals=2; plural=(n != 1); Hamis PythonQt Job.Hamis PythonQt {} lépésSzámítógép azonosító generálása.Csomagok telepítése.Csomagok feldolgozása (%(count)d / %(total)d)calamares-3.1.12/lang/python/hu/LC_MESSAGES/python.po000066400000000000000000000030211322271446000220470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: miku84 , 2017\n" "Language-Team: Hungarian (https://www.transifex.com/calamares/teams/20061/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Számítógép azonosító generálása." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Hamis PythonQt Job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Hamis PythonQt {} lépés" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Csomagok feldolgozása (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Csomagok telepítése." calamares-3.1.12/lang/python/id/000077500000000000000000000000001322271446000163655ustar00rootroot00000000000000calamares-3.1.12/lang/python/id/LC_MESSAGES/000077500000000000000000000000001322271446000201525ustar00rootroot00000000000000calamares-3.1.12/lang/python/id/LC_MESSAGES/python.mo000066400000000000000000000012051322271446000220260ustar00rootroot00000000000000<\pqI[pDummy python job.Dummy python step {}Generate machine-id.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Wantoyo , 2017 Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: id Plural-Forms: nplurals=1; plural=0; Dummy python job.Dummy python step {}Generate machine-id.calamares-3.1.12/lang/python/id/LC_MESSAGES/python.po000066400000000000000000000026251322271446000220400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Wantoyo , 2017\n" "Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generate machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/is/000077500000000000000000000000001322271446000164045ustar00rootroot00000000000000calamares-3.1.12/lang/python/is/LC_MESSAGES/000077500000000000000000000000001322271446000201715ustar00rootroot00000000000000calamares-3.1.12/lang/python/is/LC_MESSAGES/python.mo000066400000000000000000000021051322271446000220450ustar00rootroot00000000000000\ 4+L0xt.%.Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Kristján Magnússon , 2017 Language-Team: Icelandic (https://www.transifex.com/calamares/teams/20061/is/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: is Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11); Dummy python job.Dummy python step {}Generate machine-id.Setja upp pakka.Setja upp einn pakka.Setur upp %(num)d pakka.Vinnslupakkar (%(count)d / %(total)d)Fjarlægi einn pakka.Fjarlægi %(num)d pakka.calamares-3.1.12/lang/python/is/LC_MESSAGES/python.po000066400000000000000000000031551322271446000220560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kristján Magnússon , 2017\n" "Language-Team: Icelandic (https://www.transifex.com/calamares/teams/20061/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generate machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Vinnslupakkar (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Setja upp einn pakka." msgstr[1] "Setur upp %(num)d pakka." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Fjarlægi einn pakka." msgstr[1] "Fjarlægi %(num)d pakka." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Setja upp pakka." calamares-3.1.12/lang/python/it_IT/000077500000000000000000000000001322271446000170015ustar00rootroot00000000000000calamares-3.1.12/lang/python/it_IT/LC_MESSAGES/000077500000000000000000000000001322271446000205665ustar00rootroot00000000000000calamares-3.1.12/lang/python/it_IT/LC_MESSAGES/python.mo000066400000000000000000000006631322271446000224510ustar00rootroot00000000000000$,8y9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: it_IT Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/it_IT/LC_MESSAGES/python.po000066400000000000000000000025201322271446000224460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/ja/000077500000000000000000000000001322271446000163635ustar00rootroot00000000000000calamares-3.1.12/lang/python/ja/LC_MESSAGES/000077500000000000000000000000001322271446000201505ustar00rootroot00000000000000calamares-3.1.12/lang/python/ja/LC_MESSAGES/python.mo000066400000000000000000000021071322271446000220260ustar00rootroot00000000000000\ 4+L0xVh}$33'Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Takefumi Nagata , 2017 Language-Team: Japanese (https://www.transifex.com/calamares/teams/20061/ja/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ja Plural-Forms: nplurals=1; plural=0; Dummy python job.Dummy python step {}machine-id の生成パッケージのインストール %(num)d パッケージのインストール中。パッケージの処理中 (%(count)d / %(total)d) %(num)d パッケージの削除中。calamares-3.1.12/lang/python/ja/LC_MESSAGES/python.po000066400000000000000000000031271322271446000220340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Takefumi Nagata , 2017\n" "Language-Team: Japanese (https://www.transifex.com/calamares/teams/20061/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "machine-id の生成" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "パッケージの処理中 (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] " %(num)d パッケージのインストール中。" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] " %(num)d パッケージの削除中。" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "パッケージのインストール" calamares-3.1.12/lang/python/kk/000077500000000000000000000000001322271446000163765ustar00rootroot00000000000000calamares-3.1.12/lang/python/kk/LC_MESSAGES/000077500000000000000000000000001322271446000201635ustar00rootroot00000000000000calamares-3.1.12/lang/python/kk/LC_MESSAGES/python.mo000066400000000000000000000006351322271446000220450ustar00rootroot00000000000000$,8c9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Kazakh (https://www.transifex.com/calamares/teams/20061/kk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: kk Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/lang/python/kk/LC_MESSAGES/python.po000066400000000000000000000024401322271446000220440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Kazakh (https://www.transifex.com/calamares/teams/20061/kk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/lo/000077500000000000000000000000001322271446000164035ustar00rootroot00000000000000calamares-3.1.12/lang/python/lo/LC_MESSAGES/000077500000000000000000000000001322271446000201705ustar00rootroot00000000000000calamares-3.1.12/lang/python/lo/LC_MESSAGES/python.mo000066400000000000000000000006321322271446000220470ustar00rootroot00000000000000$,8`9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Lao (https://www.transifex.com/calamares/teams/20061/lo/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: lo Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/lang/python/lo/LC_MESSAGES/python.po000066400000000000000000000024351322271446000220550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Lao (https://www.transifex.com/calamares/teams/20061/lo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lo\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/lt/000077500000000000000000000000001322271446000164105ustar00rootroot00000000000000calamares-3.1.12/lang/python/lt/LC_MESSAGES/000077500000000000000000000000001322271446000201755ustar00rootroot00000000000000calamares-3.1.12/lang/python/lt/LC_MESSAGES/python.mo000066400000000000000000000022671322271446000220620ustar00rootroot00000000000000\ 4+L0xT*:QeDummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Moo , 2017 Language-Team: Lithuanian (https://www.transifex.com/calamares/teams/20061/lt/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: lt Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); Fiktyvi python užduotis.Fiktyvus python žingsnis {}Generuoti machine-id.Įdiegti paketus.Įdiegiamas %(num)d paketas.Įdiegiami %(num)d paketai.Įdiegiama %(num)d paketų.Apdorojami paketai (%(count)d / %(total)d)Šalinamas %(num)d paketas.Šalinami %(num)d paketai.Šalinama %(num)d paketų.calamares-3.1.12/lang/python/lt/LC_MESSAGES/python.po000066400000000000000000000033671322271446000220670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Moo , 2017\n" "Language-Team: Lithuanian (https://www.transifex.com/calamares/teams/20061/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generuoti machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Fiktyvi python užduotis." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Fiktyvus python žingsnis {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Apdorojami paketai (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Įdiegiamas %(num)d paketas." msgstr[1] "Įdiegiami %(num)d paketai." msgstr[2] "Įdiegiama %(num)d paketų." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Šalinamas %(num)d paketas." msgstr[1] "Šalinami %(num)d paketai." msgstr[2] "Šalinama %(num)d paketų." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Įdiegti paketus." calamares-3.1.12/lang/python/mr/000077500000000000000000000000001322271446000164075ustar00rootroot00000000000000calamares-3.1.12/lang/python/mr/LC_MESSAGES/000077500000000000000000000000001322271446000201745ustar00rootroot00000000000000calamares-3.1.12/lang/python/mr/LC_MESSAGES/python.mo000066400000000000000000000006451322271446000220570ustar00rootroot00000000000000$,8k9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Marathi (https://www.transifex.com/calamares/teams/20061/mr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: mr Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/mr/LC_MESSAGES/python.po000066400000000000000000000025021322271446000220540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Marathi (https://www.transifex.com/calamares/teams/20061/mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/nb/000077500000000000000000000000001322271446000163705ustar00rootroot00000000000000calamares-3.1.12/lang/python/nb/LC_MESSAGES/000077500000000000000000000000001322271446000201555ustar00rootroot00000000000000calamares-3.1.12/lang/python/nb/LC_MESSAGES/python.mo000066400000000000000000000006571322271446000220430ustar00rootroot00000000000000$,8u9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Norwegian Bokmål (https://www.transifex.com/calamares/teams/20061/nb/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: nb Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/nb/LC_MESSAGES/python.po000066400000000000000000000025141322271446000220400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/calamares/teams/20061/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/nl/000077500000000000000000000000001322271446000164025ustar00rootroot00000000000000calamares-3.1.12/lang/python/nl/LC_MESSAGES/000077500000000000000000000000001322271446000201675ustar00rootroot00000000000000calamares-3.1.12/lang/python/nl/LC_MESSAGES/python.mo000066400000000000000000000012221322271446000220420ustar00rootroot00000000000000<\pqOe~Dummy python job.Dummy python step {}Generate machine-id.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Adriaan de Groot , 2017 Language-Team: Dutch (https://www.transifex.com/calamares/teams/20061/nl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: nl Plural-Forms: nplurals=2; plural=(n != 1); Voorbeeld Python-taakVoorbeeld Python-stap {}Genereer machine-idcalamares-3.1.12/lang/python/nl/LC_MESSAGES/python.po000066400000000000000000000026741322271446000220610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Adriaan de Groot , 2017\n" "Language-Team: Dutch (https://www.transifex.com/calamares/teams/20061/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Genereer machine-id" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Voorbeeld Python-taak" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Voorbeeld Python-stap {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/pl/000077500000000000000000000000001322271446000164045ustar00rootroot00000000000000calamares-3.1.12/lang/python/pl/LC_MESSAGES/000077500000000000000000000000001322271446000201715ustar00rootroot00000000000000calamares-3.1.12/lang/python/pl/LC_MESSAGES/python.mo000066400000000000000000000025131322271446000220500ustar00rootroot00000000000000\ 4+L0x/+/oDummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: m4sk1n , 2017 Language-Team: Polish (https://www.transifex.com/calamares/teams/20061/pl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pl Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3); Zadanie Dummy PythonKrok dummy python {}Generuj machine-id.Zainstaluj pakiety.Instalowanie jednego pakietu.Instalowanie %(num)d pakietów.Instalowanie %(num)d pakietów.Instalowanie pakietów (%(num)d).Przetwarzanie pakietów (%(count)d / %(total)d)Usuwanie jednego pakietu.Usuwanie %(num)d pakietów.Usuwanie %(num)d pakietów.Usuwanie pakietów (%(num)d).calamares-3.1.12/lang/python/pl/LC_MESSAGES/python.po000066400000000000000000000036431322271446000220600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: m4sk1n , 2017\n" "Language-Team: Polish (https://www.transifex.com/calamares/teams/20061/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Generuj machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Zadanie Dummy Python" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Krok dummy python {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Przetwarzanie pakietów (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Instalowanie jednego pakietu." msgstr[1] "Instalowanie %(num)d pakietów." msgstr[2] "Instalowanie %(num)d pakietów." msgstr[3] "Instalowanie pakietów (%(num)d)." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Usuwanie jednego pakietu." msgstr[1] "Usuwanie %(num)d pakietów." msgstr[2] "Usuwanie %(num)d pakietów." msgstr[3] "Usuwanie pakietów (%(num)d)." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Zainstaluj pakiety." calamares-3.1.12/lang/python/pl_PL/000077500000000000000000000000001322271446000167775ustar00rootroot00000000000000calamares-3.1.12/lang/python/pl_PL/LC_MESSAGES/000077500000000000000000000000001322271446000205645ustar00rootroot00000000000000calamares-3.1.12/lang/python/pl_PL/LC_MESSAGES/python.mo000066400000000000000000000011051322271446000224370ustar00rootroot00000000000000$,8 9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Polish (Poland) (https://www.transifex.com/calamares/teams/20061/pl_PL/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pl_PL Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3); calamares-3.1.12/lang/python/pl_PL/LC_MESSAGES/python.po000066400000000000000000000030261322271446000224460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Polish (Poland) (https://www.transifex.com/calamares/teams/20061/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_PL\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/pt_BR/000077500000000000000000000000001322271446000167775ustar00rootroot00000000000000calamares-3.1.12/lang/python/pt_BR/LC_MESSAGES/000077500000000000000000000000001322271446000205645ustar00rootroot00000000000000calamares-3.1.12/lang/python/pt_BR/LC_MESSAGES/python.mo000066400000000000000000000021211322271446000224360ustar00rootroot00000000000000\ 4+L0xj1+/!Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: André Marcelo Alvarenga , 2017 Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pt_BR Plural-Forms: nplurals=2; plural=(n > 1); Trabalho fictício python.Etapa fictícia python {}Gerar machine-id.Instalar pacotes.Instalando um pacote.Instalando %(num)d pacotes.Processando pacotes (%(count)d / %(total)d)Removendo um pacote.Removendo %(num)d pacotes.calamares-3.1.12/lang/python/pt_BR/LC_MESSAGES/python.po000066400000000000000000000031711322271446000224470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: André Marcelo Alvarenga , 2017\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Gerar machine-id." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Trabalho fictício python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Etapa fictícia python {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Processando pacotes (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Instalando um pacote." msgstr[1] "Instalando %(num)d pacotes." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Removendo um pacote." msgstr[1] "Removendo %(num)d pacotes." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instalar pacotes." calamares-3.1.12/lang/python/pt_PT/000077500000000000000000000000001322271446000170175ustar00rootroot00000000000000calamares-3.1.12/lang/python/pt_PT/LC_MESSAGES/000077500000000000000000000000001322271446000206045ustar00rootroot00000000000000calamares-3.1.12/lang/python/pt_PT/LC_MESSAGES/python.mo000066400000000000000000000021071322271446000224620ustar00rootroot00000000000000\ 4+L0xj1+/Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Ricardo Simões , 2017 Language-Team: Portuguese (Portugal) (https://www.transifex.com/calamares/teams/20061/pt_PT/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pt_PT Plural-Forms: nplurals=2; plural=(n != 1); Tarefa Dummy python.Passo Dummy python {}Gerar id-máquinaInstalar pacotes.A instalar um pacote.A instalar %(num)d pacotes.A processar pacotes (%(count)d / %(total)d)A remover um pacote.A remover %(num)d pacotes.calamares-3.1.12/lang/python/pt_PT/LC_MESSAGES/python.po000066400000000000000000000031571322271446000224730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Ricardo Simões , 2017\n" "Language-Team: Portuguese (Portugal) (https://www.transifex.com/calamares/teams/20061/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Gerar id-máquina" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Tarefa Dummy python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Passo Dummy python {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "A processar pacotes (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "A instalar um pacote." msgstr[1] "A instalar %(num)d pacotes." #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "A remover um pacote." msgstr[1] "A remover %(num)d pacotes." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Instalar pacotes." calamares-3.1.12/lang/python/ro/000077500000000000000000000000001322271446000164115ustar00rootroot00000000000000calamares-3.1.12/lang/python/ro/LC_MESSAGES/000077500000000000000000000000001322271446000201765ustar00rootroot00000000000000calamares-3.1.12/lang/python/ro/LC_MESSAGES/python.mo000066400000000000000000000007171322271446000220610ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ro Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1)); calamares-3.1.12/lang/python/ro/LC_MESSAGES/python.po000066400000000000000000000026061322271446000220630ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/ru/000077500000000000000000000000001322271446000164175ustar00rootroot00000000000000calamares-3.1.12/lang/python/ru/LC_MESSAGES/000077500000000000000000000000001322271446000202045ustar00rootroot00000000000000calamares-3.1.12/lang/python/ru/LC_MESSAGES/python.mo000066400000000000000000000010571322271446000220650ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Russian (https://www.transifex.com/calamares/teams/20061/ru/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ru Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3); calamares-3.1.12/lang/python/ru/LC_MESSAGES/python.po000066400000000000000000000030001322271446000220560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Russian (https://www.transifex.com/calamares/teams/20061/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/sk/000077500000000000000000000000001322271446000164065ustar00rootroot00000000000000calamares-3.1.12/lang/python/sk/LC_MESSAGES/000077500000000000000000000000001322271446000201735ustar00rootroot00000000000000calamares-3.1.12/lang/python/sk/LC_MESSAGES/python.mo000066400000000000000000000006771322271446000220630ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Slovak (https://www.transifex.com/calamares/teams/20061/sk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sk Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; calamares-3.1.12/lang/python/sk/LC_MESSAGES/python.po000066400000000000000000000025661322271446000220650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Slovak (https://www.transifex.com/calamares/teams/20061/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/sl/000077500000000000000000000000001322271446000164075ustar00rootroot00000000000000calamares-3.1.12/lang/python/sl/LC_MESSAGES/000077500000000000000000000000001322271446000201745ustar00rootroot00000000000000calamares-3.1.12/lang/python/sl/LC_MESSAGES/python.mo000066400000000000000000000007331322271446000220550ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Slovenian (https://www.transifex.com/calamares/teams/20061/sl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sl Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3); calamares-3.1.12/lang/python/sl/LC_MESSAGES/python.po000066400000000000000000000026541322271446000220640ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Slovenian (https://www.transifex.com/calamares/teams/20061/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/sr/000077500000000000000000000000001322271446000164155ustar00rootroot00000000000000calamares-3.1.12/lang/python/sr/LC_MESSAGES/000077500000000000000000000000001322271446000202025ustar00rootroot00000000000000calamares-3.1.12/lang/python/sr/LC_MESSAGES/python.mo000066400000000000000000000007571322271446000220710ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Serbian (https://www.transifex.com/calamares/teams/20061/sr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sr Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); calamares-3.1.12/lang/python/sr/LC_MESSAGES/python.po000066400000000000000000000026461322271446000220730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Serbian (https://www.transifex.com/calamares/teams/20061/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/sr@latin/000077500000000000000000000000001322271446000175455ustar00rootroot00000000000000calamares-3.1.12/lang/python/sr@latin/LC_MESSAGES/000077500000000000000000000000001322271446000213325ustar00rootroot00000000000000calamares-3.1.12/lang/python/sr@latin/LC_MESSAGES/python.mo000066400000000000000000000010031322271446000232020ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Serbian (Latin) (https://www.transifex.com/calamares/teams/20061/sr@latin/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sr@latin Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); calamares-3.1.12/lang/python/sr@latin/LC_MESSAGES/python.po000066400000000000000000000026721322271446000232220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Serbian (Latin) (https://www.transifex.com/calamares/teams/20061/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/sv/000077500000000000000000000000001322271446000164215ustar00rootroot00000000000000calamares-3.1.12/lang/python/sv/LC_MESSAGES/000077500000000000000000000000001322271446000202065ustar00rootroot00000000000000calamares-3.1.12/lang/python/sv/LC_MESSAGES/python.mo000066400000000000000000000006451322271446000220710ustar00rootroot00000000000000$,8k9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sv Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/sv/LC_MESSAGES/python.po000066400000000000000000000025021322271446000220660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/th/000077500000000000000000000000001322271446000164045ustar00rootroot00000000000000calamares-3.1.12/lang/python/th/LC_MESSAGES/000077500000000000000000000000001322271446000201715ustar00rootroot00000000000000calamares-3.1.12/lang/python/th/LC_MESSAGES/python.mo000066400000000000000000000006331322271446000220510ustar00rootroot00000000000000$,8a9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Thai (https://www.transifex.com/calamares/teams/20061/th/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: th Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/lang/python/th/LC_MESSAGES/python.po000066400000000000000000000024361322271446000220570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Thai (https://www.transifex.com/calamares/teams/20061/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/tr_TR/000077500000000000000000000000001322271446000170235ustar00rootroot00000000000000calamares-3.1.12/lang/python/tr_TR/LC_MESSAGES/000077500000000000000000000000001322271446000206105ustar00rootroot00000000000000calamares-3.1.12/lang/python/tr_TR/LC_MESSAGES/python.mo000066400000000000000000000020171322271446000224660ustar00rootroot00000000000000\ 4+L0xXj+Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Demiray Muhterem , 2017 Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: tr_TR Plural-Forms: nplurals=1; plural=0; Dummy python job.Dummy python step {}Makine kimliği oluştur.Paketleri yükle%(num)d paket yükleniyorPaketler işleniyor (%(count)d / %(total)d)%(num)d paket kaldırılıyor.calamares-3.1.12/lang/python/tr_TR/LC_MESSAGES/python.po000066400000000000000000000030371322271446000224740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Demiray Muhterem , 2017\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "Makine kimliği oluştur." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "Dummy python job." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "Dummy python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "Paketler işleniyor (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "%(num)d paket yükleniyor" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "%(num)d paket kaldırılıyor." #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "Paketleri yükle" calamares-3.1.12/lang/python/uk/000077500000000000000000000000001322271446000164105ustar00rootroot00000000000000calamares-3.1.12/lang/python/uk/LC_MESSAGES/000077500000000000000000000000001322271446000201755ustar00rootroot00000000000000calamares-3.1.12/lang/python/uk/LC_MESSAGES/python.mo000066400000000000000000000007611322271446000220570ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: uk Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); calamares-3.1.12/lang/python/uk/LC_MESSAGES/python.po000066400000000000000000000026501322271446000220610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/ur/000077500000000000000000000000001322271446000164175ustar00rootroot00000000000000calamares-3.1.12/lang/python/ur/LC_MESSAGES/000077500000000000000000000000001322271446000202045ustar00rootroot00000000000000calamares-3.1.12/lang/python/ur/LC_MESSAGES/python.mo000066400000000000000000000006421322271446000220640ustar00rootroot00000000000000$,8h9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Urdu (https://www.transifex.com/calamares/teams/20061/ur/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ur Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/lang/python/ur/LC_MESSAGES/python.po000066400000000000000000000024771322271446000220770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Urdu (https://www.transifex.com/calamares/teams/20061/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" msgstr[1] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/uz/000077500000000000000000000000001322271446000164275ustar00rootroot00000000000000calamares-3.1.12/lang/python/uz/LC_MESSAGES/000077500000000000000000000000001322271446000202145ustar00rootroot00000000000000calamares-3.1.12/lang/python/uz/LC_MESSAGES/python.mo000066400000000000000000000006341322271446000220750ustar00rootroot00000000000000$,8b9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Uzbek (https://www.transifex.com/calamares/teams/20061/uz/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: uz Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/lang/python/uz/LC_MESSAGES/python.po000066400000000000000000000024371322271446000221030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Uzbek (https://www.transifex.com/calamares/teams/20061/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/zh_CN/000077500000000000000000000000001322271446000167725ustar00rootroot00000000000000calamares-3.1.12/lang/python/zh_CN/LC_MESSAGES/000077500000000000000000000000001322271446000205575ustar00rootroot00000000000000calamares-3.1.12/lang/python/zh_CN/LC_MESSAGES/python.mo000066400000000000000000000012341322271446000224350ustar00rootroot00000000000000<\pqWoDummy python job.Dummy python step {}Generate machine-id.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Mingcong Bai , 2017 Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: zh_CN Plural-Forms: nplurals=1; plural=0; 占位 Python 任务。占位 Python 步骤 {}生成 machine-id。calamares-3.1.12/lang/python/zh_CN/LC_MESSAGES/python.po000066400000000000000000000026541322271446000224470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Mingcong Bai , 2017\n" "Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "生成 machine-id。" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "占位 Python 任务。" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "占位 Python 步骤 {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "" calamares-3.1.12/lang/python/zh_TW/000077500000000000000000000000001322271446000170245ustar00rootroot00000000000000calamares-3.1.12/lang/python/zh_TW/LC_MESSAGES/000077500000000000000000000000001322271446000206115ustar00rootroot00000000000000calamares-3.1.12/lang/python/zh_TW/LC_MESSAGES/python.mo000066400000000000000000000020341322271446000224660ustar00rootroot00000000000000\ 4+L0xTl!-!Dummy python job.Dummy python step {}Generate machine-id.Install packages.Installing one package.Installing %(num)d packages.Processing packages (%(count)d / %(total)d)Removing one package.Removing %(num)d packages.Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Jeff Huang , 2017 Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: zh_TW Plural-Forms: nplurals=1; plural=0; 假的 python 工作。假的 python step {}生成 machine-id。安裝軟體包。正在安裝 %(num)d 軟體包。正在處理軟體包 (%(count)d / %(total)d)正在移除 %(num)d 軟體包。calamares-3.1.12/lang/python/zh_TW/LC_MESSAGES/python.po000066400000000000000000000030541322271446000224740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Jeff Huang , 2017\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." msgstr "生成 machine-id。" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." msgstr "假的 python 工作。" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" msgstr "假的 python step {}" #: src/modules/packages/main.py:59 #, python-format msgid "Processing packages (%(count)d / %(total)d)" msgstr "正在處理軟體包 (%(count)d / %(total)d)" #: src/modules/packages/main.py:61 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "正在安裝 %(num)d 軟體包。" #: src/modules/packages/main.py:64 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "正在移除 %(num)d 軟體包。" #: src/modules/packages/main.py:68 msgid "Install packages." msgstr "安裝軟體包。" calamares-3.1.12/man/000077500000000000000000000000001322271446000143025ustar00rootroot00000000000000calamares-3.1.12/man/calamares.8000066400000000000000000000023531322271446000163260ustar00rootroot00000000000000.TH CALAMARES "8" .SH NAME calamares \- distribution-independent system installer .SH SYNOPSIS .B calamares [\fI\,options\/\fR] .SH DESCRIPTION .B calamares is a distribution-independent system installer, with an advanced partitioning feature for both manual and automated partitioning operations. It is the first installer with an automated “Replace Partition” option, which makes it easy to reuse a partition over and over for distribution testing. Calamares is designed to be customizable by distribution maintainers without need for cumbersome patching, thanks to third party branding and external modules support. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR Displays this help. .TP \fB\-v\fR, \fB\-\-version\fR Displays version information. .TP \fB\-d\fR, \fB\-\-debug\fR Verbose output for debugging purposes. .TP \fB\-c\fR, \fB\-\-config\fR Configuration directory to use, for testing purposes. .SH "SEE ALSO" The .B calamares website: https://calamares.io .SH "BUGS" Please report any bugs to https://calamares.io/issues .SH AUTHORS .B calamares is written by Teo Mrnjavac , Adriaan de Groot and an international group of contributors. .LP This man page is written by Jonathan Carter calamares-3.1.12/settings.conf000066400000000000000000000124501322271446000162400ustar00rootroot00000000000000# Configuration file for Calamares # Syntax is YAML 1.2 --- # Modules can be job modules (with different interfaces) and QtWidgets view modules. # They could all be placed in a number of different paths. # "modules-search" is a list of strings, each of these can either be a full path to a # directory or the keyword "local". # "local" means LIBDIR/calamares/modules with settings in SHARE/calamares/modules or # /etc/calamares/modules. # YAML: list of strings. modules-search: [ local ] # Instances section. This section is optional, and it defines custom instances for # modules of any kind. An instance entry has an instance name, a module name, and # a configuration file name. # The primary goal of this mechanism is to allow loading multiple instances of the # same module, with different configuration. If you don't need this, the instances # section can safely be left empty. # Module name plus instance name makes an instance key, e.g. "webview@owncloud", # where "webview" is the module name (for the webview viewmodule) and "owncloud" # is the instance name, which loads a configuration file named "owncloud.conf" from # any of the configuration file paths, including the webview module directory. # This instance key can then be referenced in the sequence section. # For all modules without a custom instance specification, a default instance is # generated automatically by Calamares. Therefore a statement such as "webview" in # the sequence section automatically implies an instance key of "webview@webview" # even without explicitly defining this instance, and the configuration file for # this default instance "@" is always assumed to be # ".conf". # For more information on running module instances, run Calamares in debug mode # and check the Modules page in the Debug information interface. # YAML: list of maps of string:string key-value pairs. #instances: #- id: owncloud # module: webview # config: owncloud.conf # Sequence section. This section describes the sequence of modules, both # viewmodules and jobmodules, as they should appear and/or run. # A jobmodule instance key (or name) can only appear in an exec phase, whereas # a viewmodule instance key (or name) can appear in both exec and show phases. # There is no limit to the number of show or exec phases. However, the same module # instance key should not appear more than once per phase, and deployers should # take notice that the global storage structure is persistent throughout the # application lifetime, possibly influencing behavior across phases. # A show phase defines a sequence of viewmodules (and therefore pages). These # viewmodules can offer up jobs for the execution queue. # An exec phase displays a progress page (with brandable slideshow). This progress # page iterates over the modules listed in the *immediately preceding* show phase, # and enqueues their jobs, as well as any other jobs from jobmodules, in the order # defined in the current exec phase. # It then executes the job queue and clears it. If a viewmodule offers up a job # for execution, but the module name (or instance key) isn't listed in the # immediately following exec phase, this job will not be executed. # WARNING: when upgrading from Calamares 1.1, this section requires manual # intervention. There are no fixed prepare/install/postinstall phases any more, # and all limitations on the number of phases, number of pages, and number of # instances are lifted. # YAML: list of lists of strings. sequence: - show: - welcome # - dummypythonqt - locale - keyboard - partition - users - summary - exec: # - dummycpp # - dummyprocess # - dummypython # - dummypythonqt - partition - mount - unpackfs - machineid - fstab - locale - keyboard - localecfg # - luksbootkeyfile # - luksopenswaphookcfg # - dracutlukscfg # - plymouthcfg - initcpiocfg - initcpio - users - displaymanager - networkcfg - hwclock - services # - dracut - initramfs # - grubcfg - bootloader - umount - show: # - webview@owncloud - finished # A branding component is a directory, either in SHARE/calamares/branding or in # /etc/calamares/branding (the latter takes precedence). The directory must contain a # YAML file branding.desc which may reference additional resources (such as images) as # paths relative to the current directory. # A branding component can also ship a QML slideshow for execution pages, along with # translation files. # Only the name of the branding component (directory) should be specified here, Calamares # then takes care of finding it and loading the contents. # YAML: string. branding: default # If this is set to true, Calamares will show an "Are you sure?" prompt right before # each execution phase, i.e. at points of no return. If this is set to false, no prompt # is shown. # Default is false. # YAML: boolean. prompt-install: false # If this is set to true, Calamares will execute all target environment commands in the # current environment, without chroot. This setting is considered experimental, and it # should only be used when setting up Calamares as a post-install configuration tool, as # opposed to a full operating system installer. # Some official Calamares modules are not expected to function with this setting. # Packagers beware, here be dragons. # Default is false. # YAML: boolean. dont-chroot: false calamares-3.1.12/src/000077500000000000000000000000001322271446000143165ustar00rootroot00000000000000calamares-3.1.12/src/CMakeLists.txt000066400000000000000000000012371322271446000170610ustar00rootroot00000000000000include( CalamaresAddPlugin ) include( CalamaresAddModuleSubdirectory ) include( CalamaresAddLibrary ) include( CalamaresAddBrandingSubdirectory ) include_directories( ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/libcalamares ${CMAKE_CURRENT_LIST_DIR}/libcalamaresui ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/libcalamares ${CMAKE_CURRENT_BINARY_DIR}/libcalamaresui ) # library add_subdirectory( libcalamares ) add_subdirectory( libcalamaresui ) # all things qml add_subdirectory( qml ) # application add_subdirectory( calamares ) # plugins add_subdirectory( modules ) # branding components add_subdirectory( branding ) calamares-3.1.12/src/branding/000077500000000000000000000000001322271446000161025ustar00rootroot00000000000000calamares-3.1.12/src/branding/CMakeLists.txt000066400000000000000000000004141322271446000206410ustar00rootroot00000000000000file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) calamares_add_branding_subdirectory( ${SUBDIRECTORY} ) endif() endforeach() calamares-3.1.12/src/branding/README.md000066400000000000000000000015351322271446000173650ustar00rootroot00000000000000# Branding directory Branding components can go here, or they can be managed and installed separately. A branding component is a subdirectory with a branding.desc descriptor file, containing brand-specific strings in a key-value structure, plus brand-specific images or QML. Such a subdirectory, when placed here, is automatically picked up by CMake and made available to Calamares. QML files in a branding component can be translated. Translations should be placed in a subdirectory `lang` of the branding component directory. Qt translation files are supported (`.ts` sources which get compiled into `.qm`). Inside the `lang` subdirectory all translation files must be named according to the scheme `calamares-_.qm`. Text in your show.qml should be enclosed in this form for translations `text: qsTr("This is an example text.")` calamares-3.1.12/src/branding/default/000077500000000000000000000000001322271446000175265ustar00rootroot00000000000000calamares-3.1.12/src/branding/default/branding.desc000066400000000000000000000031161322271446000221530ustar00rootroot00000000000000--- componentName: default # This selects between different welcome texts. When false, uses # the traditional "Welcome to the %1 installer.", and when true, # uses "Welcome to the Calamares installer for %1." This allows # to distinguish this installer from other installers for the # same distribution. welcomeStyleCalamares: false # Should the welcome image (productWelcome, below) be scaled # up beyond its natural size? welcomeExpandingLogo: true strings: productName: Generic GNU/Linux shortProductName: Generic version: 2017.8 LTS shortVersion: 2017.8 versionedName: Generic GNU/Linux 2017.8 LTS "Soapy Sousaphone" shortVersionedName: Generic 2017.8 bootloaderEntryName: Generic productUrl: http://calamares.io/ supportUrl: http://calamares.io/bugs/ knownIssuesUrl: http://calamares.io/about/ releaseNotesUrl: http://calamares.io/about/ images: productLogo: "squid.png" productIcon: "squid.png" productWelcome: "languages.png" slideshow: "show.qml" # Colors for text and background components. # # - sidebarBackground is the background of the sidebar # - sidebarText is the (foreground) text color # - sidebarTextHighlight sets the background of the selected (current) step. # Optional, and defaults to the application palette. # - sidebarSelect is the text color of the selected step. # style: sidebarBackground: "#292F34" sidebarText: "#FFFFFF" sidebarTextSelect: "#292F34" sidebarTextHighlight: "#D35400" calamares-3.1.12/src/branding/default/languages.png000066400000000000000000002477621322271446000222240ustar00rootroot00000000000000PNG  IHDR@)#bKGD pHYs+tIMEeiTXtCommentCreated with GIMPd.e IDATx]gX>=y!$ A,9,&Qלb 5cB J sɡWWa癇:U *$Ii`9ݑT $P@j.WA^}h}Ch]B5*P8-V?ݱo+k+4$֪TE5*@6\y67 LT&VZ\Es^ME;Da4R_T Z07rm,NϘŠFNˊI~8N ik.2u $ad< @T ˩GJeo=C/氦Je%7}#+eӃ#3$"UŸL~_jT<䛉%:! pq e兜) 6wgi0&eN hv&Clf/k.D,_!щMGN<.s<×/V\H7]͙7d{$I3yPCxI0zmTAE*JS9Až~1)Uy\&ycsk5OXYG (&IdFL-cct>g1v򘨩bqQ`[9%UM{ N,'.td |~yDyjkw*P4> [@$UI]; `p;Ĭz`sII(dL U-i,6m5w]X_Cܗ-22%=Ә k:>;{FdwnK2TZU>p¿HHHy/"~erzW%(L'Jki&l]+d2Xk 2yA.(ߣ ըB4Wo72'ſ+'0.zwfon7IT?u.0 $٥uaTQ*KJ2eTWR1Z|!qDH\Q "IKL6 vG9й+Z+ ޑkW 6Iz$ٖ֖ S *sxr' FѪkp4Dck35ef'DܱX zZrl 4h om jֵJ)eb S0U!iE u;d]x*˴v"5-u;n;|,oZ~2q6W=A`!P$IA3f=p?O_"!Q=ɩ"8zV, ғJAYkqk*MtXUk7&$m*ʹ84=5R]S[O3'2^.Soޗ[Dt8`w^u %vmJVM#N.75eKٹsꁪ + OfFy5tGsD|sP;,?=8Mz0n?r@pdFUrA$I I ݑČ-.:Z=uܾΐP$#Vr%5!֡q"r]fE2B;w>a}7ӺL>3U¢ Xx2eB؛o[z4Pj3;M y)/5DXx!ͬESV{}}#nj5i]cHB^#<|*ݨnܨo7QMBNwA$}Ѷw |W6jw2m-RЬ>FJvq괭726dOdl9emSq`ڝ|c.xx.ydwޜ8\ ?fcmg^CO.jYVU>sI? C#z:4@j_ $DE*C.k7a“}/(N (T7̬I#`6Dc$Ka&moO0AT>E,fsԴK&JtN2KVQcQ6v 3*@J^}p}<]{ ^2A@P]Ä+r?rE%*Tya#$ILhT aN uWZ+"hh_WA(d" /1M6 ,kk5$ UUU= 4YgaT?X+)j,tS=\.95h[!$  [6]]ҴoWT ⡵-j1*c߼/[g CƈR6$^aTԺV)sԃ#3}fNzlf-kɬu?=|"d}~TzK uq7X:Ejjj7fEn[VgsIqOϧyґ7-`1)6V15b uSG5 E${[R1$p"!!tŹ^zL5fҕ$8S%v̟BJG[ Iqrnyr4+x^;xѡqJÓ%ĸ+L-3ӱA0$_">0Poeb,rHOadȤf{w7`I1(V[j`D`fɸ8L8A|LmKDv$ 3!^!w>$IdktJ$8v-LFZeT8 rW,nZ-M <DZR U32WD+( N4C^{楗夋nMPXA0) 4 :)F/%uR~(BAGuռ !H }^IF\Vj jI[ޙmje+ebEKI00*TREiL*_Gho: ~='1AE,XoC'h I?زAZ9b9P'% [? Hj@_5)A2L$\Sux׋yAbۮɔP\@C-9+|C(_^RݦRtHHSM38H̭SzT.)O[hU4qAn-ãބNr.yYT28D2!,jH|FaqG8QgﱾV}Z^)̰ kŨ%qѠc:c\Vp w4)d;oz|?t8P &;~+%reK招 1^TIF9BP ۤTtySk<;ILUy ՖqJ1qTF֋ҌP"0 2)NfQl[B)G2F42r鎚ƶ{{j?4&59`l /w_tל~GV Sb&$% cp(ۦ>&bξҠrSҶz%1*SX)  +-oIdCsz5|&#Dșwޗ6PHq`G?Ϯp!+dI:6z;[N?TٲsJBPʩ:C)4Dp`{-Pb7ίh;--?'(;h橫kG.t-~z>8;cn+9 "#S杽QCt e0z'=)n.t4gDGWӥhm6=S JTᏆ߬\62p:.2+ss -*9z2xN.3/Z+sqe :"i[}&1zCckT&v$߈a(x,GӇJ}0iT:G֒-;N=m|w 3'Q|!,Hx cVr}uM+*//VFgfDglK|(kjTͿI*B˧r10dZZjO=)tu ٹ-!A$FgN1 -ꗣ2*JU fxs FNt!_~?.NDqPB)GjFJ`U4DtGVmK,i~8;[,B6a^8M=+zlK)0o;G orhzBRha@Hua6DHVO\zӑξ$/3[k:HR[FPYLDi#YkvR)Ju}}hIIEJT &9F|ﬔ =֦fPĽl%--:8W&]8;[ ~&H6Iјbȯ.l8m;fU}3$@6) uʇb e(fv?FoB؛\-݀ |*Ce.+(GkmYfa}ṽG/KB&Q4W3VX89/bh(6;<ܡV{NصNV6zG۬ 4I.nUVߘ rvӣ4o|.I!VX ^am㵭sva!ǠaJABӷ1kA.Rn58N -矗vkڗPJ1=xOχYc8N, qS\NFP#VuQi_\L/3)hlR! \9L)R*܁ HlVI/R+AVuSp;S3Qc)2r>Q v3 b塘#B}Hj> z1ûbFA,w]FmkKp`\ԧfћ=:ﶀPꏷ,Lc]` v)V@`Pܒ ZZ%R1t6_&-#Vr~f.*4)rt|WUP 2 (wxVy6H[L#qr iv_.jɯM?U]<\.WH9WuME_['sMv{oF(d\@P\$(@t|DZ,e|WYcN="&+!엂>?-&2moϾ9yp:+d& a>I9Cߌ LW, :UgܚeB1eArRMe/`>*/6Guݕ@ { 7֊/_r RR!%"@ K:0B׽LK3b&/ZR8iߥ.s{I-%o㜽=52ۍY-Ov\PMe71 !WځzFwSn.G«ӌ`!b7Wݠ|ė=cX~7bTfӯ9 +H@REV:*`lnWg߭}|-$Q%&^9qO?HQ'ko:QX۴Ci+-~϶5?Ap\.i_~ۼHKEyW?jnwZ$ *—:N"e9L'}\r$qZ IvIƙ֕a,WTڀ#X76]xH9aۼxwtm [Z*JӲwEz~SzP\3[smU ԕ4]ݞܱB=c ՞B1i\.94a3| ^-So'S¥i{,]*l)~{`b۫ IKNgґ4SCkr!43 k5a2dc6J>vI.0ٗ'j,-DB̟Rмkm_$l(Dq'Z&4 bTG/7MP*R"Pg$/ėBc1۲e fdm҈ؿcf5y͋Ǐ r4s>n_VVUUAO;sU~P鸺I_0?jtU-[."\}O6>ML%Pip o3kۧ8nAY kY_ >FօoK~#-@-|,4l,jAr 5'b W715r"5[Z+g08)LR$M='sHw-2)zY;葝Ud} ( X4Sit4ɒ]Nil)bJR)+tyi*>.nE oOH0s~k5^v^?!*cങTL˺ĵ8P-魼K~ ~kQk P.ʨ- r2$уk7cP)XfdޭXLʯGudzL\؊й$|}d\FEM=6ک1AOѤuү ,"a@BU!@ڴ̟S~4bvػ`;kw >f~U^IyҥksN5ʳo[Xr1QsI=>;踠V2>#qe1GS"@fdL^|?ca'GOeӨ6抧G}+1_FN[ç/RUVRxߞ򐟼`'L\Eލ95?ј s0aGØ1rBRF0@.5_#HK}|pĪu/K~|{NM_2+325X.[q.nTIIɬ`cW/n.msA(R=0eјi,W_ cx($}uY)^'.ٗ"ޅf'5S)SU7&'|b$FcG)t/궆Fcip[kpoW瞶C64~x*aZ56$ld1DGu'v&/f>_kuşYvb9TPr,?z @aSPJ*]4fڗon>SڛJuw߯qswns٫i'Yf"\,-}BoO@ \ymYg\&:}t6e.K- *K}sSR^}Y~.QP%RX#psvU8NP0:K K)ͦ+Zt$mv㇗#u Yg:r$ UFT\!A+?j{eg蓦*q ut&SŊUzc6+:G M^yk.j8"(b 0jw2cRh[hMLdm$zkP)4pNGfٿJy1sA"Y{}ATLK!3LN$A$ghEKuuHJ LMc]*K=hrmqv8TLh~u˙l<.hy/e]l[|otaB)?$Ics"p]~ip9.2:YW>5(/;?359zU\k\v^ٻۮfW,>$I뵝k"0L )aWPWo~rqK$ /A =ZJ?&8KFr؉+$y"˝b-(Fщ)nhTXscYi A7Q şMoKrM#%|`}>I& |3IA vhzʅugf'MAh &qEubnX$9kŝ6SrgO}'2&P7sBaMGS԰pvJ12M'EVm=z0i%1.քaP|`hV{2Aˇ켙n :`~aciÈʃ _c9e@k0kifbl7t_pS./j]Y_!6U?yv ɭSOw˅,ms5*K]a;Dyz (3&mPot8:/\KSψ} e+rze]w&?KWJ)tK/[ ]sKj",|z;6uԲzUw|@1;!Rh*wjCEyC.lErbm3[}lηci tG"x (&j*[]06&ut#Py)nޣI"A"$I(F8ELxvF~/zϿ0_40hF_5:cS[UN7:|BꚚ w[^3_y2iR.vz0!Ѹz*{›u,(tHs]P' uelfw^f.6O^7#*rʓ`Ø.%p"2JSar.QKU _\^Zވ_bn].~UE<-Ǒ?]@i˪F9xe;8ϔ]~as$`䩀 PIT$IJ4I&=e Wҳ ɺqD/OpEȩgCȚ|𘟾<ۜ;x}#5Ha7( [\+ll_QF.[ҡfN2ԪViXTBP&zh=[zB̷{u/ $JC*sQ!Z2 xkOriv6n>(fk斢6C8THB,"Ulf-G.lk~sШL^ jO~AZKggn3hqBZaP)>= N410$pϹ@ 13,Hq$\ |+C45$5ɜ ([pA1 ltqQ ى%u.g_d{jxu;#XfjsV3>'/KZڦlSVT9M sI}$Gޠ}@)bn̊ m96/+5qZPjo$:GIۘ{V1 H_PWcdQ/2n=6WhZ.^l2"Ըf]m66״Cs*;O%^u糵'٥%n`)zr%[2Wb_I'yB)Y9y,5bbjF4M. g$RMf ׸fnN 85\pY{~/#pCiE %<?'/,|Nm&j.(4MLtTT>Bc0*~8y`JEWy᳏[֎4kD2L\P7WJKyKIwa ^-oM KsN;= C`Ǵm9Z8\7ξu]MKD5}}֪"gAkf纏]cCMe(R^&vB+ivvchsku<}ayZ} 6mfGo~_X_%n{Mh Se̓Cw3 DZ4vb[[2r~_UM \v.9{ͪYW4C^or'?"{snZ( ?9)c7xl.s*i<W$ 9.8M=a6C4-{E宲iDc)UINe%Z.~~'N=)tz .]1@ģ65/)P[y>vO?\R~od7kq7;ge??co=6/r3f^S\+#A)ƽǩѹzȸ})7]3XtUw7n[}bxk5a,ʩbO9vԜ/62- KYue]TJܰ$ ={ڂ cCg=Oygw} NMٌ.]+< S=zSÈï/ _~0*|6 j%HF A5Z4 bk*p`nܝs{T~҇yol `kv·+L _4z^WYصN=ލ{3Kz{;8^8K3i ؚ8km #o5!}kq_4ЇݽW3qq8͸/e};7"rw Xt*K1q^[8|gf B9@MHYR'B1jRq~V#Qq_LtHrw6eȩ'$У/.2+f؄zm']$rӟRS)LlnKf:CF=d2ױHB,SJ54'v=ݦ JJ<'oI xQ,,M+xmVVti϶Bi&ʈŠQ]/ZPn1qBmvD 0LY{ùSY<ԦEP*rqE \z'5b- mEAPr1n"rqw{R*Ak* iHM"fþeFm}?Q0s?8g*S qjD +0![jI%U$)Jͼ$[*ld_(},=:]Os_5AgLq@\fzRyٗCeUAW{, g{m+ϾQ~E\[Y0e7FYsPIg)UyZͅWB~{{nԄo=wM? "O9 _LZElݗ_;wk^2w^Qk'*r_!ۓz}bn1x6`ڔsu67gv/lY<Ԧ iݝz-8rS宀n..gguАᘕ1qVօ3O.r~gϵԓf tYlTP'5Wa8ahBas{wvc]n ޜ|`hӬ-ߑ}1ri7bS>[0o7 m#])kQreɈs5SI~NLWʲ+c`[(nv"NN\2d;%J w#M': 5U< [~8$ 1B"pZrɞ@ׄ %\0tm^?EP-hݼ;}5(+>+(J Q_}%Ƒ$I/EG 1?I#I8OrC_6SLuX@eSJE6kJ`P=]s7owܥ͍PηFl4i?|. ֶ3ؚhD9oCc;{k< V3LN,f q͓ "q>vwjͳ~l,/s:xcg* pyy[Mobj-w@u=r1Od3i|/EMew/rFol>~e}fFtHOǪ{gX=s|WS^πPΐ{kawaє8}3un.Ი 1 (F(t9P UbckE(a}W\Kt4,\^t7SԴ\ 1 ܒnI^Sjr @bmKob羙IKٗC X7|SsӦy?=-j.oT7 vxh֪KFРPT޴@Z}"'w ٲmTTVֱ1կ6ilu'|ZK}NE#5VKjM?ό7/f oHh ɝ#8Neh(IBi$w l= /ZCW!.\߰mwc IDAT:,$6#qr=@ЅZۧw&mu,VwqC~uoFq;eVxah1 re ɯԶJLՕ[9V{vS֒gOn'It[`*b7> &_/x)GGʲ7!j(>+:)ʕzv<n m޹ m4~W@Яc< Fn>݌Դe1$J rdė {GElû'2 9'dČ9bN"&}xwR Xx4= ޲Tɍ/8n?S.u~LWw_%)k/m5!yd~H~lc%h|8ݰUHKCPw =v`d  ʾ>9 0i~@Rmdol]˷y`8An aZ%܄ݷ7T9XS Md9z_UFI)C~Iv}KP-}5<)BnIei>pn3 C8d8%|(F%HWbJ0y;MeQ*=GP 8+q-HI AgփQ4&@<h[Q$\SgBPBǦqè 1 { ݆W~=eohۮsoKn8ND--u TGM4$u94&Τ:\Ahˬ4šį[%; AwZ}.Y11w=o]@!CVCdb-EG{梓hƱo~vzzU0Љo\⡒z3mP쥒I YR궞|9:@&pj"FjZm\%ghY jc\F#6!Hr+;hLK/V6 M:ʗڊ+xʜ3<=D,XP2Tų_ԫ S]fȵ2~8I5e.-_S9Y%/'T wfc;}$;%GVu9^'s.[ʯ[%k]fRK Tm qQ=.]peys-*-j'hMb4H=@-g/oPR#3HLIH Hطk._珢hh)׊b4L :קeԢjz1wPP(m$[54ڸrݖeraÃi5$(J SǨIҘ'сIDСB)@EQ^9okVASWy$!Fg- u{yaϲ?e *Qy>`$I,I89`ٹŐJͅ$şéĔq^WW~, ^cepuetuۧ9uB] ]t%UxL\y@gP"V\qbsJ;T~]XWTPh+Nnx{h,dpw@Q}Csr"ηIL7V*l T)?]'$G|n>;gI_yy pfա|3y6Fs-{6e:rq3?/5B;c|tSs{ރߥ}yhR"XdKPE6.jpeU'yRG_gd88ǵ 𶥰|rXP0}\w۲ jy 'L8-{SXq|v -Α}]U.l"(%;=ļzrk黷pi>h[y֐E~|u|_nK 61Aw+q|j)1V[#-P*JD T ˀ]vz@u&^/v>!N3,+^Q 7yMsqs٦i6ǝo=p0>ōmހ H0j [Z%x-ʺg~u E+4#E+f0m@ 3WSʜGM]xX.ly Tv/.-ꢺO?BgK׿2 _gTƯl]RZ3*9@щ]PR~dA۷oqynY{]bK[x); $͕ƍ/Jjo$s0g?8N .Sw$㌴Y:>I/,\ͧZ?wߝK7=߀&KG`TWOō>T5nPGkʴ#O9jE8*[E~() Lj' Մmf 1Iz7jQ!pP%TTH]E25e b5:ERT8An%!j4m61rP77Ni9@%}V/q/RfLaC)_( =ra[X➥x;^n Z1Ҙ'Zֲgc(tR~_ƧaV_oQ: IyuqBQ qCЙF&8NE(4dB K_y;SR v $TR)UVz6C.RNV7PHXU5)RRh*xAb9,\5i⦲(vPQ @I+Z_n ]teݛzQ7}VKesoc5a"Aiuj7@Eft4Ҳ <9s@Bg}Tf'w,ɰ6iO N|v⨋6,w}4HﻙZM8Oui;[q7b/nDzIyg_ۄh4c ( ݚ*tkrKhC3K(i0Cgѵ{#U.SXg5w}i'XWWL|&^? N]Kj"fjs,T$ӧ{o2tzt?I&]{\ e^[Y!)kwny8~[Ho*68yM%&.s-"$qp\1 Y`?jSy,-Iz \hA:OKڏTRl1I}a gpj^Jvxd݈#^-[ߍo`wt,|yllKHr{Wzf:jk#ɦ4e{ojuj"5oz_:cF,zJ~N_ )yQ{94]U6{"n,ѱ U;N?j ߾gg>1Ou祧(:geV{]gp[Ur#W QݗCrбo,}H 0(.%Tg`ʭZַIakʳf9Z:JXKMfD[ b,iԢVǙ3/,>r~!.fZ7&;jٹ[#uҤf:q݂!Vv*{ O<-3QJ0i}:=ulMank6(Wf{>}m^fgaCC[.eB2քqS_{5;\5jŭԵg+>r5⦲wžs|R*4w2$'H:AԴH64i&¶ q]9M-8_o q\3D?gr4SgyjZ(SӨn` GS._ƕ #tַlչO܌B &}|5ѣ/f T{ jX77}8Ħ `OK݂cz8C'GKa2QC[ϒjc'[̂.@>RYM5ZDg9׊i1i&NF,CRMMivkF?ݷkE,tY\8 6Mw=Nh'VJ-Q}_s }?F|:Z%S~ͤq7d>g rAj7bHkIz~-=?Lٯ2vhI CI7WdYzf{yyKq@0 %nO(d~t]~t] ݚ<2r$ $!C1z%ŕ# %]sYnl\!AP Vzs U*E\S-j( WɄJAxM)'T %Fc,m'|=o$e6<8&}CH\!Ĩ  3){CLWw-Ik"(RhIkN*iZ$+=cCh,Mk"'>g}Ta cmѓ:C. G"|;6*T&+4Jfzhm;:~O pug*.,-܏b>$ITnVi~նj[Ot?'[#5,:dCS,+A9~+ ٻ\-4Bzkb3)sg3ap8QwVX7~le3(LM(8'Y)wޫxs*Us`xV!m!Ut4݋y\++oS)huC),{dGϛ=2N9wza?%0vk1i;q&2>M׌|tēҿ9Y.9=,̓fJ+j yRl{OVx;}$- TDw3 (,^y_RPvI\BH|9hZ&jf#8?U):욋'.@SZԓVhZx˚%/ޡcT& t6OwpG;t IDATCS 3ڶ|x.v}2ʎ6ƷrKu^kR \X;Lu}+3ǨU2MЈ1$FҙJ`skȡ^)8E\Ofߚ:BlBn%Z5* 8yVɱq=EG('!I?A13Au򲲕sfQLOyp4׫O gTfR0P I0EeTR$!+*"bUɎ*h7Qw_'}7e+ 'g`RTe~2iK/\},R^{ܩ;}t|ld~MtE䘻-w:wڏV_o퀂 kLi:8uS3EW+j\P1=9W&~5? šehW*[ =dm(-O Y:#NJ}1Ȓ7ҭevI_ )(Qtv3ʼ.lQF1XM/1h4mH}U[/YWZa4/ͷψz7 1'Ĩ h:hK,IAEWV5vK;ݫij^/ֱ@rq۫Ӝn:WH@)/>v`!y Qxryzn+B؏v6^+wc@m1;GނMWX9W׸E?8ֱRaB:JhR~cڐDB?XRf;vy2=bTA:Gw3j&Wʄ#9'D-+/IrmPRl\}L@){(7 s挖Y\d+_~KUr1\ Qje(f'i']\6~S{jIk#j+6cs~ØZΓblmI2.d-UO3Kڒ9LJ#5?Y{:vWUMCc󆗽9uZ/c惧]Vn?NzVSP 1s6ǜSvY IڤUn#~]Է'8A{4K{c*+Ҍ3EG"ì:fq\.fRT$neRH2d]]oz(5#n 7;93?=ʛb\=ɞ j'wJ4umˉRhVd>ί0 $ xw >t-nH|-_;H\F@M3#}X0Yq@!njVdb]P9:Ip/H:5oѽ^# [oQ{k;^][Ve4K:/81 P9W*hGж=+{ʄSw\p8|I,;p{keKTЎ;LMcVZYGnu?躹 ΋(^ IĞę .dʿRѰ~rͭ)'6E&?|IK6M [2~e_YtSΏ 8NP|]]~=+*PH'}?;)bUv80?~tg0*tMJע6WpiJ*Cci]6l8|YZgj֪5pU<^!njmһ7~ǁw";K)h1қ t .MvfcD9PILWryNà ;c"JSD3gFZj2Bg7H*.k.|/'F=L-XpW*KNVkNau{I79ֵw4WLROsg7c`фh^p[TErǹ,V DlmۀU+N C`m{ݬI"H\69zs]R=G3.$rmD0,o A:hCd Q X`Tj"@Uʄ@Bc %оHkS{2e~.V8=v`^_MO AG>˰gBB1'\.l=\'e1 mAէJxP /ӕZzfU q1W^gP)eo3ТE^ŭ (OSJ~tP[q@)+: n#& &6.Uz1Q}j7\&F\%[ADJ.8pg*m>ELQKk_yKH 'r6kbUIXlg;݆9JA8N »@;ڸ'y@m~n1)_fovrҶFnQh -8rO c4κ|AHm,$M9>W9˹lߐm0y)JCT_rI4C0wxal $I.IhQ pe>ԱW[ ' O2QUB[$iJ<4#[ CӠBgg:~-aSv I‹5]ZT:9djf$X;dЮJ.j7nyr/>9x8N0Mϥo'N8 oH訌OF>G~ (/HWajʊjό5_,~zæS촪>硢f)Jd@_vmԬ"4_$JqN[[5O 5*ovvv*C o/>y)'pX_;+Y͉y5݈R#2fs^Ҩ6Jy\hwK ,ع-JeJI$؏XoCr\>\lDd_qT`B6l&t%QhI$޽lҲ]PB'%軄PCLv}b\чO|"ډa(qńuEH<kQCv(u}b6Fm͓tQ %vȳϝ w6=5RA^G!pU.|tյJTrq T8hl^Į +[njfɛJbk<3u𜁖9 bٜ0qC(M6{w$GHǨj\K 4W&U@!뛡] C2p_q٨E'. %_mg((FeYg}TXSpRI&Iq5^)/%;K&hx;j9ot,{S2$p0x[{KI֧Ϟe%JZ81 9 (EM˴TO)Z0[w[$$ꔜ= H5>6! AP0mYn~=\.$ RF[KrwY_~$s"Q7$Tʢ[">][=顁1-u\F܄qxJO\ \ 5|kq@ö[IZpM]9!n,#I uE*9 QMb\)5 Yh +5%#)pÕ+gw=]]nxaϧ~*JHߤO׏Ӳb*訋s39aٝ& wO%2[K h \Dwb;ӘH`pzd h(?v.B\S;t%s\9v+ILpA<80Y3GM4Fahz;}+|hRAֲv~<$ qOV'nu8sXP)H0]QvTiQL(tvC'&mD&M Tj!oH\Ԋ{_MRQYyv Fc !eYs/9Rx:O]4q'U8inBj=RK'*e_,~}K1 %:b-oI|S`%lʜyv᷷GDNSӜwqAQ(:gvc1;S0j<::Z Ƿ~S0kZX.?PlK~^sO>Ѷ 0A4WYz!iX׏J)lq@P6~J~X^/b* 5D;.ōc7W#p~خEN$ 6>FKb':$d}HM˔ 03eP$gŘ2~ ݚ3?r*$r-5oD]i#%zLc$(vImۧ9)t LR U=;bR88bDr$!U%O2Q0D _傪O x/U|_ҭwV9 Tw+MRCW\ןI<G~Q>[>in/X\[ajdfykg_#_ 3sl Gg2-f'%#h> BƯozpn݉k/oadd*?,Z~4n6U8:q" E^ug,IT5-SΪLkд|qbnVY\}CQ o|Y5/u|]'$m HBgszbRkdf 닙tm=@)Sn/j: -7tŞqx;/-J=Ĺ^/P6 7 <*LOX: tA%&v޺zFcǜK<Ή|r\!(+i~ȑSwLw*+ )˘ םu^E]_] bp 27"bU1yקe/Xھ+掉πVmº#as/_MC g4|~2([.,e~RP71K/F?K8N`8N`ݢ~77!xo3<h;O=$IBw?`et~%weGK١p>䟶 0سq«[0e@\~{q)[/>/`M{59T&gO8L-sndz m`ҰAi_1d%t,&]'(%,O7z7L0TQyhci:`Ӌ=,hB+% 6 sCLMstu q[qSIšGI`'5qst<ӗ1CV̢2 _-uenZ| Snt?䝗[}w7<!n(Y ) qAaM);B1jqi &Ø-*>Xk81iݥq}T{╸2AM#uBKOsHke}&D₲n?[s7tMI_ Q^}޼ >Z8~mPpըT 'zV#C:ڍܞX[R):^~tTwP։A:ޡ TC7YW6=~L̲ IDATƅWBKS ͅgz{@GHePI.C TݓeߨgF9M0$ s~*}FV;>FDkooI3q2nhLc{|֩Y¢[RIlDM70ڑ)W~F@& ԓmKv`>S :m< :-Iō͎| C!vH% z>q VԂȕ8'Hݚ)A[T_,P1b6G ]f, u8`G+gsy-jۤػ/mvCuNfܪC{+ŬJ-*B1۰v[rYw)TZ9r{ c86e0#ļ>cӨsZViZZ")hUV=3混oYq+&΁9WZ'n(Q:1O~eN2,+C-ũ6r./<1]8O/[~h:x+sX1VL<8Un!KϺxw:J6ލK6nㄉLj"뎊"'3Ðs1 渠9'0'sƜs5 Hstaݧo>]U]uAr6,s;;;2\+ kd'{{LرШ83R$&%v Ǥ}4 ^wBVLoW"R$p!Lؗ{~(+{玅$l'8j7~5w?G|{?{-ѕUhdBnK Ev1wau%ˬ * !Jx![ !̛n.]MSļve逍5XXoylUA@Ж\ +CVLYæS"*-Q|Ǥay [1{CleZjQ{*E}S&Os@CAQF%n%R1}M|ԍ7cQwc(caۮjJ|Z=x|y*\`а+~-{ZRT''sLv\d(o(EjDjʏ@-c m`{GZy[uR$ܞJAH={?k\0k_Ă1vXq(6cP *ҹ:$oKH?ݓ|,!*ѹ*u#\c̫KV/i_Ȭ1R u e(Eϭ$  (pAt? mW(t61x1L=s0~䂇;'>ӄRDvj/isH xX821uוk^'淸m `w-Pl'ȿ~.k7'^B G({WuBu6*ozpoE{ a9¯YjNZ.ѥ6!] i5Ț;c܁6E>AR݇O.àe#46az=~2mHb 'd~ׂ8s_\yY1Eaj]@#9%\~llιxɊdJ&:Xn'u8`ģ3}l: JK]b::Ŏ[ U"IZrϕ*~SfYqkOoMN ݐKu$IXs%;Րx`}Q6H- :vAEm7p-ﴗ|,еfm>B-k_5WrҨ8 QKt,Tip9undť,L%l뚶aJ{ hJgקs}Gw4 Zm W^b2H$gJOA_r:S(c**EɛYgHGPJ,;AuHd3.L8$ůrkMu zܩٷ9T+=,r7C S+fx8s~fE 58)1dI{&{XOfNA7*"iԍUg ) +.fg*+;#Y/'Hw3|;èqgl1yC`͜+.\ӗMfu/GsJK(Uo>Y~?9o.m.*/0Mqc CW_:Q|}{G;M]&߼DT&3:iPx#r/s|WcCڳh9xsY# +U9VAZ:OoA48iT㤅;>Ir3<d]H!>d|5WqPɗFGE\d0A6= I>"j$M A%ҩX٬6{;s8F0ÞWYuQ5m 饗_$kX յ+0'XQqV cJQ2Ў9qR*r>=6R 33yPCmPQZ6{vZ'`ѪdOK483>#4gʞݻh\~[:Zqmh@!NeMs ن| ɥGxoPs*\&˫jR:-΁ۅYQzv"(NarJ(]C*I I67&>d9{Jt*ZC)5ă5W;7yK}2?'=#o[]O be{X(7r>8eRSJp:fLabPyT%48"4Is 8t@w# )Aؼ bbNYeQ8aM"0oRA,P>gJbv 9U8N&> iPw+dR5ڐT6ن7AYx|yE7M83Թs&qx˫8$s5!(J]pjʖ_\7hxa C 'f=C)Qj9:L& cȕZԘGy|ϲ@pdиC᱅ǢJE׭Yϥ9=|kYz$e#~+R卾F. (V ]֪4'PA{) 1qmyD"a!$-*+)؁Zo:Ћ p_I)(FgQI ImϷթg7HYצ(Që9LJ%I ȡ^@ gKJc/=aNgؚA (Ё}oZA m/I "*#NƗR۫)LܠM%S$SoePEu{pMTt :4Ue¶s-"U"<[cv;&|u#"&ޖBca*o+58Ҁp4(fPѯ >Ign+ԸݎOo 6^6}G9mw2T94H)s;C7>bfAUΗ% kۤjw EPb(Y̓A7Y $I4h-N^TrykT׳9SFۤDMdƑ,޵ b@klst.~jo2k^LVi'pͭj]EޖwAkbI\{DPyՕGo-9] l-R+D\[qٓc캝)AeZaUoE7z{{@YS=gGED_G_OX5܆'TiIOm{QSKPX*Qs QM5_,CԒ6˪19}^g׫[K=,Z0yQXH̛MBeN(A"UjkK$$F\h$IRtoyt0M=U!BkIZ=S*ȣ"| GjbZP : a?8Lk03 nĻum|(u28CTf׎:j[ʷV~I#pmm?N 1uR3Ϲ6J%$%܎4wش*qK&TCf֘ Y;Υ>2bPY$8r=3i؂vzniL G-2ѻ`S }̔:L/Ad -l .zzcm)7H99qNU|%r¨oSf(ոS $I.SΥu_ZuŊ> /ɽCW^;g3' Oik mkdZ&\d؂℣ X]o7YG\~;f`ʩIܜ ўSƨOf λ-7QOI0_'֜JwiVƟ0h~Qq#+CVI$1JaP 2ykZS]fUܕ#tgs'BKA;& kQ^=B 4`5B:Ijp5>c(jhW,[=KŐ卒ӑ A]gXϕظ\ фV͸Jڿ۪=hl]IYz4O,T"a3<ɪpc(ڪSYNqCpZ{߅&6+=ƔϸPe*W  XLQ0(r.BVțe*m.#D$ J'HkׯvE+EflZ咳;z+S0d "$@O{ݧ fI7sRNWA@%m5&Zy2hcJV}ķ;J"Ә=~jQHơFmy6R| ssײjul[zΎZ~*E\$518ԪE8Aj=.jUrFev,R A)nbElxfMj)- &MqIs[ ΤbhóP.!7K.*Rire!N NCgP$|6U-P2D "wls& @lģ/q΀P?m18icSuQXe T/AqQxB@ 1}+.f3c$M{;=>8^ Iؾf u֬T6wc Ϫw]"&* JUx|â55K;F&ܲ2?1F rrb>g^8o @7wTma@6 @1@Ӄpro@;]񮟍]?Ɵ {SZ>; `p'x 5C&r1 O=-~&xB_^ġqAP[\;EW:־E]t.c QkI? JLZ Sn`Lp}۲3,\ M$Ibsâu׾ vUο;^ EpCԪP3hwWIptXN 2(VⅠ j:QM$4,}s*Hhl=L#XK cZkN=Sk k;:א1:n̈UeYTX!@1*U[% ũBg=tT.ґtpյH k U!},j*~zI翯k'nP^ ? ;~votgU[9"V^r*D2umS܋;AӒ7-{o@퇮muactU/E}s\[A 5?Xԑ['%~ Mlc;`EhK:Bs@)xCw |= C}WzNj v-dұ&Ӛ7Pؼ=mM7s[eKZ1CweE⻼nO{ 'n Wi9Ͷ޶YX[c TIJl /{=JWJjӜ*aٙ k~8zdgmvt0km'ŧ_4Yw5{xi7g?Jm 8t !lΙ[$;syyUe,Vdgl^ "(`i%.(.᭏OMkˠi]J~y l#dA3b8A5خC$>IG6r͢τaICP$J2ljIS *J;>e<66͝CQ}n/ie|һ'Sʽ#ön;wpQq \@01 ҵl:p(\s7y )TRN;7o`z9^BP@oi-=#ȟl}U qxbe鏁Ctm4ا>ۉa̧Rͻ_.yTtbGl/Nf:/Mv[OlHlmĦqP_\/(P 5NVfu\Ûv${u+CP] D\~IP7MU5X}!TY'k6mx 'P&B8CkdwO|ӵ AZdD],TmHj3<l::-kA0e슘:ȴ-Dž8~Ϋc]mg Dih_;& mҀA8 w4 9gm30)`g #J /G;gӱ <OR8H~Ctp8! IDATw+p\Sc*w+h\s=mxc-J-{vA68AHۥyj-'?K֙k :]GVm5!a`H&UY^3t>20wF%xՃgՒCw V;z[_`.Z|;U3sN笗Ca߸xr_<#J7t{nց1KѹFsmզ^:,l/q4'dJeg) c|i,-~gl`*Ymy+gDž'a|N\ B()~'0' \<:g)ħH+ixh/ I`b:j_߫Ը+ttq?eZR C]&W8l;6f-JULT:_Z 2|^W,;KT>@zXdqeFM+=jخ4xkhL:5tۡso%049$881v[4ިY SjpAƈ4yf#aҭ6:-Y- 5.`0Mm1b3 y!*OτZZP٨JWBeq[kQ+ϬvrOw-64)j~\k*+}9'xbߣq o~ÇBv%/݄Җ$IlF1D٬g:Rٺt m|=1 ų+D͹/VΚ?mgcNHv&o៿^8jw4:~v64\<-:6>>~"S v~Hdi:o߿0ę0po곛Wnu0{u_eFC{@R(Sۥ)[Q h-x[:e'^2u(9q7[`HL4]*yvf2O_Ȭ~t82j[kãt+'qao:7wh)]8`ĝ A F_;y(<ݎ[<^W̉\ԥ%U^iINk!VhU%)Em[=n 1!5P5mRBm+/r0 %CE| 4ݺ=zQY ܥM[v3PL}Ǡ~j+M=Q%gRs]zȭSO|, 'U_8 Z/:7Q]PuR }mk #k)3rёG:n8 6\Tqat 3e/G'_>Ro_dB'1_H8N =py]q"IRQJ9RR޶6K*d24U8,uZFeZѹ$u< :z kJqWfV%i3V^;>__oR~srs `X8KzR?`ӘCdn=NhyTO36~+ª~K{}Ughbnc}^%iM_+L{eңz6{i#aq_j/K%p+>mg'];Pj ' s' |isΛf.߶'_d$-J[kt)Qjf"^tIo$in[C9<*B F_Aev`ҋ0wR5UO_g2sMTT|?GHچ٧"g)箼УQBcK GlsitHRo=GqC5B>R1T&7H@BgnEոZQt`dh?$5U({quףTB@)4)V JP~!S5VC x$=dm5gNZBNɸXu[sU}yq 7n68|z:N%m-ztc@+;~,K+E^ GYvS^>G; ܣ<#0 mI=lJo}qxHVQM@PM燭gY mh|xtѶ)BrDOG:z{N2*9d+^cehdQ *˗;\ɸx;za.BO9}Xa0e13GnO\>>Ұs+6=kC$/^r%@y]C7oyjΪ1N}n $ZQ Oc!l=ѫR ]XB~DÛx>ŹzXgߧ܍^puɭQu&@}f˘Mۼgq;H@2Uڂ;tRQKc%|*Z~lWgxSiQ_x ƴ)JKoۺy`GZ)CYxLIuoI|AȑGE:=瞏,I?&>{ޙIB) O7d'8ZFA@MI㒪=zn~¤aЙ?`Ev2dК+S6Te*}Uge#]7~)ut#gʡESn40<?/ByGEn>]ci=>9PT',ox/h} 0tݺ:T*e>AI19`-cQ[$q5Pks?kvYq3ϸ"\\UI<tm \b/ݥ7ziTLDc,=kau&c[e:Fvf1q 뫨,]?+99>Zz+]l;pb&R!`]]q}+Ư0TUigoJJ#pSv$@s*)++ ȸNj-Q~=Yx}-Q9o&tU}gl-^)RuPZ˳e٤@_2ܸd>u5]bͤy I^{٧-#~KbrJ]t,}Rq\m{(pk]ZFN֛L#3PT-i}gQ5V^j?= ['h!X9_K݋zz|q2 gZbZAcP* k:'xyjUR& {1W0})߶Zhf܆NaJ=K_ k*7X8eO&Ms{8\jG?T0-Ǎ֪ӎ14$3gje$kOIX_J=eK+i.Uǔ7ɢ*/\N~:ؼ+.f~x_~G,|i̫Emp.(P[/P0iXtVVb~kʦ9g<*b <6EVӱKv)Kzë*'2a#]ܗ;%lhij5  I hA5YgP{qt!=K\M9/Lҵ6ǟASҹfQ:AaVSP k.$97}ǀфV݇5 C>4̅d[QZL^۳&LI7W}0<1Kz?i2薸`V)}WFR:TJ'sC kQx [$\dkɇvRrWs5ra&(Z$$w6*q1{ +m/ODarz~N|e&nG|6PFB2H&%Tnx[1QoD>_Z)/|M{;I#59Gep +31yKYxd4 @)j.ot0P\;%wyUag<>+k.wfpr6 cEۋ$k8Q2Qno#v KMVpI#Gy9#C V!5rB cVU#.oyk2)I3K򔬥^Xӟ W;Ҷ9dB@cwitgQP N" FP:P*o2xc-~YO^=k~ԑ֫tE#樂pYFU:ഁsF[IֱE>+]n﹝oO=~N Z}/ޯAƛ~饂d Ng%w3؝ZSm_Lbuʣ~~y/(KR$-nbP19E4 N1wNqLlhOh=F(6z `g@gc:<_ce:3sj;l?at[>߭( ^q"quaE[q= .RtPMNA ]z ~ȦW?y|xMa(sLzܻ7vD=6p1^XQ>1L-z(\0ycQr\Sk! ^/@_N8N檏1[n}G0t%4x4v2Q=|oP"xgRAa-ĵ6?egz*>7JچhVS)D%nQ: _A1La)w{Na/7xQmTJwr?n *>1M-h N?g׫ѧţj*QϦ*;ACA+77vksx0$I;P~ $B1eS,|,?dHs= IyT4W?ƩlB_+8]޻e(aU*Uhyos[wK.fǢ.Ӱ:63LO.IA)0TL@!(z%"6z."HrG\rՒ[L\rYhgn:G G0cuZ.lɫM4x$*Fa̋ Z(vL`~|K$ ':G}߳b& \ 7schf?c{G]+w;g|U;xkQL^C, 1uL|s~uw%wuzl I\)ndccn(DQ\ yieպ#^S)LyKYAfC@JZl*9_Xw?Мo1omdw,eO1K*M䭤;\\29bĄ#,?mZ~Uda3xSC/ew Պ"&{N5WXIvW&73ɳk S&oճis$]Ij;81Q@qY2Bd ^tp4]o{&L]XJ4^X#('oERv.À$ s0Aeʌo&,T)mn=_G/]Vr e4*xQ$5wv A5KүQlwWzg9O奞gU8;s=lUJ<=EZ>T.5}(6,tOC3O}&{܏3p]?sk#(ӎ]/nmM' FEFǥތ>:(h[9vNwԛ#){S?d;NoRZ_meqJ ZϢmC 1kzͼ{xY{i<&P3Fq`݅5I(p`%x-0ӟkU$=]dS w6$8IJm4Mg9& FYEqfSbon!Gdu6,ECGu)+ O>װSV!IUoHsNBpyi fM`ɴ[e1;_{F5MeWVZRHk gԦ(biiV+ٝ;w ?ߜ}f~8\deiY%H4U>:?cZv؀mQN\?5&k[vZ+voK.IRe> m vR0 GYʚ,6lkwMH5ŏ\FIn1 m*Q-VN HgEZ sYeR'Ӥ}CFZvh'}QIXdSKIÅ\e}aN#Or.W7j-;j+WWM𠾶7j:dr`jJWw%^Yܝ$)G~Svz:aKV\Ht~gs7r. zfVg_9X`/9;v6@3w5enD% \-#XDweg9hWPzY'N5J/ay mQ%4K+<)#|V-9-xFG&XfUĖ%0Xm_3]N`Z CUj-GV^Lrsr "Yefj\T*Qdfy  9"o>c]?F ԌiRnJJQ .?nX96,m7u)o_C$"T!`X4SoFK($88+RB3IQ@ДljPh];fλ:qՔ.4MQ S=:;;l5GlԩMӳLx/9g1dy (XLKPIg ݗ^ӵsTeaz֕Q (:f+8&e-T:}JM)ot)u3G>Vk姞筒L#n'*J52J 6HBdɻVI(ľˮzJ24A4M8 TjQ*-DĖV*pX):f\jzuAyA|GٽFvX=lJan ߾ǪY pwGU?MuU-6 f܊*FLG.?*䤄/μ. rkkS~rE Z~*bvm%+X/co?pjrf"3*$H/qYVWEZp-A#~&j؅7àGsM@q;2vkoPhT\ݨFxI @~bﭨ3o8,%){GYL@G˅ݍ[Io#*$`c/%T4FPZ[aXD[6}78e0IR =@@Uԫ\}W= MFj|91眳`XapqVLkDߧT?-\}W8Ub#@LV/cɘ:V7h[VT_K=4n>nHf:vNxc@_#M4 撡!MKIbW*Fv4` ??AP!̒8;Z,ZڵLUC/r2La#nF9hՔai_e*BٙhcJ.KTzMLMcaL=@#10VGR+p IU8%V\٠aa)ڏ(uFuKCnRKoPu@\GR7*bbEs+Qv=TifjD<&TU|6~pSϵ/`h 0~_tY^AѺ2m!IR6^OUZjbEI/|P٠b_|]GT)LPVdy^P7񂷝 cˍԕ>7*'N5gk KꤚɅ\Ml:hcG! m\Mz# )mJz8Y=9)ìM%!)+UD}7*)uC@ΫLN@?"icrѮNֳ&I ױZ^wQ;?FljNx1 X18[~!iv~ՙy va#x.WJ?wzoEXR O&tghc`(~ kxLy&fxSL U*~Q#՜6Mr;fT36XBrVQY{!}SEq,"JK<7*8Nǿ)V^Il C Cy6ݙGNN0YH5/1&T6#l/u,֬FYlөe)ΦH]]sDo3}vjF~"+x"#F|SVJ5`"dY>)-[LE^e}?OSzR`;f31`hf٪0uQ!͊k?6HO>zb=j)ŕSjgP[aWv7u* SF4ٖ>7WvUjY'vHS֗$/F_Ա'mdy@л եg]S;R}=L(ߥ|SlWxWSvTXצ#:穽mnX/d\-u=4ppA6Ye2,Pj_/ӎ47YVȷy׾A=w{{t׵l /)5d$wݖC\ 4`3P~xJCYrN^g:bS o<29]z3?WC,xqŀ(z,a'MSRrS/D81 UuXz5蚎 <3Hȓ[V}čɅ;Q~r\-"sNEgij%@RNTT#f`uPbH0p(QfL"8g^\30 (R$,}RUyú-vqҁN}܍(uȈ2߰$I ).H ߈ Ќ e;E$%)b%<}7C>)n!["/'{,t0/cnuvSR̛;$I &}{(,1%pK~z%ts.aI~vLx8ڶ$t}uR~f,tǭ?Uwgkl*fyڊvaJp)E(lom ,vE蓜)$I HM(EH:C'9 8h~>sEEdP_iFGmzo8#k[iy9#$N#j9g7$LVPM(zo?6fM\^ʍ/5m( YG"+n.IрIRZ"ZqG hPo5n@;z5 lV&VP#}<%!Ӆ@hޣ].ʥ2Q&~PRa^El7qR5ۧ}zT6M$ -a(IړiEՊj5Δ߽e,ޡ0h+Ι o XxJ'G} Rgd/lܢNz$a(!W\MJQR{Z,QqX,j-١K9-RhwK& 4Qw>:SA2<~V_NU] ~L#U84L53ӯᩴMh>u;CV3-t#Jɔ 6MPy{S՗ T1>K`Б0y8Xg1}lMxxۉ\!a Na\"2"Qj``H_<G5ZReav• ,TF0pBIN7;rx,L̲\702M%QdqLr3%(LlMxŝ7koq7pqHbkKpV5~x]Į cǿ e\ZV6B#x/WS$r a4E 0yT(旤|8rpG}Dr[z#fg +".@ WK=<*wuX IDATsz!Q8|>MӅ{{UhH*0fHkZZM1ѡ LVj":ǻ:A|D0ٹakyӛ]2tZ5f@4h>MALER/]n= kcy!C~+ObYeu 9xyEz0k-lPjiq!(z)?(T6CZќP#tNb^^ɷrfY|A]ck[m"b-7ol`?W\ƱELla# E;L~_icᆽݍcf׏1uGVp_}Ύ5cB'wv4|lPܗbBgu]tKv7XmhlYW[{X ^)'FEtǒpyEuTʈ;"s#v~f`2;k$lkGߍb>cG\RfULF==>!@˵[+pHt녬2?~gx5ʡnN,hHZёKnEJ+?T~tY:ej+ShC3Kq M.WK+,1\, *LޫQ|H0qǭH ZKVք71&j€3Th長OT8kٻqŵJ6E&rqeǧgk_Q"~Y<}5{K^}WLe QDNptIc?#SNa`yVPԩS7)x- m7]aT?n?󼵂=& ~~/v(1 %=':ނ~S'k~Ԅⷿăo?/@ s7}Pd _q1#eʢ^O4~ϯWuΪKz-z.EǞ ҭldoV\x<]>X,ʀPPoݩyC4ӓDQ_ PR9J Ư|*O.lS%ѐݍo|CQjVGnjsIr1G,)Dfb)/*R֒\QHLE 4mԐz\F(cFm?Y&`o;ڊ|iW5f,Nh81_{v^q{/sn~bpAuez{![ߥ7 kŷfS4b MqgҤFqmD÷*k 6 u,F1Ƣzʗ0.gP`jI]IXxӋk>Z<&)wwWmD3$U=/.,pƘK>x'2j¼yv(ע;d8Ycp1 [8+]-b&]&QhG,hbL' \'-K71qP l^6]eg`9ЮN }WyFZ56w]WG⇠_ǦMok1=f]0wRUu.78g&}<0l_VZ%i`3pHFI [MowQjH+EMI`pyJƫ'u#bk]un_sH(R?uƝn&ωo$?y jߔ\fܲOwc\qgo V~j3y]& kBK7eغ9(# ;הh s &8&$n(`{u4s!G_˦XrEk! Lϋ.݆̍{)9~_a~=wVV{X_?-O7!M6& a;4=bkoW0BV)aMq<έˍ[帏ZwwdsUCZvΧopT}o]+^ӎ!TYNڸY <'Эƞp,cJ|oXX4+1}-sO&a{..'A0 %kP-)']_oⰙoxuYpC4a gPqLιhluUMS0<+<weZӂ*y+֠m]YovmLų _w~_FN[;(-7Rv[nt r2|.n ]JzR03@q@~Ԗ۞fk[ 0tJ-Iy^>ڴ[(&sݺzA$I7cpB>vϷ.v#~IN=PyuFV5ckW!6׼؀dv=\ s3.{|2Uvs1;5==uWiE;i)%Rַ=ᙞo apn݂׽a7ߺ|1=k~} z-g+q[xğqM#L7\ѣ0%/kШz=+++;a(>C8E-ҳ~wNH3,ijb9 UF]~@n`L9peߓ,o{Hp8JS$&N|˽X,rHXj杌1.d:S`h5lPT;4|xr}-޽Sa3:E aIRϴ+inJJRhA#,A1| bb6pծsnmAZ2qZUA"I蔒pA4M1wJ ߶۳qqX6J} J&j'(t[~tJ'~Yo?CϢ=nGOK!Qd U6*4: EI϶WQ2cBzPNJm7S:a-jKK֗7Ğ(Vn;uٮW?7Vԫ{nRyOgy$8LamD^nFde{3["nK4;VzeYRs*>۫d /~N|xg{ w\­ßz |no}t㨴Zy-]  EٗSsʞ i3"ɄZ:D-dw]VP$ѕP|(^c{X%F^p"-,t-oٽP7M;շz5гrED [d6_}U5V,yj?Zs 1]!h?Nk3|8/{q$E &fq t4yF4;w$I1=&wkve3}sqܳ kq'mߴƂ$-n].%`U}>MSttyׅaM3+ @Ө8Y=d+&쏱i\Ck"o$I#6??oׅeYyʒcN3 A"W^ދ+ra6zʗ}-ŝ~]t|YYm`GxCC ܻs33<{3t]t5##}/U(+ Ͼx=E돣6}?1'^9JNwΥY$Eiz"M@i0hԯPK cٌ~?D0//OtřuF*#.U*sfd*!AYQp#-:Oj0t=q97Tɇ*k>Mٙy EuE~%{N92rYq4ãqEY8%I =<+Ґ/[Jjp 14z CNs#}@µ_s)"I TE0|WL^iYEj,8s[BbR IRfawaL~/yc`T PV)%00BPc dƸsbynAʝ-Sh=PdŬ^uήwn֡s 5XJH2,z's۪ѽS_sBqc7[س9;8I _=^h١Mom{̬g3B$)6IR3ӿ5r]a:}PgyZUԯGkC?ٞk1{>X7Jԣeڒӝ\DŽgbe{BY[l[-BA]["4Ov$jъmp/yC?u/t$)ZZ cpNĝѥXooJy1?aLWBC˜Met6PI918}6wDPl)ͣӵ:ñ3Nmт`8ב<&<7&t-`6':m0SAoZt# ow Zkc>\7q}Ӛ8 nGϳZy~B-?qкM=\ߣj90axtͧiOwV5:Mµ{=eFL`PI(j *?PAZz4Ѡ+HjU,m݊`Xۻ~QT1;Nl3'VJ#* | X#ݣ{]wMD`.I!WP-𵶲:p@#c־ZQ'FezjQ y>fN$Jt'5 姣c#n{noL^iMQ:%bT+1";{g޿t(P˫Y˭'9TjJ8<$z:NG db_Y׀ΔZj,/>W0MFX:R$g-V^Lh`AQTFw Aj4@q_4$v걋?upC`Y $s裣+Oh_27<)E1 &DXKo2lqyP"uo$="ys|eR>X{PDDń܌i4f]%t=g%,6*_biXj';Z~V4&bN)&\Z0P [E%$A7`U#voz=\QMQS0.`$QT)Pc+PbNU:G _)ake|` kj2#GhUIX+,kقL+p)qN"gqcHEKP~T3TUfeUTy]9>II7Vؾ<UmFCSrSLx#ͥirUYͬ1no4VIc8C--Oo4F)EΜ>a՟+ Y2*Z;>^].: ms4 h/xD3 ON]hU c$*C#Gm841eyTu$jJr:|9i[]Sf9xaw͍ !GW+fS_)53纴sfLFZǹƥDUJau*wj[53~^@bZ ꩷Nxly{bbr Ҭ쮬׷ʨズK;?++l<)Qlة0 H ZrAR*QE{^1h: C)ZB%^t|< C) qL7>*tM*dCFeJ~iRJ"Xˠ($O)[S5 xeʁq0:3ǡ\ţt삍'֌ gQhic4X?b]9~wbG(n 9Tm5Ux}iy'A~>3xz~О&<"pj[)')TQ,&.+Js0ܸQE,#:Dr@=DjA`TMoҶQ3eV~ڇf}o}3J,"n.Ǚ\mmWT+൶`jAimROɖSRѮ [Sm-~EQ{ %z @1ﵮ"sN Ics;X*gksY)j*9IG| xՐP3q"ߟG}z+t; [D ;þÖ(x< i\RRud$z- O%#;g?ݦ1ѫ"00aJEY!Y~*yZrqQ S"X1{)n[97h$%l7eJ  ] G5:9ZM=e`g wE 3z[ Ǐ^g l_2ۧQNFJglYtس`1ݸ x=)woS(7]ʋrlCۮe'_}Y=D$G'Vv{KD$IoVWׄ_Ljtz vv3WV{IW2w}m=f$xl5@yOpLُ]˞1ⓛD#KN}|:*n`_R/R7bY95sM.NzWݱG i,:Z¦g۪{^]}S [N,cu Ѱ6|"BTfsAR#̩Щj$)JUG )j3zhG7l}'C o*8Z:dcR\Wґλ(>Z5-r1ƎuяxQ̗9i0>=U%mbn8ӑ&zgiwE.!\l|nKz_awm-0zCg%kvTB4e71pWrgٖ_ ,GdMi@% !IFe71p\*?ﲙw!O ?E?`1XZnٟz{triXF˓4C;vo6~+]c2<~:a͑r |c|[Mm 3FN]sQ,?>\{3~>,n&NX%GJ 6ı^_G^:) >*(!Iɫ[o'2ZKR77!ޜ eF5WTѷ+<ʋrrz5z#@JjiՎݝcJW# H\B.YH;79"jkn?˒7Z`(PH䄵@8"O)[f}t͎,MT m 'VpbQwmM+ZVSbSKm5e5{B:üfUG0hs CwWMP&? )jAVvrޥ#-r/V(*mTWfo쐵ŊwCzigAC8LLAr0gJln2^`xa(37Li  I e竛 Z FW>`eol,.g1twZfFW嫺 gzsǥ=1O{jz`L-O=xz7y).oh0 G>L.M} 3^OfrUuϾ]g)&KO~ɻv\)mWZҫ{c[ mEkl‡K,3ƒx.<+vX>vwQs#Z=WFmO~g]Pӡq}uǏk7T335BiSתRodN'd6۽DwlP>ѹg?bwR6#- mGc3@@X!AR rr_vY479M̍PDH‚af1"soL%3qvP_!Zc4( iE@Kǽ{g07ԬCGww[o^`t"(ԏg;, JAբ("#)BQd$ۗk'ؔkzB@P>](|.:4q(g|61i2.>/[CQ>ꩳ'զǞJ99cNʉ1b둋6U {h 9f/VcgCW~uqkƜO`OŠz~c,pZI ' 'nKGU3U[KR'}X4cqtT6`(x[g}%4-i.L\Y]hus,UݷIL1é#V;#`E0; ;0wG?fNAiLLDnUQS׹Z_owGxbMS~)n[j)"oo#EMe)Bʓr PH[+?S}f.H:jMyƽ1AzR~}B&9xԹJjbZ 󅍥Z[% 2a\Q4 Ѱ1Pi (U?͈ $eT5Y H͚w=Q6 H_*I+i\[ZuҢ5vi$/7؍6n~+L<I:FR!8Y8Pס{L/X#6ݾzlDN4$Iy:VeUOt_cȗTv'GY Cq2u(_pBq!R"~f`JA]C&W34LW_sf$ڕbN&(t$I >p1l%`?7h0$!^fZ$I!;K|5˃UUMFgFMbm [MMI,U3%M)k)I~SE53级9aCyhr3+6Et1-2F.j[a6'߉˝ j\}7rymۅmw7[4/űs2RX$.Qk$/*!dbm q_CʣK\ ACc )hEPLjWG:.LV;Fg8ޱGa6SR!bZ ?(RAӾ9&,.ِ95:[لc xkcV[iZo9G)X405ٽ'˄# ;Oe{0CXW4-jg-2IQlG퐠6ߊՈ=E.\TўVR\H$Qpj2 NPr UY@hlôT2{jP8zأM' ]gx˜ `Vܦ(CWPj׺, 5B)>0:vxeuԳsD$Xʲmbֽ>(-͡q/Q {֣<D^!_\ErmdKZ Rb Nrײ0.J ЙO˪ZSONFsSt+4?ZwM2b~Jʳ(|psamtJM_w/ݏEr:[PBR0TTAWL<"N@ .ː?~Qh[=bL/!S6_#2cM#&W ; ޳#ʚ;;y2"*aCoR$Y:7ҕTٱn4O\1ߒ+RΏD,=(䬹 j[3@M`lɈEjʣbGd \6=F)(*yZasgc5؂C\$ l4{2iȐɏVT74{mMzqIuxwwBc  {TW(%l&6+n=ѹ-}-Hd A@](ŕ,%&"\S߲}aN'69kpRIִHTG;m䬰GE $WAP4ms&0D7)/ZISےO op4gR3zQܫQ;7hX ߼7Yukڞrq[3s$I!sQOp ֤"`޽ Qu3)qF5-y z⹃ڏD5AV!cM=~}p?u^{hn׌^c4S9kFAm㧽;h=nggVbbײXpzA4((r4{b.CP L%R:Jg Rb SCWI!ooio *M FP.'l($213ťrg"w=9 p]2NYۂ&#Ucu .5~U3KU}֚ eo2E TW +) Jg}@iڦ7&`RPjloۤEۭeNP"8,N8a&ڜU :z8W+FY|\:Jۅ_zlpTXe)Cwmj&1OW3~<`#X2A$u~h=]R .TdRX>{ɛc -*/ڞSku0JqAqqDXm dА98AQT+ti%Zi:JqJ ݹ8`;"XJa㗺+f0}u ,)4`ԾϣBGvEߺOqj&}Z7կ@ݝrj̦@/u4b <.㔖$j, lAiG=={)[Tv#A_r0ZݫAoVCd` K db>ϰǜw{5ٌpQµ"-qq_uk_c?8NrSNڋF5 ү[rEq,;&T.:]R\֏TVȅ!FAa(kAd}I*Kh|*DZeiMLLEQnRAS_Iu3ȕ, Elx=B,6yUYSv+k+Y)Ǘx̺&hTъ_1}^QjһP"{W}ڎј[4mFȅI͸k&O0԰Kq#յf!(e:xOSO!}4EF2ayA1 :ZZ1IխLeM-B.9e@W&v|b{ۛOj-C*-l,(k!+VGӊZ$I!f^rYϹ&^7LJ Ş~XZc;f-}խcǧDƨ$;y/JuuY5?׳+. ;i/~hv-[?eso߳";$Y" ?}=U^Kphu:;: hd^Hu. ixux-7i*|g=uղK&<4>G"ߨi2ίkX"^䔚r'Zm %mʅ^Y*u87KmfO:²3TɨmJϽ)D ɲYy>~o3UIcW(wgR`i1r.K)桴[SϸK"'lzWC[^WNWRE`C)ܒ⢹R~k/wjڐ"GusĐQ&W~ٛ);[b&E[ -ȸЀRH)+-immrm눟=G$zUšV|"IS_us1Agjo 69f9􋋷8rxCYN[d_e#>bcQp0a' C3Bk[g*CZue,gxo]{UvKE^v]m_>^n~$.%0ґ?ͬ&Id30gI24ʴ{W,_6ԿSc1' Ħ&6Qwܮ ?scr?5p@wkNXʣ;jrXv~ǡ 1A4tumY] ^o}uИ y{c*QYCTA-XK0Vi{؝Gl2;ԴH-Ӎ˱DVM~3n1+!kxyTȝohFsqK%oG?Prv! $Ejܞ$tz ӯo'KpLvMIBFtИU'G(ګ/%2BCasz[鴞Xԉ yBʆ|}pGƼ:oxENvV35yd=wAsxQ028߿Ey#v[/'PH:;rE@W7X ]6FK1 -;p\7' okK}suaXڅ 9*AQ5-$T'3NmIY}-q!~/wN$PB0:7:עPˣ,5W$E (V^ EGYs³iL0< ̨I;RqGqV(N`\ lmFUvz8 1K:!NԲ8ߏ9w 6u8b?8/`ȓrQMQ9IYl9ƺ`0?qPK0Ƕ ZP\PUQ F&R"דp*kZH wwRIߋGG`T/2H3`iX4LEG6rܪ? *kA2&&nL 'Oq7T~]z˲ CP_t՚u0p5]YjJc2RQYBghύ $f Ph_cxݷEO-c RUIM/G?e2E˽ qy +iǒOy+$%2AsA֍ k-]M0,wa] @$CJA՗N<}KjI\[)GTLh E੢g4ӶrQqaC~QVƘ  )7T (CI=V.<Η;W? *Z9 )vrx~eZNc)cMCtWmidc [.>*zN:Wpo(-tgzS@@F;;Ĭֺ;y7~ q~w%]߂krW^]^x.O{*w[MAYB˰~Vԕ.3]n+]-ߌKbrcm!F;uicE#p#{EcoZGM沀T8"d5%:N p+?ʡWFLR@BmË=Q4R! =]^e}` 7+?8w6Bc$.n@fdG|0W2~.?6v|N\񢼰A{F9aԐ\]39`˗V I@`ӳBRdwZ=e9U_3(@g o47_KQrZ>D!PY66T{{dq~uq +)-Ygþ;|O5AjhsyfNe>P0pʐ؂szQ}!kAأ]Ϩ&`aQ!4`ƒSE TtzzCiqşŨ:{o,4$woLClgJ3ˋ> |[ձNMZXG^|Kbo@VU.^|Ra.[KS:{ୀY=PR{PZ?ͥǬOK6xڷvŰhiٚ}> +*\* :rq Gˌ|{՞:A/\BP(6UޮU A(4hl/SdqI! 9 Ae=R7HC=Q4]#_sO*"}MM8iXE!.\fk21Q9yYR\*DI\N'sNEARaI:(m$:UbxMR.2f{gF{<#b>1<3N^_õ#wɠ!u *<6ɕe]V#[F9z $=mml7[4Gø* v_W 4 5+bV uN:AI(PA٣yb[mQKNa )2JEJ^Z6}¬e학*ZP,+hĥB!-](vAƛB``^eB1:V7e؏ԳYBdt%գLgH>\~oPZ:n>')$/lެʺց /(Zp4M'vDe(i3ru4 ͥz A,1%}mGMNmhQKBr4 I(B!M)#,4g+T!\8cFf{8' ')hP2l"^h؋1[kܪGɦIM$ͅNE(@;XИJu5o$Hu`3:=#fO|pxkˊ~VPk P,i!̯*j*LlJ I[2W޵'ZЌM}I\vC BPXbwa3˱ӳ6>ӫWd nlP.4f:J4A:M CFf-AC dL_M]+~t%@bNSm)yՂ 6Q,xۤzAŖٙViQexatbh5-[I ԥ.5aRI<(n}Av.k0{ |k{34c֟ |V@͗o∜ԥ<;Wxwg냾>^>p17tiAnQ5'?\Z~bЂӱIE3<7=SJE('N"18 Q7H@ɼ2kCuSAO/6L((2#m]8;kk]ozMsN!n\jȄU/of'Q(p 'L-rX'mZvH'][9LvIM{$[w2hV< h֫ٽ [TE2\̢i:n6=7&˻I Wٍ^- ZrӠ 6k{ʡoCgX*3f15^E9vs6PJ/72Bc hk'~0AF@C).sm eq՚y=> z`26=/L5wJ_MqGKTeY] (2t]> WeU : gRZ!{sg90k+Oٴ3dJăT!E$.i8M7) O5@z=>kh_xvt@$ PK7߼Qc}fU^džOV14Еd;(A)\V310v* BtBz}ĭ>;{PYbY;d@=C Ϣc S Zg?-f 8MU<0 )*Y5ly`ﮢ^w"H~Kpq0Jpл[~fn)pkKV(T =ܾFK{oj 5R V~v!qy-LV{t!+&dmཻϒ: jEDmUpb4s}5?01ixwZ ^C^~$`*%rۀ 5_i,tawmO;IDAT3?Hf`9 v9ab&<}E!I",P]cJQ^sz #Gqj4 o* )8ɯl"9Ų9sәUm.=2^i"#?{q;L:m I$.W44j_? ~.ԌdV֣e dm<* j:BflmC*,1RSNhqYiښ~yUH$6t^0T>g\Vzl2•luJZf zЙʨBvN`,3>׈$5׊ } +2{"g(ڴr?ueS6V<7A/~\{,UL)@x| Thl+-9A< `dzC_SZ`tE'?$K}lrI>zE'?v-J`dՆ3*^&ʘ}憕:lI;NE\[Ӽӌ/nvߞY,:6âo$\G_>_nOApWxbOcG\9MD2O]w)sk޳j'f_ݗY_,6Y'mUD@dXAX1C]Lx|ٻ,Z=W#rdw/JZc-NW+X_*Y ?Ԕ[r賊V<ACLMa:=T#mv[5V&l>.hɽK4Z%;:@!<\EΣ:rbjFV~Q7KHB> _ }=60PVcz%16=3emrQ5CRΉzP[Më'o:AոLXkd6 q\)aeFr{ޕ㟆g$|j1hmXo]w-mj# z aϠv:ƫҧLq?7#H)nȾ QF (<1dT?^Hf)J`-IⶃBwta3c 5+oᣡxʊpTj^ ) bjZ$29 8 B ĤsJ t ~KX&έqRWx% IQc8 qA8|`aX7]1} G>KqIG\Ԛ|y-rd$1y }{MUU6CYJ!j;s݉yꇕ4M = M.Y\Fb>&Ws KU7P!U2D.l݉Tt.0<-a}Z im^jʌqO34 |,nyf;,n^`2ИJ""Qmf 0~*_+voOraqLJ] (;) #;(,>极0\"`(""(Ѹ1&+&R&Zx.h0$FŨ1D4QFԉ*r) s=} ƨ1Uf+[~~hNQZw7 ri{>LH6gŬ~^,P7׺Mm)C73#f j16XKG.ſn+e~u7`X0d/}B`]wsz-yp+ Sv1zKO 5\ W_<7vĴlJt(>@sXwpT;y} dպĄ3\h4E\t\VMsFҠ@'@Cჟv@y;byN],k>{J+kXdqz;E| WLJ)B(+Ew M|^,yl[foCgyGEH?_AtM4P w\D]aTs#&Aq9Q  8j%J}< hGhou{jX' c%c$-fIHQ|-ֶ֖m_ piBLOM4b`hϱ}7dh^p櫓+su?ªf?S;޸ l:ך-11U[EqPDLGS&}vI~{'G{d;ro3:5[WA6?H%YvsT! aYE0QG)/]T+ II:Leh&y' jYp,~ɳ#($@0 XZ$Ꭾ,1%-+|f\p3 ύRl_: ̲v$c(Ÿ!1re凞M\sjۢhoP@!FG^e3<;`-pVn[DDvMQoV: oKxIC8S*ksrD0qGO8B͹Cv%o0jN$UZ8\[am<$JQDVHLK rm9Xw\~j6_s5v8XT,OlMCTF9X3ҍNtƈs?to\QKL׿bU`bZR%ܾ o+Fw߉0 "~;b:/qMٛ/$Vk,7vKTɲTaVv)$4!kG17Jin0S(x{g=w˼upCkzm8Crl Yo% TE,ȍ$aKCmaR.lEm |_iٗ-%C{\_JZC{GL@(x̊У,&]/ǩuoV}5 mF'Y]Z3$v ;g!q+cJ}>-eܕ+t:cirZ;-HKx&h~uݷqfRH~ƌa72rIyG+ NE$o:磟N>.K.z[ d 5h'5w5[8CGϧ=eϏb٦od委j2 Ǩ2j9fJ!P/įgzy+ҧx;Qe?n9(@7ryKVVU~# $/?$(SGu"P%6gdzGaz`YNxוAjiÜ:\u\2$*PnpKok]a7 *i]*Yizb喢rd̢^̱_%]07{lK~[A!OfIENDB`calamares-3.1.12/src/branding/default/show.qml000066400000000000000000000037651322271446000212340ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ import QtQuick 2.0; import calamares.slideshow 1.0; Presentation { id: presentation Timer { interval: 5000 running: false repeat: true onTriggered: presentation.goToNextSlide() } Slide { Image { id: background source: "squid.png" width: 200; height: 200 fillMode: Image.PreserveAspectFit anchors.centerIn: parent } Text { anchors.horizontalCenter: background.horizontalCenter anchors.top: background.bottom text: "This is a customizable QML slideshow.
"+ "Distributions should provide their own slideshow and list it in
"+ "their custom branding.desc file.
"+ "To create a Calamares presentation in QML, import calamares.slideshow,
"+ "define a Presentation element with as many Slide elements as needed." wrapMode: Text.WordWrap width: root.width horizontalAlignment: Text.Center } } Slide { centeredText: "This is a second Slide element." } Slide { centeredText: "This is a third Slide element." } } calamares-3.1.12/src/branding/default/squid.png000066400000000000000000000201711322271446000213620ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYsXXm7tEXtSoftwarewww.inkscape.org<IDATxy%U}ǿofce`d (}IԲRV*eECXFMRTʊAB2RRj, 00lo7ݵo}Ͻ޿xs{Yix#q["4n>|/(A B@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20da"ÐD! C@ 2 Ad20Z ghu]}fzрJD2 PX>&']}fq1T*"PdP0Q2`A'H3d7e54BW]%H!tE`R]M.IHt% WXougR]EGM X D/ H>t/ H6t刎p?` $jĒ$,, $b;;`L q"0֠d0,^GAC@xyo|599 L "h#~cQ2h  KwUdaC@'oA&.d;_P+(€ phsxu-K%~FɊ5> dgmSsQcI&-~0f[eZ'(d!RX>6 Qc7jɧl02(lڅwڲ5fl}0Ŀ!7 sleGRL Bi6gPGWiI00/F&뎇0ҖdC0n$ Rmd6ȇL_I20/MdA_Sa.݁JӄD@7@L/@6@H? ~AA&+d>2r%7cgtŠ@os-@o~|ٗF@V z_y}9{7d]C3S|7Uw __{RW 2@ǐ@L )g: bIH,: @nfdKC0I5o1 :@I5O7NUD+d!4p}Pb ;d!4ڇI@ d!$HdD@L *ˏk.BTl"" &݊`A;J DIMUZ$.Sk!"e22 HAFCD#2wSbO{݁ Ą@3Ռ@ dE"an6%bF\LiƳet2V}}5r<ʮ?XۛԁA@LkESUuP{|0E?QT `d1'&t nd i& ld !)&6 tP5:80a$@Z/32WHE>iHL +J\L+&4 j)12 t-)~׊:g%h)p™z[UFOqz/j%Vb2aG$~H_f @JHh_O MW h42m t2&bw$Hr>uA!H)~@'oHh9n^2= 12ӯ !~7"\c,~ALRNc^v<>@h1ƴXt $M"/ cdSHk "( ܊b@X ~?@7g41,~IAAPA@i2/?S^ݎA) /<2_CZ7? qT!Q? 2yHG$#420Ry22&êdXy;@@4Sy*?hM hASќ&m ~>q@ͻB@2`TPaR?.~!}( L}yڞw|Q2-{˧jdĒ( v1ot[#h axGoOgW2c!wM'TN6 (Ǔ{*OejdD0C@L||,T9-ĿDzP9kMGy-hCo )KcBI6^YB@BAj)%4G]C]7 /53+GNjqٶB{)P@NNmʫsGeH )y+( DSiB/"vD2${:,T ( AmT|  BALyR(n_  3g<7 Y} a- E0r(m'lʃ`.V6ݖG^ +dDd0yP| <' 9;S<'{B@Ć bA("eaؑSZH@@Ē%Bs؉ɩEy8yԡuԪVxQ|s Er>X CEhjW'6;w:+Ckk/{KlqK=1V>(fbN r97c&椈  1s CQ7Uze aJ$~Wٹ@=9k€ř6žBu+-"<\mQſƠj ݷ}{?ݦ-1%%TEM1pywW/@t#^B~|+sBQ[MېHM @N^=oDUU'پ ^l޻IOH w~Ga nxd ) 9aH]) |aX/ҷ[ @d 0ŗ@.= 1엡.I@X(Ca u;|݁A]h22 ,I"N~ `q88ثOzl5Z 0 V.|q7Id0pd/kOS @i@~X|`֫uD]1߻t]'p7pqETJEh|q,uaF V^`Wl. Tt07;?DZs)ظi3v^x!6nI#O= >3b[`K  ~@tYFkoV@/ _y ~u V\kk׭tJ`?lw` w|oR~ʏ}|Wnoۙ~/xXWw`a;kC)H>Þ~@0&o<)ʗ|~`j`;o@y> YG W]7߂!aؙSAP{P>񯀒g?6}a-;>90 ?^ \#&&=OӀ'-@#}?4k{<c9ÿE(p̙@ϣvG 9Uh߿l@Bzam2Fz~ B=o^-߁Y[B=oT?L֪8y8ݱ#hKQ~O)R|bcP篁rw W:ǎF_LMNb޽So?.CP+;¨Cy˨Uѕ!ShhI.fg#+Cpn_ HLOM(?Nw{ ? ^OkbKN9t &'0 _ЧG0C8=s&M@Q3m<`3rxcvncH033}?u3ǾY?D]ԣԊ8am y -/_ٱ`}='67ڬj$dri}PpDrX[=yVNR%Ǐ;k`ꈟ b26hL8GZhZf,Ԭ]̎Hcl]7;/ 槁'E"G:npj#ZOx-*T+~PVQ(( e?.roFDKU1/T.M~osr2#c(Λo/j|%c{ Ԭ[|ˋH8*ȹ9mppԪryef}0֞cnDΟ{Se2epsv ˑ t+;Px9Ldյv$~ZFc]( Z<}6`aƖGi娏0_*Zk9R1'eӍ'`ǻ+4Ù Wl|~ bVE0*vv`a 8z4bج[\1]A!&Ø+0CVc5cD#Әp4Z4bƭ|ď8)9W+(wdv}ܮg#!Ua cgjs1j}.֫5^&)rfͩ?Ԯdl[g2"~R)v݁|>su1##زm' Ӡ_i -Fn~lxbx 08p[G!ڏ1ULIyQ|wFUzJ믴5hձ]?aGTQ7m}\sWhhŗ\)?j?cΐ+>JvqKrN8anV}9sGNp~g<ʍ_x'L5(֝]GQ"M uipJ7h742K/"zmb8s~ĐLA;#[X^;>a*v藍)g #+Qy_o]qVϰRg.GREĪի#9i-x@+ >S7 D&ⷿvߋ҆qOOY T1z;122ykそCTƪs B0 8qwP]c6<޽s`/o!(ӯ~.:n;p t'U} n9l\y58'AHӷ~G'0_cp+{OlvhhIP`ϻ8Dc)ۍ7 ^vS߮;fj>;.~Mtz7b>(,^)u!N͞LAmuX(0tr?| ? \tE\ b?R.~ 0p ,:K QpS`z(JlLM oZöW\C34S&Q<7F 4q,{N L.~aDşb10ROFE9W/kL"</:Jc`ظi3v+W KBjk5LNM¨ȕ0#>/B{;i}hJk.BqeX{V9fgP00}c>Sc`0WU7b,n5Z(:BƍW7(jUWc݆ غu;C]a{ Ph8IAUcQ^YfwMDh#~K}UNkӸ)~33(U;sj4< UoDk3%~}-9(~R ~7P*QQ.*\cc@uLMM¨s0ƭ&$`Q{sٹYTJe;ZUN=A|IuGNXr%8`62!hnKĒ\fQH!> "LCj"7I%Ki5+ V` X>19̢T.YmFʭ1p3~8%~>96wo&.iR&wiX|9fffNŝ7EҝRoS58}y";)ݼa5I' `T*Q~_ܭa7C07dԑ}`% Փr3.iR&R-apGV+3ۛM'ҭg$~qgcY8'kȏ5˅ 6ar||;r K)wjZO \SN@zNSr9LL,nPp~6c㤈@ɚ~'/:66AC븳VhON]ӤzMz='w5aٲeӉ4oȨ!jwC)\>0RZ*?nRh@./S\.B0@B}T0`%cW.r4V9-Q\ sLIT@FQU yįyh O w\` &pF&=f9hsg.C_z]^9L0ỉ0z(v0;9hǦ'.AA@ 2 Ad20daok\IENDB`calamares-3.1.12/src/calamares/000077500000000000000000000000001322271446000162465ustar00rootroot00000000000000calamares-3.1.12/src/calamares/CMakeLists.txt000066400000000000000000000030211322271446000210020ustar00rootroot00000000000000project( calamares ) add_definitions( -DUIDLLEXPORT_PRO ) if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) message( "Building in debug mode, enabling all debug updates" ) endif() set( calamaresSources main.cpp CalamaresApplication.cpp CalamaresWindow.cpp progresstree/ProgressTreeDelegate.cpp progresstree/ProgressTreeItem.cpp progresstree/ProgressTreeModel.cpp progresstree/ProgressTreeView.cpp progresstree/ViewStepItem.cpp ) set( calamaresUi #nothing to do here ) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/../libcalamares ../libcalamares ../libcalamaresui ) include( GNUInstallDirs ) qt5_wrap_ui( calamaresUi_H ${calamaresUi} ) # Translations include( CalamaresAddTranslations ) add_calamares_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) set( final_src ${calamaresUi_H} ${calamaresSources} ${calamaresRc} ${trans_outfile} ) add_executable( calamares_bin ${final_src} ) SET_TARGET_PROPERTIES(calamares_bin PROPERTIES AUTOMOC TRUE ENABLE_EXPORTS TRUE RUNTIME_OUTPUT_NAME calamares ) target_link_libraries( calamares_bin PRIVATE ${CALAMARES_LIBRARIES} calamaresui Qt5::Core Qt5::Widgets ${LINK_LIBRARIES} ) install( TARGETS calamares_bin BUNDLE DESTINATION . RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install( FILES ${CMAKE_SOURCE_DIR}/data/images/squid.svg RENAME calamares.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps ) calamares-3.1.12/src/calamares/CalamaresApplication.cpp000066400000000000000000000266171322271446000230420ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "CalamaresApplication.h" #include "CalamaresConfig.h" #include "CalamaresWindow.h" #include "CalamaresVersion.h" #include "progresstree/ProgressTreeView.h" #include "progresstree/ProgressTreeModel.h" #include "modulesystem/ModuleManager.h" #include "utils/CalamaresUtilsGui.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" #include "JobQueue.h" #include "Branding.h" #include "Settings.h" #include "viewpages/ViewStep.h" #include "ViewManager.h" #include #include CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) : QApplication( argc, argv ) , m_mainwindow( nullptr ) , m_moduleManager( nullptr ) , m_debugMode( false ) { setOrganizationName( QLatin1String( CALAMARES_ORGANIZATION_NAME ) ); setOrganizationDomain( QLatin1String( CALAMARES_ORGANIZATION_DOMAIN ) ); setApplicationName( QLatin1String( CALAMARES_APPLICATION_NAME ) ); setApplicationVersion( QLatin1String( CALAMARES_VERSION ) ); cDebug() << "Calamares version:" << CALAMARES_VERSION; CalamaresUtils::installTranslator( QLocale::system(), QString(), this ); QFont f = font(); cDebug() << "Default font size" << f.pointSize() << ';' << f.pixelSize() << "px"; CalamaresUtils::setDefaultFontSize( f.pointSize() ); cDebug() << "Available languages:" << QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';' ); } void CalamaresApplication::init() { cDebug() << "CalamaresApplication thread:" << thread(); //TODO: Icon loader Logger::setupLogfile(); setQuitOnLastWindowClosed( false ); initQmlPath(); initSettings(); initBranding(); setWindowIcon( QIcon( Calamares::Branding::instance()-> imagePath( Calamares::Branding::ProductIcon ) ) ); cDebug() << "STARTUP: initQmlPath, initSettings, initBranding done"; initModuleManager(); //also shows main window cDebug() << "STARTUP: initModuleManager: module init started"; } CalamaresApplication::~CalamaresApplication() { cDebug( LOGVERBOSE ) << "Shutting down Calamares..."; // if ( JobQueue::instance() ) // JobQueue::instance()->stop(); // delete m_mainwindow; // delete JobQueue::instance(); cDebug( LOGVERBOSE ) << "Finished shutdown."; } CalamaresApplication* CalamaresApplication::instance() { return qobject_cast< CalamaresApplication* >( QApplication::instance() ); } void CalamaresApplication::setDebug( bool enabled ) { m_debugMode = enabled; } bool CalamaresApplication::isDebug() { return m_debugMode; } CalamaresWindow* CalamaresApplication::mainWindow() { return m_mainwindow; } void CalamaresApplication::initQmlPath() { QDir importPath; QString subpath( "qml" ); if ( CalamaresUtils::isAppDataDirOverridden() ) { importPath = QDir( CalamaresUtils::appDataDir() .absoluteFilePath( subpath ) ); if ( !importPath.exists() || !importPath.isReadable() ) { cLog() << "FATAL ERROR: explicitly configured application data directory" << CalamaresUtils::appDataDir().absolutePath() << "does not contain a valid QML modules directory at" << importPath.absolutePath() << "\nCowardly refusing to continue startup without the QML directory."; ::exit( EXIT_FAILURE ); } } else { QStringList qmlDirCandidatesByPriority; if ( isDebug() ) { qmlDirCandidatesByPriority.append( QDir::current().absoluteFilePath( QString( "src/%1" ) .arg( subpath ) ) ); } qmlDirCandidatesByPriority.append( CalamaresUtils::appDataDir() .absoluteFilePath( subpath ) ); foreach ( const QString& path, qmlDirCandidatesByPriority ) { QDir dir( path ); if ( dir.exists() && dir.isReadable() ) { importPath = dir; break; } } if ( !importPath.exists() || !importPath.isReadable() ) { cLog() << "FATAL ERROR: none of the expected QML paths (" << qmlDirCandidatesByPriority.join( ", " ) << ") exist." << "\nCowardly refusing to continue startup without the QML directory."; ::exit( EXIT_FAILURE ); } } CalamaresUtils::setQmlModulesDir( importPath ); } void CalamaresApplication::initSettings() { QFileInfo settingsFile; if ( CalamaresUtils::isAppDataDirOverridden() ) { settingsFile = QFileInfo( CalamaresUtils::appDataDir().absoluteFilePath( "settings.conf" ) ); if ( !settingsFile.exists() || !settingsFile.isReadable() ) { cLog() << "FATAL ERROR: explicitly configured application data directory" << CalamaresUtils::appDataDir().absolutePath() << "does not contain a valid settings.conf file." << "\nCowardly refusing to continue startup without settings."; ::exit( EXIT_FAILURE ); } } else { QStringList settingsFileCandidatesByPriority; if ( isDebug() ) { settingsFileCandidatesByPriority.append( QDir::currentPath() + QDir::separator() + "settings.conf" ); } settingsFileCandidatesByPriority.append( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/settings.conf" ); settingsFileCandidatesByPriority.append( CalamaresUtils::appDataDir() .absoluteFilePath( "settings.conf" ) ); foreach ( const QString& path, settingsFileCandidatesByPriority ) { QFileInfo pathFi( path ); if ( pathFi.exists() && pathFi.isReadable() ) { settingsFile = pathFi; break; } } if ( !settingsFile.exists() || !settingsFile.isReadable() ) { cLog() << "FATAL ERROR: none of the expected configuration file paths (" << settingsFileCandidatesByPriority.join( ", " ) << ") contain a valid settings.conf file." << "\nCowardly refusing to continue startup without settings."; ::exit( EXIT_FAILURE ); } } new Calamares::Settings( settingsFile.absoluteFilePath(), isDebug(), this ); } void CalamaresApplication::initBranding() { QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName(); if ( brandingComponentName.simplified().isEmpty() ) { cLog() << "FATAL ERROR: branding component not set in settings.conf"; ::exit( EXIT_FAILURE ); } QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ) .arg( brandingComponentName ); QFileInfo brandingFile; if ( CalamaresUtils::isAppDataDirOverridden() ) { brandingFile = QFileInfo( CalamaresUtils::appDataDir() .absoluteFilePath( brandingDescriptorSubpath ) ); if ( !brandingFile.exists() || !brandingFile.isReadable() ) { cLog() << "FATAL ERROR: explicitly configured application data directory" << CalamaresUtils::appDataDir().absolutePath() << "does not contain a valid branding component descriptor at" << brandingFile.absoluteFilePath() << "\nCowardly refusing to continue startup without branding."; ::exit( EXIT_FAILURE ); } } else { QStringList brandingFileCandidatesByPriority; if ( isDebug() ) { brandingFileCandidatesByPriority.append( QDir::currentPath() + QDir::separator() + "src" + QDir::separator() + brandingDescriptorSubpath ); } brandingFileCandidatesByPriority.append( QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ) .absoluteFilePath( brandingDescriptorSubpath ) ); brandingFileCandidatesByPriority.append( CalamaresUtils::appDataDir() .absoluteFilePath( brandingDescriptorSubpath ) ); foreach ( const QString& path, brandingFileCandidatesByPriority ) { QFileInfo pathFi( path ); if ( pathFi.exists() && pathFi.isReadable() ) { brandingFile = pathFi; break; } } if ( !brandingFile.exists() || !brandingFile.isReadable() ) { cLog() << "FATAL ERROR: none of the expected branding descriptor file paths (" << brandingFileCandidatesByPriority.join( ", " ) << ") contain a valid branding.desc file." << "\nCowardly refusing to continue startup without branding."; ::exit( EXIT_FAILURE ); } } new Calamares::Branding( brandingFile.absoluteFilePath(), this ); } void CalamaresApplication::initModuleManager() { m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this ); connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView ); m_moduleManager->init(); } void CalamaresApplication::initView() { cDebug() << "STARTUP: initModuleManager: all modules init done"; initJobQueue(); cDebug() << "STARTUP: initJobQueue done"; m_mainwindow = new CalamaresWindow(); //also creates ViewManager connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); m_moduleManager->loadModules(); m_mainwindow->move( this->desktop()->availableGeometry().center() - m_mainwindow->rect().center() ); cDebug() << "STARTUP: CalamaresWindow created; loadModules started"; } void CalamaresApplication::initViewSteps() { cDebug() << "STARTUP: loadModules for all modules done"; m_mainwindow->show(); ProgressTreeModel* m = new ProgressTreeModel( this ); ProgressTreeView::instance()->setModel( m ); cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; } void CalamaresApplication::initJobQueue() { Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this ); new CalamaresUtils::System( Calamares::Settings::instance()->doChroot(), this ); Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() ); } calamares-3.1.12/src/calamares/CalamaresApplication.h000066400000000000000000000044031322271446000224740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESAPPLICATION_H #define CALAMARESAPPLICATION_H #include "Typedefs.h" #include #define APP CalamaresApplication::instance() class CalamaresWindow; namespace Calamares { class ModuleManager; } /** * @brief The CalamaresApplication class extends QApplication to handle * Calamares startup and lifetime of main components. */ class CalamaresApplication : public QApplication { Q_OBJECT public: CalamaresApplication( int& argc, char* argv[] ); virtual ~CalamaresApplication(); /** * @brief init handles the first part of Calamares application startup. * After the main window shows up, the latter part of the startup sequence * (including modules loading) happens asynchronously. */ void init(); static CalamaresApplication* instance(); /** * @brief setDebug controls whether debug mode is enabled */ void setDebug( bool enabled ); /** * @brief isDebug returns true if running in debug mode, otherwise false. */ bool isDebug(); /** * @brief mainWindow returns the Calamares application main window. */ CalamaresWindow* mainWindow(); private slots: void initView(); void initViewSteps(); private: void initQmlPath(); void initSettings(); void initBranding(); void initModuleManager(); void initJobQueue(); CalamaresWindow* m_mainwindow; Calamares::ModuleManager* m_moduleManager; bool m_debugMode; }; #endif //CALAMARESAPPLICATION_H calamares-3.1.12/src/calamares/CalamaresVersion.h.in000066400000000000000000000014061322271446000222630ustar00rootroot00000000000000#ifndef CALAMARES_VERSION_H #define CALAMARES_VERSION_H #cmakedefine CALAMARES_ORGANIZATION_NAME "${CALAMARES_ORGANIZATION_NAME}" #cmakedefine CALAMARES_ORGANIZATION_DOMAIN "${CALAMARES_ORGANIZATION_DOMAIN}" #cmakedefine CALAMARES_APPLICATION_NAME "${CALAMARES_APPLICATION_NAME}" #cmakedefine CALAMARES_VERSION "${CALAMARES_VERSION}" #cmakedefine CALAMARES_VERSION_SHORT "${CALAMARES_VERSION_SHORT}" #cmakedefine CALAMARES_VERSION_MAJOR "${CALAMARES_VERSION_MAJOR}" #cmakedefine CALAMARES_VERSION_MINOR "${CALAMARES_VERSION_MINOR}" #cmakedefine CALAMARES_VERSION_PATCH "${CALAMARES_VERSION_PATCH}" #cmakedefine CALAMARES_VERSION_RC "${CALAMARES_VERSION_RC}" #cmakedefine CALAMARES_TRANSLATION_LANGUAGES "${CALAMARES_TRANSLATION_LANGUAGES}" #endif // CALAMARES_VERSION_H calamares-3.1.12/src/calamares/CalamaresWindow.cpp000066400000000000000000000136561322271446000220450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CalamaresWindow.h" #include "ViewManager.h" #include "progresstree/ProgressTreeView.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/DebugWindow.h" #include "utils/Retranslator.h" #include "Settings.h" #include "Branding.h" #include #include #include #include #include #include CalamaresWindow::CalamaresWindow( QWidget* parent ) : QWidget( parent ) , m_debugWindow( nullptr ) , m_viewManager( nullptr ) { CALAMARES_RETRANSLATE( setWindowTitle( tr( "%1 Installer" ) .arg( *Calamares::Branding::ProductName ) ); ) using CalamaresUtils::windowMinimumHeight; using CalamaresUtils::windowMinimumWidth; using CalamaresUtils::windowPreferredHeight; using CalamaresUtils::windowPreferredWidth; QSize availableSize = qApp->desktop()->availableGeometry( this ).size(); cDebug() << "Available size" << availableSize; if ( ( availableSize.width() < windowPreferredWidth ) || ( availableSize.height() < windowPreferredHeight ) ) cDebug() << " Small screen detected."; QSize minimumSize( qBound( windowMinimumWidth, availableSize.width(), windowPreferredWidth ), qBound( windowMinimumHeight, availableSize.height(), windowPreferredHeight ) ); setMinimumSize( minimumSize ); int w = qBound( minimumSize.width(), CalamaresUtils::defaultFontHeight() * 60, availableSize.width() ); int h = qBound( minimumSize.height(), CalamaresUtils::defaultFontHeight() * 36, availableSize.height() ); cDebug() << " Proposed window size:" << w << h; resize( w, h ); QBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); QWidget* sideBox = new QWidget( this ); mainLayout->addWidget( sideBox ); QBoxLayout* sideLayout = new QVBoxLayout; sideBox->setLayout( sideLayout ); sideBox->setFixedWidth( qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); sideBox->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); QHBoxLayout* logoLayout = new QHBoxLayout; sideLayout->addLayout( logoLayout ); logoLayout->addStretch(); QLabel* logoLabel = new QLabel( sideBox ); { QPalette plt = sideBox->palette(); sideBox->setAutoFillBackground( true ); plt.setColor( sideBox->backgroundRole(), Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarBackground ) ); plt.setColor( sideBox->foregroundRole(), Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarText ) ); sideBox->setPalette( plt ); logoLabel->setPalette( plt ); } logoLabel->setAlignment( Qt::AlignCenter ); logoLabel->setFixedSize( 80, 80 ); logoLabel->setPixmap( Calamares::Branding::instance()-> image( Calamares::Branding::ProductLogo, logoLabel->size() ) ); logoLayout->addWidget( logoLabel ); logoLayout->addStretch(); ProgressTreeView* tv = new ProgressTreeView( sideBox ); sideLayout->addWidget( tv ); tv->setFocusPolicy( Qt::NoFocus ); if ( Calamares::Settings::instance()->debugMode() ) { QPushButton* debugWindowBtn = new QPushButton; CALAMARES_RETRANSLATE( debugWindowBtn->setText( tr( "Show debug information" ) ); ) sideLayout->addWidget( debugWindowBtn ); debugWindowBtn->setFlat( true ); debugWindowBtn->setCheckable( true ); connect( debugWindowBtn, &QPushButton::clicked, this, [ = ]( bool checked ) { if ( checked ) { m_debugWindow = new Calamares::DebugWindow(); m_debugWindow->show(); connect( m_debugWindow.data(), &Calamares::DebugWindow::closed, this, [ = ]() { m_debugWindow->deleteLater(); debugWindowBtn->setChecked( false ); } ); } else { if ( m_debugWindow ) m_debugWindow->deleteLater(); } } ); } CalamaresUtils::unmarginLayout( sideLayout ); CalamaresUtils::unmarginLayout( mainLayout ); m_viewManager = Calamares::ViewManager::instance( this ); connect( m_viewManager, &Calamares::ViewManager::enlarge, this, &CalamaresWindow::enlarge ); mainLayout->addWidget( m_viewManager->centralWidget() ); } void CalamaresWindow::enlarge( QSize enlarge ) { auto mainGeometry = this->geometry(); QSize availableSize = qApp->desktop()->availableGeometry( this ).size(); auto h = qBound( 0, mainGeometry.height() + enlarge.height(), availableSize.height() ); auto w = this->size().width(); resize( w, h ); } void CalamaresWindow::closeEvent( QCloseEvent* event ) { if ( ( !m_viewManager ) || m_viewManager->confirmCancelInstallation() ) { event->accept(); qApp->quit(); } else event->ignore(); } calamares-3.1.12/src/calamares/CalamaresWindow.h000066400000000000000000000032541322271446000215030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESWINDOW_H #define CALAMARESWINDOW_H #include #include namespace Calamares { class DebugWindow; class ViewManager; } /** * @brief The CalamaresWindow class represents the main window of the Calamares UI. */ class CalamaresWindow : public QWidget { Q_OBJECT public: CalamaresWindow( QWidget* parent = nullptr ); virtual ~CalamaresWindow() {} public slots: /** * This asks the main window to grow by @p enlarge pixels, to accomodate * larger-than-expected window contents. The enlargement may be silently * ignored. */ void enlarge( QSize enlarge ); protected: virtual void closeEvent( QCloseEvent* e ) override; private: QPointer< Calamares::DebugWindow > m_debugWindow; // Managed by self Calamares::ViewManager* m_viewManager; }; #endif //CALAMARESWINDOW_H calamares-3.1.12/src/calamares/main.cpp000066400000000000000000000042451322271446000177030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CalamaresApplication.h" #include "kdsingleapplicationguard/kdsingleapplicationguard.h" #include "utils/CalamaresUtils.h" #include "utils/Logger.h" #include "CalamaresConfig.h" #include #include #include int main( int argc, char* argv[] ) { CalamaresApplication a( argc, argv ); QCommandLineParser parser; parser.setApplicationDescription( "Distribution-independent installer framework" ); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption debugOption( QStringList() << "d" << "debug", "Verbose output for debugging purposes." ); parser.addOption( debugOption ); QCommandLineOption configOption( QStringList() << "c" << "config", "Configuration directory to use, for testing purposes.", "config" ); parser.addOption( configOption ); parser.process( a ); a.setDebug( parser.isSet( debugOption ) ); if ( parser.isSet( configOption ) ) CalamaresUtils::setAppDataDir( QDir( parser.value( configOption ) ) ); KDSingleApplicationGuard guard( KDSingleApplicationGuard::AutoKillOtherInstances ); int returnCode = 0; if ( guard.isPrimaryInstance() ) { a.init(); returnCode = a.exec(); } else qDebug() << "Calamares is already running, shutting down."; return returnCode; } calamares-3.1.12/src/calamares/progresstree/000077500000000000000000000000001322271446000207725ustar00rootroot00000000000000calamares-3.1.12/src/calamares/progresstree/ProgressTreeDelegate.cpp000066400000000000000000000072261322271446000255640ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProgressTreeDelegate.h" #include "../CalamaresApplication.h" #include "../CalamaresWindow.h" #include "ViewStepItem.h" #include "ProgressTreeModel.h" #include "ViewManager.h" #include "Branding.h" #include "utils/CalamaresUtilsGui.h" #include #include #define ITEM_MARGIN 12 #define VS_FONTSIZE CalamaresUtils::defaultFontSize() + 4 ProgressTreeDelegate::ProgressTreeDelegate( QAbstractItemView* parent ) : QStyledItemDelegate( parent ) , m_parent( parent ) { } QSize ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { if ( !index.isValid() ) return option.rect.size(); QFont font = qApp->font(); font.setPointSize( VS_FONTSIZE ); QFontMetrics fm( font ); int height = fm.height(); height += 2*ITEM_MARGIN; //margin return QSize( option.rect.width(), height ); } void ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyleOptionViewItem opt = option; painter->save(); initStyleOption( &opt, index ); opt.text.clear(); painter->setBrush( QColor( Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarBackground ) ) ); painter->setPen( QColor( Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarText ) ) ); paintViewStep( painter, opt, index ); painter->restore(); } void ProgressTreeDelegate::paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { QRect textRect = option.rect.adjusted( ITEM_MARGIN, ITEM_MARGIN, ITEM_MARGIN, ITEM_MARGIN ); QFont font = qApp->font(); font.setPointSize( VS_FONTSIZE ); font.setBold( false ); painter->setFont( font ); bool isCurrent = false; isCurrent = index.data( ProgressTreeModel::ProgressTreeItemCurrentRole ).toBool(); if ( isCurrent ) { painter->setPen( Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarTextSelect ) ); QString textHighlight = Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarTextHighlight ); if ( textHighlight.isEmpty() ) painter->setBrush( APP->mainWindow()->palette().background() ); else painter->setBrush( QColor( textHighlight ) ); } painter->fillRect( option.rect, painter->brush().color() ); painter->drawText( textRect, index.data().toString() ); } calamares-3.1.12/src/calamares/progresstree/ProgressTreeDelegate.h000066400000000000000000000032451322271446000252260ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PROGRESSTREEDELEGATE_H #define PROGRESSTREEDELEGATE_H #include /** * @brief The ProgressTreeDelegate class customizes the look and feel of the * ProgressTreeView elements. * @see ProgressTreeView */ class ProgressTreeDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit ProgressTreeDelegate( QAbstractItemView* parent = nullptr ); protected: QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; private: void paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; QAbstractItemView* m_parent; }; #endif // PROGRESSTREEDELEGATE_H calamares-3.1.12/src/calamares/progresstree/ProgressTreeItem.cpp000066400000000000000000000034771322271446000247540ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProgressTreeItem.h" #include "ProgressTreeModel.h" ProgressTreeItem::ProgressTreeItem( ProgressTreeItem* parent ) { m_parentItem = parent; } ProgressTreeItem::~ProgressTreeItem() { qDeleteAll( m_childItems ); } void ProgressTreeItem::appendChild( ProgressTreeItem* item ) { m_childItems.append( item ); } ProgressTreeItem* ProgressTreeItem::child( int row ) { return m_childItems.value( row ); } int ProgressTreeItem::childCount() const { return m_childItems.count(); } int ProgressTreeItem::columnCount() const { return 1; } int ProgressTreeItem::row() const { if ( m_parentItem ) return m_parentItem->m_childItems.indexOf( const_cast< ProgressTreeItem* >( this ) ); return 0; } ProgressTreeItem* ProgressTreeItem::parent() { return m_parentItem; } ProgressTreeRoot::ProgressTreeRoot() : ProgressTreeItem() {} QVariant ProgressTreeRoot::data( int role ) const { if ( role == ProgressTreeModel::ProgressTreeItemRole ) return this; return QVariant(); } calamares-3.1.12/src/calamares/progresstree/ProgressTreeItem.h000066400000000000000000000033111322271446000244040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PROGRESSTREEITEM_H #define PROGRESSTREEITEM_H #include #include /** * @brief The ProgressTreeItem class represents an item in the * ProgressTreeModel/ProgressTreeView. * Each item generally represents a ViewStep. */ class ProgressTreeItem { public: explicit ProgressTreeItem( ProgressTreeItem* parent = nullptr ); virtual ~ProgressTreeItem(); virtual void appendChild( ProgressTreeItem* item ); virtual ProgressTreeItem* child( int row ); virtual int childCount() const; virtual int columnCount() const; virtual QVariant data( int role ) const = 0; virtual int row() const; virtual ProgressTreeItem* parent(); private: QList< ProgressTreeItem* > m_childItems; ProgressTreeItem* m_parentItem; }; class ProgressTreeRoot : public ProgressTreeItem { public: explicit ProgressTreeRoot(); virtual QVariant data( int role ) const; }; #endif // PROGRESSTREEITEM_H calamares-3.1.12/src/calamares/progresstree/ProgressTreeModel.cpp000066400000000000000000000112671322271446000251120ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProgressTreeModel.h" #include "progresstree/ViewStepItem.h" #include "ViewManager.h" ProgressTreeModel::ProgressTreeModel( QObject* parent ) : QAbstractItemModel( parent ) { setupModelData(); } ProgressTreeModel::~ProgressTreeModel() { delete m_rootItem; } Qt::ItemFlags ProgressTreeModel::flags( const QModelIndex& index ) const { if ( !index.isValid() ) return 0; return Qt::ItemIsEnabled; } QModelIndex ProgressTreeModel::index( int row, int column, const QModelIndex& parent ) const { if ( !hasIndex( row, column, parent ) ) return QModelIndex(); ProgressTreeItem* parentItem; if ( !parent.isValid() ) parentItem = m_rootItem; else parentItem = static_cast< ProgressTreeItem* >( parent.internalPointer() ); ProgressTreeItem* childItem = parentItem->child( row ); if ( childItem ) return createIndex( row, column, childItem ); else return QModelIndex(); } QModelIndex ProgressTreeModel::parent( const QModelIndex& index ) const { if ( !index.isValid() ) return QModelIndex(); ProgressTreeItem* childItem = static_cast< ProgressTreeItem* >( index.internalPointer() ); ProgressTreeItem* parentItem = childItem->parent(); if ( parentItem == m_rootItem ) return QModelIndex(); return createIndex( parentItem->row(), 0, parentItem ); } QVariant ProgressTreeModel::data( const QModelIndex& index, int role ) const { if ( !index.isValid() ) return QVariant(); ProgressTreeItem* item = static_cast< ProgressTreeItem* >( index.internalPointer() ); return item->data( role ); } QVariant ProgressTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const { Q_UNUSED( section ); Q_UNUSED( orientation ); Q_UNUSED( role ); return QVariant(); } int ProgressTreeModel::rowCount( const QModelIndex& parent ) const { ProgressTreeItem* parentItem; if ( parent.column() > 0 ) return 0; if ( !parent.isValid() ) parentItem = m_rootItem; else parentItem = static_cast< ProgressTreeItem* >( parent.internalPointer() ); return parentItem->childCount(); } int ProgressTreeModel::columnCount( const QModelIndex& parent ) const { if ( parent.isValid() ) return static_cast< ProgressTreeItem* >( parent.internalPointer() )->columnCount(); else return m_rootItem->columnCount(); } void ProgressTreeModel::setupModelData() { m_rootItem = new ProgressTreeRoot(); const Calamares::ViewManager* vm = Calamares::ViewManager::instance(); const auto steps = vm->viewSteps(); for ( const Calamares::ViewStep* step : steps ) { m_rootItem->appendChild( new ViewStepItem( step, m_rootItem ) ); } } QModelIndex ProgressTreeModel::indexFromItem( ProgressTreeItem* item ) { if ( !item || !item->parent() ) return QModelIndex(); // Reconstructs a QModelIndex from a ProgressTreeItem that is somewhere in the tree. // Traverses the item to the root node, then rebuilds the qmodelindices from there // back down; each int is the row of that item in the parent. /** * In this diagram, if the item is G, childIndexList will contain [0, 2, 0] * * A * D * E * F * G * H * B * C * **/ QList< int > childIndexList; ProgressTreeItem* curItem = item; while ( curItem != m_rootItem ) { int row = curItem->row(); //relative to its parent if ( row < 0 ) // something went wrong, bail return QModelIndex(); childIndexList << row; curItem = curItem->parent(); } // Now we rebuild the QModelIndex we need QModelIndex idx; for ( int i = childIndexList.size() - 1; i >= 0 ; i-- ) { idx = index( childIndexList[ i ], 0, idx ); } return idx; } calamares-3.1.12/src/calamares/progresstree/ProgressTreeModel.h000066400000000000000000000042301322271446000245470ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PROGRESSTREEMODEL_H #define PROGRESSTREEMODEL_H #include class ProgressTreeRoot; class ProgressTreeItem; /** * @brief The ProgressTreeModel class implements a model for the ProgressTreeView. */ class ProgressTreeModel : public QAbstractItemModel { Q_OBJECT public: enum Role { ProgressTreeItemRole = Qt::UserRole + 10, ProgressTreeItemCurrentRole = Qt::UserRole + 11 }; explicit ProgressTreeModel( QObject* parent = nullptr ); virtual ~ProgressTreeModel() override; // Reimplemented from QAbstractItemModel Qt::ItemFlags flags( const QModelIndex& index ) const override; QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const override; QModelIndex parent( const QModelIndex& index ) const override; QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override; int rowCount( const QModelIndex& parent = QModelIndex() ) const override; int columnCount( const QModelIndex& parent = QModelIndex() ) const override; private: void setupModelData(); QModelIndex indexFromItem( ProgressTreeItem* item ); ProgressTreeRoot* m_rootItem; }; #endif // PROGRESSTREEMODEL_H calamares-3.1.12/src/calamares/progresstree/ProgressTreeView.cpp000066400000000000000000000044231322271446000247600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProgressTreeView.h" #include "ProgressTreeDelegate.h" #include "ViewManager.h" #include "Branding.h" ProgressTreeView* ProgressTreeView::s_instance = nullptr; ProgressTreeView* ProgressTreeView::instance() { return s_instance; } ProgressTreeView::ProgressTreeView( QWidget* parent ) : QTreeView( parent ) { s_instance = this; //FIXME: should assert when s_instance gets written and it wasn't nullptr setFrameShape( QFrame::NoFrame ); setContentsMargins( 0, 0, 0, 0 ); setHeaderHidden( true ); setRootIsDecorated( true ); setExpandsOnDoubleClick( true ); setSelectionMode( QAbstractItemView::NoSelection ); setDragDropMode( QAbstractItemView::NoDragDrop ); setAcceptDrops( false ); setUniformRowHeights( false ); setIndentation( 0 ); setSortingEnabled( false ); m_delegate = new ProgressTreeDelegate( this ); setItemDelegate( m_delegate ); QPalette plt = palette(); plt.setColor( QPalette::Base, Calamares::Branding::instance()-> styleString( Calamares::Branding::SidebarBackground ) ); setPalette( plt ); } ProgressTreeView::~ProgressTreeView() { } void ProgressTreeView::setModel( QAbstractItemModel* model ) { if ( ProgressTreeView::model() ) return; QTreeView::setModel( model ); expandAll(); connect( Calamares::ViewManager::instance(), &Calamares::ViewManager::currentStepChanged, this, [this]() { viewport()->update(); }, Qt::UniqueConnection ); } calamares-3.1.12/src/calamares/progresstree/ProgressTreeView.h000066400000000000000000000031321322271446000244210ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PROGRESSTREEVIEW_H #define PROGRESSTREEVIEW_H #include class ProgressTreeDelegate; /** * @brief The ProgressTreeView class is a modified QTreeView which displays the * available view steps and the user's progress through them. * @note singleton, only access through ProgressTreeView::instance(). */ class ProgressTreeView : public QTreeView { Q_OBJECT public: static ProgressTreeView* instance(); explicit ProgressTreeView( QWidget* parent = nullptr ); virtual ~ProgressTreeView() override; /** * @brief setModel assigns a model to this view. */ void setModel( QAbstractItemModel* model ) override; private: static ProgressTreeView* s_instance; ProgressTreeDelegate* m_delegate; }; #endif // PROGRESSTREEVIEW_H calamares-3.1.12/src/calamares/progresstree/ViewStepItem.cpp000066400000000000000000000056231322271446000240710ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ViewStepItem.h" #include "ProgressTreeModel.h" #include "Settings.h" #include "ViewManager.h" #include "viewpages/ViewStep.h" ViewStepItem::ViewStepItem( std::function< QString() > prettyName, std::function< const Calamares::ViewStep*() > accessor, ProgressTreeItem* parent ) : ProgressTreeItem( parent ) , m_step( nullptr ) { m_prettyName = prettyName; m_accessor = accessor; } ViewStepItem::ViewStepItem( const Calamares::ViewStep* step, ProgressTreeItem* parent ) : ProgressTreeItem( parent ) { m_step = step; } void ViewStepItem::appendChild( ProgressTreeItem* item ) { Q_ASSERT( false ); Q_UNUSED( item ); } QVariant ViewStepItem::data( int role ) const { if ( role == ProgressTreeModel::ProgressTreeItemRole ) return this; if ( role == Qt::DisplayRole ) { return m_step ? m_step->prettyName() : m_prettyName(); } if ( Calamares::Settings::instance()->debugMode() && role == Qt::ToolTipRole ) { QString toolTip( "Debug information" ); if ( m_step ) { toolTip.append( "
Type:\tViewStep" ); toolTip.append( QString( "
Pretty:\t%1" ).arg( m_step->prettyName() ) ); toolTip.append( QString( "
Status:\t%1" ).arg( m_step->prettyStatus() ) ); toolTip.append( QString( "
Source:\t%1" ).arg( m_step->moduleInstanceKey().isEmpty() ? "built-in" : m_step->moduleInstanceKey() ) ); } else { toolTip.append( "
Type:\tDelegate" ); toolTip.append( QString( "
Pretty:\t%1" ).arg( m_prettyName() ) ); } return toolTip; } if ( role == ProgressTreeModel::ProgressTreeItemCurrentRole ) return m_step ? ( Calamares::ViewManager::instance()->currentStep() == m_step ) : ( Calamares::ViewManager::instance()->currentStep() == m_accessor() ); return QVariant(); } calamares-3.1.12/src/calamares/progresstree/ViewStepItem.h000066400000000000000000000034041322271446000235310ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef VIEWSTEPITEM_H #define VIEWSTEPITEM_H #include "ProgressTreeItem.h" #include namespace Calamares { class ViewStep; } class ViewStepItem : public ProgressTreeItem { public: // We take a std::function< QString() > instead of a QString because the view asks for // new strings on LanguageChange, and tr needs to be called again in that case. explicit ViewStepItem( std::function< QString() > prettyName, std::function< const Calamares::ViewStep*() > accessor, ProgressTreeItem* parent = nullptr ); explicit ViewStepItem( const Calamares::ViewStep* step, ProgressTreeItem* parent = nullptr ); void appendChild( ProgressTreeItem* item ) override; QVariant data( int role ) const override; private: std::function< const Calamares::ViewStep*() > m_accessor; std::function< QString() > m_prettyName; const Calamares::ViewStep* m_step; }; #endif // VIEWSTEPITEM_H calamares-3.1.12/src/libcalamares/000077500000000000000000000000001322271446000167355ustar00rootroot00000000000000calamares-3.1.12/src/libcalamares/CMakeLists.txt000066400000000000000000000067451322271446000215110ustar00rootroot00000000000000project( libcalamares CXX ) add_definitions( ${QT_DEFINITIONS} -DQT_SHARED -DQT_SHAREDPOINTER_TRACK_POINTERS -DDLLEXPORT_PRO ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/CalamaresConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/CalamaresConfig.h ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/../calamares/CalamaresVersion.h.in ${CMAKE_CURRENT_BINARY_DIR}/CalamaresVersion.h ) set( libSources CppJob.cpp GlobalStorage.cpp Job.cpp JobQueue.cpp ProcessJob.cpp ) set( utilsSources utils/CalamaresUtils.cpp utils/CalamaresUtilsSystem.cpp utils/Logger.cpp utils/PluginFactory.cpp utils/Retranslator.cpp ) set( kdsagSources kdsingleapplicationguard/kdsingleapplicationguard.cpp kdsingleapplicationguard/kdsharedmemorylocker.cpp kdsingleapplicationguard/kdtoolsglobal.cpp kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp ) mark_thirdparty_code( ${kdsagSources} ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) if( WITH_PYTHON ) set( libSources ${libSources} PythonHelper.cpp PythonJob.cpp PythonJobApi.cpp ) set_source_files_properties( PythonJob.cpp PROPERTIES COMPILE_FLAGS "${SUPPRESS_BOOST_WARNINGS}" ) include_directories(${PYTHON_INCLUDE_DIRS}) link_directories(${PYTHON_LIBRARIES}) include_directories(${Boost_INCLUDE_DIRS}) link_directories(${Boost_LIBRARY_DIRS}) set( OPTIONAL_PRIVATE_LIBRARIES ${OPTIONAL_PRIVATE_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES} ) endif() if( WITH_PYTHONQT ) include_directories(${PYTHON_INCLUDE_DIRS}) link_directories(${PYTHON_LIBRARIES}) include_directories(${PYTHONQT_INCLUDE_DIR}) link_directories(${PYTHONQT_LIBRARY}) set( OPTIONAL_PRIVATE_LIBRARIES ${OPTIONAL_PRIVATE_LIBRARIES} ${PYTHON_LIBRARIES} ${PYTHONQT_LIBRARY} ) endif() add_library( calamares SHARED ${libSources} ${kdsagSources} ${utilsSources} ) set_target_properties( calamares PROPERTIES AUTOMOC TRUE VERSION ${CALAMARES_VERSION_SHORT} SOVERSION ${CALAMARES_VERSION_SHORT} ) target_link_libraries( calamares LINK_PRIVATE ${OPTIONAL_PRIVATE_LIBRARIES} LINK_PUBLIC Qt5::Core ) install( TARGETS calamares EXPORT CalamaresLibraryDepends RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) # Make symlink lib/calamares/libcalamares.so to lib/libcalamares.so.VERSION so # lib/calamares can be used as module path for the Python interpreter. install( CODE " file( MAKE_DIRECTORY \"\$ENV{DESTDIR}/${CMAKE_INSTALL_FULL_LIBDIR}/calamares\" ) execute_process( COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../libcalamares.so.${CALAMARES_VERSION_SHORT} libcalamares.so WORKING_DIRECTORY \"\$ENV{DESTDIR}/${CMAKE_INSTALL_FULL_LIBDIR}/calamares\" ) ") # Install header files file( GLOB rootHeaders "*.h" ) file( GLOB kdsingleapplicationguardHeaders "kdsingleapplicationguard/*.h" ) file( GLOB utilsHeaders "utils/*.h" ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/CalamaresConfig.h DESTINATION include/libcalamares ) install( FILES ${rootHeaders} DESTINATION include/libcalamares ) install( FILES ${kdsingleapplicationguardHeaders} DESTINATION include/libcalamares/kdsingleapplicationguard ) install( FILES ${utilsHeaders} DESTINATION include/libcalamares/utils ) calamares-3.1.12/src/libcalamares/CalamaresConfig.h.in000066400000000000000000000011261322271446000225310ustar00rootroot00000000000000#ifndef CALAMARESCONFIG_H #define CALAMARESCONFIG_H #define CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" #define CMAKE_INSTALL_FULL_LIBEXECDIR "${CMAKE_INSTALL_FULL_LIBEXECDIR}" #define CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}" #define CMAKE_INSTALL_FULL_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" #define CMAKE_INSTALL_FULL_DATADIR "${CMAKE_INSTALL_FULL_DATADIR}/calamares" #define CMAKE_INSTALL_FULL_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}" //cmakedefines for CMake variables (e.g. for optdepends) go here #cmakedefine WITH_PYTHON #cmakedefine WITH_PYTHONQT #endif // CALAMARESCONFIG_H calamares-3.1.12/src/libcalamares/CppJob.cpp000066400000000000000000000022451322271446000206210ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2016, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CppJob.h" namespace Calamares { CppJob::CppJob( QObject* parent ) : Job( parent ) {} CppJob::~CppJob() {} void CppJob::setModuleInstanceKey( const QString& instanceKey ) { m_instanceKey = instanceKey; } void CppJob::setConfigurationMap( const QVariantMap& configurationMap ) { Q_UNUSED( configurationMap ); } } calamares-3.1.12/src/libcalamares/CppJob.h000066400000000000000000000026431322271446000202700ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2016, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_CPPJOB_H #define CALAMARES_CPPJOB_H #include #include #include "DllMacro.h" #include "Typedefs.h" #include "Job.h" namespace Calamares { class DLLEXPORT CppJob : public Job { Q_OBJECT public: explicit CppJob( QObject* parent = nullptr ); virtual ~CppJob(); void setModuleInstanceKey( const QString& instanceKey ); QString moduleInstanceKey() const { return m_instanceKey; } virtual void setConfigurationMap( const QVariantMap& configurationMap ); protected: QString m_instanceKey; }; } #endif // CALAMARES_CPPJOB_H calamares-3.1.12/src/libcalamares/DllMacro.h000066400000000000000000000017511322271446000206070ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DLLMACRO_H #define DLLMACRO_H #include #ifndef DLLEXPORT # if defined (DLLEXPORT_PRO) # define DLLEXPORT Q_DECL_EXPORT # else # define DLLEXPORT Q_DECL_IMPORT # endif #endif #endif calamares-3.1.12/src/libcalamares/GlobalStorage.cpp000066400000000000000000000070251322271446000221720ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/Logger.h" #ifdef WITH_PYTHON #include "PythonHelper.h" #undef slots #include #include namespace bp = boost::python; #endif namespace Calamares { GlobalStorage::GlobalStorage() : QObject( nullptr ) { } bool GlobalStorage::contains( const QString& key ) const { return m.contains( key ); } int GlobalStorage::count() const { return m.count(); } void GlobalStorage::insert( const QString& key, const QVariant& value ) { m.insert( key, value ); emit changed(); } QStringList GlobalStorage::keys() const { return m.keys(); } int GlobalStorage::remove( const QString& key ) { int nItems = m.remove( key ); emit changed(); return nItems; } QVariant GlobalStorage::value( const QString& key ) const { return m.value( key ); } void GlobalStorage::debugDump() const { for ( auto it = m.cbegin(); it != m.cend(); ++it ) { cDebug() << it.key() << '\t' << it.value(); } } } // namespace Calamares #ifdef WITH_PYTHON namespace CalamaresPython { Calamares::GlobalStorage* GlobalStoragePythonWrapper::s_gs_instance = nullptr; // The special handling for nullptr is only for the testing // script for the python bindings, which passes in None; // normal use will have a GlobalStorage from JobQueue::instance() // passed in. Testing use will leak the allocated GlobalStorage // object, but that's OK for testing. GlobalStoragePythonWrapper::GlobalStoragePythonWrapper( Calamares::GlobalStorage* gs ) : m_gs( gs ? gs : s_gs_instance ) { if (!m_gs) { s_gs_instance = new Calamares::GlobalStorage; m_gs = s_gs_instance; } } bool GlobalStoragePythonWrapper::contains( const std::string& key ) const { return m_gs->contains( QString::fromStdString( key ) ); } int GlobalStoragePythonWrapper::count() const { return m_gs->count(); } void GlobalStoragePythonWrapper::insert( const std::string& key, const bp::object& value ) { m_gs->insert( QString::fromStdString( key ), CalamaresPython::variantFromPyObject( value ) ); } bp::list GlobalStoragePythonWrapper::keys() const { bp::list pyList; const auto keys = m_gs->keys(); for ( const QString& key : keys ) pyList.append( key.toStdString() ); return pyList; } int GlobalStoragePythonWrapper::remove( const std::string& key ) { return m_gs->remove( QString::fromStdString( key ) ); } bp::object GlobalStoragePythonWrapper::value( const std::string& key ) const { return CalamaresPython::variantToPyObject( m_gs->value( QString::fromStdString( key ) ) ); } } // namespace CalamaresPython #endif // WITH_PYTHON calamares-3.1.12/src/libcalamares/GlobalStorage.h000066400000000000000000000052451322271446000216410ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_GLOBALSTORAGE_H #define CALAMARES_GLOBALSTORAGE_H #include "CalamaresConfig.h" #include #ifdef WITH_PYTHON namespace boost { namespace python { namespace api { class object; } class list; } } #endif namespace Calamares { class DebugWindow; class GlobalStorage : public QObject { Q_OBJECT public: explicit GlobalStorage(); //NOTE: thread safety is guaranteed by JobQueue, which executes jobs one by one. // If at any time jobs become concurrent, this class must be made thread-safe. bool contains( const QString& key ) const; int count() const; void insert( const QString& key, const QVariant& value ); QStringList keys() const; int remove( const QString& key ); QVariant value( const QString& key ) const; void debugDump() const; signals: void changed(); private: QVariantMap m; friend DebugWindow; }; } // namespace Calamares #ifdef WITH_PYTHON namespace CalamaresPython { class GlobalStoragePythonWrapper { public: explicit GlobalStoragePythonWrapper( Calamares::GlobalStorage* gs ); bool contains( const std::string& key ) const; int count() const; void insert( const std::string& key, const boost::python::api::object& value ); boost::python::list keys() const; int remove( const std::string& key ); boost::python::api::object value( const std::string& key ) const; // This is a helper for scripts that do not go through // the JobQueue (i.e. the module testpython script), // which allocate their own (singleton) GlobalStorage. static Calamares::GlobalStorage* globalStorageInstance() { return s_gs_instance; } private: Calamares::GlobalStorage* m_gs; static Calamares::GlobalStorage* s_gs_instance; // See globalStorageInstance() }; } // namespace CalamaresPython #endif #endif // CALAMARES_GLOBALSTORAGE_H calamares-3.1.12/src/libcalamares/Job.cpp000066400000000000000000000036411322271446000201570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Job.h" namespace Calamares { JobResult::JobResult( JobResult&& rhs ) : m_ok( rhs.m_ok ) , m_message( std::move( rhs.m_message ) ) , m_details( std::move( rhs.m_details ) ) { } JobResult::operator bool() const { return m_ok; } QString JobResult::message() const { return m_message; } void JobResult::setMessage( const QString& message ) { m_message = message; } QString JobResult::details() const { return m_details; } void JobResult::setDetails( const QString& details ) { m_details = details; } JobResult JobResult::ok() { return JobResult( true, QString(), QString() ); } JobResult JobResult::error( const QString& message, const QString& details ) { return JobResult( false, message, details ); } JobResult::JobResult( bool ok, const QString& message, const QString& details ) : m_ok( ok ) , m_message( message ) , m_details( details ) {} Job::Job( QObject* parent ) : QObject( parent ) { } Job::~Job() {} QString Job::prettyDescription() const { return QString(); } QString Job::prettyStatusMessage() const { return QString(); } } // namespace Calamares calamares-3.1.12/src/libcalamares/Job.h000066400000000000000000000037071322271446000176270ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_JOB_H #define CALAMARES_JOB_H #include "DllMacro.h" #include "Typedefs.h" #include namespace Calamares { class DLLEXPORT JobResult { public: JobResult( const JobResult& rhs ) = delete; JobResult( JobResult&& rhs ); virtual ~JobResult() {} virtual operator bool() const; virtual QString message() const; virtual void setMessage( const QString& message ); virtual QString details() const; virtual void setDetails( const QString& details ); static JobResult ok(); static JobResult error( const QString& message, const QString& details = QString() ); protected: explicit JobResult( bool ok, const QString& message, const QString& details ); private: bool m_ok; QString m_message; QString m_details; }; class DLLEXPORT Job : public QObject { Q_OBJECT public: explicit Job( QObject* parent = nullptr ); virtual ~Job(); virtual QString prettyName() const = 0; virtual QString prettyDescription() const; virtual QString prettyStatusMessage() const; virtual JobResult exec() = 0; signals: void progress( qreal percent ); }; } // namespace Calamares #endif // CALAMARES_JOB_H calamares-3.1.12/src/libcalamares/JobQueue.cpp000066400000000000000000000075741322271446000211750ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "JobQueue.h" #include "Job.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "CalamaresConfig.h" #ifdef WITH_PYTHON #include "PythonHelper.h" #endif #include namespace Calamares { class JobThread : public QThread { Q_OBJECT public: JobThread( JobQueue* queue ) : QThread( queue ) , m_queue( queue ) , m_jobIndex( 0 ) { #ifdef WITH_PYTHON new CalamaresPython::Helper( this ); #endif } void setJobs( const QList< job_ptr >& jobs ) { m_jobs = jobs; } void run() override { m_jobIndex = 0; for( auto job : m_jobs ) { emitProgress(); cLog() << "Starting job" << job->prettyName(); connect( job.data(), &Job::progress, this, &JobThread::emitProgress ); JobResult result = job->exec(); if ( !result ) { emitFailed( result.message(), result.details() ); emitFinished(); return; } ++m_jobIndex; } emitProgress(); emitFinished(); } private: QList< job_ptr > m_jobs; JobQueue* m_queue; int m_jobIndex; void emitProgress( qreal jobPercent = 0 ) { // Make sure jobPercent is reasonable, in case a job messed up its // percentage computations. jobPercent = qBound( qreal( 0 ), jobPercent, qreal( 1 ) ); int jobCount = m_jobs.size(); QString message = m_jobIndex < jobCount ? m_jobs.at( m_jobIndex )->prettyStatusMessage() : tr( "Done" ); qreal percent = ( m_jobIndex + jobPercent ) / qreal( jobCount ); QMetaObject::invokeMethod( m_queue, "progress", Qt::QueuedConnection, Q_ARG( qreal, percent ), Q_ARG( QString, message ) ); } void emitFailed( const QString& message, const QString& details ) { QMetaObject::invokeMethod( m_queue, "failed", Qt::QueuedConnection, Q_ARG( QString, message ), Q_ARG( QString, details ) ); } void emitFinished() { QMetaObject::invokeMethod( m_queue, "finished", Qt::QueuedConnection ); } }; JobQueue* JobQueue::s_instance = nullptr; JobQueue* JobQueue::instance() { return s_instance; } GlobalStorage* JobQueue::globalStorage() const { return m_storage; } JobQueue::JobQueue( QObject* parent ) : QObject( parent ) , m_thread( new JobThread( this ) ) , m_storage( new GlobalStorage() ) { Q_ASSERT( !s_instance ); s_instance = this; } JobQueue::~JobQueue() { delete m_storage; } void JobQueue::start() { Q_ASSERT( !m_thread->isRunning() ); m_thread->setJobs( m_jobs ); m_jobs.clear(); m_thread->start(); } void JobQueue::enqueue( const job_ptr& job ) { Q_ASSERT( !m_thread->isRunning() ); m_jobs.append( job ); emit queueChanged( m_jobs ); } void JobQueue::enqueue( const QList< job_ptr >& jobs ) { Q_ASSERT( !m_thread->isRunning() ); m_jobs.append( jobs ); emit queueChanged( m_jobs ); } } // namespace Calamares #include "JobQueue.moc" calamares-3.1.12/src/libcalamares/JobQueue.h000066400000000000000000000032311322271446000206240ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_JOBQUEUE_H #define CALAMARES_JOBQUEUE_H #include "DllMacro.h" #include "Typedefs.h" #include namespace Calamares { class GlobalStorage; class JobThread; class DLLEXPORT JobQueue : public QObject { Q_OBJECT public: explicit JobQueue( QObject* parent = nullptr ); virtual ~JobQueue(); static JobQueue* instance(); GlobalStorage* globalStorage() const; void enqueue( const job_ptr& job ); void enqueue( const QList< job_ptr >& jobs ); void start(); signals: void queueChanged( const QList< job_ptr >& jobs ); void progress( qreal percent, const QString& prettyName ); void finished(); void failed( const QString& message, const QString& details ); private: static JobQueue* s_instance; QList< job_ptr > m_jobs; JobThread* m_thread; GlobalStorage* m_storage; }; } #endif // CALAMARES_JOBQUEUE_H calamares-3.1.12/src/libcalamares/PluginDllMacro.h000066400000000000000000000020151322271446000217600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLUGINDLLMACRO_H #define PLUGINDLLMACRO_H #include #ifndef PLUGINDLLEXPORT # if defined (PLUGINDLLEXPORT_PRO) # define PLUGINDLLEXPORT Q_DECL_EXPORT # else # define PLUGINDLLEXPORT Q_DECL_IMPORT # endif #endif #endif calamares-3.1.12/src/libcalamares/ProcessJob.cpp000066400000000000000000000123141322271446000215130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProcessJob.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" #include #include namespace Calamares { ProcessJob::ProcessJob( const QString& command, const QString& workingPath, bool runInChroot, int secondsTimeout, QObject* parent ) : Job( parent ) , m_command( command ) , m_workingPath( workingPath ) , m_runInChroot( runInChroot ) , m_timeoutSec( secondsTimeout ) {} ProcessJob::~ProcessJob() {} QString ProcessJob::prettyName() const { //TODO: show something more meaningful return tr( "Run command %1 %2" ) .arg( m_command ) .arg( m_runInChroot ? "in chroot." : " ." ); } QString ProcessJob::prettyStatusMessage() const { return tr( "Running command %1 %2" ) .arg( m_command ) .arg( m_runInChroot ? "in chroot." : " ." ); } JobResult ProcessJob::exec() { int ec = 0; QString output; if ( m_runInChroot ) ec = CalamaresUtils::System::instance()-> targetEnvOutput( m_command, output, m_workingPath, QString(), m_timeoutSec ); else ec = callOutput( m_command, output, m_workingPath, QString(), m_timeoutSec ); if ( ec == 0 ) return JobResult::ok(); if ( ec == -1 ) //Crash! return JobResult::error( tr( "External command crashed" ), tr( "Command %1 crashed.\nOutput:\n%2" ) .arg( m_command ) .arg( output ) ); if ( ec == -2 ) return JobResult::error( tr( "External command failed to start" ), tr( "Command %1 failed to start." ) .arg( m_command ) ); if ( ec == -3 ) return JobResult::error( tr( "Internal error when starting command" ), tr( "Bad parameters for process job call." ) ); if ( ec == -4 ) return JobResult::error( tr( "External command failed to finish" ), tr( "Command %1 failed to finish in %2s.\nOutput:\n%3" ) .arg( m_command ) .arg( m_timeoutSec ) .arg( output ) ); //Any other exit code return JobResult::error( tr( "External command finished with errors" ), tr( "Command %1 finished with exit code %2.\nOutput:\n%3" ) .arg( m_command ) .arg( ec ) .arg( output ) ); } int ProcessJob::callOutput( const QString& command, QString& output, const QString& workingPath, const QString& stdInput, int timeoutSec ) { output.clear(); QProcess process; process.setProgram( "/bin/sh" ); process.setArguments( { "-c", command } ); process.setProcessChannelMode( QProcess::MergedChannels ); if ( !workingPath.isEmpty() ) { if ( QDir( workingPath ).exists() ) process.setWorkingDirectory( QDir( workingPath ).absolutePath() ); else { cLog() << "Invalid working directory:" << workingPath; return -3; } } cLog() << "Running" << command; process.start(); if ( !process.waitForStarted() ) { cLog() << "Process failed to start" << process.error(); return -2; } if ( !stdInput.isEmpty() ) { process.write( stdInput.toLocal8Bit() ); process.closeWriteChannel(); } if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) ) { cLog() << "Timed out. output so far:"; cLog() << process.readAllStandardOutput(); return -4; } output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() ); if ( process.exitStatus() == QProcess::CrashExit ) { cLog() << "Process crashed"; return -1; } cLog() << "Finished. Exit code:" << process.exitCode(); return process.exitCode(); } } // namespace Calamares calamares-3.1.12/src/libcalamares/ProcessJob.h000066400000000000000000000034401322271446000211600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PROCESSJOB_H #define CALAMARES_PROCESSJOB_H #include "Job.h" namespace Calamares { class ProcessJob : public Job { Q_OBJECT public: explicit ProcessJob( const QString& command, const QString& workingPath, bool runInChroot = false, int secondsTimeout = 30, QObject* parent = nullptr ); virtual ~ProcessJob() override; QString prettyName() const override; QString prettyStatusMessage() const override; JobResult exec() override; private: int callOutput( const QString& command, QString& output, const QString& workingPath = QString(), const QString& stdInput = QString(), int timeoutSec = 0 ); QString m_command; QString m_workingPath; bool m_runInChroot; int m_timeoutSec; }; } // namespace Calamares #endif // CALAMARES_PROCESSJOB_H calamares-3.1.12/src/libcalamares/PythonHelper.cpp000066400000000000000000000210261322271446000220630ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonHelper.h" #include "utils/CalamaresUtils.h" #include "utils/Logger.h" #include #include #undef slots #include namespace bp = boost::python; namespace CalamaresPython { boost::python::object variantToPyObject( const QVariant& variant ) { switch ( variant.type() ) { case QVariant::Map: return variantMapToPyDict( variant.toMap() ); case QVariant::Hash: return variantHashToPyDict( variant.toHash() ); case QVariant::List: case QVariant::StringList: return variantListToPyList( variant.toList() ); case QVariant::Int: return bp::object( variant.toInt() ); case QVariant::Double: return bp::object( variant.toDouble() ); case QVariant::String: return bp::object( variant.toString().toStdString() ); case QVariant::Bool: return bp::object( variant.toBool() ); default: return bp::object(); } } QVariant variantFromPyObject( const boost::python::object& pyObject ) { std::string pyType = bp::extract< std::string >( pyObject.attr( "__class__" ).attr( "__name__" ) ); if ( pyType == "dict" ) return variantMapFromPyDict( bp::extract< bp::dict >( pyObject ) ); else if ( pyType == "list" ) return variantListFromPyList( bp::extract< bp::list >( pyObject ) ); else if ( pyType == "int" ) return QVariant( bp::extract< int >( pyObject ) ); else if ( pyType == "float" ) return QVariant( bp::extract< double >( pyObject ) ); else if ( pyType == "str" ) return QVariant( QString::fromStdString( bp::extract< std::string >( pyObject ) ) ); else if ( pyType == "bool" ) return QVariant( bp::extract< bool >( pyObject ) ); else return QVariant(); } boost::python::list variantListToPyList( const QVariantList& variantList ) { bp::list pyList; for ( const QVariant& variant : variantList ) pyList.append( variantToPyObject( variant ) ); return pyList; } QVariantList variantListFromPyList( const boost::python::list& pyList ) { QVariantList list; for ( int i = 0; i < bp::len( pyList ); ++i ) list.append( variantFromPyObject( pyList[ i ] ) ); return list; } boost::python::dict variantMapToPyDict( const QVariantMap& variantMap ) { bp::dict pyDict; for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it ) pyDict[ it.key().toStdString() ] = variantToPyObject( it.value() ); return pyDict; } QVariantMap variantMapFromPyDict( const boost::python::dict& pyDict ) { QVariantMap map; bp::list keys = pyDict.keys(); for ( int i = 0; i < bp::len( keys ); ++i ) { bp::extract< std::string > extracted_key( keys[ i ] ); if ( !extracted_key.check() ) { cDebug() << "Key invalid, map might be incomplete."; continue; } std::string key = extracted_key; bp::object obj = pyDict[ key ]; map.insert( QString::fromStdString( key ), variantFromPyObject( obj ) ); } return map; } boost::python::dict variantHashToPyDict( const QVariantHash& variantHash ) { bp::dict pyDict; for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it ) pyDict[ it.key().toStdString() ] = variantToPyObject( it.value() ); return pyDict; } QVariantHash variantHashFromPyDict( const boost::python::dict& pyDict ) { QVariantHash hash; bp::list keys = pyDict.keys(); for ( int i = 0; i < bp::len( keys ); ++i ) { bp::extract< std::string > extracted_key( keys[ i ] ); if ( !extracted_key.check() ) { cDebug() << "Key invalid, map might be incomplete."; continue; } std::string key = extracted_key; bp::object obj = pyDict[ key ]; hash.insert( QString::fromStdString( key ), variantFromPyObject( obj ) ); } return hash; } Helper* Helper::s_instance = nullptr; static inline void add_if_lib_exists( const QDir& dir, const char* name, QStringList& list ) { if ( ! ( dir.exists() && dir.isReadable() ) ) return; QFileInfo fi( dir.absoluteFilePath( name ) ); if ( fi.exists() && fi.isReadable() ) list.append( fi.dir().absolutePath() ); } Helper::Helper( QObject* parent ) : QObject( parent ) { // Let's make extra sure we only call Py_Initialize once if ( !s_instance ) { if ( !Py_IsInitialized() ) Py_Initialize(); m_mainModule = bp::import( "__main__" ); m_mainNamespace = m_mainModule.attr( "__dict__" ); // If we're running from the build dir add_if_lib_exists( QDir::current(), "libcalamares.so", m_pythonPaths ); QDir calaPythonPath( CalamaresUtils::systemLibDir().absolutePath() + QDir::separator() + "calamares" ); add_if_lib_exists( calaPythonPath, "libcalamares.so", m_pythonPaths ); bp::object sys = bp::import( "sys" ); foreach ( QString path, m_pythonPaths ) { bp::str dir = path.toLocal8Bit().data(); sys.attr( "path" ).attr( "append" )( dir ); } } else { cDebug() << "WARNING: creating PythonHelper more than once. This is very bad."; return; } s_instance = this; } Helper::~Helper() {} boost::python::dict Helper::createCleanNamespace() { // To make sure we run each script with a clean namespace, we only fetch the // builtin namespace from the interpreter as it was when freshly initialized. bp::dict scriptNamespace; scriptNamespace[ "__builtins__" ] = m_mainNamespace[ "__builtins__" ]; return scriptNamespace; } QString Helper::handleLastError() { PyObject* type = nullptr, *val = nullptr, *tb = nullptr; PyErr_Fetch( &type, &val, &tb ); QString typeMsg; if ( type != nullptr ) { bp::handle<> h_type( type ); bp::str pystr( h_type ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) typeMsg = QString::fromStdString( extracted() ).toHtmlEscaped(); if ( typeMsg.trimmed().isEmpty() ) typeMsg = tr( "Unknown exception type" ); } QString valMsg; if ( val != nullptr ) { bp::handle<> h_val( val ); bp::str pystr( h_val ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) valMsg = QString::fromStdString( extracted() ).toHtmlEscaped(); if ( valMsg.trimmed().isEmpty() ) valMsg = tr( "unparseable Python error" ); } QString tbMsg; if ( tb != nullptr ) { bp::handle<> h_tb( tb ); bp::object tb( bp::import( "traceback" ) ); bp::object format_tb( tb.attr( "format_tb" ) ); bp::object tb_list( format_tb( h_tb ) ); bp::object pystr( bp::str( "\n" ).join( tb_list ) ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) tbMsg = QString::fromStdString( extracted() ).toHtmlEscaped(); if ( tbMsg.trimmed().isEmpty() ) tbMsg = tr( "unparseable Python traceback" ); } if ( typeMsg.isEmpty() && valMsg.isEmpty() && tbMsg.isEmpty() ) return tr( "Unfetchable Python error." ); QStringList msgList; if ( !typeMsg.isEmpty() ) msgList.append( QString( "%1" ).arg( typeMsg ) ); if ( !valMsg.isEmpty() ) msgList.append( valMsg ); if ( !tbMsg.isEmpty() ) { msgList.append( "Traceback:" ); msgList.append( QString( "
%1
" ).arg( tbMsg ) ); cDebug() << "tbMsg" << tbMsg; } // Return a string made of the msgList items, wrapped in
tags return QString( "
%1
" ).arg( msgList.join( "
" ) ); } } // namespace CalamaresPython calamares-3.1.12/src/libcalamares/PythonHelper.h000066400000000000000000000042111322271446000215250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PYTHONJOBHELPER_H #define CALAMARES_PYTHONJOBHELPER_H #include "PythonJob.h" #include #undef slots #include #include #include namespace CalamaresPython { boost::python::object variantToPyObject( const QVariant& variant ); QVariant variantFromPyObject( const boost::python::object& pyObject ); boost::python::list variantListToPyList( const QVariantList& variantList ); QVariantList variantListFromPyList( const boost::python::list& pyList ); boost::python::dict variantMapToPyDict( const QVariantMap& variantMap ); QVariantMap variantMapFromPyDict( const boost::python::dict& pyDict ); boost::python::dict variantHashToPyDict( const QVariantHash& variantHash ); QVariantHash variantHashFromPyDict( const boost::python::dict& pyDict ); class Helper : public QObject { Q_OBJECT public: explicit Helper( QObject* parent = nullptr ); virtual ~Helper(); boost::python::dict createCleanNamespace(); QString handleLastError(); private: friend Helper* Calamares::PythonJob::helper(); static Helper* s_instance; boost::python::object m_mainModule; boost::python::object m_mainNamespace; QStringList m_pythonPaths; }; } // namespace Calamares #endif // CALAMARES_PYTHONJOBHELPER_H calamares-3.1.12/src/libcalamares/PythonJob.cpp000066400000000000000000000341111322271446000213550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonJob.h" #include "PythonHelper.h" #include "utils/Logger.h" #include "GlobalStorage.h" #include "JobQueue.h" #include #undef slots #include #include #include "PythonJobApi.h" namespace bp = boost::python; BOOST_PYTHON_FUNCTION_OVERLOADS( mount_overloads, CalamaresPython::mount, 2, 4 ); BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_str_overloads, CalamaresPython::target_env_call, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_list_overloads, CalamaresPython::target_env_call, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_str_overloads, CalamaresPython::check_target_env_call, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_list_overloads, CalamaresPython::check_target_env_call, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_output_str_overloads, CalamaresPython::check_target_env_output, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_output_list_overloads, CalamaresPython::check_target_env_output, 1, 3 ); BOOST_PYTHON_MODULE( libcalamares ) { bp::object package = bp::scope(); package.attr( "__path__" ) = "libcalamares"; bp::scope().attr( "ORGANIZATION_NAME" ) = CALAMARES_ORGANIZATION_NAME; bp::scope().attr( "ORGANIZATION_DOMAIN" ) = CALAMARES_ORGANIZATION_DOMAIN; bp::scope().attr( "APPLICATION_NAME" ) = CALAMARES_APPLICATION_NAME; bp::scope().attr( "VERSION" ) = CALAMARES_VERSION; bp::scope().attr( "VERSION_SHORT" ) = CALAMARES_VERSION_SHORT; bp::class_< CalamaresPython::PythonJobInterface >( "Job", bp::init< Calamares::PythonJob* >() ) .def_readonly( "module_name", &CalamaresPython::PythonJobInterface::moduleName ) .def_readonly( "pretty_name", &CalamaresPython::PythonJobInterface::prettyName ) .def_readonly( "working_path", &CalamaresPython::PythonJobInterface::workingPath ) .def_readonly( "configuration", &CalamaresPython::PythonJobInterface::configuration ) .def( "setprogress", &CalamaresPython::PythonJobInterface::setprogress, bp::args( "progress" ), "Reports the progress status of this job to Calamares, " "as a real number between 0 and 1." ); bp::class_< CalamaresPython::GlobalStoragePythonWrapper >( "GlobalStorage", bp::init< Calamares::GlobalStorage* >() ) .def( "contains", &CalamaresPython::GlobalStoragePythonWrapper::contains ) .def( "count", &CalamaresPython::GlobalStoragePythonWrapper::count ) .def( "insert", &CalamaresPython::GlobalStoragePythonWrapper::insert ) .def( "keys", &CalamaresPython::GlobalStoragePythonWrapper::keys ) .def( "remove", &CalamaresPython::GlobalStoragePythonWrapper::remove ) .def( "value", &CalamaresPython::GlobalStoragePythonWrapper::value ); // libcalamares.utils submodule starts here bp::object utilsModule( bp::handle<>( bp::borrowed( PyImport_AddModule( "libcalamares.utils" ) ) ) ); bp::scope().attr( "utils" ) = utilsModule; bp::scope utilsScope = utilsModule; Q_UNUSED( utilsScope ); bp::def( "debug", &CalamaresPython::debug, bp::args( "s" ), "Writes the given string to the Calamares debug stream." ); bp::def( "mount", &CalamaresPython::mount, mount_overloads( bp::args( "device_path", "mount_point", "filesystem_name", "options" ), "Runs the mount utility with the specified parameters.\n" "Returns the program's exit code, or:\n" "-1 = QProcess crash\n" "-2 = QProcess cannot start\n" "-3 = bad arguments" ) ); bp::def( "target_env_call", static_cast< int (*)( const std::string&, const std::string&, int ) >( &CalamaresPython::target_env_call ), target_env_call_str_overloads( bp::args( "command", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns the program's exit code, or:\n" "-1 = QProcess crash\n" "-2 = QProcess cannot start\n" "-3 = bad arguments\n" "-4 = QProcess timeout" ) ); bp::def( "target_env_call", static_cast< int (*)( const bp::list&, const std::string&, int ) >( &CalamaresPython::target_env_call ), target_env_call_list_overloads( bp::args( "args", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns the program's exit code, or:\n" "-1 = QProcess crash\n" "-2 = QProcess cannot start\n" "-3 = bad arguments\n" "-4 = QProcess timeout" ) ); bp::def( "check_target_env_call", static_cast< int (*)( const std::string&, const std::string&, int ) >( &CalamaresPython::check_target_env_call ), check_target_env_call_str_overloads( bp::args( "command", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns 0, which is program's exit code if the program exited " "successfully, or raises a subprocess.CalledProcessError." ) ); bp::def( "check_target_env_call", static_cast< int (*)( const bp::list&, const std::string&, int ) >( &CalamaresPython::check_target_env_call ), check_target_env_call_list_overloads( bp::args( "args", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns 0, which is program's exit code if the program exited " "successfully, or raises a subprocess.CalledProcessError." ) ); bp::def( "check_target_env_output", static_cast< std::string (*)( const std::string&, const std::string&, int ) >( &CalamaresPython::check_target_env_output ), check_target_env_output_str_overloads( bp::args( "command", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns the program's standard output, and raises a " "subprocess.CalledProcessError if something went wrong." ) ); bp::def( "check_target_env_output", static_cast< std::string (*)( const bp::list&, const std::string&, int ) >( &CalamaresPython::check_target_env_output ), check_target_env_output_list_overloads( bp::args( "args", "stdin", "timeout" ), "Runs the specified command in the chroot of the target system.\n" "Returns the program's standard output, and raises a " "subprocess.CalledProcessError if something went wrong." ) ); bp::def( "obscure", &CalamaresPython::obscure, bp::args( "s" ), "Simple string obfuscation function based on KStringHandler::obscure.\n" "Returns a string, generated using a simple symmetric encryption.\n" "Applying the function to a string obscured by this function will result " "in the original string." ); bp::def( "gettext_languages", &CalamaresPython::gettext_languages, "Returns list of languages (most to least-specific) for gettext." ); bp::def( "gettext_path", &CalamaresPython::gettext_path, "Returns path for gettext search." ); } namespace Calamares { PythonJob::PythonJob( const QString& scriptFile, const QString& workingPath, const QVariantMap& moduleConfiguration, QObject* parent ) : Job( parent ) , m_scriptFile( scriptFile ) , m_workingPath( workingPath ) , m_description() , m_configurationMap( moduleConfiguration ) { } PythonJob::~PythonJob() {} QString PythonJob::prettyName() const { return QDir( m_workingPath ).dirName(); } QString PythonJob::prettyStatusMessage() const { if ( m_description.isEmpty() ) return tr( "Running %1 operation." ) .arg( QDir( m_workingPath ).dirName() ); else return m_description; } JobResult PythonJob::exec() { // We assume m_scriptFile to be relative to m_workingPath. QDir workingDir( m_workingPath ); if ( !workingDir.exists() || !workingDir.isReadable() ) { return JobResult::error( tr( "Bad working directory path" ), tr( "Working directory %1 for python job %2 is not readable." ) .arg( m_workingPath ) .arg( prettyName() ) ); } QFileInfo scriptFI( workingDir.absoluteFilePath( m_scriptFile ) ); if ( !scriptFI.exists() || !scriptFI.isFile() || !scriptFI.isReadable() ) { return JobResult::error( tr( "Bad main script file" ), tr( "Main script file %1 for python job %2 is not readable." ) .arg( scriptFI.absoluteFilePath() ) .arg( prettyName() ) ); } try { bp::dict scriptNamespace = helper()->createCleanNamespace(); bp::object calamaresModule = bp::import( "libcalamares" ); bp::dict calamaresNamespace = bp::extract< bp::dict >( calamaresModule.attr( "__dict__" ) ); calamaresNamespace[ "job" ] = CalamaresPython::PythonJobInterface( this ); calamaresNamespace[ "globalstorage" ] = CalamaresPython::GlobalStoragePythonWrapper( JobQueue::instance()->globalStorage() ); bp::object execResult = bp::exec_file( scriptFI.absoluteFilePath().toLocal8Bit().data(), scriptNamespace, scriptNamespace ); bp::object entryPoint = scriptNamespace[ "run" ]; bp::object prettyNameFunc = scriptNamespace.get("pretty_name", bp::object()); cDebug() << "Job file" << scriptFI.absoluteFilePath(); if ( !prettyNameFunc.is_none() ) { bp::extract< std::string > prettyNameResult( prettyNameFunc() ); if ( prettyNameResult.check() ) { m_description = QString::fromStdString( prettyNameResult() ).trimmed(); } if ( !m_description.isEmpty() ) { cDebug() << "Job" << prettyName() << "(func) ->" << m_description; emit progress( 0 ); } } if ( m_description.isEmpty() ) { bp::extract< std::string > entryPoint_doc_attr(entryPoint.attr( "__doc__" ) ); if ( entryPoint_doc_attr.check() ) { m_description = QString::fromStdString( entryPoint_doc_attr() ).trimmed(); auto i_newline = m_description.indexOf('\n'); if ( i_newline > 0 ) m_description.truncate( i_newline ); cDebug() << "Job" << prettyName() << "(doc) ->" << m_description; emit progress( 0 ); } } bp::object runResult = entryPoint(); if ( runResult.is_none() ) { return JobResult::ok(); } else // Something happened in the Python job { bp::tuple resultTuple = bp::extract< bp::tuple >( runResult ); QString message = QString::fromStdString( bp::extract< std::string >( resultTuple[ 0 ] ) ); QString description = QString::fromStdString( bp::extract< std::string >( resultTuple[ 1 ] ) ); return JobResult::error( message, description ); } } catch ( bp::error_already_set ) { QString msg; if ( PyErr_Occurred() ) { msg = helper()->handleLastError(); } bp::handle_exception(); PyErr_Clear(); return JobResult::error( tr( "Boost.Python error in job \"%1\"." ).arg( prettyName() ), msg ); } } void PythonJob::emitProgress( qreal progressValue ) { emit progress( progressValue ); } CalamaresPython::Helper* PythonJob::helper() { return CalamaresPython::Helper::s_instance; } } // namespace Calamares calamares-3.1.12/src/libcalamares/PythonJob.h000066400000000000000000000034071322271446000210260ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PYTHONJOB_H #define CALAMARES_PYTHONJOB_H #include "Job.h" #include namespace CalamaresPython { class PythonJobInterface; class Helper; } namespace Calamares { class PythonJob : public Job { Q_OBJECT public: explicit PythonJob( const QString& scriptFile, const QString& workingPath, const QVariantMap& moduleConfiguration = QVariantMap(), QObject* parent = nullptr ); virtual ~PythonJob() override; QString prettyName() const override; QString prettyStatusMessage() const override; JobResult exec() override; private: friend class CalamaresPython::Helper; friend class CalamaresPython::PythonJobInterface; void emitProgress( double progressValue ); CalamaresPython::Helper* helper(); QString m_scriptFile; QString m_workingPath; QString m_description; QVariantMap m_configurationMap; }; } // namespace Calamares #endif // CALAMARES_PYTHONJOB_H calamares-3.1.12/src/libcalamares/PythonJobApi.cpp000066400000000000000000000212201322271446000220040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonJobApi.h" #include "PythonHelper.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/CalamaresUtils.h" #include "GlobalStorage.h" #include "JobQueue.h" #include #include #include #undef slots #include namespace bp = boost::python; namespace CalamaresPython { int mount( const std::string& device_path, const std::string& mount_point, const std::string& filesystem_name, const std::string& options ) { return CalamaresUtils::System::instance()-> mount( QString::fromStdString( device_path ), QString::fromStdString( mount_point ), QString::fromStdString( filesystem_name ), QString::fromStdString( options ) ); } int target_env_call( const std::string& command, const std::string& stdin, int timeout ) { return CalamaresUtils::System::instance()-> targetEnvCall( QString::fromStdString( command ), QString(), QString::fromStdString( stdin ), timeout ); } int target_env_call( const bp::list& args, const std::string& stdin, int timeout ) { QStringList list; for ( int i = 0; i < bp::len( args ); ++i ) { list.append( QString::fromStdString( bp::extract< std::string >( args[ i ] ) ) ); } return CalamaresUtils::System::instance()-> targetEnvCall( list, QString(), QString::fromStdString( stdin ), timeout ); } int check_target_env_call( const std::string& command, const std::string& stdin, int timeout ) { int ec = target_env_call( command, stdin, timeout ); return _handle_check_target_env_call_error( ec, QString::fromStdString( command ) ); } int check_target_env_call( const bp::list& args, const std::string& stdin, int timeout ) { int ec = target_env_call( args, stdin, timeout ); if ( !ec ) return ec; QStringList failedCmdList; for ( int i = 0; i < bp::len( args ); ++i ) { failedCmdList.append( QString::fromStdString( bp::extract< std::string >( args[ i ] ) ) ); } return _handle_check_target_env_call_error( ec, failedCmdList.join( ' ' ) ); } std::string check_target_env_output( const std::string& command, const std::string& stdin, int timeout ) { QString output; int ec = CalamaresUtils::System::instance()-> targetEnvOutput( QString::fromStdString( command ), output, QString(), QString::fromStdString( stdin ), timeout ); _handle_check_target_env_call_error( ec, QString::fromStdString( command ) ); return output.toStdString(); } std::string check_target_env_output( const bp::list& args, const std::string& stdin, int timeout ) { QString output; QStringList list; for ( int i = 0; i < bp::len( args ); ++i ) { list.append( QString::fromStdString( bp::extract< std::string >( args[ i ] ) ) ); } int ec = CalamaresUtils::System::instance()-> targetEnvOutput( list, output, QString(), QString::fromStdString( stdin ), timeout ); _handle_check_target_env_call_error( ec, list.join( ' ' ) ); return output.toStdString(); } int _handle_check_target_env_call_error( int ec, const QString& cmd ) { if ( !ec ) return ec; QString raise = QString( "import subprocess\n" "raise subprocess.CalledProcessError(%1,\"%2\")" ) .arg( ec ) .arg( cmd ); bp::exec( raise.toStdString().c_str() ); bp::throw_error_already_set(); return ec; } void debug( const std::string& s ) { cDebug() << "[PYTHON JOB]: " << QString::fromStdString( s ); } PythonJobInterface::PythonJobInterface( Calamares::PythonJob* parent ) : m_parent( parent ) { auto moduleDir = QDir( m_parent->m_workingPath ); moduleName = moduleDir.dirName().toStdString(); prettyName = m_parent->prettyName().toStdString(); workingPath = m_parent->m_workingPath.toStdString(); configuration = CalamaresPython::variantMapToPyDict( m_parent->m_configurationMap ); } void PythonJobInterface::setprogress( qreal progress ) { if ( progress >= 0 && progress <= 1 ) m_parent->emitProgress( progress ); } std::string obscure( const std::string& string ) { return CalamaresUtils::obscure( QString::fromStdString( string ) ).toStdString(); } static QStringList _gettext_languages() { QStringList languages; // There are two ways that Python jobs can be initialised: // - through JobQueue, in which case that has an instance which holds // a GlobalStorage object, or // - through the Python test-script, which initialises its // own GlobalStoragePythonWrapper, which then holds a // GlobalStorage object for all of Python. Calamares::JobQueue* jq = Calamares::JobQueue::instance(); Calamares::GlobalStorage* gs = jq ? jq->globalStorage() : CalamaresPython::GlobalStoragePythonWrapper::globalStorageInstance(); QVariant localeConf_ = gs->value( "localeConf" ); if ( localeConf_.canConvert< QVariantMap >() ) { QVariant lang_ = localeConf_.value< QVariantMap >()[ "LANG" ]; if ( lang_.canConvert< QString >() ) { QString lang = lang_.value< QString >(); languages.append( lang ); if ( lang.indexOf( '.' ) > 0 ) { lang.truncate( lang.indexOf( '.' ) ); languages.append( lang ); } if ( lang.indexOf( '_' ) > 0 ) { lang.truncate( lang.indexOf( '_' ) ); languages.append( lang ); } } } return languages; } bp::list gettext_languages() { bp::list pyList; for ( auto lang : _gettext_languages() ) pyList.append( lang.toStdString() ); return pyList; } static void _add_localedirs( QStringList& pathList, const QString& candidate ) { if ( !candidate.isEmpty() && !pathList.contains( candidate ) ) { pathList.prepend( candidate ); if ( QDir( candidate ).cd( "lang" ) ) pathList.prepend( candidate + "/lang" ); } } bp::object gettext_path() { // TODO: distinguish between -d runs and normal runs // TODO: can we detect DESTDIR-installs? QStringList candidatePaths = QStandardPaths::locateAll( QStandardPaths::GenericDataLocation, "locale", QStandardPaths::LocateDirectory ); QString extra = QCoreApplication::applicationDirPath(); _add_localedirs( candidatePaths, extra ); // Often /usr/local/bin if ( !extra.isEmpty() ) { QDir d( extra ); if ( d.cd( "../share/locale" ) ) // Often /usr/local/bin/../share/locale -> /usr/local/share/locale _add_localedirs( candidatePaths, d.canonicalPath() ); } _add_localedirs( candidatePaths, QDir().canonicalPath() ); // . cDebug() << "Standard paths" << candidatePaths; for ( auto lang : _gettext_languages() ) for ( auto localedir : candidatePaths ) { QDir ldir( localedir ); cDebug() << "Checking" << lang << "in" < === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONJOBAPI_H #define PYTHONJOBAPI_H #include "CalamaresVersion.h" #include "PythonJob.h" #undef slots #include namespace CalamaresPython { int mount( const std::string& device_path, const std::string& mount_point, const std::string& filesystem_name = std::string(), const std::string& options = std::string() ); int target_env_call( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); int target_env_call( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); int check_target_env_call( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); int check_target_env_call( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); std::string check_target_env_output( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); std::string check_target_env_output( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); std::string obscure( const std::string& string ); boost::python::object gettext_path(); boost::python::list gettext_languages(); void debug( const std::string& s ); inline int _handle_check_target_env_call_error( int ec, const QString& cmd ); class PythonJobInterface { public: explicit PythonJobInterface( Calamares::PythonJob* parent ); std::string moduleName; std::string prettyName; std::string workingPath; boost::python::dict configuration; void setprogress( qreal progress ); private: Calamares::PythonJob* m_parent; }; } #endif // PYTHONJOBAPI_H calamares-3.1.12/src/libcalamares/Typedefs.h000066400000000000000000000020511322271446000206670ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef TYPEDEFS_H #define TYPEDEFS_H #include namespace Calamares { class Job; typedef QSharedPointer< Job > job_ptr; enum ModuleAction : char { Show, Exec }; class ViewStep; typedef QList< ViewStep* > ViewStepList; } //ns #endif // TYPEDEFS_H calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/000077500000000000000000000000001322271446000240045ustar00rootroot00000000000000calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/LICENSE.LGPL.txt000066400000000000000000000621261322271446000263730ustar00rootroot00000000000000 The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. You may use, distribute and copy the KD Tools Library under the terms of GNU Library General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp000066400000000000000000000310701322271446000323120ustar00rootroot00000000000000#include "kdlockedsharedmemorypointer.h" #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) #ifndef QT_NO_SHAREDMEMORY namespace kdtools { } using namespace kdtools; KDLockedSharedMemoryPointerBase::KDLockedSharedMemoryPointerBase( QSharedMemory * m ) : locker( m ), mem( m ) { } KDLockedSharedMemoryPointerBase::KDLockedSharedMemoryPointerBase( QSharedMemory & m ) : locker( &m ), mem( &m ) { } KDLockedSharedMemoryPointerBase::~KDLockedSharedMemoryPointerBase() {} void * KDLockedSharedMemoryPointerBase::get() { return mem ? mem->data() : 0 ; } const void * KDLockedSharedMemoryPointerBase::get() const { return mem ? mem->data() : 0 ; } size_t KDLockedSharedMemoryPointerBase::byteSize() const { return mem ? mem->size() : 0; } /*! \class KDLockedSharedMemoryPointer \ingroup core raii smartptr \brief Locking pointer for Qt shared memory segments \since_c 2.1 (The exception safety of this class has not been evaluated yet.) KDLockedSharedMemoryPointer is a smart immutable pointer, which gives convenient and safe access to a QSharedMemory data segment. The content of a KDLockedSharedMemoryPointer cannot be changed during it's lifetime. You can use this class like a normal pointer to the shared memory segment and be sure it's locked while accessing it. \note You can only put simple types/structs/classes into it. structs and classes shall not contain any other pointers. See the documentation of QSharedMemory for details. */ /*! \fn KDLockedSharedMemoryPointer::KDLockedSharedMemoryPointer( QSharedMemory * mem ) Constructor. Constructs a KDLockedSharedMemory pointer which points to the data segment of \a mem. The constructor locks \a mem. If the memory segment is already locked by another process, this constructor blocks until the lock is released. \post data() == mem->data() and the memory segment has been locked */ /*! \fn KDLockedSharedMemoryPointer::KDLockedSharedMemoryPointer( QSharedMemory & mem ) \overload \post data() == mem.data() and the memory segment has been locked */ /*! \fn KDLockedSharedMemoryPointer::~KDLockedSharedMemoryPointer() Destructor. Unlocks the shared memory segment. \post The shared memory segment has been unlocked */ /*! \fn T * KDLockedSharedMemoryPointer::get() \returns a pointer to the contained object. */ /*! \fn const T * KDLockedSharedMemoryPointer::get() const \returns a const pointer to the contained object \overload */ /*! \fn T * KDLockedSharedMemoryPointer::data() Equivalent to get(), provided for consistency with Qt naming conventions. */ /*! \fn const T * KDLockedSharedMemoryPointer::data() const \overload */ /*! \fn T & KDLockedSharedMemoryPointer::operator*() Dereference operator. Returns \link get() *get()\endlink. */ /*! \fn const T & KDLockedSharedMemoryPointer::operator*() const Dereference operator. Returns \link get() *get()\endlink. \overload */ /*! \fn T * KDLockedSharedMemoryPointer::operator->() Member-by-pointer operator. Returns get(). */ /*! \fn const T * KDLockedSharedMemoryPointer::operator->() const Member-by-pointer operator. Returns get(). \overload */ /*! \class KDLockedSharedMemoryArray \ingroup core raii smartptr \brief Locking array pointer to Qt shared memory segments \since_c 2.1 (The exception safety of this class has not been evaluated yet.) KDLockedSharedMemoryArray is a smart immutable pointer, which gives convenient and safe access to array data stored in a QSharedMemory data segment. The content of a KDLockedSharedMemoryArray cannot be changed during it's lifetime. You can use this class like a normal pointer to the shared memory segment and be sure it's locked while accessing it. \note You can only put arrays of simple types/structs/classes into it. structs and classes shall not contain any other pointers. See the documentation of QSharedMemory for details. \sa KDLockedSharedMemoryPointer */ /*! \fn KDLockedSharedMemoryArray::KDLockedSharedMemoryArray( QSharedMemory* mem ) Constructor. Constructs a KDLockedSharedMemoryArray which points to the data segment of \a mem. The constructor locks \a mem. If the memory segment is already locked by another process, this constructor blocks until the lock is release. \post get() == mem->data() and the memory segment has been locked */ /*! \fn KDLockedSharedMemoryArray::KDLockedSharedMemoryArray( QSharedMemory& mem ) \overload \post get() == mem->data() and the memory segment has been locked */ /*! \typedef KDLockedSharedMemoryArray::size_type Typedef for std::size_t. Provided for STL compatibility. */ /*! \typedef KDLockedSharedMemoryArray::difference_type Typedef for std::ptrdiff_t. Provided for STL compatibility. */ /*! \typedef KDLockedSharedMemoryArray::iterator Typedef for T*. Provided for STL compatibility. \since_t 2.2 */ /*! \typedef KDLockedSharedMemoryArray::const_iterator Typedef for const T*. Provided for STL compatibility. \since_t 2.2 */ /*! \typedef KDLockedSharedMemoryArray::reverse_iterator Typedef for std::reverse_iterator< \link KDLockedSharedMemoryArray::iterator iterator\endlink >. Provided for STL compatibility. \since_t 2.2 */ /*! \typedef KDLockedSharedMemoryArray::const_reverse_iterator Typedef for std::reverse_iterator< \link KDLockedSharedMemoryArray::const_iterator const_iterator\endlink >. Provided for STL compatibility. \since_t 2.2 */ /*! \fn KDLockedSharedMemoryArray::iterator KDLockedSharedMemoryArray::begin() Returns an \link KDLockedSharedMemoryArray::iterator iterator\endlink pointing to the first item of the array. \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::const_iterator KDLockedSharedMemoryArray::begin() const \overload \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::iterator KDLockedSharedMemoryArray::end() Returns an \link KDLockedSharedMemoryArray::iterator iterator\endlink pointing to the item after the last item of the array. \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::const_iterator KDLockedSharedMemoryArray::end() const \overload \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::reverse_iterator KDLockedSharedMemoryArray::rbegin() Returns an \link KDLockedSharedMemoryArray::reverse_iterator reverse_iterator\endlink pointing to the item after the last item of the array. \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::const_reverse_iterator KDLockedSharedMemoryArray::rbegin() const \overload \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::reverse_iterator KDLockedSharedMemoryArray::rend() Returns an \link KDLockedSharedMemoryArray::reverse_iterator reverse_iterator\endlink pointing to the first item of the array. \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::const_reverse_iterator KDLockedSharedMemoryArray::rend() const \overload \since_f 2.2 */ /*! \fn KDLockedSharedMemoryArray::size_type KDLockedSharedMemoryArray::size() const Returns the size of this array. The size is calculated from the storage size of T and the size of the shared memory segment. \since_f 2.2 */ /*! \fn T& KDLockedSharedMemoryArray::operator[]( difference_type n ) Array access operator. Returns a reference to the item at index position \a n. */ /*! \fn const T& KDLockedSharedMemoryArray::operator[]( difference_type n ) const \overload */ /*! \fn T& KDLockedSharedMemoryArray::front() Returns a reference to the first item in the array. This is the same as operator[](0). */ /*! \fn const T& KDLockedSharedMemoryArray::front() const \overload */ /*! \fn T& KDLockedSharedMemoryArray::back() Returns a reference to the last item in the array. This is the same as operator[](size()-1). \since_f 2.2 */ /*! \fn const T& KDLockedSharedMemoryArray::back() const \overload \since_f 2.2 */ #ifdef eKDTOOLSCORE_UNITTESTS #include #include #include namespace { struct TestStruct { TestStruct( uint nn = 0 ) : n( nn ), f( 0.0 ), c( '\0' ), b( false ) { } uint n; double f; char c; bool b; }; bool operator==( const TestStruct& lhs, const TestStruct& rhs ) { return lhs.n == rhs.n && lhs.f == rhs.f && lhs.c == rhs.c && lhs.b == rhs.b; } class TestThread : public QThread { public: TestThread( const QString& key ) : mem( key ) { mem.attach(); } void run() { while( true ) { msleep( 100 ); kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem ); if( !p->b ) continue; p->n = 5; p->f = 3.14; p->c = 'A'; p->b = false; return; } } QSharedMemory mem; }; bool isConst( TestStruct* ) { return false; } bool isConst( const TestStruct* ) { return true; } } KDAB_UNITTEST_SIMPLE( KDLockedSharedMemoryPointer, "kdcoretools" ) { const QString key = QUuid::createUuid(); QSharedMemory mem( key ); const bool created = mem.create( sizeof( TestStruct ) ); assertTrue( created ); if ( !created ) return; // don't execute tests if shm coulnd't be created // On Windows, shared mem is only available in increments of page // size (4k), so don't fail if the segment is larger: const unsigned long mem_size = mem.size(); assertGreaterOrEqual( mem_size, sizeof( TestStruct ) ); { kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem ); assertTrue( p ); *p = TestStruct(); assertEqual( p->n, 0u ); assertEqual( p->f, 0.0 ); assertEqual( p->c, '\0' ); assertFalse( p->b ); } { TestThread thread( key ); assertEqual( thread.mem.key().toStdString(), key.toStdString() ); assertEqual( static_cast< unsigned long >( thread.mem.size() ), mem_size ); thread.start(); assertTrue( thread.isRunning() ); thread.wait( 2000 ); assertTrue( thread.isRunning() ); { kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem ); p->b = true; } thread.wait( 2000 ); assertFalse( thread.isRunning() ); } { kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem ); assertEqual( p->n, 5u ); assertEqual( p->f, 3.14 ); assertEqual( p->c, 'A' ); assertFalse( p->b ); } { kdtools::KDLockedSharedMemoryPointer< TestStruct > p( mem ); assertEqual( mem.data(), p.get() ); assertEqual( p.get(), p.operator->() ); assertEqual( p.get(), &(*p) ); assertEqual( p.get(), p.data() ); assertFalse( isConst( p.get() ) ); } { const kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem ); assertEqual( mem.data(), p.get() ); assertEqual( p.get(), p.operator->() ); assertEqual( p.get(), &(*p) ); assertEqual( p.get(), p.data() ); assertTrue( isConst( p.get() ) ); } { QSharedMemory mem2( key + key ); const bool created2 = mem2.create( 16 * sizeof( TestStruct ) ); assertTrue( created2 ); if ( !created2 ) return; // don't execute tests if shm coulnd't be created kdtools::KDLockedSharedMemoryArray a( mem2 ); assertTrue( a ); assertEqual( a.get(), mem2.data() ); assertEqual( &a[0], a.get() ); a[1] = a[0]; assertTrue( a[0] == a[1] ); TestStruct ts; ts.n = 5; ts.f = 3.14; a[0] = ts; assertFalse( a[0] == a[1] ); assertEqual( a.front().n, ts.n ); assertEqual( a[0].f, ts.f ); a[0].n = 10; assertEqual( a.front().n, 10u ); ts = a[0]; assertEqual( ts.n, 10u ); std::vector< TestStruct > v; for( uint i = 0; i < a.size(); ++i ) v.push_back( TestStruct( i ) ); std::copy( v.begin(), v.end(), a.begin() ); for( uint i = 0; i < a.size(); ++i ) assertEqual( a[ i ].n, i ); assertEqual( a.front().n, 0u ); assertEqual( a.back().n, a.size() - 1 ); std::copy( v.begin(), v.end(), a.rbegin() ); for( uint i = 0; i < a.size(); ++i ) assertEqual( a[ i ].n, a.size() - 1 - i ); assertEqual( a.front().n, a.size() - 1 ); assertEqual( a.back().n, 0u ); } } #endif // KDTOOLSCORE_UNITTESTS #endif // QT_NO_SHAREDMEMORY #endif // QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.h000066400000000000000000000077111322271446000317640ustar00rootroot00000000000000#ifndef __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ #define __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ #include #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) #ifndef QT_NO_SHAREDMEMORY #include "kdsharedmemorylocker.h" #include #include #ifndef DOXYGEN_RUN namespace kdtools { #endif class KDLockedSharedMemoryPointerBase { protected: explicit KDLockedSharedMemoryPointerBase( QSharedMemory * mem ); explicit KDLockedSharedMemoryPointerBase( QSharedMemory & mem ); ~KDLockedSharedMemoryPointerBase(); // PENDING(marc) do we really want const propagation here? I // usually declare all my RAII objects const... void * get(); const void * get() const; KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( get() ) size_t byteSize() const; private: KDSharedMemoryLocker locker; QSharedMemory * const mem; }; template< typename T> class MAKEINCLUDES_EXPORT KDLockedSharedMemoryPointer : KDLockedSharedMemoryPointerBase { KDAB_DISABLE_COPY( KDLockedSharedMemoryPointer ); public: explicit KDLockedSharedMemoryPointer( QSharedMemory * m ) : KDLockedSharedMemoryPointerBase( m ) {} explicit KDLockedSharedMemoryPointer( QSharedMemory & m ) : KDLockedSharedMemoryPointerBase( m ) {} T * get() { return static_cast( KDLockedSharedMemoryPointerBase::get() ); } const T * get() const { return static_cast( KDLockedSharedMemoryPointerBase::get() ); } T * data() { return static_cast( get() ); } const T * data() const { return static_cast( get() ); } T & operator*() { assert( get() ); return *get(); } const T & operator*() const { assert( get() ); return *get(); } T * operator->() { return get(); } const T * operator->() const { return get(); } KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase ) }; template class MAKEINCLUDES_EXPORT KDLockedSharedMemoryArray : KDLockedSharedMemoryPointerBase { KDAB_DISABLE_COPY( KDLockedSharedMemoryArray ); public: explicit KDLockedSharedMemoryArray( QSharedMemory * m ) : KDLockedSharedMemoryPointerBase( m ) {} explicit KDLockedSharedMemoryArray( QSharedMemory & m ) : KDLockedSharedMemoryPointerBase( m ) {} typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T* iterator; typedef const T* const_iterator; typedef std::reverse_iterator< const_iterator > const_reverse_iterator; typedef std::reverse_iterator< iterator > reverse_iterator; iterator begin() { return get(); } const_iterator begin() const { return get(); } iterator end() { return begin() + size(); } const_iterator end() const { return begin() + size(); } reverse_iterator rbegin() { return reverse_iterator( end() ); } const_reverse_iterator rbegin() const { return reverse_iterator( end() ); } reverse_iterator rend() { return reverse_iterator( begin() ); } const_reverse_iterator rend() const { return const_reverse_iterator( begin() ); } size_type size() const { return byteSize() / sizeof( T ); } T * get() { return static_cast( KDLockedSharedMemoryPointerBase::get() ); } const T * get() const { return static_cast( KDLockedSharedMemoryPointerBase::get() ); } T & operator[]( difference_type n ) { assert( get() ); return *(get()+n); } const T & operator[]( difference_type n ) const { assert( get() ); return *(get()+n); } T & front() { assert( get() ); return *get(); } const T & front() const { assert( get() ); return *get(); } T & back() { assert( get() ); return *( get() + size() - 1 ); } const T & back() const { assert( get() ); return *( get() + size() - 1 ); } KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase ) }; #ifndef DOXYGEN_RUN } #endif #endif /* QT_NO_SHAREDMEMORY */ #endif /* QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) */ #endif /* __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ */ calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.cpp000066400000000000000000000016011322271446000307240ustar00rootroot00000000000000#include "kdsharedmemorylocker.h" #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) #include using namespace kdtools; /*! \class KDSharedMemoryLocker \ingroup raii core \brief Exception-safe and convenient wrapper around QSharedMemory::lock() */ /** * Constructor. Locks the shared memory segment \a mem. * If another process has locking the segment, this constructor blocks * until the lock is released. The memory segments needs to be properly created or attached. */ KDSharedMemoryLocker::KDSharedMemoryLocker( QSharedMemory* mem ) : mem( mem ) { mem->lock(); } /** * Destructor. Unlocks the shared memory segment associated with this * KDSharedMemoryLocker. */ KDSharedMemoryLocker::~KDSharedMemoryLocker() { mem->unlock(); } #ifdef KDAB_EVAL #include KDAB_EVAL static const EvalDialogChecker evalChecker( "KD Tools", false ); #endif #endif calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.h000066400000000000000000000011571322271446000303770ustar00rootroot00000000000000#ifndef __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H #define __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H #include "kdtoolsglobal.h" #if QT_VERSION < 0x040400 && !defined( DOXYGEN_RUN ) #ifdef Q_CC_GNU #warning "Can't use KDTools KDSharedMemoryLocker with Qt versions prior to 4.4" #endif #else class QSharedMemory; #ifndef DOXYGEN_RUN namespace kdtools { #endif class KDTOOLSCORE_EXPORT KDSharedMemoryLocker { Q_DISABLE_COPY( KDSharedMemoryLocker ) public: KDSharedMemoryLocker( QSharedMemory* mem ); ~KDSharedMemoryLocker(); private: QSharedMemory* const mem; }; #ifndef DOXYGEN_RUN } #endif #endif #endif calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.cpp000066400000000000000000001141131322271446000315600ustar00rootroot00000000000000#include "kdsingleapplicationguard.h" #if QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN) #ifndef QT_NO_SHAREDMEMORY #include "kdsharedmemorylocker.h" #include "kdlockedsharedmemorypointer.h" #include #include #include #include #include #include #include #include #include #include #include #ifndef Q_WS_WIN #include #include #endif #ifdef Q_WS_WIN #include #ifndef _SSIZE_T_DEFINED typedef signed int ssize_t; #endif #endif using namespace kdtools; #ifndef KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS #define KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS 10 #endif #ifndef KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES #define KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES 10 #endif #ifndef KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE #define KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE 32768 #endif static unsigned int KDSINGLEAPPLICATIONGUARD_SHM_VERSION = 0; Q_GLOBAL_STATIC_WITH_ARGS( int, registerInstanceType, (qRegisterMetaType()) ) /*! \class KDSingleApplicationGuard::Instance \relates KDSingleApplicationGuard \ingroup core \brief Information about instances a KDSingleApplicationGuard knows about Instance represents instances of applications under KDSingleApplicationGuard protection, and allows access to their pid() and the arguments() they were started with. */ class KDSingleApplicationGuard::Instance::Private : public QSharedData { friend class ::KDSingleApplicationGuard::Instance; public: Private( const QStringList & args, bool truncated, qint64 pid ) : pid( pid ), arguments( args ), truncated( truncated ) {} private: qint64 pid; QStringList arguments; bool truncated; }; struct ProcessInfo; /*! \internal */ class KDSingleApplicationGuard::Private { friend class ::KDSingleApplicationGuard; friend class ::KDSingleApplicationGuard::Instance; friend struct ::ProcessInfo; KDSingleApplicationGuard * const q; public: Private( Policy policy, KDSingleApplicationGuard* qq ); ~Private(); void create( const QStringList& arguments ); bool checkOperational( const char * function, const char * act ) const; bool checkOperationalPrimary( const char * function, const char * act ) const; struct segmentheader { size_t size : 16; }; static void sharedmem_free( char* ); static char* sharedmem_malloc( size_t size ); private: void shutdownInstance(); void poll(); private: static KDSingleApplicationGuard* primaryInstance; private: QBasicTimer timer; QSharedMemory mem; int id; Policy policy; bool operational; bool exitRequested; }; /*! \internal */ KDSingleApplicationGuard::Instance::Instance( const QStringList & args, bool truncated, qint64 p ) : d( new Private( args, truncated, p ) ) { d->ref.ref(); (void)registerInstanceType(); } /*! Default constructor. Constructs in Instance that is \link isNull() null\endlink. \sa isNull() */ KDSingleApplicationGuard::Instance::Instance() : d( 0 ) {} /*! Copy constructor. */ KDSingleApplicationGuard::Instance::Instance( const Instance & other ) : d( other.d ) { if ( d ) d->ref.ref(); } /*! Destructor. */ KDSingleApplicationGuard::Instance::~Instance() { if ( d && !d->ref.deref() ) delete d; } /*! \fn KDSingleApplicationGuard::Instance::swap( Instance & other ) Swaps the contents of this and \a other. This function never throws exceptions. */ /*! \fn KDSingleApplicationGuard::Instance::operator=( Instance other ) Assigns the contents of \a other to this. This function is strongly exception-safe. */ /*! \fn std::swap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs ) \relates KDSingleApplicationGuard::Instance Specialisation of std::swap() for KDSingleApplicationGuard::Instance. Calls swap(). */ /*! \fn qSwap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs ) \relates KDSingleApplicationGuard::Instance Specialisation of qSwap() for KDSingleApplicationGuard::Instance. Calls swap(). */ /*! \fn KDSingleApplicationGuard::Instance::isNull() const Returns whether this instance is null. */ /*! Returns whether this instance is valid. A valid instance is neither null, nor does it have a negative PID. */ bool KDSingleApplicationGuard::Instance::isValid() const { return d && d->pid >= 0 ; } /*! Returns whether the #arguments are complete (\c false) or not (\c true), e.g. because they have been truncated due to limited storage space. \sa arguments() */ bool KDSingleApplicationGuard::Instance::areArgumentsTruncated() const { return d && d->truncated; } /*! Returns the arguments that this instance was started with. \sa areArgumentsTruncated() */ const QStringList & KDSingleApplicationGuard::Instance::arguments() const { if ( d ) return d->arguments; static const QStringList empty; return empty; } /*! Returns the process-id (PID) of this instance. */ qint64 KDSingleApplicationGuard::Instance::pid() const { if ( d ) return d->pid; else return -1; } /*! \class KDSingleApplicationGuard KDSingleApplicationGuard \ingroup core \brief A guard to protect an application from having several instances. KDSingleApplicationGuard can be used to make sure only one instance of an application is running at the same time. \note As KDSingleApplicationGuard currently uses QSharedMemory, Qt 4.4 or later is required. */ /*! \fn void KDSingleApplicationGuard::instanceStarted(const KDSingleApplicationGuard::Instance & instance) This signal is emitted by the primary instance whenever another instance \a instance started. */ /*! \fn void KDSingleApplicationGuard::instanceExited(const KDSingleApplicationGuard::Instance & instance) This signal is emitted by the primary instance whenever another instance \a instance exited. */ /*! \fn void KDSingleApplicationGuard::raiseRequested() This signal is emitted when the current running application is requested to raise its main window. */ /*! \fn void KDSingleApplicationGuard::exitRequested() This signal is emitted when the current running application has been asked to exit by calling kill on the instance. */ /*! \fn void KDSingleApplicationGuard::becamePrimaryInstance() This signal is emitted when the current running application becomes the new primary application. The old primary application has quit. */ /*! \fn void KDSingleApplicationGuard::becameSecondaryInstance() This signal is emmited when the primary instance became secondary instance. This happens when the instance doesn't update its status for some (default 10) seconds. Another instance got primary instance in that case. */ /*! \fn void KDSingleApplicationGuard::policyChanged( KDSingleApplicationGuard::Policy policy ) This signal is emitted when the #policy of the system changes. */ enum Command { NoCommand = 0x00, ExitedInstance = 0x01, NewInstance = 0x02, FreeInstance = 0x04, ShutDownCommand = 0x08, KillCommand = 0x10, BecomePrimaryCommand = 0x20, RaiseCommand = 0x40 }; static const quint16 PrematureEndOfOptions = -1; static const quint16 RegularEndOfOptions = -2; struct ProcessInfo { static const size_t MarkerSize = sizeof(quint16); explicit ProcessInfo( Command c = FreeInstance, const QStringList& arguments = QStringList(), qint64 p = -1 ) : pid( p ), command( c ), timestamp( 0 ), commandline( 0 ) { setArguments( arguments ); } void setArguments( const QStringList & arguments ); QStringList arguments( bool * prematureEnd ) const; qint64 pid; quint32 command; quint32 timestamp; char* commandline; }; static inline bool operator==( const ProcessInfo & lhs, const ProcessInfo & rhs ) { return lhs.command == rhs.command && ( lhs.commandline == rhs.commandline || ( lhs.commandline != 0 && rhs.commandline != 0 && ::strcmp( lhs.commandline, rhs.commandline ) == 0 ) ); } static inline bool operator!=( const ProcessInfo & lhs, const ProcessInfo & rhs ) { return !operator==( lhs, rhs ); } /*! This struct contains information about the managed process system. \internal */ struct InstanceRegister { explicit InstanceRegister( KDSingleApplicationGuard::Policy policy = KDSingleApplicationGuard::NoPolicy ) : policy( policy ), maxInstances( KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES ), version( 0 ) { std::fill_n( commandLines, KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE, 0 ); ::memcpy( magicCookie, "kdsingleapp", 12 ); } /*! Returns whether this register was properly initialized by the first instance. */ bool isValid() const { return ::strcmp( magicCookie, "kdsingleapp" ) == 0; } char magicCookie[ 12 ]; unsigned int policy : 8; quint32 maxInstances : 20; unsigned int version : 4; ProcessInfo info[ KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES ]; char commandLines[ KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE ]; Q_DISABLE_COPY( InstanceRegister ) }; void ProcessInfo::setArguments( const QStringList & arguments ) { if( commandline != 0 ) KDSingleApplicationGuard::Private::sharedmem_free( commandline ); commandline = 0; if( arguments.isEmpty() ) return; size_t totalsize = MarkerSize; for ( const QString& arg : arguments ) { const QByteArray utf8 = arg.toUtf8(); totalsize += utf8.size() + MarkerSize; } InstanceRegister* const reg = reinterpret_cast( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() ); this->commandline = KDSingleApplicationGuard::Private::sharedmem_malloc( totalsize ); if( this->commandline == 0 ) { qWarning("KDSingleApplicationguard: out of memory when trying to save arguments.\n"); return; } char* const commandline = this->commandline + reinterpret_cast(reg->commandLines); int argpos = 0; for ( const QString & arg : arguments ) { const QByteArray utf8 = arg.toUtf8(); const int required = MarkerSize + utf8.size() + MarkerSize ; const int available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos ; if ( required > available || utf8.size() > std::numeric_limits::max() ) { // write a premature-eoo marker, and quit memcpy( commandline + argpos, &PrematureEndOfOptions, MarkerSize ); argpos += MarkerSize; qWarning( "KDSingleApplicationGuard: argument list is too long (bytes required: %d, used: %d, available: %d", required, argpos - 2, available ); return; } else { const quint16 len16 = utf8.size(); // write the size of the data... memcpy( commandline + argpos, &len16, MarkerSize ); argpos += MarkerSize; // then the data memcpy( commandline + argpos, utf8.data(), len16 ); argpos += len16; } } const ssize_t available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos; assert( available >= static_cast( MarkerSize ) ); memcpy( commandline + argpos, &RegularEndOfOptions, MarkerSize ); argpos += MarkerSize; } QStringList ProcessInfo::arguments( bool * prematureEnd ) const { QStringList result; if( commandline == 0 ) { if( prematureEnd ) *prematureEnd = true; return result; } InstanceRegister* const reg = reinterpret_cast( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() ); const char* const commandline = this->commandline + reinterpret_cast(reg->commandLines); int argpos = 0; while ( true ) { const int available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos ; assert( available >= 2 ); quint16 marker; memcpy( &marker, commandline + argpos, MarkerSize ); argpos += MarkerSize; if ( marker == PrematureEndOfOptions ) { if ( prematureEnd ) *prematureEnd = true; break; } if ( marker == RegularEndOfOptions ) { if ( prematureEnd ) *prematureEnd = false; break; } const int requested = MarkerSize + marker + MarkerSize ; if ( requested > available ) { const long long int p = pid; qWarning( "KDSingleApplicationGuard: inconsistency detected when parsing command-line argument for process %lld", p ); if ( prematureEnd ) *prematureEnd = true; break; } result.push_back( QString::fromUtf8( commandline + argpos, marker ) ); argpos += marker; } return result; } KDSingleApplicationGuard::Private::~Private() { if( primaryInstance == q ) primaryInstance = 0; } bool KDSingleApplicationGuard::Private::checkOperational( const char * function, const char * act ) const { assert( function ); assert( act ); if ( !operational ) qWarning( "KDSingleApplicationGuard::%s: need to be operational to %s", function, act ); return operational; } bool KDSingleApplicationGuard::Private::checkOperationalPrimary( const char * function, const char * act ) const { if ( !checkOperational( function, act ) ) return false; if ( id != 0 ) qWarning( "KDSingleApplicationGuard::%s: need to be primary to %s", function, act ); return id == 0; } struct segmentheader { size_t size : 16; }; void KDSingleApplicationGuard::Private::sharedmem_free( char* pointer ) { InstanceRegister* const reg = reinterpret_cast( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() ); char* const heap = reg->commandLines; char* const heap_ptr = heap + reinterpret_cast(pointer) - sizeof( segmentheader ); const segmentheader* const header = reinterpret_cast< const segmentheader* >( heap_ptr ); const size_t size = header->size; char* end = heap + KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE; std::copy( heap_ptr + size, end, heap_ptr ); std::fill( end - size, end, 0 ); for( uint i = 0; i < reg->maxInstances; ++i ) { if( reg->info[ i ].commandline > pointer ) reg->info[ i ].commandline -= size + sizeof( segmentheader ); } } char* KDSingleApplicationGuard::Private::sharedmem_malloc( size_t size ) { InstanceRegister* const reg = reinterpret_cast( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() ); char* heap = reg->commandLines; while( heap + sizeof( segmentheader ) + size < reg->commandLines + KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE ) { segmentheader* const header = reinterpret_cast< segmentheader* >( heap ); if( header->size == 0 ) { header->size = size; return heap + sizeof( segmentheader ) - reinterpret_cast(reg->commandLines); } heap += sizeof( header ) + header->size; } return 0; } void KDSingleApplicationGuard::Private::shutdownInstance() { KDLockedSharedMemoryPointer< InstanceRegister > instances( &q->d->mem ); instances->info[ q->d->id ].command |= ExitedInstance; if( q->isPrimaryInstance() ) { // ohh... we need a new primary instance... for ( int i = 1, end = instances->maxInstances ; i < end ; ++i ) { if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance | ShutDownCommand | KillCommand ) ) == 0 ) { instances->info[ i ].command |= BecomePrimaryCommand; return; } } // none found? then my species is dead :-( } } KDSingleApplicationGuard* KDSingleApplicationGuard::Private::primaryInstance = 0; /*! Requests that the instance kills itself (by emitting exitRequested). If the instance has since exited, does nothing. \sa shutdown(), raise() */ void KDSingleApplicationGuard::Instance::kill() { KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem ); for ( int i = 0, end = instances->maxInstances ; i < end ; ++i ) { if( instances->info[ i ].pid != d->pid ) continue; if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 ) instances->info[ i ].command = KillCommand; } } /*! Requests that the instance shuts itself down (by calling QCoreApplication::quit()). If the instance has since exited, does nothing. \sa kill(), raise() */ void KDSingleApplicationGuard::Instance::shutdown() { KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem ); for ( int i = 0, end = instances->maxInstances ; i < end ; ++i ) { if( instances->info[ i ].pid != d->pid ) continue; if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 ) instances->info[ i ].command = ShutDownCommand; } } /*! Requests that the instance raises its main window. The effects are implementation-defined: the KDSingleApplicationGuard corresponding to the instance will emit its \link KDSingleApplicationGuard::raiseRequested() raiseRequested()\endlink signal. If the instance has since exited, does nothing. \sa kill(), shutdown() */ void KDSingleApplicationGuard::Instance::raise() { KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem ); for ( int i = 0, end = instances->maxInstances ; i < end ; ++i ) { if( instances->info[ i ].pid != d->pid ) continue; if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 ) instances->info[ i ].command = RaiseCommand; } } #ifndef Q_WS_WIN // static void KDSingleApplicationGuard::SIGINT_handler( int sig ) { if( sig == SIGINT && Private::primaryInstance != 0 ) Private::primaryInstance->d->shutdownInstance(); ::exit( 1 ); } #endif /*! \enum KDSingleApplicationGuard::Policy Defines the policy that a KDSingleApplicationGuard can enforce: */ /*! \var KDSingleApplicationGuard::NoPolicy instanceStarted() is emitted, and the new instance allowed to continue. */ /*! \var KDSingleApplicationGuard::AutoKillOtherInstances instanceStarted() is emitted, and the new instance is killed (Instance::kill()). */ /*! Creates a new KDSingleApplicationGuard with arguments QCoreApplication::arguments() and policy AutoKillOtherInstances, passing \a parent to the base class constructor, as usual. */ KDSingleApplicationGuard::KDSingleApplicationGuard( QObject * parent ) : QObject( parent ), d( new Private( AutoKillOtherInstances, this ) ) { d->create( QCoreApplication::arguments() ); } /*! Creates a new KDSingleApplicationGuard with arguments QCoreApplication::arguments() and policy \a policy, passing \a parent to the base class constructor, as usual. */ KDSingleApplicationGuard::KDSingleApplicationGuard( Policy policy, QObject * parent ) : QObject( parent ), d( new Private( policy, this ) ) { d->create( QCoreApplication::arguments() ); } /*! Creates a new KDSingleApplicationGuard with arguments \a arguments and policy AutoKillOtherInstances, passing \a parent to the base class constructor, as usual. */ KDSingleApplicationGuard::KDSingleApplicationGuard( const QStringList & arguments, QObject * parent ) : QObject( parent ), d( new Private( AutoKillOtherInstances, this ) ) { d->create( arguments ); } /*! Creates a new KDSingleApplicationGuard with arguments \a arguments and policy \a policy, passing \a parent to the base class constructor, as usual. */ KDSingleApplicationGuard::KDSingleApplicationGuard( const QStringList & arguments, Policy policy, QObject * parent ) : QObject( parent ), d( new Private( policy, this ) ) { d->create( arguments ); } KDSingleApplicationGuard::Private::Private( Policy policy_, KDSingleApplicationGuard * qq ) : q( qq ), id( -1 ), policy( policy_ ), operational( false ), exitRequested( false ) { } void KDSingleApplicationGuard::Private::create( const QStringList & arguments ) { if ( !QCoreApplication::instance() ) { qWarning( "KDSingleApplicationGuard: you need to construct a Q(Core)Application before you can construct a KDSingleApplicationGuard" ); return; } const QString name = QCoreApplication::applicationName(); if ( name.isEmpty() ) { qWarning( "KDSingleApplicationGuard: QCoreApplication::applicationName must not be empty" ); return; } (void)registerInstanceType(); if ( primaryInstance == 0 ) primaryInstance = q; mem.setKey( name ); // if another instance crashed, the shared memory segment is still there on Unix // the following lines trigger deletion in that case #ifndef Q_WS_WIN mem.attach(); mem.detach(); #endif const bool created = mem.create( sizeof( InstanceRegister ) ); if( !created ) { QString errorMsg; if( mem.error() != QSharedMemory::NoError && mem.error() != QSharedMemory::AlreadyExists ) errorMsg += QString::fromLatin1( "QSharedMemomry::create() failed: %1" ).arg( mem.errorString() ); if( !mem.attach() ) { if( mem.error() != QSharedMemory::NoError ) errorMsg += QString::fromLatin1( "QSharedMemomry::attach() failed: %1" ).arg( mem.errorString() ); qWarning( "KDSingleApplicationGuard: Could neither create nor attach to shared memory segment." ); qWarning( "%s\n", errorMsg.toLocal8Bit().constData() ); return; } const int maxWaitMSecs = 1000 * 60; // stop waiting after 60 seconds QTime waitTimer; waitTimer.start(); // lets wait till the other instance initialized the register bool initialized = false; while( !initialized && waitTimer.elapsed() < maxWaitMSecs ) { const KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem ); initialized = instances->isValid(); #ifdef Q_WS_WIN ::Sleep(20); #else usleep(20000); #endif } const KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem ); if ( instances->version != 0 ) { qWarning( "KDSingleApplicationGuard: Detected version mismatch. " "Highest supported version: %ud, actual version: %ud", KDSINGLEAPPLICATIONGUARD_SHM_VERSION, instances->version ); return; } } KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem ); if( !created ) { assert( instances->isValid() ); // we're _not_ the first instance // but the bool killOurSelf = false; // find a new slot... id = std::find( instances->info, instances->info + instances->maxInstances, ProcessInfo() ) - instances->info; ProcessInfo& info = instances->info[ id ]; info = ProcessInfo( NewInstance, arguments, QCoreApplication::applicationPid() ); killOurSelf = instances->policy == AutoKillOtherInstances; policy = static_cast( instances->policy ); // but the signal that we tried to start was sent to the primary application if( killOurSelf ) exitRequested = true; } else { // ok.... we are the first instance new ( instances.get() ) InstanceRegister( policy ); // create a new list (in shared memory) id = 0; // our id = 0 // and we've no command instances->info[ 0 ] = ProcessInfo( NoCommand, arguments, QCoreApplication::applicationPid() ); } #ifndef Q_WS_WIN ::signal( SIGINT, SIGINT_handler ); #endif // now listen for commands timer.start( 750, q ); operational = true; } /*! Destroys this SingleApplicationGuard. If this instance has been the primary instance and no other instance is existing anymore, the application is shut down completely. Otherwise the destructor selects another instance to be the primary instances. */ KDSingleApplicationGuard::~KDSingleApplicationGuard() { if( d->id == -1 ) return; d->shutdownInstance(); } /*! \property KDSingleApplicationGuard::operational Contains whether this KDSingleApplicationGuard is operational. A non-operational KDSingleApplicationGuard cannot be used in any meaningful way. Reasons for a KDSingleApplicationGuard being non-operational include: \li it was constructed before QApplication (or at least QCoreApplication) was constructed \li it failed to create or attach to the shared memory segment that is used for communication Get this property's value using %isOperational(). */ bool KDSingleApplicationGuard::isOperational() const { return d->operational; } /*! \property KDSingleApplicationGuard::exitRequested Contains wheter this istance has been requested to exit. This will happen when this instance was just started, but the policy is AutoKillOtherInstances or by explicitely calling kill on this instance(). Get this property's value using %isExitRequested(). */ bool KDSingleApplicationGuard::isExitRequested() const { return d->exitRequested; }; /*! \property KDSingleApplicationGuard::primaryInstance Contains whether this instance is the primary instance. The primary instance is the first instance which was started or else the instance which got selected by KDSingleApplicationGuard's destructor, when the primary instance was shut down. Get this property's value using %isPrimaryInstance(), and monitor changes to it using becamePrimaryInstance(). */ bool KDSingleApplicationGuard::isPrimaryInstance() const { return d->id == 0; } /*! \property KDSingleApplicationGuard::policy Specifies the policy KDSingleApplicationGuard is using when new instances are started. This can only be set in the primary instance. Get this property's value using %policy(), set it using %setPolicy(), and monitor changes to it using policyChanged(). */ KDSingleApplicationGuard::Policy KDSingleApplicationGuard::policy() const { return d->policy; } void KDSingleApplicationGuard::setPolicy( Policy policy ) { if ( !d->checkOperationalPrimary( "setPolicy", "change the policy" ) ) return; if( d->policy == policy ) return; d->policy = policy; emit policyChanged( policy ); KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem ); instances->policy = policy; } /*! Returns a list of all currently running instances. */ QVector KDSingleApplicationGuard::instances() const { if ( !d->checkOperational( "instances", "report on other instances" ) ) return QVector(); if ( Private::primaryInstance == 0 ) { Private::primaryInstance = const_cast( this ); } QVector result; const KDLockedSharedMemoryPointer< InstanceRegister > instances( const_cast< QSharedMemory* >( &d->mem ) ); for ( int i = 0, end = instances->maxInstances ; i < end ; ++i ) { const ProcessInfo& info = instances->info[ i ]; if( ( info.command & ( FreeInstance | ExitedInstance ) ) == 0 ) { bool truncated; const QStringList arguments = info.arguments( &truncated ); result.push_back( Instance( arguments, truncated, info.pid ) ); } } return result; } /*! Shuts down all other instances. This can only be called from the the primary instance. Shut down is done gracefully via QCoreApplication::quit(). */ void KDSingleApplicationGuard::shutdownOtherInstances() { if ( !d->checkOperationalPrimary( "shutdownOtherInstances", "shut other instances down" ) ) return; KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem ); for ( int i = 1, end = instances->maxInstances ; i < end ; ++i ) { if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 ) instances->info[ i ].command = ShutDownCommand; } } /*! Kills all other instances. This can only be called from the the primary instance. Killing is done via emitting exitRequested. It's up to the receiving instance to react properly. */ void KDSingleApplicationGuard::killOtherInstances() { if ( !d->checkOperationalPrimary( "killOtherInstances", "kill other instances" ) ) return; KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem ); for ( int i = 1, end = instances->maxInstances ; i < end ; ++i ) { if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 ) instances->info[ i ].command = KillCommand; } } bool KDSingleApplicationGuard::event( QEvent * event ) { if ( event->type() == QEvent::Timer ) { const QTimerEvent * const te = static_cast( event ); if ( te->timerId() == d->timer.timerId() ) { d->poll(); return true; } } return QObject::event( event ); } void KDSingleApplicationGuard::Private::poll() { const quint32 now = QDateTime::currentDateTime().toTime_t(); if ( primaryInstance == 0 ) { primaryInstance = q; } if ( q->isPrimaryInstance() ) { // only the primary instance will get notified about new instances QVector< Instance > exitedInstances; QVector< Instance > startedInstances; { KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem ); if( instances->info[ id ].pid != QCoreApplication::applicationPid() ) { for ( int i = 1, end = instances->maxInstances ; i < end && id == 0 ; ++i ) { if( instances->info[ i ].pid == QCoreApplication::applicationPid() ) id = i; } emit q->becameSecondaryInstance(); return; } instances->info[ id ].timestamp = now; for ( int i = 1, end = instances->maxInstances ; i < end ; ++i ) { ProcessInfo& info = instances->info[ i ]; if( info.command & NewInstance ) { bool truncated; const QStringList arguments = info.arguments( &truncated ); startedInstances.push_back( Instance( arguments, truncated, info.pid ) ); info.command &= ~NewInstance; // clear NewInstance flag } if( info.command & ExitedInstance ) { bool truncated; const QStringList arguments = info.arguments( &truncated ); exitedInstances.push_back( Instance( arguments, truncated, info.pid ) ); info.command = FreeInstance; // set FreeInstance flag } } } // one signal for every new instance - _after_ the memory segment was unlocked again for( QVector< Instance >::const_iterator it = startedInstances.constBegin(); it != startedInstances.constEnd(); ++it ) emit q->instanceStarted( *it ); for( QVector< Instance >::const_iterator it = exitedInstances.constBegin(); it != exitedInstances.constEnd(); ++it ) emit q->instanceExited( *it ); } else { // do we have a command? bool killOurSelf = false; bool shutDownOurSelf = false; bool policyDidChange = false; { KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem ); const Policy oldPolicy = policy; policy = static_cast( instances->policy ); policyDidChange = policy != oldPolicy; // check for the primary instance health status if( now - instances->info[ 0 ].timestamp > KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS ) { std::swap( instances->info[ 0 ], instances->info[ id ] ); id = 0; instances->info[ id ].timestamp = now; emit q->becamePrimaryInstance(); instances->info[ id ].command &= ~BecomePrimaryCommand; // afterwards, reset the flag } if( instances->info[ id ].command & BecomePrimaryCommand ) { // we became primary! instances->info[ 0 ] = instances->info[ id ]; instances->info[ id ] = ProcessInfo(); // change our id to 0 and declare the old slot as free id = 0; instances->info[ id ].timestamp = now; emit q->becamePrimaryInstance(); } if( instances->info[ id ].command & RaiseCommand ) { // raise ourself! emit q->raiseRequested(); instances->info[ id ].command &= ~RaiseCommand; // afterwards, reset the flag } killOurSelf = instances->info[ id ].command & KillCommand; // check for kill command shutDownOurSelf = instances->info[ id ].command & ShutDownCommand; // check for shut down command instances->info[ id ].command &= ~( KillCommand | ShutDownCommand | BecomePrimaryCommand ); // reset both flags if( killOurSelf ) { instances->info[ id ].command |= ExitedInstance; // upon kill, we have to set the ExitedInstance flag id = -1; // becauso our d'tor won't be called anymore } } if( killOurSelf ) // kill our self takes precedence { exitRequested = true; emit q->exitRequested(); } else if( shutDownOurSelf ) qApp->quit(); else if( policyDidChange ) emit q->policyChanged( policy ); } } #include "moc_kdsingleapplicationguard.cpp" #ifdef KDTOOLSCORE_UNITTESTS #include #include "kdautopointer.h" #include #include #include #include static void wait( int msec, QSignalSpy * spy=0, int expectedCount=INT_MAX ) { QTime t; t.start(); while ( ( !spy || spy->count() < expectedCount ) && t.elapsed() < msec ) { qApp->processEvents( QEventLoop::WaitForMoreEvents, qMax( 10, msec - t.elapsed() ) ); } } static std::ostream& operator<<( std::ostream& stream, const QStringList& list ) { stream << "QStringList("; for( QStringList::const_iterator it = list.begin(); it != list.end(); ++it ) { stream << " " << it->toLocal8Bit().data(); if( it + 1 != list.end() ) stream << ","; } stream << " )"; return stream; } namespace { class ApplicationNameSaver { Q_DISABLE_COPY( ApplicationNameSaver ) const QString oldname; public: explicit ApplicationNameSaver( const QString & name ) : oldname( QCoreApplication::applicationName() ) { QCoreApplication::setApplicationName( name ); } ~ApplicationNameSaver() { QCoreApplication::setApplicationName( oldname ); } }; } KDAB_UNITTEST_SIMPLE( KDSingleApplicationGuard, "kdcoretools" ) { // set it to an unique name const ApplicationNameSaver saver( QUuid::createUuid().toString() ); KDAutoPointer guard3; KDAutoPointer spy3; KDAutoPointer spy4; { KDSingleApplicationGuard guard1; assertEqual( guard1.policy(), KDSingleApplicationGuard::AutoKillOtherInstances ); assertEqual( guard1.instances().count(), 1 ); assertTrue( guard1.isPrimaryInstance() ); guard1.setPolicy( KDSingleApplicationGuard::NoPolicy ); assertEqual( guard1.policy(), KDSingleApplicationGuard::NoPolicy ); QSignalSpy spy1( &guard1, SIGNAL(instanceStarted(KDSingleApplicationGuard::Instance)) ); KDSingleApplicationGuard guard2; assertEqual( guard1.instances().count(), 2 ); assertEqual( guard2.instances().count(), 2 ); assertEqual( guard2.policy(), KDSingleApplicationGuard::NoPolicy ); assertFalse( guard2.isPrimaryInstance() ); wait( 1000, &spy1, 1 ); assertEqual( spy1.count(), 1 ); guard3.reset( new KDSingleApplicationGuard ); spy3.reset( new QSignalSpy( guard3.get(), SIGNAL(becamePrimaryInstance()) ) ); spy4.reset( new QSignalSpy( guard3.get(), SIGNAL(instanceExited(KDSingleApplicationGuard::Instance) ) ) ); assertFalse( guard3->isPrimaryInstance() ); } wait( 1000, spy3.get(), 1 ); wait( 1000, spy4.get(), 1 ); assertEqual( spy3->count(), 1 ); assertEqual( guard3->instances().count(), 1 ); assertTrue( guard3->isPrimaryInstance() ); guard3.reset( new KDSingleApplicationGuard ); assertEqual( guard3->instances().first().arguments(), qApp->arguments() ); QSignalSpy spyStarted( guard3.get(), SIGNAL(instanceStarted(KDSingleApplicationGuard::Instance)) ); QSignalSpy spyExited( guard3.get(), SIGNAL(instanceExited(KDSingleApplicationGuard::Instance)) ); { KDSingleApplicationGuard guard1; KDSingleApplicationGuard guard2; wait( 1000, &spyStarted, 2 ); assertEqual( spyStarted.count(), 2 ); } wait( 1000, &spyExited, 2 ); assertEqual( spyExited.count(), 2 ); spyStarted.clear(); spyExited.clear(); { // check arguments-too-long handling: QStringList args; for ( unsigned int i = 0, end = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE/16 ; i != end ; ++i ) args.push_back( QLatin1String( "0123456789ABCDEF" ) ); KDSingleApplicationGuard guard3( args ); wait( 1000, &spyStarted, 1 ); const QVector instances = guard3.instances(); assertEqual( instances.size(), 2 ); assertTrue( instances[1].areArgumentsTruncated() ); } } #endif // KDTOOLSCORE_UNITTESTS #endif // QT_NO_SHAREDMEMORY #endif // QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN) calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.h000066400000000000000000000066261322271446000312360ustar00rootroot00000000000000#ifndef __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__ #define __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__ #include #ifndef QT_NO_SHAREDMEMORY #include #include #include "pimpl_ptr.h" #include "DllMacro.h" #include template class QVector; class QCoreApplication; class DLLEXPORT KDSingleApplicationGuard : public QObject { Q_OBJECT Q_ENUMS( Policy ) Q_PROPERTY( bool operational READ isOperational ) Q_PROPERTY( bool exitRequested READ isExitRequested ) Q_PROPERTY( bool primaryInstance READ isPrimaryInstance NOTIFY becamePrimaryInstance ) Q_PROPERTY( Policy policy READ policy WRITE setPolicy NOTIFY policyChanged ) public: enum Policy { NoPolicy = 0, AutoKillOtherInstances = 1 }; explicit KDSingleApplicationGuard( QObject * parent=0 ); explicit KDSingleApplicationGuard( Policy policy, QObject * parent=0 ); explicit KDSingleApplicationGuard( const QStringList & arguments, QObject * parent=0 ); explicit KDSingleApplicationGuard( const QStringList & arguments, Policy policy, QObject * parent=0 ); ~KDSingleApplicationGuard(); bool isOperational() const; bool isExitRequested() const; bool isPrimaryInstance() const; Policy policy() const; void setPolicy( Policy policy ); class Instance; QVector instances() const; Q_SIGNALS: void instanceStarted( const KDSingleApplicationGuard::Instance & instance ); void instanceExited( const KDSingleApplicationGuard::Instance & instance ); void exitRequested(); void raiseRequested(); void becamePrimaryInstance(); void becameSecondaryInstance(); void policyChanged( KDSingleApplicationGuard::Policy policy ); public Q_SLOTS: void shutdownOtherInstances(); void killOtherInstances(); protected: /*! \reimp */ bool event( QEvent * event ); private: #ifndef Q_WS_WIN static void SIGINT_handler( int ); #endif private: friend struct ProcessInfo; class Private; kdtools::pimpl_ptr< Private > d; }; class DLLEXPORT KDSingleApplicationGuard::Instance { friend class ::KDSingleApplicationGuard; friend class ::KDSingleApplicationGuard::Private; Instance( const QStringList &, bool, qint64 ); public: Instance(); Instance( const Instance & other ); ~Instance(); void swap( Instance & other ) { std::swap( d, other.d ); } Instance & operator=( Instance other ) { swap( other ); return *this; } bool isNull() const { return !d; } bool isValid() const; bool areArgumentsTruncated() const; const QStringList & arguments() const; qint64 pid() const; void shutdown(); void kill(); void raise(); private: class Private; Private * d; }; namespace std { template <> inline void swap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs ) { lhs.swap( rhs ); } } // namespace std QT_BEGIN_NAMESPACE template <> inline void qSwap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs ) { lhs.swap( rhs ); } Q_DECLARE_METATYPE( KDSingleApplicationGuard::Instance ) Q_DECLARE_TYPEINFO( KDSingleApplicationGuard::Instance, Q_MOVABLE_TYPE ); QT_END_NAMESPACE #endif // QT_NO_SHAREDMEMORY #endif /* __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__ */ calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.cpp000066400000000000000000000026451322271446000273570ustar00rootroot00000000000000#include "kdtoolsglobal.h" #include #include namespace { struct Version { unsigned char v[3]; }; static inline bool operator<( const Version & lhs, const Version & rhs ) { return std::lexicographical_compare( lhs.v, lhs.v + 3, rhs.v, rhs.v + 3 ); } static inline bool operator==( const Version & lhs, const Version & rhs ) { return std::equal( lhs.v, lhs.v + 3, rhs.v ); } KDTOOLS_MAKE_RELATION_OPERATORS( Version, static inline ) } static Version kdParseQtVersion( const char * const version ) { if ( !version || qstrlen( version ) < 5 || version[1] != '.' || version[3] != '.' || ( version[5] != 0 && version[5] != '.' && version[5] != '-' ) ) return Version(); // parse error const Version result = { { static_cast< unsigned char >( version[0] - '0' ), static_cast< unsigned char >( version[2] - '0' ), static_cast< unsigned char >( version[4] - '0' ) } }; return result; } bool _kdCheckQtVersion_impl( int major, int minor, int patchlevel ) { static const Version actual = kdParseQtVersion( qVersion() ); // do this only once each run... const Version requested = { { static_cast< unsigned char >( major ), static_cast< unsigned char >( minor ), static_cast< unsigned char >( patchlevel ) } }; return actual >= requested; } calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.h000066400000000000000000000116131322271446000270170ustar00rootroot00000000000000#ifndef __KDTOOLS_KDTOOLSGLOBAL_H__ #define __KDTOOLS_KDTOOLSGLOBAL_H__ #include #define KDAB_DISABLE_COPY( x ) private: x( const x & ); x & operator=( const x & ) #ifdef KDTOOLS_SHARED # ifdef BUILD_SHARED_KDTOOLSCORE # define KDTOOLSCORE_EXPORT Q_DECL_EXPORT # else # define KDTOOLSCORE_EXPORT Q_DECL_IMPORT # endif # ifdef BUILD_SHARED_KDTOOLSGUI # define KDTOOLSGUI_EXPORT Q_DECL_EXPORT # else # define KDTOOLSGUI_EXPORT Q_DECL_IMPORT # endif # ifdef BUILD_SHARED_KDTOOLSXML # define KDTOOLSXML_EXPORT Q_DECL_EXPORT # else # define KDTOOLSXML_EXPORT Q_DECL_IMPORT # endif # ifdef BUILD_SHARED_KDUPDATER # define KDTOOLS_UPDATER_EXPORT Q_DECL_EXPORT # else # define KDTOOLS_UPDATER_EXPORT Q_DECL_IMPORT # endif #else // KDTOOLS_SHARED # define KDTOOLSCORE_EXPORT # define KDTOOLSGUI_EXPORT # define KDTOOLSXML_EXPORT # define KDTOOLS_UPDATER_EXPORT #endif // KDTOOLS_SHARED #define MAKEINCLUDES_EXPORT #define DOXYGEN_PROPERTY( x ) #ifdef DOXYGEN_RUN # define KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( func ) operator unspecified_bool_type() const { return func; } # define KDAB_USING_SAFE_BOOL_OPERATOR( Class ) operator unspecified_bool_type() const; #else # define KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( func ) \ private: \ struct __safe_bool_dummy__ { void nonnull() {} }; \ public: \ typedef void ( __safe_bool_dummy__::*unspecified_bool_type )(); \ operator unspecified_bool_type() const { \ return ( func ) ? &__safe_bool_dummy__::nonnull : 0 ; \ } #define KDAB_USING_SAFE_BOOL_OPERATOR( Class ) \ using Class::operator Class::unspecified_bool_type; #endif #define KDTOOLS_MAKE_RELATION_OPERATORS( Class, linkage ) \ linkage bool operator>( const Class & lhs, const Class & rhs ) { \ return operator<( rhs, lhs ); \ } \ linkage bool operator!=( const Class & lhs, const Class & rhs ) { \ return !operator==( lhs, rhs ); \ } \ linkage bool operator<=( const Class & lhs, const Class & rhs ) { \ return !operator>( lhs, rhs ); \ } \ linkage bool operator>=( const Class & lhs, const Class & rhs ) { \ return !operator<( lhs, rhs ); \ } template inline T & __kdtools__dereference_for_methodcall( T & o ) { return o; } template inline T & __kdtools__dereference_for_methodcall( T * o ) { return *o; } #define KDAB_SET_OBJECT_NAME( x ) __kdtools__dereference_for_methodcall( x ).setObjectName( QLatin1String( #x ) ) KDTOOLSCORE_EXPORT bool _kdCheckQtVersion_impl( int major, int minor=0, int patchlevel=0 ); static inline bool kdCheckQtVersion( unsigned int major, unsigned int minor=0, unsigned int patchlevel=0 ) { return (major<<16|minor<<8|patchlevel) <= static_cast(QT_VERSION) || _kdCheckQtVersion_impl( major, minor, patchlevel ); } #define KDTOOLS_DECLARE_PRIVATE_BASE( Class ) \ protected: \ class Private; \ Private * d_func() { return _d; } \ const Private * d_func() const { return _d; } \ Class( Private * _d_, bool b ) : _d( _d_ ) { init(b); } \ private: \ void init(bool); \ private: \ Private * _d #define KDTOOLS_DECLARE_PRIVATE_DERIVED( Class, Base ) \ protected: \ class Private; \ Private * d_func() { \ return reinterpret_cast( Base::d_func() ); \ } \ const Private * d_func() const { \ return reinterpret_cast( Base::d_func() ); \ } \ Class( Private * _d_, bool b ) \ : Base( reinterpret_cast(_d_), b ) { init(b); } \ private: \ void init(bool) #endif /* __KDTOOLS_KDTOOLSGLOBAL_H__ */ calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.cpp000066400000000000000000000101771322271446000265240ustar00rootroot00000000000000#include "pimpl_ptr.h" /*! \class pimpl_ptr: \ingroup core smartptr \brief Owning pointer for private implementations \since_c 2.1 (The exception safety of this class has not been evaluated yet.) pimpl_ptr is a smart immutable pointer, which owns the contained object. Unlike other smart pointers, it creates a standard constructed object when instanciated via the \link pimpl_ptr() standard constructor\endlink. Additionally, pimpl_ptr respects constness of the pointer object and returns \c const \c T* for a const pimpl_ptr object. The content of a pimpl_ptr cannot be changed during it's lifetime. \section general-use General Use The general use case of pimpl_ptr is the "Pimpl Idiom", i.e. hiding the private implementation of a class from the user's compiler which see \c MyClass as \code class MyClass { public: MyClass(); ~MyClass(); // public class API int value() const; private: class Private; // defined later kdtools::pimpl_ptr< Private > d; }; \endcode but not the private parts of it. These can only be seen (and accessed) by the code knowing \c MyClass::Private: \code class MyClass::Private { public: int value; }; MyClass::MyClass() { // d was automatically filled with new Private d->value = 42; } MyClass::~MyClass() { // the content of d gets deleted automatically } int MyClass::value() const { // access the private part: // since MyClass::value() is const, the returned pointee is const, too return d->value; } \endcode */ /*! \fn pimpl_ptr::pimpl_ptr() Default constructor. Constructs a pimpl_tr that contains (owns) a standard constructed instance of \c T. \post \c *this owns a new object. */ /*! \fn pimpl_ptr::pimpl_ptr( T * t ) Constructor. Constructs a pimpl_ptr that contains (owns) \a t. \post get() == obj */ /*! \fn pimpl_ptr::~pimpl_ptr() Destructor. \post The object previously owned by \c *this has been deleted. */ /*! \fn const T * pimpl_ptr::get() const \returns a const pointer to the contained (owned) object. \overload */ /*! \fn T * pimpl_ptr::get() \returns a pointer to the contained (owned) object. */ /*! \fn const T & pimpl_ptr::operator*() const Dereference operator. Returns \link get() *get()\endlink. \overload */ /*! \fn T & pimpl_ptr::operator*() Dereference operator. Returns \link get() *get()\endlink. */ /*! \fn const T * pimpl_ptr::operator->() const Member-by-pointer operator. Returns get(). \overload */ /*! \fn T * pimpl_ptr::operator->() Member-by-pointer operator. Returns get(). */ #ifdef KDTOOLSCORE_UNITTESTS #include #include #include namespace { struct ConstTester { bool isConst() { return false; } bool isConst() const { return true; } }; } KDAB_UNITTEST_SIMPLE( pimpl_ptr, "kdcoretools" ) { { kdtools::pimpl_ptr< QObject > p; assertNotNull( p.get() ); assertNull( p->parent() ); } { QPointer< QObject > o; { kdtools::pimpl_ptr< QObject > qobject( new QObject ); o = qobject.get(); assertEqual( o, qobject.operator->() ); assertEqual( o, &(qobject.operator*()) ); } assertNull( o ); } { const kdtools::pimpl_ptr< QObject > qobject( new QObject ); const QObject* o = qobject.get(); assertEqual( o, qobject.operator->() ); assertEqual( o, &(qobject.operator*()) ); } { kdtools::pimpl_ptr< QObject > o1; assertTrue( o1 ); kdtools::pimpl_ptr< QObject > o2( 0 ); assertFalse( o2 ); } { const kdtools::pimpl_ptr< ConstTester > o1; kdtools::pimpl_ptr< ConstTester > o2; assertTrue( o1->isConst() ); assertFalse( o2->isConst() ); assertTrue( (*o1).isConst() ); assertFalse( (*o2).isConst() ); assertTrue( o1.get()->isConst() ); assertFalse( o2.get()->isConst() ); } } #endif // KDTOOLSCORE_UNITTESTS calamares-3.1.12/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.h000066400000000000000000000022731322271446000261670ustar00rootroot00000000000000#ifndef __KDTOOLSCORE__PIMPL_PTR_H__ #define __KDTOOLSCORE__PIMPL_PTR_H__ #include "kdtoolsglobal.h" #ifndef DOXYGEN_RUN namespace kdtools { #endif template class pimpl_ptr { KDAB_DISABLE_COPY( pimpl_ptr ); T * d; public: pimpl_ptr() : d( new T ) {} explicit pimpl_ptr( T * t ) : d( t ) {} ~pimpl_ptr() { delete d; d = 0; } T * get() { return d; } const T * get() const { return d; } T * operator->() { return get(); } const T * operator->() const { return get(); } T & operator*() { return *get(); } const T & operator*() const { return *get(); } KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( get() ) }; // these are not implemented, so's we can catch their use at // link-time. Leaving them undeclared would open up a comparison // via operator unspecified-bool-type(). template void operator==( const pimpl_ptr &, const pimpl_ptr & ); template void operator!=( const pimpl_ptr &, const pimpl_ptr & ); #ifndef DOXYGEN_RUN } // namespace kdtools #endif #endif /* __KDTOOLSCORE__PIMPL_PTR_H__ */ calamares-3.1.12/src/libcalamares/utils/000077500000000000000000000000001322271446000200755ustar00rootroot00000000000000calamares-3.1.12/src/libcalamares/utils/CalamaresUtils.cpp000066400000000000000000000223441322271446000235170ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2013-2016, Teo Mrnjavac * * Originally from Tomahawk, portions: * Copyright 2010-2011, Christian Muehlhaeuser * Copyright 2010-2011, Leo Franchi * Copyright 2010-2012, Jeff Mitchell * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CalamaresUtils.h" #include "CalamaresConfig.h" #include #include #include #include #include #include // stdc++ #include using namespace std; namespace CalamaresUtils { static QDir s_appDataDir( CMAKE_INSTALL_FULL_DATADIR ); static QDir s_qmlModulesDir( QString( CMAKE_INSTALL_FULL_DATADIR ) + "/qml" ); static bool s_isAppDataDirOverridden = false; static QTranslator* s_brandingTranslator = nullptr; static QTranslator* s_translator = nullptr; static QString s_translatorLocaleName; static bool isWritableDir( const QDir& dir ) { // We log with cerr here because we might be looking for the log dir QString path = dir.absolutePath(); if ( !dir.exists() ) { if ( !dir.mkpath( "." ) ) { cerr << "warning: failed to create " << qPrintable( path ) << endl; return false; } return true; } QFileInfo info( path ); if ( !info.isDir() ) { cerr << "warning: " << qPrintable( path ) << " is not a dir\n"; return false; } if ( !info.isWritable() ) { cerr << "warning: " << qPrintable( path ) << " is not writable\n"; return false; } return true; } QDir qmlModulesDir() { return s_qmlModulesDir; } void setAppDataDir( const QDir& dir ) { s_appDataDir = dir; s_isAppDataDirOverridden = true; } bool isAppDataDirOverridden() { return s_isAppDataDirOverridden; } QDir appDataDir() { return s_appDataDir; } QDir systemLibDir() { QDir path( CMAKE_INSTALL_FULL_LIBDIR ); return path; } QDir appLogDir() { QString path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation ); QDir dir( path ); if ( isWritableDir( dir ) ) return dir; cerr << "warning: Could not find a standard writable location for log dir, falling back to $HOME\n"; dir = QDir::home(); if ( isWritableDir( dir ) ) return dir; cerr << "warning: Found no writable location for log dir, falling back to the temp dir\n"; return QDir::temp(); } void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent ) { QString localeName = locale.name(); localeName.replace( "-", "_" ); if ( localeName == "C" ) localeName = "en"; QTranslator* translator = nullptr; // Branding translations if ( !brandingTranslationsPrefix.isEmpty() ) { QString brandingTranslationsDirPath( brandingTranslationsPrefix ); brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) ); QDir brandingTranslationsDir( brandingTranslationsDirPath ); if ( brandingTranslationsDir.exists() ) { QString filenameBase( brandingTranslationsPrefix ); filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) + 1 ); translator = new QTranslator( parent ); if ( translator->load( locale, filenameBase, "_", brandingTranslationsDir.absolutePath() ) ) { qDebug() << "Translation: Branding component: Using system locale:" << localeName; } else { qDebug() << "Translation: Branding component: Using default locale, system locale one not found:" << localeName; translator->load( brandingTranslationsPrefix + "en" ); } if ( s_brandingTranslator ) { QCoreApplication::removeTranslator( s_brandingTranslator ); delete s_brandingTranslator; } QCoreApplication::installTranslator( translator ); s_brandingTranslator = translator; } } // Calamares translations translator = new QTranslator( parent ); if ( translator->load( QString( ":/lang/calamares_" ) + localeName ) ) { qDebug() << "Translation: Calamares: Using system locale:" << localeName; } else { qDebug() << "Translation: Calamares: Using default locale, system locale one not found:" << localeName; translator->load( QString( ":/lang/calamares_en" ) ); } if ( s_translator ) { QCoreApplication::removeTranslator( s_translator ); delete s_translator; } QCoreApplication::installTranslator( translator ); s_translator = translator; s_translatorLocaleName = localeName; } QString translatorLocaleName() { return s_translatorLocaleName; } void setQmlModulesDir( const QDir& dir ) { s_qmlModulesDir = dir; } QString removeDiacritics( const QString& string ) { const QString diacriticLetters = QString::fromUtf8( "ŠŒŽšœžŸ¥µÀ" "ÁÂÃÄÅÆÇÈÉÊ" "ËÌÍÎÏÐÑÒÓÔ" "ÕÖØÙÚÛÜÝßà" "áâãäåæçèéê" "ëìíîïðñòóô" "õöøùúûüýÿÞ" "þČčĆćĐ𩹮" "žŞşĞğİıȚțȘ" "șĂăŐőŰűŘřĀ" "āĒēĪīŌōŪūŢ" "ţẀẁẂẃŴŵŶŷĎ" "ďĚěŇňŤťŮůŔ" "ॹĘꣳŃńŚ" "śŹźŻż" ); const QStringList noDiacriticLetters = { "S", "OE", "Z", "s", "oe", "z", "Y", "Y", "u", "A", "A", "A", "A", "A", "AA", "AE", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "E", "OE", "U", "U", "U", "E", "Y", "s", "a", "a", "a", "a", "e", "aa", "ae", "c", "e", "e", "e", "e", "i", "i", "i", "i", "d", "n", "o", "o", "o", "o", "e", "oe", "u", "u", "u", "e", "y", "y", "TH", "th", "C", "c", "C", "c", "DJ", "dj", "S", "s", "Z", "z", "S", "s", "G", "g", "I", "i", "T", "t", "S", "s", "A", "a", "O", "o", "U", "u", "R", "r", "A", "a", "E", "e", "I", "i", "O", "o", "U", "u", "T", "t", "W", "w", "W", "w", "W", "w", "Y", "y", "D", "d", "E", "e", "N", "n", "T", "t", "U", "u", "R", "r", "A", "a", "E", "e", "L", "l", "N", "n", "S", "s", "Z", "z", "Z", "z" }; QString output; for ( const QChar &c : string ) { int i = diacriticLetters.indexOf( c ); if ( i < 0 ) { output.append( c ); } else { QString replacement = noDiacriticLetters[ i ]; output.append( replacement ); } } return output; } // Function CalamaresUtils::obscure based on KStringHandler::obscure, // part of KDElibs by KDE, file kstringhandler.cpp. // Original copyright statement follows. /* This file is part of the KDE libraries Copyright (C) 1999 Ian Zepp (icszepp@islc.net) Copyright (C) 2006 by Dominic Battre Copyright (C) 2006 by Martin Pool This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ QString obscure( const QString& string ) { QString result; const QChar *unicode = string.unicode(); for ( int i = 0; i < string.length(); ++i ) // yes, no typo. can't encode ' ' or '!' because // they're the unicode BOM. stupid scrambling. stupid. result += ( unicode[ i ].unicode() <= 0x21 ) ? unicode[ i ] : QChar( 0x1001F - unicode[ i ].unicode() ); return result; } void crash() { volatile int* a = nullptr; *a = 1; } } calamares-3.1.12/src/libcalamares/utils/CalamaresUtils.h000066400000000000000000000063661322271446000231720ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2013-2016, Teo Mrnjavac * * Originally from Tomahawk, portions: * Copyright 2010-2011, Christian Muehlhaeuser * Copyright 2010-2011, Leo Franchi * Copyright 2010-2012, Jeff Mitchell * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESUTILS_H #define CALAMARESUTILS_H #include "DllMacro.h" #include #define RESPATH ":/data/" class QDir; class QObject; /** * @brief The CalamaresUtils namespace contains utility functions. */ namespace CalamaresUtils { DLLEXPORT QDir qmlModulesDir(); /** * @brief appDataDir returns the directory with common application data. * Defaults to CMAKE_INSTALL_FULL_DATADIR (usually /usr/share/calamares). */ DLLEXPORT QDir appDataDir(); /** * @brief appLogDir returns the directory for Calamares logs. * Defaults to QStandardPaths::CacheLocation (usually ~/.cache/Calamares). */ DLLEXPORT QDir appLogDir(); /** * @brief systemLibDir returns the system's lib directory. * Defaults to CMAKE_INSTALL_FULL_LIBDIR (usually /usr/lib64 or /usr/lib). */ DLLEXPORT QDir systemLibDir(); /** * @brief installTranslator changes the application language. * @param locale the new locale. * @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding. * @param parent the parent QObject. */ DLLEXPORT void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent ); DLLEXPORT QString translatorLocaleName(); /** * Override app data dir. Only for testing purposes. */ DLLEXPORT void setAppDataDir( const QDir& dir ); DLLEXPORT bool isAppDataDirOverridden(); DLLEXPORT void setQmlModulesDir( const QDir& dir ); /** * @brief removeDiacritics replaces letters with diacritics and ligatures with * alternative forms and digraphs. * @param string the string to transform. * @return the output string with plain characters. */ DLLEXPORT QString removeDiacritics( const QString& string ); /** * @brief obscure is a bidirectional obfuscation function, from KStringHandler. * @param string the input string. * @return the obfuscated string. */ DLLEXPORT QString obscure( const QString& string ); /** * @brief crash makes Calamares crash immediately. */ DLLEXPORT void crash(); } #endif // CALAMARESUTILS_H calamares-3.1.12/src/libcalamares/utils/CalamaresUtilsSystem.cpp000066400000000000000000000143401322271446000247210ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CalamaresUtilsSystem.h" #include "utils/Logger.h" #include "JobQueue.h" #include "GlobalStorage.h" #include #include #include #ifdef Q_OS_LINUX #include #endif #ifdef Q_OS_FREEBSD #include #include #endif namespace CalamaresUtils { System* System::s_instance = nullptr; System::System( bool doChroot, QObject* parent ) : QObject( parent ) , m_doChroot( doChroot ) { Q_ASSERT( !s_instance ); s_instance = this; if ( !doChroot ) Calamares::JobQueue::instance()->globalStorage()->insert( "rootMountPoint", "/" ); } System::~System() {} System*System::instance() { return s_instance; } int System::mount( const QString& devicePath, const QString& mountPoint, const QString& filesystemName, const QString& options ) { if ( devicePath.isEmpty() || mountPoint.isEmpty() ) return -3; QDir mountPointDir( mountPoint ); if ( !mountPointDir.exists() ) { bool ok = mountPointDir.mkpath( mountPoint ); if ( !ok ) return -3; } QString program( "mount" ); QStringList args = { devicePath, mountPoint }; if ( !filesystemName.isEmpty() ) args << "-t" << filesystemName; if ( !options.isEmpty() ) args << "-o" << options; return QProcess::execute( program, args ); } int System::targetEnvCall( const QStringList& args, const QString& workingPath, const QString& stdInput, int timeoutSec ) { QString discard; return targetEnvOutput( args, discard, workingPath, stdInput, timeoutSec ); } int System::targetEnvCall( const QString& command, const QString& workingPath, const QString& stdInput, int timeoutSec ) { return targetEnvCall( QStringList{ command }, workingPath, stdInput, timeoutSec ); } int System::targetEnvOutput( const QStringList& args, QString& output, const QString& workingPath, const QString& stdInput, int timeoutSec ) { output.clear(); if ( !Calamares::JobQueue::instance() ) return -3; Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( !gs || ( m_doChroot && !gs->contains( "rootMountPoint" ) ) ) { cLog() << "No rootMountPoint in global storage"; return -3; } QProcess process; QString program; QStringList arguments; if ( m_doChroot ) { QString destDir = gs->value( "rootMountPoint" ).toString(); if ( !QDir( destDir ).exists() ) { cLog() << "rootMountPoint points to a dir which does not exist"; return -3; } program = "chroot"; arguments = QStringList( { destDir } ); arguments << args; } else { program = "env"; arguments << args; } process.setProgram( program ); process.setArguments( arguments ); process.setProcessChannelMode( QProcess::MergedChannels ); if ( !workingPath.isEmpty() ) { if ( QDir( workingPath ).exists() ) process.setWorkingDirectory( QDir( workingPath ).absolutePath() ); else cLog() << "Invalid working directory:" << workingPath; return -3; } cLog() << "Running" << program << arguments; process.start(); if ( !process.waitForStarted() ) { cLog() << "Process failed to start" << process.error(); return -2; } if ( !stdInput.isEmpty() ) { process.write( stdInput.toLocal8Bit() ); process.closeWriteChannel(); } if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) ) { cLog() << "Timed out. output so far:"; cLog() << process.readAllStandardOutput(); return -4; } output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() ); if ( process.exitStatus() == QProcess::CrashExit ) { cLog() << "Process crashed"; return -1; } auto r = process.exitCode(); cLog() << "Finished. Exit code:" << r; if ( r != 0 ) { cLog() << "Target cmd" << args; cLog() << "Target out" << output; } return r; } int System::targetEnvOutput( const QString& command, QString& output, const QString& workingPath, const QString& stdInput, int timeoutSec ) { return targetEnvOutput( QStringList{ command }, output, workingPath, stdInput, timeoutSec ); } QPair System::getTotalMemoryB() { #ifdef Q_OS_LINUX struct sysinfo i; int r = sysinfo( &i ); if (r) return qMakePair(0, 0.0); return qMakePair(quint64( i.mem_unit ) * quint64( i.totalram ), 1.1); #elif defined( Q_OS_FREEBSD ) unsigned long memsize; size_t s = sizeof(memsize); int r = sysctlbyname("vm.kmem_size", &memsize, &s, NULL, 0); if (r) return qMakePair(0, 0.0); return qMakePair(memsize, 1.01); #else return qMakePair(0, 0.0); // Unsupported #endif } bool System::doChroot() const { return m_doChroot; } } // namespace calamares-3.1.12/src/libcalamares/utils/CalamaresUtilsSystem.h000066400000000000000000000115311322271446000243650ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESUTILSSYSTEM_H #define CALAMARESUTILSSYSTEM_H #include "DllMacro.h" #include #include namespace CalamaresUtils { /** * @brief The System class is a singleton with utility functions that perform * system-specific operations. */ class DLLEXPORT System : public QObject { Q_OBJECT public: /** * @brief System the constructor. Only call this once in a Calamares instance. * @param doChroot set to true if all external commands should run in the * target system chroot, otherwise false to run everything on the current system. * @param parent the QObject parent. */ explicit System( bool doChroot, QObject* parent = nullptr ); virtual ~System(); static System* instance(); /** * Runs the mount utility with the specified parameters. * @param devicePath the path of the partition to mount. * @param mountPoint the full path of the target mount point. * @param filesystemName the name of the filesystem (optional). * @param options any additional options as passed to mount -o (optional). * @returns the program's exit code, or: * -1 = QProcess crash * -2 = QProcess cannot start * -3 = bad arguments */ DLLEXPORT int mount( const QString& devicePath, const QString& mountPoint, const QString& filesystemName = QString(), const QString& options = QString() ); /** * Runs the specified command in the chroot of the target system. * @param args the call with arguments, as a string list. * @param workingPath the current working directory for the QProcess * call (optional). * @param stdInput the input string to send to the running process as * standard input (optional). * @param timeoutSec the timeout after which the process will be * killed (optional, default is 0 i.e. no timeout). * @returns the program's exit code, or: * -1 = QProcess crash * -2 = QProcess cannot start * -3 = bad arguments * -4 = QProcess timeout */ DLLEXPORT int targetEnvCall( const QStringList& args, const QString& workingPath = QString(), const QString& stdInput = QString(), int timeoutSec = 0 ); DLLEXPORT int targetEnvCall( const QString& command, const QString& workingPath = QString(), const QString& stdInput = QString(), int timeoutSec = 0 ); DLLEXPORT int targetEnvOutput( const QStringList& args, QString& output, const QString& workingPath = QString(), const QString& stdInput = QString(), int timeoutSec = 0 ); DLLEXPORT int targetEnvOutput( const QString& command, QString& output, const QString& workingPath = QString(), const QString& stdInput = QString(), int timeoutSec = 0 ); /** * @brief getTotalMemoryB returns the total main memory, in bytes. * * Since it is difficult to get the RAM memory size exactly -- either * by reading information from the DIMMs, which may fail on virtual hosts * or from asking the kernel, which doesn't report some memory areas -- * this returns a pair of guessed-size (in bytes) and a "guesstimate factor" * which says how good the guess is. Generally, assume the *real* memory * available is size * guesstimate. * * If nothing can be found, returns a 0 size and 0 guesstimate. * * @return size, guesstimate-factor */ DLLEXPORT QPair getTotalMemoryB(); DLLEXPORT bool doChroot() const; private: static System* s_instance; bool m_doChroot; }; } #endif // CALAMARESUTILSSYSTEM_H calamares-3.1.12/src/libcalamares/utils/Logger.cpp000066400000000000000000000105041322271446000220200ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2010-2011, Christian Muehlhaeuser * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Logger.h" #include #include #include #include #include #include #include #include #include "utils/CalamaresUtils.h" #define LOGFILE_SIZE 1024 * 256 #define RELEASE_LEVEL_THRESHOLD 0 #define DEBUG_LEVEL_THRESHOLD LOGEXTRA using namespace std; static ofstream logfile; static unsigned int s_threshold = 0; static QMutex s_mutex; namespace Logger { static void log( const char* msg, unsigned int debugLevel, bool toDisk = true ) { if ( !s_threshold ) { if ( qApp->arguments().contains( "--debug" ) || qApp->arguments().contains( "-d" ) ) s_threshold = LOGVERBOSE; else #ifdef QT_NO_DEBUG s_threshold = RELEASE_LEVEL_THRESHOLD; #else s_threshold = DEBUG_LEVEL_THRESHOLD; #endif // Comparison is < threshold, below ++s_threshold; } if ( toDisk || debugLevel < s_threshold ) { QMutexLocker lock( &s_mutex ); // If we don't format the date as a Qt::ISODate then we get a crash when // logging at exit as Qt tries to use QLocale to format, but QLocale is // on its way out. logfile << QDate::currentDate().toString( Qt::ISODate ).toUtf8().data() << " - " << QTime::currentTime().toString().toUtf8().data() << " [" << QString::number( debugLevel ).toUtf8().data() << "]: " << msg << endl; logfile.flush(); } if ( debugLevel <= LOGEXTRA || debugLevel < s_threshold ) { QMutexLocker lock( &s_mutex ); cout << QTime::currentTime().toString().toUtf8().data() << " [" << QString::number( debugLevel ).toUtf8().data() << "]: " << msg << endl; cout.flush(); } } void CalamaresLogHandler( QtMsgType type, const QMessageLogContext& context, const QString& msg ) { static QMutex s_mutex; Q_UNUSED( context ); QByteArray ba = msg.toUtf8(); const char* message = ba.constData(); QMutexLocker locker( &s_mutex ); switch( type ) { case QtDebugMsg: log( message, LOGVERBOSE ); break; case QtInfoMsg: log( message, 1 ); break; case QtCriticalMsg: case QtWarningMsg: case QtFatalMsg: log( message, 0 ); break; } } QString logFile() { return CalamaresUtils::appLogDir().filePath( "Calamares.log" ); } void setupLogfile() { if ( QFileInfo( logFile().toLocal8Bit() ).size() > LOGFILE_SIZE ) { QByteArray lc; { QFile f( logFile().toLocal8Bit() ); f.open( QIODevice::ReadOnly | QIODevice::Text ); lc = f.readAll(); f.close(); } QFile::remove( logFile().toLocal8Bit() ); { QFile f( logFile().toLocal8Bit() ); f.open( QIODevice::WriteOnly | QIODevice::Text ); f.write( lc.right( LOGFILE_SIZE - ( LOGFILE_SIZE / 4 ) ) ); f.close(); } } cDebug() << "Using log file:" << logFile(); logfile.open( logFile().toLocal8Bit(), ios::app ); qInstallMessageHandler( CalamaresLogHandler ); } } using namespace Logger; CLog::CLog( unsigned int debugLevel ) : QDebug( &m_msg ) , m_debugLevel( debugLevel ) { } CLog::~CLog() { log( m_msg.toUtf8().data(), m_debugLevel ); } Logger::CDebug::~CDebug() { } calamares-3.1.12/src/libcalamares/utils/Logger.h000066400000000000000000000033731322271446000214730ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2010-2011, Christian Muehlhaeuser * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_LOGGER_H #define CALAMARES_LOGGER_H #include #include "DllMacro.h" #define LOGDEBUG 1 #define LOGINFO 2 #define LOGEXTRA 5 #define LOGVERBOSE 8 namespace Logger { class DLLEXPORT CLog : public QDebug { public: CLog( unsigned int debugLevel = 0 ); virtual ~CLog(); private: QString m_msg; unsigned int m_debugLevel; }; class DLLEXPORT CDebug : public CLog { public: CDebug( unsigned int debugLevel = LOGDEBUG ) : CLog( debugLevel ) { } virtual ~CDebug(); }; DLLEXPORT void CalamaresLogHandler( QtMsgType type, const QMessageLogContext& context, const QString& msg ); DLLEXPORT void setupLogfile(); DLLEXPORT QString logFile(); } #define cLog Logger::CLog #define cDebug Logger::CDebug #endif // CALAMARES_LOGGER_H calamares-3.1.12/src/libcalamares/utils/PluginFactory.cpp000066400000000000000000000107101322271446000233660ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Based on KPluginFactory from KCoreAddons, KDE project * Copyright 2007, Matthias Kretz * Copyright 2007, Bernhard Loos * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PluginFactory.h" #include "PluginFactory_p.h" #include #include Q_GLOBAL_STATIC( QObjectCleanupHandler, factorycleanup ) extern int kLibraryDebugArea(); namespace Calamares { PluginFactory::PluginFactory() : d_ptr( new PluginFactoryPrivate ) { Q_D( PluginFactory ); d->q_ptr = this; factorycleanup()->add( this ); } PluginFactory::PluginFactory( PluginFactoryPrivate& d ) : d_ptr( &d ) { factorycleanup()->add( this ); } PluginFactory::~PluginFactory() { delete d_ptr; } void PluginFactory::doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction ) { Q_D( PluginFactory ); Q_ASSERT( metaObject ); // we allow different interfaces to be registered without keyword if ( !keyword.isEmpty() ) { if ( d->createInstanceHash.contains( keyword ) ) qWarning() << "A plugin with the keyword" << keyword << "was already registered. A keyword must be unique!"; d->createInstanceHash.insert( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) ); } else { const QList clashes( d->createInstanceHash.values( keyword ) ); const QMetaObject* superClass = metaObject->superClass(); if ( superClass ) { for ( const PluginFactoryPrivate::Plugin& plugin : clashes ) { for ( const QMetaObject* otherSuper = plugin.first->superClass(); otherSuper; otherSuper = otherSuper->superClass() ) { if ( superClass == otherSuper ) qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins."; } } } for ( const PluginFactoryPrivate::Plugin& plugin : clashes ) { superClass = plugin.first->superClass(); if ( superClass ) { for ( const QMetaObject* otherSuper = metaObject->superClass(); otherSuper; otherSuper = otherSuper->superClass() ) { if ( superClass == otherSuper ) qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins."; } } } d->createInstanceHash.insertMulti( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) ); } } QObject* PluginFactory::create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword ) { Q_D( PluginFactory ); QObject* obj = nullptr; const QList candidates( d->createInstanceHash.values( keyword ) ); // for !keyword.isEmpty() candidates.count() is 0 or 1 for ( const PluginFactoryPrivate::Plugin& plugin : candidates ) { for ( const QMetaObject* current = plugin.first; current; current = current->superClass() ) { if ( 0 == qstrcmp( iface, current->className() ) ) { if ( obj ) qWarning() << "ambiguous interface requested from a DSO containing more than one plugin"; obj = plugin.second( parentWidget, parent ); break; } } } if ( obj ) emit objectCreated( obj ); return obj; } } calamares-3.1.12/src/libcalamares/utils/PluginFactory.h000066400000000000000000000317631322271446000230460ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Based on KPluginFactory from KCoreAddons, KDE project * Copyright 2007, Matthias Kretz * Copyright 2007, Bernhard Loos * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESPLUGINFACTORY_H #define CALAMARESPLUGINFACTORY_H #include "DllMacro.h" #include #include #include namespace Calamares { class PluginFactoryPrivate; } #define CalamaresPluginFactory_iid "io.calamares.PluginFactory" #define CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY_SKEL(name, baseFactory, ...) \ class name : public Calamares::PluginFactory \ { \ Q_OBJECT \ Q_INTERFACES(Calamares::PluginFactory) \ __VA_ARGS__ \ public: \ explicit name(); \ ~name(); \ private: \ void init(); \ }; #define CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, baseFactory) \ CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY_SKEL(name, baseFactory, Q_PLUGIN_METADATA(IID CalamaresPluginFactory_iid)) #define CALAMARES_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, baseFactory, pluginRegistrations) \ name::name() \ { \ pluginRegistrations \ } \ name::~name() {} #define CALAMARES_PLUGIN_FACTORY_WITH_BASEFACTORY(name, baseFactory, pluginRegistrations) \ CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, baseFactory) \ CALAMARES_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, baseFactory, pluginRegistrations) #define CALAMARES_PLUGIN_FACTORY_DECLARATION(name) CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, Calamares::PluginFactory) #define CALAMARES_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations) CALAMARES_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, Calamares::PluginFactory, pluginRegistrations) /** * \relates PluginFactory * * Create a PluginFactory subclass and export it as the root plugin object. * * \param name The name of the PluginFactory derived class. * * \param pluginRegistrations Code to be inserted into the constructor of the * class. Usually a series of registerPlugin() calls. * * Example: * \code * #include * #include * * class MyPlugin : public PluginInterface * { * public: * MyPlugin(QObject *parent, const QVariantList &args) * : PluginInterface(parent) * {} * }; * * CALAMARES_PLUGIN_FACTORY(MyPluginFactory, * registerPlugin(); * ) * * #include * \endcode * * \see CALAMARES_PLUGIN_FACTORY_DECLARATION * \see CALAMARES_PLUGIN_FACTORY_DEFINITION */ #define CALAMARES_PLUGIN_FACTORY(name, pluginRegistrations) CALAMARES_PLUGIN_FACTORY_WITH_BASEFACTORY(name, Calamares::PluginFactory, pluginRegistrations) /** * \relates PluginFactory * * CALAMARES_PLUGIN_FACTORY_DECLARATION declares the PluginFactory subclass. This macro * can be used in a header file. * * \param name The name of the PluginFactory derived class. * * \see CALAMARES_PLUGIN_FACTORY * \see CALAMARES_PLUGIN_FACTORY_DEFINITION */ #define CALAMARES_PLUGIN_FACTORY_DECLARATION(name) CALAMARES_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, Calamares::PluginFactory) /** * \relates PluginFactory * CALAMARES_PLUGIN_FACTORY_DEFINITION defines the PluginFactory subclass. This macro * can not be used in a header file. * * \param name The name of the PluginFactory derived class. * * \param pluginRegistrations Code to be inserted into the constructor of the * class. Usually a series of registerPlugin() calls. * * \see CALAMARES_PLUGIN_FACTORY * \see CALAMARES_PLUGIN_FACTORY_DECLARATION */ #define CALAMARES_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations) CALAMARES_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, Calamares::PluginFactory, pluginRegistrations) namespace Calamares { /** * \class PluginFactory PluginFactory.h * * PluginFactory provides a convenient way to provide factory-style plugins. * Qt plugins provide a singleton object, but a common pattern is for plugins * to generate as many objects of a particular type as the application requires. * By using PluginFactory, you can avoid implementing the factory pattern * yourself. * * PluginFactory also allows plugins to provide multiple different object * types, indexed by keywords. * * The objects created by PluginFactory must inherit QObject, and must have a * standard constructor pattern: * \li if the object is a KPart::Part, it must be of the form * \code * T(QWidget *parentWidget, QObject *parent, const QVariantList &args) * \endcode * \li if it is a QWidget, it must be of the form * \code * T(QWidget *parent, const QVariantList &args) * \endcode * \li otherwise it must be of the form * \code * T(QObject *parent, const QVariantList &args) * \endcode * * You should typically use either CALAMARES_PLUGIN_FACTORY() or * CALAMARES_PLUGIN_FACTORY_WITH_JSON() in your plugin code to create the factory. The * typical pattern is * * \code * #include * #include * * class MyPlugin : public PluginInterface * { * public: * MyPlugin(QObject *parent, const QVariantList &args) * : PluginInterface(parent) * {} * }; * * CALAMARES_PLUGIN_FACTORY(MyPluginFactory, * registerPlugin(); * ) * #include * \endcode * * If you want to load a library use KPluginLoader. * The application that wants to instantiate plugin classes can do the following: * \code * PluginFactory *factory = KPluginLoader("libraryname").factory(); * if (factory) { * PluginInterface *p1 = factory->create(parent); * OtherInterface *p2 = factory->create(parent); * NextInterface *p3 = factory->create("keyword1", parent); * NextInterface *p3 = factory->create("keyword2", parent); * } * \endcode * * \author Matthias Kretz * \author Bernhard Loos */ class DLLEXPORT PluginFactory : public QObject { Q_OBJECT Q_DECLARE_PRIVATE( PluginFactory ) public: /** * This constructor creates a factory for a plugin. */ explicit PluginFactory(); /** * This destroys the PluginFactory. */ virtual ~PluginFactory(); /** * Use this method to create an object. It will try to create an object which inherits * \p T. If it has multiple choices, you will get a fatal error (kFatal()), so be careful * to request a unique interface or use keywords. * * \tparam T The interface for which an object should be created. The object will inherit \p T. * \param parent The parent of the object. If \p parent is a widget type, it will also passed * to the parentWidget argument of the CreateInstanceFunction for the object. * \returns A pointer to the created object is returned, or 0 if an error occurred. */ template T* create( QObject* parent = nullptr ); /** * Use this method to create an object. It will try to create an object which inherits * \p T and was registered with \p keyword. * * \tparam T The interface for which an object should be created. The object will inherit \p T. * \param keyword The keyword of the object. * \param parent The parent of the object. If \p parent is a widget type, it will also passed * to the parentWidget argument of the CreateInstanceFunction for the object. * \returns A pointer to the created object is returned, or 0 if an error occurred. */ template T* create( const QString& keyword, QObject* parent = nullptr ); Q_SIGNALS: void objectCreated( QObject* object ); protected: /** * Function pointer type to a function that instantiates a plugin. */ typedef QObject* ( *CreateInstanceFunction )( QWidget*, QObject* ); /** * This is used to detect the arguments need for the constructor of plugin classes. * You can inherit it, if you want to add new classes and still keep support for the old ones. */ template struct InheritanceChecker { CreateInstanceFunction createInstanceFunction( QWidget* ) { return &createInstance; } CreateInstanceFunction createInstanceFunction( ... ) { return &createInstance; } }; explicit PluginFactory( PluginFactoryPrivate& dd ); /** * Registers a plugin with the factory. Call this function from the constructor of the * PluginFactory subclass to make the create function able to instantiate the plugin when asked * for an interface the plugin implements. * * \tparam T the name of the plugin class * * \param keyword An optional keyword as unique identifier for the plugin. This allows you to * put more than one plugin with the same interface into the same library using the same * factory. X-KDE-PluginKeyword is a convenient way to specify the keyword in a desktop file. * * \param instanceFunction A function pointer to a function that creates an instance of the * plugin. The default function that will be used depends on the type of interface. If the * interface inherits from * \li \c KParts::Part the function will call * \code * new T(QWidget *parentWidget, QObject *parent) * \endcode * \li \c QWidget the function will call * \code * new T(QWidget *parent) * \endcode * \li else the function will call * \code * new T(QObject *parent) * \endcode */ template void registerPlugin( const QString& keyword = QString(), CreateInstanceFunction instanceFunction = InheritanceChecker().createInstanceFunction( reinterpret_cast( 0 ) ) ) { doRegisterPlugin( keyword, &T::staticMetaObject, instanceFunction ); } PluginFactoryPrivate* const d_ptr; /** * This function is called when the factory asked to create an Object. * * You may reimplement it to provide a very flexible factory. This is especially useful to * provide generic factories for plugins implemeted using a scripting language. * * \param iface The staticMetaObject::className() string identifying the plugin interface that * was requested. E.g. for KCModule plugins this string will be "KCModule". * \param parentWidget Only used if the requested plugin is a KPart. * \param parent The parent object for the plugin object. * \param keyword A string that uniquely identifies the plugin. If a KService is used this * keyword is read from the X-KDE-PluginKeyword entry in the .desktop file. */ virtual QObject* create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword ); template static QObject* createInstance( QWidget* parentWidget, QObject* parent ) { Q_UNUSED( parentWidget ); ParentType* p = nullptr; if ( parent ) { p = qobject_cast( parent ); Q_ASSERT( p ); } return new impl( p ); } private: void doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction ); }; template inline T* PluginFactory::create( QObject* parent ) { QObject* o = create( T::staticMetaObject.className(), parent && parent->isWidgetType() ? reinterpret_cast( parent ) : nullptr, parent, QString() ); T* t = qobject_cast( o ); if ( !t ) delete o; return t; } template inline T* PluginFactory::create( const QString& keyword, QObject* parent ) { QObject* o = create( T::staticMetaObject.className(), parent && parent->isWidgetType() ? reinterpret_cast( parent ) : nullptr, parent, keyword ); T* t = qobject_cast( o ); if ( !t ) delete o; return t; } } Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid ) #endif // CALAMARESPLUGINFACTORY_H calamares-3.1.12/src/libcalamares/utils/PluginFactory_p.h000066400000000000000000000030401322271446000233500ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * * Based on KPluginFactory from KCoreAddons, KDE project * Copyright 2007, Matthias Kretz * Copyright 2007, Bernhard Loos * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESPLUGINFACTORY_P_H #define CALAMARESPLUGINFACTORY_P_H #include "PluginFactory.h" #include namespace Calamares { class PluginFactoryPrivate { Q_DECLARE_PUBLIC(PluginFactory) protected: typedef QPair Plugin; PluginFactoryPrivate() : catalogInitialized( false ) , q_ptr( nullptr ) {} ~PluginFactoryPrivate() {} QHash createInstanceHash; QString catalogName; bool catalogInitialized; PluginFactory *q_ptr; }; } #endif // CALAMARESPLUGINFACTORY_P_H calamares-3.1.12/src/libcalamares/utils/Retranslator.cpp000066400000000000000000000034371322271446000232700ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Retranslator.h" #include namespace CalamaresUtils { void Retranslator::attachRetranslator( QObject* parent, std::function< void ( void ) > retranslateFunc ) { Retranslator* r = nullptr; for ( QObject* child : parent->children() ) { r = qobject_cast< Retranslator* >( child ); if ( r ) break; } if ( !r ) r = new Retranslator( parent ); r->m_retranslateFuncList.append( retranslateFunc ); retranslateFunc(); } Retranslator::Retranslator( QObject* parent ) : QObject( parent ) { parent->installEventFilter( this ); } bool Retranslator::eventFilter( QObject* obj, QEvent* e ) { if ( obj == parent() ) { if ( e->type() == QEvent::LanguageChange ) { foreach ( std::function< void() > func, m_retranslateFuncList ) func(); } } // pass the event on to the base return QObject::eventFilter( obj, e ); } } // namespace CalamaresUtils calamares-3.1.12/src/libcalamares/utils/Retranslator.h000066400000000000000000000033431322271446000227310ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESUTILS_RETRANSLATOR_H #define CALAMARESUTILS_RETRANSLATOR_H #include #include #include class QEvent; namespace CalamaresUtils { class Retranslator : public QObject { Q_OBJECT public: static void attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc ); void addRetranslateFunc( std::function< void( void ) > retranslateFunc ); protected: bool eventFilter( QObject* obj, QEvent* e ) override; private: explicit Retranslator( QObject* parent ); QList< std::function< void( void ) > > m_retranslateFuncList; }; } // namespace CalamaresUtils #define CALAMARES_RETRANSLATE(body) \ CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } ); #define CALAMARES_RETRANSLATE_WIDGET(widget,body) \ CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } ); #endif // CALAMARESUTILS_RETRANSLATOR_H calamares-3.1.12/src/libcalamares/utils/Units.h000066400000000000000000000032511322271446000213510ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LIBCALAMARES_UTILS_UNITS_H #define LIBCALAMARES_UTILS_UNITS_H #include namespace CalamaresUtils { /** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */ constexpr qint64 operator ""_MiB( unsigned long long m ) { return qint64(m) * 1024 * 1024; } /** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */ constexpr qint64 operator ""_GiB( unsigned long long m ) { return operator ""_MiB(m) * 1024; } constexpr qint64 MiBtoBytes( unsigned long long m ) { return operator ""_MiB( m ); } constexpr qint64 GiBtoBytes( unsigned long long m ) { return operator ""_GiB( m ); } constexpr qint64 MiBToBytes( double m ) { return qint64(m * 1024 * 1024); } constexpr qint64 GiBtoBytes( double m ) { return qint64(m * 1024 * 1024 * 1024); } constexpr int BytesToMiB( qint64 b ) { return int( b / 1024 / 1024 ); } } // namespace #endif calamares-3.1.12/src/libcalamaresui/000077500000000000000000000000001322271446000172735ustar00rootroot00000000000000calamares-3.1.12/src/libcalamaresui/Branding.cpp000066400000000000000000000212401322271446000215220ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Branding.h" #include "GlobalStorage.h" #include "utils/CalamaresUtils.h" #include "utils/Logger.h" #include "utils/YamlUtils.h" #include "utils/ImageRegistry.h" #include #include #include #include #include namespace Calamares { Branding* Branding::s_instance = nullptr; Branding* Branding::instance() { return s_instance; } const QStringList Branding::s_stringEntryStrings = { "productName", "version", "shortVersion", "versionedName", "shortVersionedName", "shortProductName", "bootloaderEntryName", "productUrl", "supportUrl", "knownIssuesUrl", "releaseNotesUrl" }; const QStringList Branding::s_imageEntryStrings = { "productLogo", "productIcon", "productWelcome" }; const QStringList Branding::s_styleEntryStrings = { "sidebarBackground", "sidebarText", "sidebarTextSelect", "sidebarTextHighlight" }; Branding::Branding( const QString& brandingFilePath, QObject* parent ) : QObject( parent ) , m_descriptorPath( brandingFilePath ) , m_componentName() , m_welcomeStyleCalamares( false ) , m_welcomeExpandingLogo( true ) { cDebug() << "Using Calamares branding file at" << brandingFilePath; QFile file( brandingFilePath ); if ( file.exists() && file.open( QFile::ReadOnly | QFile::Text ) ) { QByteArray ba = file.readAll(); QFileInfo fi ( m_descriptorPath ); QDir componentDir = fi.absoluteDir(); if ( !componentDir.exists() ) bail( "Bad component directory path." ); try { YAML::Node doc = YAML::Load( ba.constData() ); Q_ASSERT( doc.IsMap() ); m_componentName = QString::fromStdString( doc[ "componentName" ] .as< std::string >() ); if ( m_componentName != QFileInfo( m_descriptorPath ).absoluteDir().dirName() ) bail( "The branding component name should match the name of the " "component directory." ); if ( !doc[ "strings" ].IsMap() ) bail( "Syntax error in strings map." ); m_welcomeStyleCalamares = doc[ "welcomeStyleCalamares" ].as< bool >( false ); m_welcomeExpandingLogo = doc[ "welcomeExpandingLogo" ].as< bool >( true ); QVariantMap strings = CalamaresUtils::yamlMapToVariant( doc[ "strings" ] ).toMap(); m_strings.clear(); for ( auto it = strings.constBegin(); it != strings.constEnd(); ++it ) m_strings.insert( it.key(), it.value().toString() ); if ( !doc[ "images" ].IsMap() ) bail( "Syntax error in images map." ); QVariantMap images = CalamaresUtils::yamlMapToVariant( doc[ "images" ] ).toMap(); m_images.clear(); for ( auto it = images.constBegin(); it != images.constEnd(); ++it ) { QString pathString = it.value().toString(); QFileInfo imageFi( componentDir.absoluteFilePath( pathString ) ); if ( !imageFi.exists() ) bail( QString( "Image file %1 does not exist." ) .arg( imageFi.absoluteFilePath() ) ); m_images.insert( it.key(), imageFi.absoluteFilePath() ); } if ( doc[ "slideshow" ].IsSequence() ) { QStringList slideShowPictures; doc[ "slideshow" ] >> slideShowPictures; for ( int i = 0; i < slideShowPictures.count(); ++i ) { QString pathString = slideShowPictures[ i ]; QFileInfo imageFi( componentDir.absoluteFilePath( pathString ) ); if ( !imageFi.exists() ) bail( QString( "Slideshow file %1 does not exist." ) .arg( imageFi.absoluteFilePath() ) ); slideShowPictures[ i ] = imageFi.absoluteFilePath(); } //FIXME: implement a GenericSlideShow.qml that uses these slideShowPictures } else if ( doc[ "slideshow" ].IsScalar() ) { QString slideshowPath = QString::fromStdString( doc[ "slideshow" ] .as< std::string >() ); QFileInfo slideshowFi( componentDir.absoluteFilePath( slideshowPath ) ); if ( !slideshowFi.exists() || !slideshowFi.fileName().toLower().endsWith( ".qml" ) ) bail( QString( "Slideshow file %1 does not exist or is not a valid QML file." ) .arg( slideshowFi.absoluteFilePath() ) ); m_slideshowPath = slideshowFi.absoluteFilePath(); } else bail( "Syntax error in slideshow sequence." ); if ( !doc[ "style" ].IsMap() ) bail( "Syntax error in style map." ); QVariantMap style = CalamaresUtils::yamlMapToVariant( doc[ "style" ] ).toMap(); m_style.clear(); for ( auto it = style.constBegin(); it != style.constEnd(); ++it ) m_style.insert( it.key(), it.value().toString() ); } catch ( YAML::Exception& e ) { cDebug() << "WARNING: YAML parser error " << e.what() << "in" << file.fileName(); } QDir translationsDir( componentDir.filePath( "lang" ) ); if ( !translationsDir.exists() ) cDebug() << "WARNING: the selected branding component does not ship translations."; m_translationsPathPrefix = translationsDir.absolutePath(); m_translationsPathPrefix.append( QString( "%1calamares-%2" ) .arg( QDir::separator() ) .arg( m_componentName ) ); } else { cDebug() << "WARNING: Cannot read " << file.fileName(); } s_instance = this; if ( m_componentName.isEmpty() ) { cDebug() << "WARNING: failed to load component from" << brandingFilePath; } else { cDebug() << "Loaded branding component" << m_componentName; } } QString Branding::descriptorPath() const { return m_descriptorPath; } QString Branding::componentName() const { return m_componentName; } QString Branding::componentDirectory() const { QFileInfo fi ( m_descriptorPath ); return fi.absoluteDir().absolutePath(); } QString Branding::translationsPathPrefix() const { return m_translationsPathPrefix; } QString Branding::string( Branding::StringEntry stringEntry ) const { return m_strings.value( s_stringEntryStrings.value( stringEntry ) ); } QString Branding::styleString( Branding::StyleEntry styleEntry ) const { return m_style.value( s_styleEntryStrings.value( styleEntry ) ); } QString Branding::imagePath( Branding::ImageEntry imageEntry ) const { return m_images.value( s_imageEntryStrings.value( imageEntry ) ); } QPixmap Branding::image( Branding::ImageEntry imageEntry, const QSize& size ) const { QPixmap pixmap = ImageRegistry::instance()->pixmap( imagePath( imageEntry ), size ); if ( pixmap.isNull() ) { Q_ASSERT( false ); return QPixmap(); } return pixmap; } QString Branding::slideshowPath() const { return m_slideshowPath; } void Branding::setGlobals( GlobalStorage* globalStorage ) const { QVariantMap brandingMap; for ( const QString& key : s_stringEntryStrings ) brandingMap.insert( key, m_strings.value( key ) ); globalStorage->insert( "branding", brandingMap ); } void Branding::bail( const QString& message ) { cLog() << "FATAL ERROR in" << m_descriptorPath << "\n" + message; ::exit( EXIT_FAILURE ); } } calamares-3.1.12/src/libcalamaresui/Branding.h000066400000000000000000000067101322271446000211740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef BRANDING_H #define BRANDING_H #include "UiDllMacro.h" #include "Typedefs.h" #include #include #include namespace Calamares { class GlobalStorage; class UIDLLEXPORT Branding : public QObject { Q_OBJECT public: /** * Descriptive strings in the configuration file. use * e.g. *Branding::ProductName to get the string value for * the product name. */ enum StringEntry : short { ProductName, Version, ShortVersion, VersionedName, ShortVersionedName, ShortProductName, BootloaderEntryName, ProductUrl, SupportUrl, KnownIssuesUrl, ReleaseNotesUrl }; enum ImageEntry : short { ProductLogo, ProductIcon, ProductWelcome }; enum StyleEntry : short { SidebarBackground, SidebarText, SidebarTextSelect, SidebarTextHighlight }; static Branding* instance(); explicit Branding( const QString& brandingFilePath, QObject* parent = nullptr ); QString descriptorPath() const; QString componentName() const; QString componentDirectory() const; QString translationsPathPrefix() const; QString string( Branding::StringEntry stringEntry ) const; QString styleString( Branding::StyleEntry styleEntry ) const; QString imagePath( Branding::ImageEntry imageEntry ) const; QPixmap image( Branding::ImageEntry imageEntry, const QSize& size ) const; QString slideshowPath() const; bool welcomeStyleCalamares() const { return m_welcomeStyleCalamares; } bool welcomeExpandingLogo() const { return m_welcomeExpandingLogo; } /** * Creates a map called "branding" in the global storage, and inserts an * entry for each of the branding strings. This makes the branding * information accessible to the Python modules. */ void setGlobals( GlobalStorage* globalStorage ) const; private: static Branding* s_instance; static const QStringList s_stringEntryStrings; static const QStringList s_imageEntryStrings; static const QStringList s_styleEntryStrings; void bail( const QString& message ); QString m_descriptorPath; QString m_componentName; QMap< QString, QString > m_strings; QMap< QString, QString > m_images; QMap< QString, QString > m_style; QString m_slideshowPath; QString m_translationsPathPrefix; bool m_welcomeStyleCalamares; bool m_welcomeExpandingLogo; }; template inline QString operator*(U e) { return Branding::instance()->string( e ); } } #endif // BRANDING_H calamares-3.1.12/src/libcalamaresui/CMakeLists.txt000066400000000000000000000036041322271446000220360ustar00rootroot00000000000000project( libcalamaresui CXX ) set( calamaresui_SOURCES modulesystem/CppJobModule.cpp modulesystem/Module.cpp modulesystem/ModuleManager.cpp modulesystem/ProcessJobModule.cpp modulesystem/ViewModule.cpp utils/CalamaresUtilsGui.cpp utils/DebugWindow.cpp utils/ImageRegistry.cpp utils/YamlUtils.cpp utils/qjsonmodel.cpp utils/qjsonitem.cpp viewpages/AbstractPage.cpp viewpages/ViewStep.cpp widgets/ClickableLabel.cpp widgets/FixedAspectRatioLabel.cpp widgets/waitingspinnerwidget.cpp widgets/WaitingWidget.cpp ExecutionViewStep.cpp Branding.cpp Settings.cpp ViewManager.cpp ) # Don't warn about third-party sources mark_thirdparty_code( utils/ImageRegistry.cpp utils/qjsonitem.cpp utils/qjsonmodel.cpp widgets/waitingspinnerwidget.cpp ) set( calamaresui_UI utils/DebugWindow.ui ) if( WITH_PYTHON ) list( APPEND calamaresui_SOURCES modulesystem/PythonJobModule.cpp ) endif() if( WITH_PYTHONQT ) include_directories(${PYTHON_INCLUDE_DIRS}) include_directories(${PYTHONQT_INCLUDE_DIR}) list( APPEND calamaresui_SOURCES modulesystem/PythonQtViewModule.cpp utils/PythonQtUtils.cpp viewpages/PythonQtJob.cpp viewpages/PythonQtViewStep.cpp viewpages/PythonQtGlobalStorageWrapper.cpp viewpages/PythonQtUtilsWrapper.cpp ) set( OPTIONAL_PRIVATE_LIBRARIES ${OPTIONAL_PRIVATE_LIBRARIES} ${PYTHON_LIBRARIES} ${PYTHONQT_LIBRARIES} ) endif() calamares_add_library( calamaresui SOURCES ${calamaresui_SOURCES} UI ${calamaresui_UI} EXPORT_MACRO UIDLLEXPORT_PRO LINK_PRIVATE_LIBRARIES ${YAMLCPP_LIBRARY} Qt5::Svg Qt5::QuickWidgets ${OPTIONAL_PRIVATE_LIBRARIES} RESOURCES libcalamaresui.qrc EXPORT CalamaresLibraryDepends VERSION ${CALAMARES_VERSION_SHORT} ) calamares-3.1.12/src/libcalamaresui/ExecutionViewStep.cpp000066400000000000000000000076671322271446000234510ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "Branding.h" #include "JobQueue.h" #include "modulesystem/Module.h" #include "modulesystem/ModuleManager.h" #include "Settings.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "ViewManager.h" #include #include #include #include #include #include namespace Calamares { ExecutionViewStep::ExecutionViewStep( QObject* parent ) : ViewStep( parent ) , m_widget( new QWidget ) { m_progressBar = new QProgressBar; m_progressBar->setMaximum( 10000 ); m_label = new QLabel; QVBoxLayout* layout = new QVBoxLayout( m_widget ); QVBoxLayout* innerLayout = new QVBoxLayout; m_slideShow = new QQuickWidget; layout->addWidget( m_slideShow ); CalamaresUtils::unmarginLayout( layout ); layout->addLayout( innerLayout ); m_slideShow->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_slideShow->setResizeMode( QQuickWidget::SizeRootObjectToView ); m_slideShow->engine()->addImportPath( CalamaresUtils::qmlModulesDir().absolutePath() ); innerLayout->addSpacing( CalamaresUtils::defaultFontHeight() / 2 ); innerLayout->addWidget( m_progressBar ); innerLayout->addWidget( m_label ); cDebug() << "QML import paths:" << m_slideShow->engine()->importPathList(); connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); } QString ExecutionViewStep::prettyName() const { return tr( "Install" ); } QWidget* ExecutionViewStep::widget() { return m_widget; } void ExecutionViewStep::next() { } void ExecutionViewStep::back() { } bool ExecutionViewStep::isNextEnabled() const { return false; } bool ExecutionViewStep::isBackEnabled() const { return false; } bool ExecutionViewStep::isAtBeginning() const { return true; } bool ExecutionViewStep::isAtEnd() const { return true; } void ExecutionViewStep::onActivate() { CALAMARES_RETRANSLATE_WIDGET( m_widget, if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) m_slideShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance() ->slideshowPath() ) ); ) JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) { Calamares::Module* module = Calamares::ModuleManager::instance() ->moduleInstance( instanceKey ); if ( module ) queue->enqueue( module->jobs() ); } queue->start(); } QList< Calamares::job_ptr > ExecutionViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void ExecutionViewStep::appendJobModuleInstanceKey( const QString& instanceKey ) { m_jobInstanceKeys.append( instanceKey ); } void ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message ) { m_progressBar->setValue( int( percent * m_progressBar->maximum() ) ); m_label->setText( message ); } } // namespace calamares-3.1.12/src/libcalamaresui/ExecutionViewStep.h000066400000000000000000000035131322271446000231000ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef EXECUTIONVIEWSTEP_H #define EXECUTIONVIEWSTEP_H #include #include class QLabel; class QProgressBar; class QQuickWidget; namespace Calamares { class ExecutionViewStep : public ViewStep { Q_OBJECT public: explicit ExecutionViewStep( QObject* parent = nullptr ); QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; void onActivate() override; QList< job_ptr > jobs() const override; void appendJobModuleInstanceKey( const QString& instanceKey ); private: QWidget* m_widget; QProgressBar* m_progressBar; QLabel* m_label; QQuickWidget* m_slideShow; QStringList m_jobInstanceKeys; void updateFromJobQueue( qreal percent, const QString& message ); }; } #endif /* EXECUTIONVIEWSTEP_H */ calamares-3.1.12/src/libcalamaresui/Settings.cpp000066400000000000000000000160431322271446000216030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Settings.h" #include "utils/CalamaresUtils.h" #include "utils/Logger.h" #include "utils/YamlUtils.h" #include #include #include #include namespace Calamares { Settings* Settings::s_instance = nullptr; Settings* Settings::instance() { return s_instance; } Settings::Settings( const QString& settingsFilePath, bool debugMode, QObject* parent ) : QObject( parent ) , m_debug( debugMode ) , m_doChroot( true ) , m_promptInstall( false ) { cDebug() << "Using Calamares settings file at" << settingsFilePath; QFile file( settingsFilePath ); if ( file.exists() && file.open( QFile::ReadOnly | QFile::Text ) ) { QByteArray ba = file.readAll(); try { YAML::Node config = YAML::Load( ba.constData() ); Q_ASSERT( config.IsMap() ); QStringList rawPaths; config[ "modules-search" ] >> rawPaths; for ( int i = 0; i < rawPaths.length(); ++i ) { if ( rawPaths[ i ] == "local" ) { // If we're running in debug mode, we assume we might also be // running from the build dir, so we add a maximum priority // module search path in the build dir. if ( debugMode ) { QString buildDirModules = QDir::current().absolutePath() + QDir::separator() + "src" + QDir::separator() + "modules"; if ( QDir( buildDirModules ).exists() ) m_modulesSearchPaths.append( buildDirModules ); } // Install path is set in CalamaresAddPlugin.cmake m_modulesSearchPaths.append( CalamaresUtils::systemLibDir().absolutePath() + QDir::separator() + "calamares" + QDir::separator() + "modules" ); } else { QDir path( rawPaths[ i ] ); if ( path.exists() && path.isReadable() ) m_modulesSearchPaths.append( path.absolutePath() ); } } // Parse the custom instances section if ( config[ "instances" ] ) { QVariant instancesV = CalamaresUtils::yamlToVariant( config[ "instances" ] ).toList(); if ( instancesV.type() == QVariant::List ) { const auto instances = instancesV.toList(); for ( const QVariant& instancesVListItem : instances ) { if ( instancesVListItem.type() != QVariant::Map ) continue; QVariantMap instancesVListItemMap = instancesVListItem.toMap(); QMap< QString, QString > instanceMap; for ( auto it = instancesVListItemMap.constBegin(); it != instancesVListItemMap.constEnd(); ++it ) { if ( it.value().type() != QVariant::String ) continue; instanceMap.insert( it.key(), it.value().toString() ); } m_customModuleInstances.append( instanceMap ); } } } // Parse the modules sequence section Q_ASSERT( config[ "sequence" ] ); // It better exist! { QVariant sequenceV = CalamaresUtils::yamlToVariant( config[ "sequence" ] ); Q_ASSERT( sequenceV.type() == QVariant::List ); const auto sequence = sequenceV.toList(); for ( const QVariant& sequenceVListItem : sequence ) { if ( sequenceVListItem.type() != QVariant::Map ) continue; QString thisActionS = sequenceVListItem.toMap().firstKey(); ModuleAction thisAction; if ( thisActionS == "show" ) thisAction = ModuleAction::Show; else if ( thisActionS == "exec" ) thisAction = ModuleAction::Exec; else continue; QStringList thisActionRoster = sequenceVListItem .toMap() .value( thisActionS ) .toStringList(); m_modulesSequence.append( qMakePair( thisAction, thisActionRoster ) ); } } m_brandingComponentName = QString::fromStdString( config[ "branding" ] .as< std::string >() ); m_promptInstall = config[ "prompt-install" ].as< bool >(); m_doChroot = config[ "dont-chroot" ] ? !config[ "dont-chroot" ].as< bool >() : true; } catch ( YAML::Exception& e ) { cDebug() << "WARNING: YAML parser error " << e.what() << "in" << file.fileName(); } } else { cDebug() << "WARNING: Cannot read " << file.fileName(); } s_instance = this; } QStringList Settings::modulesSearchPaths() const { return m_modulesSearchPaths; } QList > Settings::customModuleInstances() const { return m_customModuleInstances; } QList< QPair< ModuleAction, QStringList > > Settings::modulesSequence() const { return m_modulesSequence; } QString Settings::brandingComponentName() const { return m_brandingComponentName; } bool Settings::showPromptBeforeExecution() const { return m_promptInstall; } bool Settings::debugMode() const { return m_debug; } bool Settings::doChroot() const { return m_doChroot; } } calamares-3.1.12/src/libcalamaresui/Settings.h000066400000000000000000000036631322271446000212540ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETTINGS_H #define SETTINGS_H #include "UiDllMacro.h" #include "Typedefs.h" #include #include namespace Calamares { class UIDLLEXPORT Settings : public QObject { Q_OBJECT public: explicit Settings( const QString& settingsFilePath, bool debugMode, QObject* parent = nullptr ); static Settings* instance(); //TODO: load from YAML then emit ready QStringList modulesSearchPaths() const; QList< QMap< QString, QString > > customModuleInstances() const; QList< QPair< ModuleAction, QStringList > > modulesSequence() const; QString brandingComponentName() const; bool showPromptBeforeExecution() const; bool debugMode() const; bool doChroot() const; private: static Settings* s_instance; QStringList m_modulesSearchPaths; QList< QMap< QString, QString > > m_customModuleInstances; QList< QPair< ModuleAction, QStringList > > m_modulesSequence; QString m_brandingComponentName; bool m_debug; bool m_doChroot; bool m_promptInstall; }; } #endif // SETTINGS_H calamares-3.1.12/src/libcalamaresui/UiDllMacro.h000066400000000000000000000017651322271446000214500ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef UIDLLMACRO_H #define UIDLLMACRO_H #include #ifndef UIDLLEXPORT # if defined (UIDLLEXPORT_PRO) # define UIDLLEXPORT Q_DECL_EXPORT # else # define UIDLLEXPORT Q_DECL_IMPORT # endif #endif #endif calamares-3.1.12/src/libcalamaresui/ViewManager.cpp000066400000000000000000000223461322271446000222130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ViewManager.h" #include "utils/Logger.h" #include "viewpages/ViewStep.h" #include "ExecutionViewStep.h" #include "JobQueue.h" #include "utils/Retranslator.h" #include "Branding.h" #include "Settings.h" #include #include #include #include namespace Calamares { ViewManager* ViewManager::s_instance = nullptr; ViewManager* ViewManager::instance() { return s_instance; } ViewManager* ViewManager::instance( QObject* parent ) { Q_ASSERT( !s_instance ); s_instance = new ViewManager( parent ); return s_instance; } ViewManager::ViewManager( QObject* parent ) : QObject( parent ) , m_currentStep( 0 ) , m_widget( new QWidget() ) { Q_ASSERT( !s_instance ); QBoxLayout* mainLayout = new QVBoxLayout; m_widget->setLayout( mainLayout ); m_stack = new QStackedWidget( m_widget ); m_stack->setContentsMargins( 0, 0, 0, 0 ); mainLayout->addWidget( m_stack ); m_back = new QPushButton( m_widget ); m_next = new QPushButton( m_widget ); m_quit = new QPushButton( m_widget ); CALAMARES_RETRANSLATE( m_back->setText( tr( "&Back" ) ); m_next->setText( tr( "&Next" ) ); m_quit->setText( tr( "&Cancel" ) ); m_quit->setToolTip( tr( "Cancel installation without changing the system." ) ); ) QBoxLayout* bottomLayout = new QHBoxLayout; mainLayout->addLayout( bottomLayout ); bottomLayout->addStretch(); bottomLayout->addWidget( m_back ); bottomLayout->addWidget( m_next ); bottomLayout->addSpacing( 12 ); bottomLayout->addWidget( m_quit ); connect( m_next, &QPushButton::clicked, this, &ViewManager::next ); connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); m_back->setEnabled( false ); connect( m_quit, &QPushButton::clicked, this, [this]() { if ( this->confirmCancelInstallation() ) qApp->quit(); } ); connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); connect( JobQueue::instance(), &JobQueue::finished, this, &ViewManager::next ); } ViewManager::~ViewManager() { m_widget->deleteLater(); } QWidget* ViewManager::centralWidget() { return m_widget; } void ViewManager::addViewStep( ViewStep* step ) { insertViewStep( m_steps.size(), step ); // If this is the first inserted view step, update status of "Next" button if ( m_steps.count() == 1 ) m_next->setEnabled( step->isNextEnabled() ); } void ViewManager::insertViewStep( int before, ViewStep* step ) { m_steps.insert( before, step ); QLayout* layout = step->widget()->layout(); if ( layout ) layout->setContentsMargins( 0, 0, 0, 0 ); m_stack->insertWidget( before, step->widget() ); connect( step, &ViewStep::enlarge, this, &ViewManager::enlarge ); connect( step, &ViewStep::nextStatusChanged, this, [this]( bool status ) { ViewStep* vs = qobject_cast< ViewStep* >( sender() ); if ( vs ) { if ( vs == m_steps.at( m_currentStep ) ) m_next->setEnabled( status ); } } ); m_stack->setCurrentIndex( 0 ); step->widget()->setFocus(); } void ViewManager::onInstallationFailed( const QString& message, const QString& details ) { cLog() << "Installation failed:"; cLog() << "- message:" << message; cLog() << "- details:" << details; QMessageBox* msgBox = new QMessageBox(); msgBox->setIcon( QMessageBox::Critical ); msgBox->setWindowTitle( tr( "Error" ) ); msgBox->setText( "" + tr( "Installation Failed" ) + "" ); msgBox->setStandardButtons( QMessageBox::Close ); msgBox->button( QMessageBox::Close )->setText( tr( "&Close" ) ); QString text = "

" + message + "

"; if ( !details.isEmpty() ) text += "

" + details + "

"; msgBox->setInformativeText( text ); connect( msgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); cLog() << "Calamares will quit when the dialog closes."; msgBox->show(); } ViewStepList ViewManager::viewSteps() const { return m_steps; } ViewStep* ViewManager::currentStep() const { return m_steps.value( m_currentStep ); } int ViewManager::currentStepIndex() const { return m_currentStep; } void ViewManager::next() { ViewStep* step = m_steps.at( m_currentStep ); bool executing = false; if ( step->isAtEnd() ) { // Special case when the user clicks next on the very last page in a view phase // and right before switching to an execution phase. // Depending on Calamares::Settings, we show an "are you sure" prompt or not. if ( Calamares::Settings::instance()->showPromptBeforeExecution() && m_currentStep + 1 < m_steps.count() && qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep + 1 ) ) ) { int reply = QMessageBox::question( m_widget, tr( "Continue with setup?" ), tr( "The %1 installer is about to make changes to your " "disk in order to install %2.
You will not be able " "to undo these changes." ) .arg( *Calamares::Branding::ShortProductName ) .arg( *Calamares::Branding::ShortVersionedName ), tr( "&Install now" ), tr( "Go &back" ), QString(), 0, 1 ); if ( reply == 1 ) return; } m_currentStep++; m_stack->setCurrentIndex( m_currentStep ); step->onLeave(); m_steps.at( m_currentStep )->onActivate(); executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr; emit currentStepChanged(); if ( executing ) { m_back->setEnabled( false ); m_next->setEnabled( false ); } } else step->next(); m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() ); m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() ); if ( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) { m_quit->setText( tr( "&Done" ) ); m_quit->setToolTip( tr( "The installation is complete. Close the installer." ) ); } } void ViewManager::back() { ViewStep* step = m_steps.at( m_currentStep ); if ( step->isAtBeginning() && m_currentStep > 0 ) { m_currentStep--; m_stack->setCurrentIndex( m_currentStep ); step->onLeave(); m_steps.at( m_currentStep )->onActivate(); emit currentStepChanged(); } else if ( !step->isAtBeginning() ) step->back(); else return; m_next->setEnabled( m_steps.at( m_currentStep )->isNextEnabled() ); m_back->setEnabled( m_steps.at( m_currentStep )->isBackEnabled() ); if ( m_currentStep == 0 && m_steps.first()->isAtBeginning() ) m_back->setEnabled( false ); if ( !( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) ) { m_quit->setText( tr( "&Cancel" ) ); m_quit->setToolTip( tr( "Cancel installation without changing the system." ) ); } } bool ViewManager::confirmCancelInstallation() { // If it's NOT the last page of the last step, we ask for confirmation if ( !( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) ) { QMessageBox mb( QMessageBox::Question, tr( "Cancel installation?" ), tr( "Do you really want to cancel the current install process?\n" "The installer will quit and all changes will be lost." ), QMessageBox::Yes | QMessageBox::No, m_widget ); mb.setDefaultButton( QMessageBox::No ); mb.button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); mb.button( QMessageBox::No )->setText( tr( "&No" ) ); int response = mb.exec(); return response == QMessageBox::Yes; } else // Means we're at the end, no need to confirm. return true; } } // namespace calamares-3.1.12/src/libcalamaresui/ViewManager.h000066400000000000000000000104761322271446000216610ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef VIEWMANAGER_H #define VIEWMANAGER_H #include "UiDllMacro.h" #include "Typedefs.h" #include #include #include namespace Calamares { class ViewStep; class ExecutionViewStep; /** * @brief The ViewManager class handles progression through view pages. * @note Singleton object, only use through ViewManager::instance(). */ class UIDLLEXPORT ViewManager : public QObject { Q_OBJECT public: /** * @brief instance access to the ViewManager singleton. * @return pointer to the singleton instance. */ static ViewManager* instance(); static ViewManager* instance( QObject* parent ); /** * @brief centralWidget always returns the central widget in the Calamares main * window. * @return a pointer to the active QWidget (usually a wizard page provided by a * view module). */ QWidget* centralWidget(); /** * @brief addViewStep appends a view step to the roster. * @param step a pointer to the ViewStep object to add. * @note a ViewStep is the active instance of a view module, it aggregates one * or more view pages, plus zero or more jobs which may be created at runtime. */ void addViewStep( ViewStep* step ); /** * @brief viewSteps returns the list of currently present view steps. * @return the ViewStepList. * This should only return an empty list before startup is complete. */ ViewStepList viewSteps() const; /** * @brief currentStep returns the currently active ViewStep, i.e. the ViewStep * which owns the currently visible view page. * @return the active ViewStep. Do not confuse this with centralWidget(). * @see ViewStep::centralWidget */ ViewStep* currentStep() const; /** * @brief currentStepIndex returns the index of the currently active ViewStep. * @return the index. */ int currentStepIndex() const; /** * @ brief Called when "Cancel" is clicked; asks for confirmation. * Other means of closing Calamares also call this method, e.g. alt-F4. * At the end of installation, no confirmation is asked. Returns true * if the user confirms closing the window. */ bool confirmCancelInstallation(); public slots: /** * @brief next moves forward to the next page of the current ViewStep (if any), * or to the first page of the next ViewStep if the current ViewStep doesn't * have any more pages. */ void next(); /** * @brief back moves backward to the previous page of the current ViewStep (if any), * or to the last page of the previous ViewStep if the current ViewStep doesn't * have any pages before the current one. */ void back(); /** * @brief onInstallationFailed displays an error message when a fatal failure * happens in a ViewStep. * @param message the error string. * @param details the details string. */ void onInstallationFailed( const QString& message, const QString& details ); signals: void currentStepChanged(); void enlarge( QSize enlarge ) const; // See ViewStep::enlarge() private: explicit ViewManager( QObject* parent = nullptr ); virtual ~ViewManager(); void insertViewStep( int before, ViewStep* step ); static ViewManager* s_instance; ViewStepList m_steps; int m_currentStep; QWidget* m_widget; QStackedWidget* m_stack; QPushButton* m_back; QPushButton* m_next; QPushButton* m_quit; }; } #endif // VIEWMANAGER_H calamares-3.1.12/src/libcalamaresui/libcalamaresui.qrc000066400000000000000000000026531322271446000227650ustar00rootroot00000000000000 ../../data/images/yes.svgz ../../data/images/no.svgz ../../data/images/information.svgz ../../data/images/fail.svgz ../../data/images/bugs.svg ../../data/images/help.svg ../../data/images/release.svg ../../data/images/partition-disk.svg ../../data/images/partition-partition.svg ../../data/images/partition-alongside.svg ../../data/images/partition-erase-auto.svg ../../data/images/partition-manual.svg ../../data/images/partition-replace-os.svg ../../data/images/boot-environment.svg ../../data/images/partition-table.svg ../../data/images/squid.svg calamares-3.1.12/src/libcalamaresui/modulesystem/000077500000000000000000000000001322271446000220255ustar00rootroot00000000000000calamares-3.1.12/src/libcalamaresui/modulesystem/CppJobModule.cpp000066400000000000000000000065011322271446000250560ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2016, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CppJobModule.h" #include "utils/PluginFactory.h" #include "utils/Logger.h" #include "CppJob.h" #include #include namespace Calamares { Module::Type CppJobModule::type() const { return Job; } Module::Interface CppJobModule::interface() const { return QtPluginInterface; } void CppJobModule::loadSelf() { if ( m_loader ) { PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); if ( !pf ) { cDebug() << Q_FUNC_INFO << m_loader->errorString(); return; } CppJob *cppJob = pf->create< Calamares::CppJob >(); if ( !cppJob ) { cDebug() << Q_FUNC_INFO << m_loader->errorString(); return; } // cDebug() << "CppJobModule loading self for instance" << instanceKey() // << "\nCppJobModule at address" << this // << "\nCalamares::PluginFactory at address" << pf // << "\nCppJob at address" << cppJob; cppJob->setModuleInstanceKey( instanceKey() ); cppJob->setConfigurationMap( m_configurationMap ); m_job = Calamares::job_ptr( static_cast< Calamares::Job * >( cppJob ) ); m_loaded = true; cDebug() << "CppJobModule" << instanceKey() << "loading complete."; } } QList< job_ptr > CppJobModule::jobs() const { return QList< job_ptr >() << m_job; } void CppJobModule::initFrom( const QVariantMap& moduleDescriptor ) { Module::initFrom( moduleDescriptor ); QDir directory( location() ); QString load; if ( !moduleDescriptor.value( "load" ).toString().isEmpty() ) { load = moduleDescriptor.value( "load" ).toString(); load = directory.absoluteFilePath( load ); } // If a load path is not specified, we look for a plugin to load in the directory. if ( load.isEmpty() || !QLibrary::isLibrary( load ) ) { const QStringList ls = directory.entryList( QStringList{ "*.so" } ); if ( !ls.isEmpty() ) { for ( QString entry : ls ) { entry = directory.absoluteFilePath( entry ); if ( QLibrary::isLibrary( entry ) ) { load = entry; break; } } } } m_loader = new QPluginLoader( load ); } CppJobModule::CppJobModule() : Module() , m_loader( nullptr ) { } CppJobModule::~CppJobModule() { delete m_loader; } } // namespace Calamares calamares-3.1.12/src/libcalamaresui/modulesystem/CppJobModule.h000066400000000000000000000031001322271446000245130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2016, Kevin Kofler * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_CPPJOBMODULE_H #define CALAMARES_CPPJOBMODULE_H #include "UiDllMacro.h" #include "Module.h" class QPluginLoader; namespace Calamares { class UIDLLEXPORT CppJobModule : public Module { public: Type type() const override; Interface interface() const override; void loadSelf() override; QList< job_ptr > jobs() const override; protected: void initFrom( const QVariantMap& moduleDescriptor ) override; private: friend class Module; //so only the superclass can instantiate explicit CppJobModule(); virtual ~CppJobModule() override; QPluginLoader* m_loader; job_ptr m_job; }; } // namespace Calamares #endif // CALAMARES_CPPJOBMODULE_H calamares-3.1.12/src/libcalamaresui/modulesystem/Module.cpp000066400000000000000000000160421322271446000237610ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "Module.h" #include "ProcessJobModule.h" #include "CppJobModule.h" #include "ViewModule.h" #include "utils/CalamaresUtils.h" #include "utils/YamlUtils.h" #include "utils/Logger.h" #include "Settings.h" #include "CalamaresConfig.h" #ifdef WITH_PYTHON #include "PythonJobModule.h" #endif #ifdef WITH_PYTHONQT #include "PythonQtViewModule.h" #endif #include #include #include #include #include // Example module.desc /* --- type: "view" #job or view name: "foo" #the module name. must be unique and same as the parent directory interface: "qtplugin" #can be: qtplugin, python, process, ... */ namespace Calamares { Module::~Module() {} Module* Module::fromDescriptor( const QVariantMap& moduleDescriptor, const QString& instanceId, const QString& configFileName, const QString& moduleDirectory ) { Module* m = nullptr; QString typeString = moduleDescriptor.value( "type" ).toString(); QString intfString = moduleDescriptor.value( "interface" ).toString(); if ( typeString.isEmpty() || intfString.isEmpty() ) { cLog() << Q_FUNC_INFO << "bad module descriptor format" << instanceId; return nullptr; } if ( ( typeString == "view" ) || ( typeString == "viewmodule" ) ) { if ( intfString == "qtplugin" ) { m = new ViewModule(); } else if ( intfString == "pythonqt" ) { #ifdef WITH_PYTHONQT m = new PythonQtViewModule(); #else cLog() << "PythonQt modules are not supported in this version of Calamares."; #endif } else cLog() << "Bad interface" << intfString << "for module type" << typeString; } else if ( typeString == "job" ) { if ( intfString == "qtplugin" ) { m = new CppJobModule(); } else if ( intfString == "process" ) { m = new ProcessJobModule(); } else if ( intfString == "python" ) { #ifdef WITH_PYTHON m = new PythonJobModule(); #else cLog() << "Python modules are not supported in this version of Calamares."; #endif } else cLog() << "Bad interface" << intfString << "for module type" << typeString; } else cLog() << "Bad module type" << typeString; if ( !m ) { cLog() << "Bad module type (" << typeString << ") or interface string (" << intfString << ") for module " << instanceId; return nullptr; } QDir moduleDir( moduleDirectory ); if ( moduleDir.exists() && moduleDir.isReadable() ) m->m_directory = moduleDir.absolutePath(); else { cLog() << Q_FUNC_INFO << "bad module directory" << instanceId; delete m; return nullptr; } m->m_instanceId = instanceId; m->initFrom( moduleDescriptor ); try { m->loadConfigurationFile( configFileName ); } catch ( YAML::Exception& e ) { cDebug() << "WARNING: YAML parser error " << e.what(); delete m; return nullptr; } return m; } void Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Exception { QStringList configFilesByPriority; if ( CalamaresUtils::isAppDataDirOverridden() ) { configFilesByPriority.append( CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ) ); } else { if ( Settings::instance()->debugMode() ) { configFilesByPriority.append( QDir( QDir::currentPath() ).absoluteFilePath( QString( "src/modules/%1/%2" ).arg( m_name ) .arg( configFileName ) ) ); } configFilesByPriority.append( QString( "/etc/calamares/modules/%1" ).arg( configFileName ) ); configFilesByPriority.append( CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%2" ).arg( configFileName ) ) ); } foreach ( const QString& path, configFilesByPriority ) { QFile configFile( path ); if ( configFile.exists() && configFile.open( QFile::ReadOnly | QFile::Text ) ) { QByteArray ba = configFile.readAll(); YAML::Node doc = YAML::Load( ba.constData() ); if ( doc.IsNull() ) { // Special case: empty config files are valid, // but aren't a map. return; } if ( !doc.IsMap() ) { cLog() << Q_FUNC_INFO << "bad module configuration format" << path; return; } m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ).toMap(); return; } else continue; } } QString Module::name() const { return m_name; } QString Module::instanceId() const { return m_instanceId; } QString Module::instanceKey() const { return QString( "%1@%2" ).arg( m_name ) .arg( m_instanceId ); } QStringList Module::requiredModules() const { return m_requiredModules; } QString Module::location() const { return m_directory; } QString Module::typeString() const { switch ( type() ) { case Job: return "Job Module"; case View: return "View Module"; } return QString(); } QString Module::interfaceString() const { switch ( interface() ) { case ProcessInterface: return "External process"; case PythonInterface: return "Python (Boost.Python)"; case PythonQtInterface: return "Python (experimental)"; case QtPluginInterface: return "Qt Plugin"; } return QString(); } bool Module::isLoaded() const { return m_loaded; } QVariantMap Module::configurationMap() { return m_configurationMap; } Module::Module() : m_loaded( false ) {} void Module::initFrom( const QVariantMap& moduleDescriptor ) { m_name = moduleDescriptor.value( "name" ).toString(); } } //ns calamares-3.1.12/src/libcalamaresui/modulesystem/Module.h000066400000000000000000000134071322271446000234300ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_MODULE_H #define CALAMARES_MODULE_H #include "UiDllMacro.h" #include #include #include namespace Calamares { class Module; } void operator>>( const QVariantMap& moduleDescriptor, Calamares::Module* m ); namespace Calamares { /** * @brief The Module class is a common supertype for Calamares modules. * It enforces a common interface for all the different types of modules, and it * takes care of creating an object of the correct type starting from a module * descriptor structure. */ class UIDLLEXPORT Module { public: /** * @brief The Type enum represents the intended functionality of the module * Every module is either a job module or a view module. * A job module is a single Calamares job. * A view module has a UI (one or more view pages) and zero-to-many jobs. */ enum Type { Job, View }; /** * @brief The Interface enum represents the interface through which the module * talks to Calamares. * Not all Type-Interface associations are valid. */ enum Interface { QtPluginInterface, PythonInterface, ProcessInterface, PythonQtInterface }; virtual ~Module(); /** * @brief fromDescriptor creates a new Module object of the correct type. * @param moduleDescriptor a module descriptor, already parsed into a variant map. * @param instanceId the instance id of the new module instance. * @param configFileName the name of the configuration file to read. * @param moduleDirectory the path to the directory with this module's files. * @return a pointer to an object of a subtype of Module. */ static Module* fromDescriptor( const QVariantMap& moduleDescriptor, const QString& instanceId, const QString& configFileName, const QString& moduleDirectory ); /** * @brief name returns the name of this module. * @return a string with this module's name. */ virtual QString name() const final; /** * @brief instanceId returns the instance id of this module. * @return a string with this module's instance id. */ virtual QString instanceId() const final; /** * @brief instanceKey returns the instance key of this module. * @return a string with the instance key. * A module instance's instance key is modulename\@instanceid. * For instance, "partition\@partition" (default configuration) or * "locale\@someconfig" (custom configuration) */ virtual QString instanceKey() const final; /** * @brief requiredModules a list of names of modules required by this one. * @return the list of names. * The module dependencies system is currently incomplete and unused. */ virtual QStringList requiredModules() const; /** * @brief location returns the full path of this module's directory. * @return the path. */ virtual QString location() const final; /** * @brief type returns the Type of this module object. * @return the type enum value. */ virtual Type type() const = 0; /** * @brief typeString returns a user-visible string for the module's type. * @return the type string. */ virtual QString typeString() const; /** * @brief interface the Interface used by this module. * @return the interface enum value. */ virtual Interface interface() const = 0; /** * @brief interface returns a user-visible string for the module's interface. * @return the interface string. */ virtual QString interfaceString() const; /** * @brief isLoaded reports on the loaded status of a module. * @return true if the module's loading phase has finished, otherwise false. */ virtual bool isLoaded() const; /** * @brief loadSelf initialized the module. * Subclasses must reimplement this depending on the module type and interface. */ virtual void loadSelf() = 0; /** * @brief jobs returns any jobs exposed by this module. * @return a list of jobs (can be empty). */ virtual QList< job_ptr > jobs() const = 0; /** * @brief configurationMap returns the contents of the configuration file for * this module instance. * @return the instance's configuration, already parsed from YAML into a variant map. */ QVariantMap configurationMap(); protected: explicit Module(); virtual void initFrom( const QVariantMap& moduleDescriptor ); bool m_loaded; QVariantMap m_configurationMap; private: void loadConfigurationFile( const QString& configFileName ); //throws YAML::Exception QString m_name; QStringList m_requiredModules; QString m_directory; QString m_instanceId; friend void ::operator>>( const QVariantMap& moduleDescriptor, Calamares::Module* m ); }; } #endif // CALAMARES_MODULE_H calamares-3.1.12/src/libcalamaresui/modulesystem/ModuleManager.cpp000066400000000000000000000317631322271446000252630ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ModuleManager.h" #include "ExecutionViewStep.h" #include "Module.h" #include "utils/Logger.h" #include "utils/YamlUtils.h" #include "Settings.h" #include "ViewManager.h" #include #include #include #include #define MODULE_CONFIG_FILENAME "module.desc" namespace Calamares { ModuleManager* ModuleManager::s_instance = nullptr; ModuleManager* ModuleManager::instance() { return s_instance; } ModuleManager::ModuleManager( const QStringList& paths, QObject* parent ) : QObject( parent ) , m_paths( paths ) { Q_ASSERT( !s_instance ); s_instance = this; } ModuleManager::~ModuleManager() { // The map is populated with Module::fromDescriptor(), which allocates on the heap. for( auto moduleptr : m_loadedModulesByInstanceKey ) { delete moduleptr; } } void ModuleManager::init() { QTimer::singleShot( 0, this, &ModuleManager::doInit ); } void ModuleManager::doInit() { // We start from a list of paths in m_paths. Each of those is a directory that // might (should) contain Calamares modules of any type/interface. // For each modules search path (directory), it is expected that each module // lives in its own subdirectory. This subdirectory must have the same name as // the module name, and must contain a settings file named module.desc. // If at any time the module loading procedure finds something unexpected, it // silently skips to the next module or search path. --Teo 6/2014 for ( const QString& path : m_paths ) { QDir currentDir( path ); if ( currentDir.exists() && currentDir.isReadable() ) { const QStringList subdirs = currentDir.entryList( QDir::AllDirs | QDir::NoDotAndDotDot ); for ( const QString& subdir : subdirs ) { currentDir.setPath( path ); bool success = currentDir.cd( subdir ); if ( success ) { QFileInfo descriptorFileInfo( currentDir.absoluteFilePath( MODULE_CONFIG_FILENAME ) ); if ( ! ( descriptorFileInfo.exists() && descriptorFileInfo.isReadable() ) ) { cDebug() << Q_FUNC_INFO << "unreadable file: " << descriptorFileInfo.absoluteFilePath(); continue; } QFile descriptorFile( descriptorFileInfo.absoluteFilePath() ); QVariant moduleDescriptor; if ( descriptorFile.exists() && descriptorFile.open( QFile::ReadOnly | QFile::Text ) ) { QByteArray ba = descriptorFile.readAll(); try { YAML::Node doc = YAML::Load( ba.constData() ); moduleDescriptor = CalamaresUtils::yamlToVariant( doc ); } catch ( YAML::Exception& e ) { cDebug() << "WARNING: YAML parser error " << e.what(); continue; } } if ( moduleDescriptor.isValid() && !moduleDescriptor.isNull() && moduleDescriptor.type() == QVariant::Map ) { QVariantMap moduleDescriptorMap = moduleDescriptor.toMap(); if ( moduleDescriptorMap.value( "name" ) == currentDir.dirName() && !m_availableDescriptorsByModuleName.contains( moduleDescriptorMap.value( "name" ).toString() ) ) { m_availableDescriptorsByModuleName.insert( moduleDescriptorMap.value( "name" ).toString(), moduleDescriptorMap ); m_moduleDirectoriesByModuleName.insert( moduleDescriptorMap.value( "name" ).toString(), descriptorFileInfo.absoluteDir().absolutePath() ); } } } else { cDebug() << Q_FUNC_INFO << "cannot cd into module directory " << path << "/" << subdir; } } } else { cDebug() << "ModuleManager bad search path" << path; } } // At this point m_availableModules is filled with whatever was found in the // search paths. checkDependencies(); emit initDone(); } QStringList ModuleManager::loadedInstanceKeys() { return m_loadedModulesByInstanceKey.keys(); } QVariantMap ModuleManager::moduleDescriptor( const QString& name ) { return m_availableDescriptorsByModuleName.value( name ); } Module* ModuleManager::moduleInstance( const QString& instanceKey ) { return m_loadedModulesByInstanceKey.value( instanceKey ); } void ModuleManager::loadModules() { QTimer::singleShot( 0, this, [ this ]() { QList< QMap< QString, QString > > customInstances = Settings::instance()->customModuleInstances(); const auto modulesSequence = Settings::instance()->modulesSequence(); for ( const auto &modulePhase : modulesSequence ) { ModuleAction currentAction = modulePhase.first; foreach ( const QString& moduleEntry, modulePhase.second ) { QStringList moduleEntrySplit = moduleEntry.split( '@' ); QString moduleName; QString instanceId; QString configFileName; if ( moduleEntrySplit.length() < 1 || moduleEntrySplit.length() > 2 ) { cDebug() << "Wrong module entry format for module" << moduleEntry << "." << "\nCalamares will now quit."; qApp->exit( 1 ); return; } moduleName = moduleEntrySplit.first(); instanceId = moduleEntrySplit.last(); configFileName = QString( "%1.conf" ).arg( moduleName ); if ( !m_availableDescriptorsByModuleName.contains( moduleName ) || m_availableDescriptorsByModuleName.value( moduleName ).isEmpty() ) { cDebug() << "Module" << moduleName << "not found in module search paths." << "\nCalamares will now quit."; qApp->exit( 1 ); return; } auto findCustomInstance = [ customInstances ]( const QString& module, const QString& id) -> int { for ( int i = 0; i < customInstances.count(); ++i ) { auto thisInstance = customInstances[ i ]; if ( thisInstance.value( "module" ) == module && thisInstance.value( "id" ) == id ) return i; } return -1; }; if ( moduleName != instanceId ) //means this is a custom instance { if ( findCustomInstance( moduleName, instanceId ) > -1 ) { configFileName = customInstances[ findCustomInstance( moduleName, instanceId ) ].value( "config" ); } else //ought to be a custom instance, but cannot find instance entry { cDebug() << "Custom instance" << moduleEntry << "not found in custom instances section." << "\nCalamares will now quit."; qApp->exit( 1 ); return; } } // So now we can assume that the module entry is at least valid, // that we have a descriptor on hand (and therefore that the // module exists), and that the instance is either default or // defined in the custom instances section. // We still don't know whether the config file for the entry // exists and is valid, but that's the only thing that could fail // from this point on. -- Teo 8/2015 QString instanceKey = QString( "%1@%2" ) .arg( moduleName ) .arg( instanceId ); Module* thisModule = m_loadedModulesByInstanceKey.value( instanceKey, nullptr ); if ( thisModule && !thisModule->isLoaded() ) { cDebug() << "Module" << instanceKey << "exists but not loaded." << "\nCalamares will now quit."; qApp->exit( 1 ); return; } if ( thisModule && thisModule->isLoaded() ) { cDebug() << "Module" << instanceKey << "already loaded."; } else { thisModule = Module::fromDescriptor( m_availableDescriptorsByModuleName.value( moduleName ), instanceId, configFileName, m_moduleDirectoriesByModuleName.value( moduleName ) ); if ( !thisModule ) { cDebug() << "Module" << instanceKey << "cannot be created from descriptor."; Q_ASSERT( thisModule ); continue; } // If it's a ViewModule, it also appends the ViewStep to the ViewManager. thisModule->loadSelf(); m_loadedModulesByInstanceKey.insert( instanceKey, thisModule ); Q_ASSERT( thisModule->isLoaded() ); if ( !thisModule->isLoaded() ) { cDebug() << "Module" << moduleName << "loading FAILED"; continue; } } // At this point we most certainly have a pointer to a loaded module in // thisModule. We now need to enqueue jobs info into an EVS. if ( currentAction == Calamares::Exec ) { ExecutionViewStep* evs = qobject_cast< ExecutionViewStep* >( Calamares::ViewManager::instance()->viewSteps().last() ); if ( !evs ) // If the last step is not an EVS, we must create it. { evs = new ExecutionViewStep( ViewManager::instance() ); ViewManager::instance()->addViewStep( evs ); } evs->appendJobModuleInstanceKey( instanceKey ); } } } emit modulesLoaded(); } ); } void ModuleManager::checkDependencies() { // This goes through the map of available modules, and deletes those whose // dependencies are not met, if any. bool somethingWasRemovedBecauseOfUnmetDependencies = false; forever { for ( auto it = m_availableDescriptorsByModuleName.begin(); it != m_availableDescriptorsByModuleName.end(); ++it ) { foreach ( const QString& depName, (*it).value( "requiredModules" ).toStringList() ) { if ( !m_availableDescriptorsByModuleName.contains( depName ) ) { somethingWasRemovedBecauseOfUnmetDependencies = true; m_availableDescriptorsByModuleName.erase( it ); break; } } if ( somethingWasRemovedBecauseOfUnmetDependencies ) break; } if ( !somethingWasRemovedBecauseOfUnmetDependencies ) break; } } } calamares-3.1.12/src/libcalamaresui/modulesystem/ModuleManager.h000066400000000000000000000061111322271446000247150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef MODULELOADER_H #define MODULELOADER_H #include "Typedefs.h" #include #include #include namespace Calamares { class Module; /** * @brief The ModuleManager class is a singleton which manages Calamares modules. * * It goes through the module search directories and reads module metadata. It then * constructs objects of type Module, loads them and makes them accessible by their * instance key. */ class ModuleManager : public QObject { Q_OBJECT public: explicit ModuleManager( const QStringList& paths, QObject* parent = nullptr ); virtual ~ModuleManager(); static ModuleManager* instance(); /** * @brief init goes through the module search directories and gets a list of * modules available for loading, along with their metadata. * This information is stored as a map of Module* objects, indexed by name. */ void init(); /** * @brief loadedInstanceKeys returns a list of instance keys for the available * modules. * @return a QStringList with the instance keys. */ QStringList loadedInstanceKeys(); /** * @brief moduleDescriptor returns the module descriptor structure for a given module. * @param name the name of the module for which to return the module descriptor. * @return the module descriptor, as a variant map already parsed from YAML. */ QVariantMap moduleDescriptor( const QString& name ); /** * @brief moduleInstance returns a Module object for a given instance key. * @param instanceKey the instance key for a module instance. * @return a pointer to an object of a subtype of Module. */ Module* moduleInstance( const QString& instanceKey ); /** * @brief loadModules initiates the asynchronous module loading operation. * When this is done, the signal modulesLoaded is emitted. */ void loadModules(); signals: void initDone(); void modulesLoaded(); private slots: void doInit(); private: void checkDependencies(); QMap< QString, QVariantMap > m_availableDescriptorsByModuleName; QMap< QString, QString > m_moduleDirectoriesByModuleName; QMap< QString, Module* > m_loadedModulesByInstanceKey; const QStringList m_paths; static ModuleManager* s_instance; }; } #endif // MODULELOADER_H calamares-3.1.12/src/libcalamaresui/modulesystem/ProcessJobModule.cpp000066400000000000000000000045511322271446000257550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ProcessJobModule.h" #include "ProcessJob.h" #include namespace Calamares { Module::Type ProcessJobModule::type() const { return Job; } Module::Interface ProcessJobModule::interface() const { return ProcessInterface; } void ProcessJobModule::loadSelf() { if ( m_loaded ) return; m_job = job_ptr( new ProcessJob( m_command, m_workingPath, m_runInChroot, m_secondsTimeout ) ); m_loaded = true; } QList< job_ptr > ProcessJobModule::jobs() const { return QList< job_ptr >() << m_job; } void ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor ) { Module::initFrom( moduleDescriptor ); QDir directory( location() ); m_workingPath = directory.absolutePath(); if ( !moduleDescriptor.value( "command" ).toString().isEmpty() ) { m_command = moduleDescriptor.value( "command" ).toString(); } m_secondsTimeout = 30; if ( moduleDescriptor.contains( "timeout" ) && !moduleDescriptor.value( "timeout" ).isNull() ) { m_secondsTimeout = moduleDescriptor.value( "timeout" ).toInt(); } m_runInChroot = false; if ( moduleDescriptor.contains( "chroot" )&& !moduleDescriptor.value( "chroot" ).isNull() ) { m_runInChroot = moduleDescriptor.value( "chroot" ).toBool(); } } ProcessJobModule::ProcessJobModule() : Module() , m_secondsTimeout( 30 ) , m_runInChroot( false ) {} ProcessJobModule::~ProcessJobModule() {} } // namespace Calamares calamares-3.1.12/src/libcalamaresui/modulesystem/ProcessJobModule.h000066400000000000000000000030461322271446000254200ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PROCESSJOBMODULE_H #define CALAMARES_PROCESSJOBMODULE_H #include "Module.h" #include "UiDllMacro.h" namespace Calamares { class UIDLLEXPORT ProcessJobModule : public Module { public: Type type() const override; Interface interface() const override; void loadSelf() override; QList< job_ptr > jobs() const override; protected: void initFrom( const QVariantMap& moduleDescriptor ) override; private: friend class Module; explicit ProcessJobModule(); virtual ~ProcessJobModule() override; QString m_command; QString m_workingPath; int m_secondsTimeout; bool m_runInChroot; job_ptr m_job; }; } // namespace Calamares #endif // CALAMARES_PROCESSJOBMODULE_H calamares-3.1.12/src/libcalamaresui/modulesystem/PythonJobModule.cpp000066400000000000000000000035521322271446000256200ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonJobModule.h" #include "PythonJob.h" #include namespace Calamares { Module::Type PythonJobModule::type() const { return Job; } Module::Interface PythonJobModule::interface() const { return PythonInterface; } void PythonJobModule::loadSelf() { if ( m_loaded ) return; m_job = Calamares::job_ptr( new PythonJob( m_scriptFileName, m_workingPath, m_configurationMap ) ); m_loaded = true; } QList< job_ptr > PythonJobModule::jobs() const { return QList< job_ptr >() << m_job; } void PythonJobModule::initFrom( const QVariantMap& moduleDescriptor ) { Module::initFrom( moduleDescriptor ); QDir directory( location() ); m_workingPath = directory.absolutePath(); if ( !moduleDescriptor.value( "script" ).toString().isEmpty() ) { m_scriptFileName = moduleDescriptor.value( "script" ).toString(); } } PythonJobModule::PythonJobModule() : Module() {} PythonJobModule::~PythonJobModule() {} } // namespace Calamares calamares-3.1.12/src/libcalamaresui/modulesystem/PythonJobModule.h000066400000000000000000000026771322271446000252740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PYTHONJOBMODULE_H #define CALAMARES_PYTHONJOBMODULE_H #include "Module.h" #include "UiDllMacro.h" namespace Calamares { class UIDLLEXPORT PythonJobModule : public Module { public: Type type() const override; Interface interface() const override; void loadSelf() override; QList< job_ptr > jobs() const override; protected: void initFrom( const QVariantMap& moduleDescriptor ) override; private: friend class Module; explicit PythonJobModule(); virtual ~PythonJobModule() override; QString m_scriptFileName; QString m_workingPath; job_ptr m_job; }; } // namespace Calamares #endif // CALAMARES_PYTHONJOBMODULE_H calamares-3.1.12/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp000066400000000000000000000145621322271446000263300ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtViewModule.h" #include "utils/Logger.h" #include "viewpages/ViewStep.h" #include "viewpages/PythonQtViewStep.h" #include "ViewManager.h" #include "CalamaresConfig.h" #include "viewpages/PythonQtGlobalStorageWrapper.h" #include "viewpages/PythonQtUtilsWrapper.h" #include "GlobalStorage.h" #include "JobQueue.h" #include #include #include #include static QPointer< GlobalStorage > s_gs = nullptr; static QPointer< Utils > s_utils = nullptr; namespace Calamares { Module::Type PythonQtViewModule::type() const { return View; } Module::Interface PythonQtViewModule::interface() const { return PythonQtInterface; } void PythonQtViewModule::loadSelf() { if ( !m_scriptFileName.isEmpty() ) { if ( PythonQt::self() == nullptr ) { if ( Py_IsInitialized() ) PythonQt::init( PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut | PythonQt::PythonAlreadyInitialized ); else PythonQt::init(); PythonQt_QtAll::init(); cDebug() << "Initializing PythonQt bindings." << "This should only happen once."; //TODO: register classes here into the PythonQt environment, like this: //PythonQt::self()->registerClass( &PythonQtViewStep::staticMetaObject, // "calamares" ); // We only do the following to force PythonQt to create a submodule // "calamares" for us to put our static objects in PythonQt::self()->registerClass( &::GlobalStorage::staticMetaObject, "calamares" ); // Get a PythonQtObjectPtr to the PythonQt.calamares submodule PythonQtObjectPtr pqtm = PythonQt::priv()->pythonQtModule(); PythonQtObjectPtr cala = PythonQt::self()->lookupObject( pqtm, "calamares" ); // Prepare GlobalStorage object, in module PythonQt.calamares if ( !s_gs ) s_gs = new ::GlobalStorage( Calamares::JobQueue::instance()->globalStorage() ); cala.addObject( "global_storage", s_gs ); // Prepare Utils object, in module PythonQt.calamares if ( !s_utils ) s_utils = new ::Utils( Calamares::JobQueue::instance()->globalStorage() ); cala.addObject( "utils", s_utils ); // Basic stdout/stderr handling QObject::connect( PythonQt::self(), &PythonQt::pythonStdOut, []( const QString& message ) { cDebug() << "PythonQt OUT>" << message; } ); QObject::connect( PythonQt::self(), &PythonQt::pythonStdErr, []( const QString& message ) { cDebug() << "PythonQt ERR>" << message; } ); } QDir workingDir( m_workingPath ); if ( !workingDir.exists() ) { cDebug() << "Invalid working directory" << m_workingPath << "for module" << name(); return; } QString fullPath = workingDir.absoluteFilePath( m_scriptFileName ); QFileInfo scriptFileInfo( fullPath ); if ( !scriptFileInfo.isReadable() ) { cDebug() << "Invalid main script file path" << fullPath << "for module" << name(); return; } // Construct empty Python module with the given name PythonQtObjectPtr cxt = PythonQt::self()-> createModuleFromScript( name() ); if ( cxt.isNull() ) { cDebug() << "Cannot load PythonQt context from file" << fullPath << "for module" << name(); return; } QString calamares_module_annotation = "_calamares_module_typename = ''\n" "def calamares_module(viewmodule_type):\n" " global _calamares_module_typename\n" " _calamares_module_typename = viewmodule_type.__name__\n" " return viewmodule_type\n"; // Load in the decorator PythonQt::self()->evalScript( cxt, calamares_module_annotation ); // Load the module PythonQt::self()->evalFile( cxt, fullPath ); m_viewStep = new PythonQtViewStep( cxt ); cDebug() << "PythonQtViewModule loading self for instance" << instanceKey() << "\nPythonQtViewModule at address" << this << "\nViewStep at address" << m_viewStep; m_viewStep->setModuleInstanceKey( instanceKey() ); m_viewStep->setConfigurationMap( m_configurationMap ); ViewManager::instance()->addViewStep( m_viewStep ); m_loaded = true; cDebug() << "PythonQtViewModule" << instanceKey() << "loading complete."; } } QList< job_ptr > PythonQtViewModule::jobs() const { return m_viewStep->jobs(); } void PythonQtViewModule::initFrom( const QVariantMap& moduleDescriptor ) { Module::initFrom( moduleDescriptor ); QDir directory( location() ); m_workingPath = directory.absolutePath(); if ( !moduleDescriptor.value( "script" ).toString().isEmpty() ) { m_scriptFileName = moduleDescriptor.value( "script" ).toString(); } } PythonQtViewModule::PythonQtViewModule() : Module() { } PythonQtViewModule::~PythonQtViewModule() { } } // namespace Calamares calamares-3.1.12/src/libcalamaresui/modulesystem/PythonQtViewModule.h000066400000000000000000000030231322271446000257630ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_PYTHONQTVIEWMODULE_H #define CALAMARES_PYTHONQTVIEWMODULE_H #include "UiDllMacro.h" #include "Module.h" namespace Calamares { class ViewStep; class UIDLLEXPORT PythonQtViewModule : public Module { public: Type type() const override; Interface interface() const override; void loadSelf() override; QList< job_ptr > jobs() const override; protected: void initFrom( const QVariantMap& moduleDescriptor ) override; private: friend class Module; //so only the superclass can instantiate explicit PythonQtViewModule(); virtual ~PythonQtViewModule(); ViewStep* m_viewStep = nullptr; QString m_scriptFileName; QString m_workingPath; }; } // namespace Calamares #endif // CALAMARES_PYTHONQTVIEWMODULE_H calamares-3.1.12/src/libcalamaresui/modulesystem/ViewModule.cpp000066400000000000000000000065401322271446000246160ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ViewModule.h" #include "utils/PluginFactory.h" #include "utils/Logger.h" #include "viewpages/ViewStep.h" #include "ViewManager.h" #include #include namespace Calamares { Module::Type ViewModule::type() const { return View; } Module::Interface ViewModule::interface() const { return QtPluginInterface; } void ViewModule::loadSelf() { if ( m_loader ) { PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); if ( !pf ) { cDebug() << Q_FUNC_INFO << "No factory:" << m_loader->errorString(); return; } m_viewStep = pf->create< Calamares::ViewStep >(); if ( !m_viewStep ) { cDebug() << Q_FUNC_INFO << "create() failed" << m_loader->errorString(); return; } // cDebug() << "ViewModule loading self for instance" << instanceKey() // << "\nViewModule at address" << this // << "\nCalamares::PluginFactory at address" << pf // << "\nViewStep at address" << m_viewStep; m_viewStep->setModuleInstanceKey( instanceKey() ); m_viewStep->setConfigurationMap( m_configurationMap ); ViewManager::instance()->addViewStep( m_viewStep ); m_loaded = true; cDebug() << "ViewModule" << instanceKey() << "loading complete."; } } QList< job_ptr > ViewModule::jobs() const { return m_viewStep->jobs(); } void ViewModule::initFrom( const QVariantMap& moduleDescriptor ) { Module::initFrom( moduleDescriptor ); QDir directory( location() ); QString load; if ( !moduleDescriptor.value( "load" ).toString().isEmpty() ) { load = moduleDescriptor.value( "load" ).toString(); load = directory.absoluteFilePath( load ); } // If a load path is not specified, we look for a plugin to load in the directory. if ( load.isEmpty() || !QLibrary::isLibrary( load ) ) { const QStringList ls = directory.entryList( QStringList{ "*.so" } ); if ( !ls.isEmpty() ) { for ( QString entry : ls ) { entry = directory.absoluteFilePath( entry ); if ( QLibrary::isLibrary( entry ) ) { load = entry; break; } } } } m_loader = new QPluginLoader( load ); } ViewModule::ViewModule() : Module() , m_loader( nullptr ) { } ViewModule::~ViewModule() { delete m_loader; } } // namespace Calamares calamares-3.1.12/src/libcalamaresui/modulesystem/ViewModule.h000066400000000000000000000030331322271446000242550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_VIEWMODULE_H #define CALAMARES_VIEWMODULE_H #include "UiDllMacro.h" #include "Module.h" class QPluginLoader; namespace Calamares { class ViewStep; class UIDLLEXPORT ViewModule : public Module { public: Type type() const override; Interface interface() const override; void loadSelf() override; QList< job_ptr > jobs() const override; protected: void initFrom( const QVariantMap& moduleDescriptor ) override; private: friend class Module; //so only the superclass can instantiate explicit ViewModule(); virtual ~ViewModule() override; QPluginLoader* m_loader; ViewStep* m_viewStep = nullptr; }; } // namespace Calamares #endif // CALAMARES_VIEWMODULE_H calamares-3.1.12/src/libcalamaresui/utils/000077500000000000000000000000001322271446000204335ustar00rootroot00000000000000calamares-3.1.12/src/libcalamaresui/utils/CalamaresUtilsGui.cpp000066400000000000000000000134461322271446000245250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CalamaresUtilsGui.h" #include "ImageRegistry.h" #include #include #include #include #include #include #include namespace CalamaresUtils { static int s_defaultFontSize = 0; static int s_defaultFontHeight = 0; QPixmap defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) { Q_UNUSED( mode ); QPixmap pixmap; switch ( type ) { case Yes: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/yes.svgz", size ); break; case No: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/no.svgz", size ); break; case Information: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/information.svgz", size ); break; case Fail: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/fail.svgz", size ); break; case Bugs: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/bugs.svg", size ); break; case Help: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/help.svg", size ); break; case Release: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/release.svg", size ); break; case PartitionDisk: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-disk.svg", size ); break; case PartitionPartition: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-partition.svg", size ); break; case PartitionAlongside: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-alongside.svg", size ); break; case PartitionEraseAuto: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-erase-auto.svg", size ); break; case PartitionManual: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-manual.svg", size ); break; case PartitionReplaceOs: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-replace-os.svg", size ); break; case PartitionTable: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-table.svg", size ); break; case BootEnvironment: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/boot-environment.svg", size ); break; case Squid: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/squid.svg", size ); break; } if ( pixmap.isNull() ) { Q_ASSERT( false ); return QPixmap(); } return pixmap; } QPixmap createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPct ) { int height; int width; if ( !size.isEmpty() ) { height = size.height(); width = size.width(); } else { height = pixmap.height(); width = pixmap.width(); } if ( !height || !width ) return QPixmap(); QPixmap scaledAvatar = pixmap.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); if ( frameWidthPct == 0.00f ) return scaledAvatar; QPixmap frame( width, height ); frame.fill( Qt::transparent ); QPainter painter( &frame ); painter.setRenderHint( QPainter::Antialiasing ); QRect outerRect( 0, 0, width, height ); QBrush brush( scaledAvatar ); QPen pen; pen.setColor( Qt::transparent ); pen.setJoinStyle( Qt::RoundJoin ); painter.setBrush( brush ); painter.setPen( pen ); painter.drawRoundedRect( outerRect, qreal(frameWidthPct) * 100.0, qreal(frameWidthPct) * 100.0, Qt::RelativeSize ); /* painter.setBrush( Qt::transparent ); painter.setPen( Qt::white ); painter.drawRoundedRect( outerRect, frameWidthPct, frameWidthPct, Qt::RelativeSize ); */ return frame; } void unmarginLayout( QLayout* layout ) { layout->setContentsMargins( 0, 0, 0, 0 ); layout->setMargin( 0 ); layout->setSpacing( 0 ); for ( int i = 0; i < layout->count(); i++ ) { QLayout* childLayout = layout->itemAt( i )->layout(); if ( childLayout ) unmarginLayout( childLayout ); } } int defaultFontSize() { return s_defaultFontSize; } int defaultFontHeight() { if ( s_defaultFontHeight <= 0 ) { QFont f; f.setPointSize( defaultFontSize() ); s_defaultFontHeight = QFontMetrics( f ).height(); } return s_defaultFontHeight; } QFont defaultFont() { QFont f; f.setPointSize( defaultFontSize() ); return f; } void setDefaultFontSize( int points ) { s_defaultFontSize = points; } QSize defaultIconSize() { const int w = int(defaultFontHeight() * 1.6); return QSize( w, w ); } void clearLayout( QLayout* layout ) { while ( QLayoutItem* item = layout->takeAt( 0 ) ) { if ( QWidget* widget = item->widget() ) widget->deleteLater(); if ( QLayout* childLayout = item->layout() ) clearLayout( childLayout ); delete item; } } } calamares-3.1.12/src/libcalamaresui/utils/CalamaresUtilsGui.h000066400000000000000000000071631322271446000241710ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARESUTILSGUI_H #define CALAMARESUTILSGUI_H #include "utils/CalamaresUtils.h" #include "UiDllMacro.h" #include #include class QLayout; namespace CalamaresUtils { /** * @brief The ImageType enum lists all common Calamares icons. * Icons are loaded from SVGs and cached. Each icon has an enum value, through which * it can be accessed. * You can forward-declare this as: * enum ImageType : int; */ enum ImageType : int { Yes, No, Information, Fail, Bugs, Help, Release, PartitionDisk, PartitionPartition, PartitionAlongside, PartitionEraseAuto, PartitionManual, PartitionReplaceOs, PartitionTable, BootEnvironment, Squid }; /** * @brief The ImageMode enum contains different transformations that can be applied. * Most of these are currently unused. */ enum ImageMode { Original, CoverInCase, Grid, DropShadow, RoundedCorners }; /** * @brief defaultPixmap returns a resized and/or transformed pixmap for a given * ImageType. * @param type the ImageType i.e. the enum value for an SVG. * @param mode the transformation to apply (default: no transformation). * @param size the target pixmap size (default: original SVG size). * @return the new pixmap. */ UIDLLEXPORT QPixmap defaultPixmap( ImageType type, ImageMode mode = CalamaresUtils::Original, const QSize& size = QSize( 0, 0 ) ); /** * @brief createRoundedImage returns a rounded version of a pixmap. * @param avatar the input pixmap. * @param size the new size. * @param frameWidthPct the frame size, as percentage of width. * @return the transformed pixmap. * This one is currently unused. */ UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar, const QSize& size, float frameWidthPct = 0.20f ); /** * @brief unmarginLayout recursively walks the QLayout tree and removes all margins. * @param layout the layout to unmargin. */ UIDLLEXPORT void unmarginLayout( QLayout* layout ); /** * @brief clearLayout recursively walks the QLayout tree and deletes all the child * widgets and layouts. * @param layout the layout to clear. */ UIDLLEXPORT void clearLayout( QLayout* layout ); UIDLLEXPORT void setDefaultFontSize( int points ); UIDLLEXPORT int defaultFontSize(); // in points UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific UIDLLEXPORT QFont defaultFont(); UIDLLEXPORT QSize defaultIconSize(); /** * @brief Size constants for the main Calamares window. */ constexpr int windowMinimumWidth = 800; constexpr int windowMinimumHeight = 520; constexpr int windowPreferredWidth = 1024; constexpr int windowPreferredHeight = 520; } #endif // CALAMARESUTILSGUI_H calamares-3.1.12/src/libcalamaresui/utils/DebugWindow.cpp000066400000000000000000000153641322271446000233660ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "DebugWindow.h" #include "utils/CalamaresUtils.h" #include "utils/Retranslator.h" #include "utils/qjsonmodel.h" #include "JobQueue.h" #include "Job.h" #include "GlobalStorage.h" #include "modulesystem/ModuleManager.h" #include "modulesystem/Module.h" #ifdef WITH_PYTHONQT #include #include "ViewManager.h" #include "viewpages/PythonQtViewStep.h" #endif #include #include #include #include namespace Calamares { DebugWindow::DebugWindow() : QWidget( nullptr ) { setupUi( this ); // GlobalStorage page QJsonModel* jsonModel = new QJsonModel( this ); globalStorageView->setModel( jsonModel ); GlobalStorage* gs = JobQueue::instance()->globalStorage(); connect( gs, &GlobalStorage::changed, this, [ = ] { jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() ); globalStorageView->expandAll(); } ); jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() ); globalStorageView->expandAll(); // JobQueue page jobQueueText->setReadOnly( true ); connect( JobQueue::instance(), &JobQueue::queueChanged, this, [ this ]( const QList< Calamares::job_ptr >& jobs ) { QStringList text; for ( const auto &job : jobs ) { text.append( job->prettyName() ); } jobQueueText->setText( text.join( '\n' ) ); } ); // Modules page QStringListModel* modulesModel = new QStringListModel( ModuleManager::instance()->loadedInstanceKeys() ); modulesListView->setModel( modulesModel ); modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); QJsonModel* moduleConfigModel = new QJsonModel( this ); moduleConfigView->setModel( moduleConfigModel ); #ifdef WITH_PYTHONQT QPushButton* pythonConsoleButton = new QPushButton; pythonConsoleButton->setText( "Attach Python console" ); modulesVerticalLayout->insertWidget( 1, pythonConsoleButton ); pythonConsoleButton->hide(); QObject::connect( pythonConsoleButton, &QPushButton::clicked, this, [ this, moduleConfigModel ] { QString moduleName = modulesListView->currentIndex().data().toString(); Module* module = ModuleManager::instance()->moduleInstance( moduleName ); if ( module->interface() != Module::PythonQtInterface || module->type() != Module::View ) return; for ( ViewStep* step : ViewManager::instance()->viewSteps() ) { if ( step->moduleInstanceKey() == module->instanceKey() ) { PythonQtViewStep* pqvs = qobject_cast< PythonQtViewStep* >( step ); if ( pqvs ) { QWidget* consoleWindow = new QWidget; QWidget* console = pqvs->createScriptingConsole(); console->setParent( consoleWindow ); QVBoxLayout* layout = new QVBoxLayout; consoleWindow->setLayout( layout ); layout->addWidget( console ); QHBoxLayout* bottomLayout = new QHBoxLayout; layout->addLayout( bottomLayout ); QLabel* bottomLabel = new QLabel( consoleWindow ); bottomLayout->addWidget( bottomLabel ); QString line = QString( "Module: %1
" "Python class: %2" ) .arg( module->instanceKey() ) .arg( console->property( "classname" ).toString() ); bottomLabel->setText( line ); QPushButton* closeButton = new QPushButton( consoleWindow ); closeButton->setText( "&Close" ); QObject::connect( closeButton, &QPushButton::clicked, [ consoleWindow ] { consoleWindow->close(); } ); bottomLayout->addWidget( closeButton ); bottomLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); consoleWindow->setParent( this ); consoleWindow->setWindowFlags( Qt::Window ); consoleWindow->setWindowTitle( "Calamares Python console" ); consoleWindow->setAttribute( Qt::WA_DeleteOnClose, true ); consoleWindow->showNormal(); break; } } } } ); #endif connect( modulesListView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [ this, moduleConfigModel #ifdef WITH_PYTHONQT , pythonConsoleButton #endif ] { QString moduleName = modulesListView->currentIndex().data().toString(); Module* module = ModuleManager::instance()->moduleInstance( moduleName ); if ( module ) { moduleConfigModel->loadJson( QJsonDocument::fromVariant( module->configurationMap() ).toJson() ); moduleConfigView->expandAll(); moduleTypeLabel->setText( module->typeString() ); moduleInterfaceLabel->setText( module->interfaceString() ); #ifdef WITH_PYTHONQT pythonConsoleButton->setVisible( module->interface() == Module::PythonQtInterface && module->type() == Module::View ); #endif } } ); connect( crashButton, &QPushButton::clicked, this, [] { CalamaresUtils::crash(); } ); CALAMARES_RETRANSLATE( retranslateUi( this ); setWindowTitle( tr( "Debug information" ) ); ) } void DebugWindow::closeEvent( QCloseEvent* e ) { Q_UNUSED( e ) emit closed(); } } // namespace Calamares calamares-3.1.12/src/libcalamaresui/utils/DebugWindow.h000066400000000000000000000022471322271446000230270ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CALAMARES_DEBUGWINDOW_H #define CALAMARES_DEBUGWINDOW_H #include "ui_DebugWindow.h" #include namespace Calamares { class DebugWindow : public QWidget, private Ui::DebugWindow { Q_OBJECT public: explicit DebugWindow(); signals: void closed(); protected: void closeEvent( QCloseEvent* e ) override; }; } // namespace Calamares #endif // CALAMARES_DEBUGWINDOW_H calamares-3.1.12/src/libcalamaresui/utils/DebugWindow.ui000066400000000000000000000070031322271446000232100ustar00rootroot00000000000000 Calamares::DebugWindow 0 0 962 651 Form 2 GlobalStorage JobQueue Modules Type: none Interface: none Tools Crash now Qt::Vertical 20 40 calamares-3.1.12/src/libcalamaresui/utils/ImageRegistry.cpp000066400000000000000000000115621322271446000237170ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPLv3+ * License-Filename: LICENSES/GPLv3+-ImageRegistry */ /* * Copyright 2012, Christian Muehlhaeuser This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "ImageRegistry.h" #include #include #include static QHash< QString, QHash< int, QHash< qint64, QPixmap > > > s_cache; ImageRegistry* ImageRegistry::s_instance = 0; ImageRegistry* ImageRegistry::instance() { return s_instance; } ImageRegistry::ImageRegistry() { s_instance = this; } QIcon ImageRegistry::icon( const QString& image, CalamaresUtils::ImageMode mode ) { return pixmap( image, CalamaresUtils::defaultIconSize(), mode ); } qint64 ImageRegistry::cacheKey( const QSize& size, float opacity, QColor tint ) { return size.width() * 100 + size.height() * 10 + ( opacity * 100.0 ) + tint.value(); } QPixmap ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, QColor tint ) { if ( size.width() < 0 || size.height() < 0 ) { Q_ASSERT( false ); return QPixmap(); } QHash< qint64, QPixmap > subsubcache; QHash< int, QHash< qint64, QPixmap > > subcache; if ( s_cache.contains( image ) ) { subcache = s_cache.value( image ); if ( subcache.contains( mode ) ) { subsubcache = subcache.value( mode ); const qint64 ck = cacheKey( size, opacity, tint ); if ( subsubcache.contains( ck ) ) { return subsubcache.value( ck ); } } } // Image not found in cache. Let's load it. QPixmap pixmap; if ( image.toLower().endsWith( ".svg" ) ) { QSvgRenderer svgRenderer( image ); QPixmap p( size.isNull() || size.height() == 0 || size.width() == 0 ? svgRenderer.defaultSize() : size ); p.fill( Qt::transparent ); QPainter pixPainter( &p ); pixPainter.setOpacity( opacity ); svgRenderer.render( &pixPainter ); pixPainter.end(); if ( tint.alpha() > 0 ) { QImage resultImage( p.size(), QImage::Format_ARGB32_Premultiplied ); QPainter painter( &resultImage ); painter.drawPixmap( 0, 0, p ); painter.setCompositionMode( QPainter::CompositionMode_Screen ); painter.fillRect( resultImage.rect(), tint ); painter.end(); resultImage.setAlphaChannel( p.toImage().alphaChannel() ); p = QPixmap::fromImage( resultImage ); } pixmap = p; } else pixmap = QPixmap( image ); if ( !pixmap.isNull() ) { switch ( mode ) { case CalamaresUtils::RoundedCorners: pixmap = CalamaresUtils::createRoundedImage( pixmap, size ); break; default: break; } if ( !size.isNull() && pixmap.size() != size ) { if ( size.width() == 0 ) { pixmap = pixmap.scaledToHeight( size.height(), Qt::SmoothTransformation ); } else if ( size.height() == 0 ) { pixmap = pixmap.scaledToWidth( size.width(), Qt::SmoothTransformation ); } else pixmap = pixmap.scaled( size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); } putInCache( image, size, mode, opacity, pixmap, tint ); } return pixmap; } void ImageRegistry::putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint ) { QHash< qint64, QPixmap > subsubcache; QHash< int, QHash< qint64, QPixmap > > subcache; if ( s_cache.contains( image ) ) { subcache = s_cache.value( image ); if ( subcache.contains( mode ) ) { subsubcache = subcache.value( mode ); /* if ( subsubcache.contains( size.width() * size.height() ) ) { Q_ASSERT( false ); }*/ } } subsubcache.insert( cacheKey( size, opacity, tint ), pixmap ); subcache.insert( mode, subsubcache ); s_cache.insert( image, subcache ); } calamares-3.1.12/src/libcalamaresui/utils/ImageRegistry.h000066400000000000000000000032761322271446000233670ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPLv3+ * License-Filename: LICENSES/GPLv3+-ImageRegistry */ /* * Copyright 2012, Christian Muehlhaeuser This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef IMAGE_REGISTRY_H #define IMAGE_REGISTRY_H #include #include "utils/CalamaresUtilsGui.h" #include "UiDllMacro.h" class UIDLLEXPORT ImageRegistry { public: static ImageRegistry* instance(); explicit ImageRegistry(); QIcon icon( const QString& image, CalamaresUtils::ImageMode mode = CalamaresUtils::Original ); QPixmap pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode = CalamaresUtils::Original, float opacity = 1.0, QColor tint = QColor( 0, 0, 0, 0 ) ); private: qint64 cacheKey( const QSize& size, float opacity, QColor tint ); void putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint ); static ImageRegistry* s_instance; }; #endif // IMAGE_REGISTRY_H calamares-3.1.12/src/libcalamaresui/utils/PythonQtUtils.cpp000066400000000000000000000027101322271446000237460ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtUtils.h" namespace CalamaresUtils { QVariant lookupAndCall( PyObject* object, const QStringList& candidateNames, const QVariantList& args, const QVariantMap& kwargs ) { Q_ASSERT( object ); Q_ASSERT( !candidateNames.isEmpty() ); for ( const QString& name : candidateNames ) { PythonQtObjectPtr callable = PythonQt::self()->lookupCallable( object, name ); if ( callable ) return callable.call( args, kwargs ); } // If we haven't found a callable with the given names, we force an error: return PythonQt::self()->call( object, candidateNames.first(), args, kwargs ); } } calamares-3.1.12/src/libcalamaresui/utils/PythonQtUtils.h000066400000000000000000000024101322271446000234100ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONQTUTILS_H #define PYTHONQTUTILS_H #include #include namespace CalamaresUtils { //NOTE: when running this, it is assumed that Python is initialized and // PythonQt::self() is valid. QVariant lookupAndCall( PyObject* object, const QStringList& candidateNames, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap() ); } //ns #endif // PYTHONQTUTILS_H calamares-3.1.12/src/libcalamaresui/utils/YamlUtils.cpp000066400000000000000000000104621322271446000230650ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "YamlUtils.h" #include "utils/Logger.h" #include #include #include void operator>>( const YAML::Node& node, QStringList& v ) { for ( size_t i = 0; i < node.size(); ++i ) { v.append( QString::fromStdString( node[ i ].as< std::string >() ) ); } } namespace CalamaresUtils { const QRegExp _yamlScalarTrueValues = QRegExp( "true|True|TRUE|on|On|ON" ); const QRegExp _yamlScalarFalseValues = QRegExp( "false|False|FALSE|off|Off|OFF" ); QVariant yamlToVariant( const YAML::Node& node ) { switch ( node.Type() ) { case YAML::NodeType::Scalar: return yamlScalarToVariant( node ); case YAML::NodeType::Sequence: return yamlSequenceToVariant( node ); case YAML::NodeType::Map: return yamlMapToVariant( node ); case YAML::NodeType::Null: case YAML::NodeType::Undefined: return QVariant(); } // NOTREACHED return QVariant(); } QVariant yamlScalarToVariant( const YAML::Node& scalarNode ) { std::string stdScalar = scalarNode.as< std::string >(); QString scalarString = QString::fromStdString( stdScalar ); if ( _yamlScalarTrueValues.exactMatch( scalarString ) ) return QVariant( true ); if ( _yamlScalarFalseValues.exactMatch( scalarString ) ) return QVariant( false ); if ( QRegExp( "[-+]?\\d+" ).exactMatch( scalarString ) ) return QVariant( scalarString.toInt() ); if ( QRegExp( "[-+]?\\d*\\.?\\d+" ).exactMatch( scalarString ) ) return QVariant( scalarString.toDouble() ); return QVariant( scalarString ); } QVariant yamlSequenceToVariant( const YAML::Node& sequenceNode ) { QVariantList vl; for ( YAML::const_iterator it = sequenceNode.begin(); it != sequenceNode.end(); ++it ) { vl << yamlToVariant( *it ); } return vl; } QVariant yamlMapToVariant( const YAML::Node& mapNode ) { QVariantMap vm; for ( YAML::const_iterator it = mapNode.begin(); it != mapNode.end(); ++it ) { vm.insert( QString::fromStdString( it->first.as< std::string >() ), yamlToVariant( it->second ) ); } return vm; } void explainYamlException( const YAML::Exception& e, const QByteArray& yamlData, const char *label ) { cDebug() << "WARNING: YAML error " << e.what() << "in" << label << '.'; if ( ( e.mark.line >= 0 ) && ( e.mark.column >= 0 ) ) { // Try to show the line where it happened. int linestart = 0; for ( int linecount = 0; linecount < e.mark.line; ++linecount ) { linestart = yamlData.indexOf( '\n', linestart ); // No more \ns found, weird if ( linestart < 0 ) break; linestart += 1; // Skip that \n } int lineend = linestart; if ( linestart >= 0 ) { lineend = yamlData.indexOf( '\n', linestart ); if ( lineend < 0 ) lineend = yamlData.length(); } int rangestart = linestart; int rangeend = lineend; // Adjust range (linestart..lineend) so it's not too long if ( ( linestart >= 0 ) && ( e.mark.column > 30 ) ) rangestart += ( e.mark.column - 30 ); if ( ( linestart >= 0 ) && ( rangeend - rangestart > 40 ) ) rangeend = rangestart + 40; if ( linestart >= 0 ) cDebug() << "WARNING: offending YAML data:" << yamlData.mid( rangestart, rangeend-rangestart ).constData(); } } } // namespace calamares-3.1.12/src/libcalamaresui/utils/YamlUtils.h000066400000000000000000000031621322271446000225310ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef YAMLUTILS_H #define YAMLUTILS_H #include #include class QByteArray; namespace YAML { class Node; class Exception; } void operator>>( const YAML::Node& node, QStringList& v ); namespace CalamaresUtils { QVariant yamlToVariant( const YAML::Node& node ); QVariant yamlScalarToVariant( const YAML::Node& scalarNode ); QVariant yamlSequenceToVariant( const YAML::Node& sequenceNode ); QVariant yamlMapToVariant( const YAML::Node& mapNode ); /** * Given an exception from the YAML parser library, explain * what is going on in terms of the data passed to the parser. * Uses @p label when labeling the data source (e.g. "netinstall data") */ void explainYamlException( const YAML::Exception& e, const QByteArray& data, const char *label ); } //ns #endif // YAMLUTILS_H calamares-3.1.12/src/libcalamaresui/utils/qjsonitem.cpp000066400000000000000000000060471322271446000231570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPL-3.0+ * License-Filename: LICENSES/GPLv3+-QJsonModel */ /*********************************************** Copyright (C) 2014 Schutz Sacha This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). QJsonModel is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. QJsonModel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QJsonModel. If not, see . **********************************************/ #include "qjsonitem.h" QJsonTreeItem::QJsonTreeItem(QJsonTreeItem *parent) { mParent = parent; } QJsonTreeItem::~QJsonTreeItem() { qDeleteAll(mChilds); } void QJsonTreeItem::appendChild(QJsonTreeItem *item) { mChilds.append(item); } QJsonTreeItem *QJsonTreeItem::child(int row) { return mChilds.value(row); } QJsonTreeItem *QJsonTreeItem::parent() { return mParent; } int QJsonTreeItem::childCount() const { return mChilds.count(); } int QJsonTreeItem::row() const { if (mParent) return mParent->mChilds.indexOf(const_cast(this)); return 0; } void QJsonTreeItem::setKey(const QString &key) { mKey = key; } void QJsonTreeItem::setValue(const QString &value) { mValue = value; } void QJsonTreeItem::setType(const QJsonValue::Type &type) { mType = type; } QString QJsonTreeItem::key() const { return mKey; } QString QJsonTreeItem::value() const { return mValue; } QJsonValue::Type QJsonTreeItem::type() const { return mType; } QJsonTreeItem* QJsonTreeItem::load(const QJsonValue& value, QJsonTreeItem* parent) { QJsonTreeItem * rootItem = new QJsonTreeItem(parent); rootItem->setKey("root"); if ( value.isObject()) { //Get all QJsonValue childs foreach (QString key , value.toObject().keys()){ QJsonValue v = value.toObject().value(key); QJsonTreeItem * child = load(v,rootItem); child->setKey(key); child->setType(v.type()); rootItem->appendChild(child); } } else if ( value.isArray()) { //Get all QJsonValue childs int index = 0; foreach (QJsonValue v , value.toArray()){ QJsonTreeItem * child = load(v,rootItem); child->setKey(QString::number(index)); child->setType(v.type()); rootItem->appendChild(child); ++index; } } else { rootItem->setValue(value.toVariant().toString()); rootItem->setType(value.type()); } return rootItem; } calamares-3.1.12/src/libcalamaresui/utils/qjsonitem.h000066400000000000000000000020101322271446000226060ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPL-3.0+ * License-Filename: LICENSES/GPLv3+-QJsonModel */ #ifndef JSONITEM_H #define JSONITEM_H #include #include #include #include class QJsonTreeItem { public: QJsonTreeItem(QJsonTreeItem * parent = 0); ~QJsonTreeItem(); void appendChild(QJsonTreeItem * item); QJsonTreeItem *child(int row); QJsonTreeItem *parent(); int childCount() const; int row() const; void setKey(const QString& key); void setValue(const QString& value); void setType(const QJsonValue::Type& type); QString key() const; QString value() const; QJsonValue::Type type() const; static QJsonTreeItem* load(const QJsonValue& value, QJsonTreeItem * parent = 0); protected: private: QString mKey; QString mValue; QJsonValue::Type mType; QList mChilds; QJsonTreeItem * mParent; }; #endif // JSONITEM_H calamares-3.1.12/src/libcalamaresui/utils/qjsonmodel.cpp000066400000000000000000000104721322271446000233160ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPL-3.0+ * License-Filename: LICENSES/GPLv3+-QJsonModel */ /*********************************************** Copyright (C) 2014 Schutz Sacha This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). QJsonModel is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. QJsonModel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QJsonModel. If not, see . **********************************************/ #include "qjsonmodel.h" #include #include #include #include #include #include QJsonModel::QJsonModel(QObject *parent) : QAbstractItemModel(parent) { mRootItem = new QJsonTreeItem; mHeaders.append("key"); mHeaders.append("value"); } bool QJsonModel::load(const QString &fileName) { QFile file(fileName); bool success = false; if (file.open(QIODevice::ReadOnly)) { success = load(&file); file.close(); } else success = false; return success; } bool QJsonModel::load(QIODevice *device) { return loadJson(device->readAll()); } bool QJsonModel::loadJson(const QByteArray &json) { mDocument = QJsonDocument::fromJson(json); if (!mDocument.isNull()) { beginResetModel(); if (mDocument.isArray()) { mRootItem = QJsonTreeItem::load(QJsonValue(mDocument.array())); } else { mRootItem = QJsonTreeItem::load(QJsonValue(mDocument.object())); } endResetModel(); return true; } return false; } QVariant QJsonModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); QJsonTreeItem *item = static_cast(index.internalPointer()); if ((role == Qt::DecorationRole) && (index.column() == 0)){ return mTypeIcons.value(item->type()); } if (role == Qt::DisplayRole) { if (index.column() == 0) return QString("%1").arg(item->key()); if (index.column() == 1) return QString("%1").arg(item->value()); } return QVariant(); } QVariant QJsonModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { return mHeaders.value(section); } else return QVariant(); } QModelIndex QJsonModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); QJsonTreeItem *parentItem; if (!parent.isValid()) parentItem = mRootItem; else parentItem = static_cast(parent.internalPointer()); QJsonTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex QJsonModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); QJsonTreeItem *childItem = static_cast(index.internalPointer()); QJsonTreeItem *parentItem = childItem->parent(); if (parentItem == mRootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int QJsonModel::rowCount(const QModelIndex &parent) const { QJsonTreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = mRootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } int QJsonModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent) return 2; } void QJsonModel::setIcon(const QJsonValue::Type &type, const QIcon &icon) { mTypeIcons.insert(type,icon); } calamares-3.1.12/src/libcalamaresui/utils/qjsonmodel.h000066400000000000000000000023231322271446000227570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: GPL-3.0+ * License-Filename: LICENSES/GPLv3+-QJsonModel */ #ifndef QJSONMODEL_H #define QJSONMODEL_H #include #include "qjsonitem.h" #include #include #include class QJsonModel : public QAbstractItemModel { Q_OBJECT public: explicit QJsonModel(QObject *parent = 0); bool load(const QString& fileName); bool load(QIODevice * device); bool loadJson(const QByteArray& json); QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; void setIcon(const QJsonValue::Type& type, const QIcon& icon); private: QJsonTreeItem * mRootItem; QJsonDocument mDocument; QStringList mHeaders; QHash mTypeIcons; }; #endif // QJSONMODEL_H calamares-3.1.12/src/libcalamaresui/viewpages/000077500000000000000000000000001322271446000212655ustar00rootroot00000000000000calamares-3.1.12/src/libcalamaresui/viewpages/AbstractPage.cpp000066400000000000000000000016231322271446000243330ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "AbstractPage.h" namespace Calamares { AbstractPage::AbstractPage( QWidget* parent ) : QWidget( parent ) { } } calamares-3.1.12/src/libcalamaresui/viewpages/AbstractPage.h000066400000000000000000000021101322271446000237700ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef ABSTRACTPAGE_H #define ABSTRACTPAGE_H #include #include "../UiDllMacro.h" namespace Calamares { class UIDLLEXPORT AbstractPage : public QWidget { Q_OBJECT public: explicit AbstractPage(QWidget* parent = nullptr); virtual ~AbstractPage() {} }; } #endif // ABSTRACTPAGE_H calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.cpp000066400000000000000000000027151322271446000275730ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtGlobalStorageWrapper.h" #include "GlobalStorage.h" GlobalStorage::GlobalStorage( Calamares::GlobalStorage* gs ) : QObject( gs ) , m_gs( gs ) {} bool GlobalStorage::contains( const QString& key ) const { return m_gs->contains( key ); } int GlobalStorage::count() const { return m_gs->count(); } void GlobalStorage::insert( const QString& key, const QVariant& value ) { m_gs->insert( key, value ); } QStringList GlobalStorage::keys() const { return m_gs->keys(); } int GlobalStorage::remove( const QString& key ) { return m_gs->remove( key ); } QVariant GlobalStorage::value( const QString& key ) const { return m_gs->value( key ); } calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.h000066400000000000000000000031461322271446000272370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONQTGLOBALSTORAGEWRAPPER_H #define PYTHONQTGLOBALSTORAGEWRAPPER_H #include namespace Calamares { class GlobalStorage; } /** * @brief This GlobalStorage class is a namespace-free wrapper for * Calamares::GlobalStorage. This is unfortunately a necessity * because PythonQt doesn't like namespaces. */ class GlobalStorage : public QObject { Q_OBJECT public: explicit GlobalStorage( Calamares::GlobalStorage* gs ); virtual ~GlobalStorage() {} public slots: bool contains( const QString& key ) const; int count() const; void insert( const QString& key, const QVariant& value ); QStringList keys() const; int remove( const QString& key ); QVariant value( const QString& key ) const; private: Calamares::GlobalStorage* m_gs; }; #endif // PYTHONQTGLOBALSTORAGEWRAPPER_H calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtJob.cpp000066400000000000000000000046271322271446000242230ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtJob.h" #include "utils/PythonQtUtils.h" PythonQtJob::PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent ) : Calamares::Job( parent ) , m_cxt( cxt ) , m_pyJob( pyJob ) { } QString PythonQtJob::prettyName() const { return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyName", "prettyname", "pretty_name" } ).toString(); } QString PythonQtJob::prettyDescription() const { return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyDescription", "prettydescription", "pretty_description" } ).toString(); } QString PythonQtJob::prettyStatusMessage() const { return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyStatusMessage", "prettystatusmessage", "pretty_status_message" } ).toString(); } Calamares::JobResult PythonQtJob::exec() { QVariant response = m_pyJob.call( "exec" ); if ( response.isNull() ) return Calamares::JobResult::ok(); QVariantMap map = response.toMap(); if ( map.isEmpty() || map.value( "ok" ).toBool() ) return Calamares::JobResult::ok(); return Calamares::JobResult::error( map.value( "message" ).toString(), map.value( "details" ).toString() ); } calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtJob.h000066400000000000000000000035261322271446000236650ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONQTJOB_H #define PYTHONQTJOB_H #include "Job.h" #include namespace Calamares { class PythonQtViewStep; } class PythonQtJobResult : public QObject, public Calamares::JobResult { Q_OBJECT public: explicit PythonQtJobResult( bool ok, const QString& message, const QString& details ) : QObject( nullptr ) , Calamares::JobResult( ok, message, details ) {} }; class PythonQtJob : public Calamares::Job { Q_OBJECT public: virtual ~PythonQtJob() {} QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: explicit PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent = nullptr ); friend class Calamares::PythonQtViewStep; // only this one can call the ctor PythonQtObjectPtr m_cxt; PythonQtObjectPtr m_pyJob; }; #endif // PYTHONQTJOB_H calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.cpp000066400000000000000000000100371322271446000261420ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtUtilsWrapper.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/CalamaresUtils.h" #include "utils/Logger.h" #include Utils::Utils(QObject* parent) : QObject( parent ) , m_exceptionCxt( PythonQt::self()->createUniqueModule() ) { PythonQt::self()->evalScript( m_exceptionCxt, "import subprocess" ); } void Utils::debug(const QString& s) const { cDebug() << "PythonQt DBG>" << s; } int Utils::mount( const QString& device_path, const QString& mount_point, const QString& filesystem_name, const QString& options ) const { return CalamaresUtils::System::instance()-> mount( device_path, mount_point, filesystem_name, options ); } int Utils::target_env_call( const QString& command, const QString& stdin, int timeout ) const { return CalamaresUtils::System::instance()-> targetEnvCall( command, QString(), stdin, timeout ); } int Utils::target_env_call( const QStringList& args, const QString& stdin, int timeout ) const { return CalamaresUtils::System::instance()-> targetEnvCall( args, QString(), stdin, timeout ); } int Utils::check_target_env_call( const QString& command, const QString& stdin, int timeout ) const { int ec = target_env_call( command, stdin, timeout ); return _handle_check_target_env_call_error( ec, command ); } int Utils::check_target_env_call( const QStringList& args, const QString& stdin, int timeout) const { int ec = target_env_call( args, stdin, timeout ); return _handle_check_target_env_call_error( ec, args.join( ' ' ) ); } QString Utils::check_target_env_output( const QString& command, const QString& stdin, int timeout ) const { QString output; int ec = CalamaresUtils::System::instance()-> targetEnvOutput( command, output, QString(), stdin, timeout ); _handle_check_target_env_call_error( ec, command ); return output; } QString Utils::check_target_env_output( const QStringList& args, const QString& stdin, int timeout ) const { QString output; int ec = CalamaresUtils::System::instance()-> targetEnvOutput( args, output, QString(), stdin, timeout ); _handle_check_target_env_call_error( ec, args.join( ' ' ) ); return output; } QString Utils::obscure( const QString& string ) const { return CalamaresUtils::obscure( string ); } int Utils::_handle_check_target_env_call_error( int ec, const QString& cmd) const { if ( ec ) { QString raise = QString( "raise subprocess.CalledProcessError(%1,\"%2\")" ) .arg( ec ) .arg( cmd ); PythonQt::self()->evalScript( m_exceptionCxt, raise ); } return ec; } calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.h000066400000000000000000000052011322271446000256040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONQTUTILSWRAPPER_H #define PYTHONQTUTILSWRAPPER_H #include #include /** * @brief The Utils class wraps around functions from CalamaresUtils to make them * available in the PythonQt interface. */ class Utils : public QObject { Q_OBJECT public: explicit Utils( QObject* parent = nullptr ); virtual ~Utils() {} public slots: void debug( const QString& s ) const; int mount( const QString& device_path, const QString& mount_point, const QString& filesystem_name, const QString& options ) const; int target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; int target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; int check_target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; int check_target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; QString check_target_env_output( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; QString check_target_env_output( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; QString obscure( const QString& string ) const; private: inline int _handle_check_target_env_call_error( int ec, const QString& cmd ) const; PythonQtObjectPtr m_exceptionCxt; }; #endif // PYTHONQTUTILSWRAPPER_H calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtViewStep.cpp000066400000000000000000000141711322271446000252520ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PythonQtViewStep.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include "utils/PythonQtUtils.h" #include "utils/Retranslator.h" #include "viewpages/PythonQtJob.h" #include #include #include namespace Calamares { PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent ) : ViewStep( parent ) , m_widget( new QWidget() ) , m_cxt( cxt ) { PythonQt* pq = PythonQt::self(); Q_ASSERT( pq ); // The @calamares_module decorator should have filled _calamares_module_typename // for us. QString className = m_cxt.getVariable( "_calamares_module_typename" ).toString(); // Instantiate an object of the class marked with @calamares_module and // store it as _calamares_module. pq->evalScript( m_cxt, QString( "_calamares_module = %1()" ) .arg( className ) ); m_obj = pq->lookupObject( m_cxt, "_calamares_module" ); Q_ASSERT( !m_obj.isNull() ); // no entry point, no party // Prepare the base widget for the module's pages m_widget->setLayout( new QVBoxLayout ); CalamaresUtils::unmarginLayout( m_widget->layout() ); m_cxt.addObject( "_calamares_module_basewidget", m_widget ); CALAMARES_RETRANSLATE_WIDGET( m_widget, CalamaresUtils::lookupAndCall( m_obj, { "retranslate" }, { CalamaresUtils::translatorLocaleName() } ); ) } QString PythonQtViewStep::prettyName() const { return CalamaresUtils::lookupAndCall( m_obj, { "prettyName", "prettyname", "pretty_name" } ).toString(); } QWidget* PythonQtViewStep::widget() { if ( m_widget->layout()->count() > 1 ) cDebug() << "WARNING: PythonQtViewStep wrapper widget has more than 1 child. " "This should never happen."; bool nothingChanged = m_cxt.evalScript( "_calamares_module.widget() in _calamares_module_basewidget.children()" ).toBool(); if ( nothingChanged ) return m_widget; // Else, we either don't have a child widget, or we have a child widget that // was previously set and doesn't apply any more since the Python module // set a new one. // First we clear the layout, which should only ever have 1 item. // We only remove from the layout and not delete because Python is in charge // of memory management for these widgets. while ( m_widget->layout()->itemAt( 0 ) ) m_widget->layout()->takeAt( 0 ); m_cxt.evalScript( "_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" ); return m_widget; } void PythonQtViewStep::next() { CalamaresUtils::lookupAndCall( m_obj, { "next" } ); } void PythonQtViewStep::back() { CalamaresUtils::lookupAndCall( m_obj, { "back" } ); } bool PythonQtViewStep::isNextEnabled() const { return CalamaresUtils::lookupAndCall( m_obj, { "isNextEnabled", "isnextenabled", "is_next_enabled" } ).toBool(); } bool PythonQtViewStep::isBackEnabled() const { return CalamaresUtils::lookupAndCall( m_obj, { "isBackEnabled", "isbackenabled", "is_back_enabled" } ).toBool(); } bool PythonQtViewStep::isAtBeginning() const { return CalamaresUtils::lookupAndCall( m_obj, { "isAtBeginning", "isatbeginning", "is_at_beginning" } ).toBool(); } bool PythonQtViewStep::isAtEnd() const { return CalamaresUtils::lookupAndCall( m_obj, { "isAtEnd", "isatend", "is_at_end" } ).toBool(); } QList< Calamares::job_ptr > PythonQtViewStep::jobs() const { QList< Calamares::job_ptr > jobs; PythonQtObjectPtr jobsCallable = PythonQt::self()->lookupCallable( m_obj, "jobs" ); if ( jobsCallable.isNull() ) return jobs; PythonQtObjectPtr response = PythonQt::self()->callAndReturnPyObject( jobsCallable ); if ( response.isNull() ) return jobs; PythonQtObjectPtr listPopCallable = PythonQt::self()->lookupCallable( response, "pop" ); if ( listPopCallable.isNull() ) return jobs; forever { PythonQtObjectPtr aJob = PythonQt::self()->callAndReturnPyObject( listPopCallable, { 0 } ); if ( aJob.isNull() ) break; jobs.append( Calamares::job_ptr( new PythonQtJob( m_cxt, aJob ) ) ); } return jobs; } void PythonQtViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { m_obj.addVariable( "configuration", configurationMap ); } QWidget* PythonQtViewStep::createScriptingConsole() { PythonQtScriptingConsole* console = new PythonQtScriptingConsole( nullptr, m_cxt ); console->setProperty( "classname", m_cxt.getVariable( "_calamares_module_typename" ).toString() ); return console; } } calamares-3.1.12/src/libcalamaresui/viewpages/PythonQtViewStep.h000066400000000000000000000032251322271446000247150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PYTHONQTVIEWSTEP_H #define PYTHONQTVIEWSTEP_H #include "ViewStep.h" #include namespace Calamares { class PythonQtViewStep : public Calamares::ViewStep { Q_OBJECT public: PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent = nullptr ); QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; QWidget* createScriptingConsole(); protected: QWidget* m_widget; private: PythonQtObjectPtr m_cxt; PythonQtObjectPtr m_obj; }; } #endif // PYTHONQTVIEWSTEP_H calamares-3.1.12/src/libcalamaresui/viewpages/ViewStep.cpp000066400000000000000000000025731322271446000235460ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ViewStep.h" namespace Calamares { ViewStep::ViewStep( QObject* parent ) : QObject( parent ) {} ViewStep::~ViewStep() {} QString ViewStep::prettyStatus() const { return QString(); } QWidget* ViewStep::createSummaryWidget() const { return nullptr; } void ViewStep::onActivate() {} void ViewStep::onLeave() {} void ViewStep::setModuleInstanceKey( const QString& instanceKey ) { m_instanceKey = instanceKey; } void ViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { Q_UNUSED( configurationMap ); } } calamares-3.1.12/src/libcalamaresui/viewpages/ViewStep.h000066400000000000000000000075301322271446000232110ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef VIEWSTEP_H #define VIEWSTEP_H #include #include "../UiDllMacro.h" #include "Typedefs.h" namespace Calamares { /** * @brief The ViewStep class is the base class for all view modules. * A view module is a Calamares module which has at least one UI page (exposed as * ViewStep::widget), and can optionally create Calamares jobs at runtime. * As of early 2017, a view module can be implemented by deriving from ViewStep * in C++ (as a Qt Plugin) or in Python with the PythonQt interface (which also * mimics the ViewStep class). * * A ViewStep can describe itself in human-readable format for the SummaryPage * (which shows all of the things which have been collected to be done in the * next exec-step) through prettyStatus() and createSummaryWidget(). */ class UIDLLEXPORT ViewStep : public QObject { Q_OBJECT public: explicit ViewStep( QObject* parent = nullptr ); virtual ~ViewStep() override; virtual QString prettyName() const = 0; /** * Optional. May return a non-empty string describing what this * step is going to do (should be translated). This is also used * in the summary page to describe what is going to be done. * Return an empty string to provide no description. */ virtual QString prettyStatus() const; /** * Optional. May return a widget which will be inserted in the summary * page. The caller takes ownership of the widget. Return nullptr to * provide no widget. In general, this is only used for complicated * steps where prettyStatus() is not sufficient. */ virtual QWidget* createSummaryWidget() const; //TODO: we might want to make this a QSharedPointer virtual QWidget* widget() = 0; virtual void next() = 0; virtual void back() = 0; virtual bool isNextEnabled() const = 0; virtual bool isBackEnabled() const = 0; virtual bool isAtBeginning() const = 0; virtual bool isAtEnd() const = 0; /** * @brief onActivate called every time a ViewStep is shown, either by going forward * or backward. * The default implementation does nothing. */ virtual void onActivate(); /** * @brief onLeave called every time a ViewStep is hidden and control passes to * another ViewStep, either by going forward or backward. * The default implementation does nothing. */ virtual void onLeave(); virtual QList< job_ptr > jobs() const = 0; void setModuleInstanceKey( const QString& instanceKey ); QString moduleInstanceKey() const { return m_instanceKey; } virtual void setConfigurationMap( const QVariantMap& configurationMap ); signals: void nextStatusChanged( bool status ); void done(); /* Emitted when the viewstep thinks it needs more space than is currently * available for display. @p enlarge is the requested additional space, * e.g. 24px vertical. This request may be silently ignored. */ void enlarge( QSize enlarge ) const; protected: QString m_instanceKey; }; } #endif // VIEWSTEP_H calamares-3.1.12/src/libcalamaresui/widgets/000077500000000000000000000000001322271446000207415ustar00rootroot00000000000000calamares-3.1.12/src/libcalamaresui/widgets/ClickableLabel.cpp000066400000000000000000000026131322271446000242600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ClickableLabel.h" #include ClickableLabel::ClickableLabel( QWidget* parent, Qt::WindowFlags f ) : QLabel( parent, f ) {} ClickableLabel::ClickableLabel( const QString& text, QWidget* parent, Qt::WindowFlags f ) : QLabel( text, parent, f ) {} ClickableLabel::~ClickableLabel() {} void ClickableLabel::mousePressEvent( QMouseEvent* event ) { QLabel::mousePressEvent( event ); m_time.start(); } void ClickableLabel::mouseReleaseEvent( QMouseEvent* event ) { QLabel::mouseReleaseEvent( event ); if ( m_time.elapsed() < qApp->doubleClickInterval() ) emit clicked(); } calamares-3.1.12/src/libcalamaresui/widgets/ClickableLabel.h000066400000000000000000000026451322271446000237320ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CLICKABLELABEL_H #define CLICKABLELABEL_H #include #include class ClickableLabel : public QLabel { Q_OBJECT public: explicit ClickableLabel( QWidget* parent = nullptr, Qt::WindowFlags f = 0 ); explicit ClickableLabel( const QString& text, QWidget* parent = nullptr, Qt::WindowFlags f = 0 ); virtual ~ClickableLabel() override; signals: void clicked(); protected: virtual void mousePressEvent( QMouseEvent* event ) override; virtual void mouseReleaseEvent( QMouseEvent* event ) override; private: QTime m_time; }; #endif // CLICKABLELABEL_H calamares-3.1.12/src/libcalamaresui/widgets/FixedAspectRatioLabel.cpp000066400000000000000000000030731322271446000256060ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "FixedAspectRatioLabel.h" FixedAspectRatioLabel::FixedAspectRatioLabel( QWidget* parent ) : QLabel( parent ) {} FixedAspectRatioLabel::~FixedAspectRatioLabel() {} void FixedAspectRatioLabel::setPixmap( const QPixmap& pixmap ) { m_pixmap = pixmap; QLabel::setPixmap( pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); } void FixedAspectRatioLabel::resizeEvent( QResizeEvent* event ) { Q_UNUSED( event ); QLabel::setPixmap( m_pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); } calamares-3.1.12/src/libcalamaresui/widgets/FixedAspectRatioLabel.h000066400000000000000000000024341322271446000252530ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef FIXEDASPECTRATIOLABEL_H #define FIXEDASPECTRATIOLABEL_H #include #include class FixedAspectRatioLabel : public QLabel { Q_OBJECT public: explicit FixedAspectRatioLabel( QWidget* parent = nullptr ); virtual ~FixedAspectRatioLabel() override; public slots: void setPixmap( const QPixmap &pixmap ); void resizeEvent( QResizeEvent* event ) override; private: QPixmap m_pixmap; }; #endif // FIXEDASPECTRATIOLABEL_H calamares-3.1.12/src/libcalamaresui/widgets/WaitingWidget.cpp000066400000000000000000000040101322271446000242060ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "WaitingWidget.h" #include "utils/CalamaresUtilsGui.h" #include "waitingspinnerwidget.h" #include #include WaitingWidget::WaitingWidget( const QString& text, QWidget* parent ) : QWidget( parent ) { QBoxLayout* waitingLayout = new QVBoxLayout; setLayout( waitingLayout ); waitingLayout->addStretch(); QBoxLayout* pbLayout = new QHBoxLayout; waitingLayout->addLayout( pbLayout ); pbLayout->addStretch(); WaitingSpinnerWidget* spnr = new WaitingSpinnerWidget(); pbLayout->addWidget( spnr ); pbLayout->addStretch(); m_waitingLabel = new QLabel( text ); int spnrSize = m_waitingLabel->fontMetrics().height() * 4; spnr->setFixedSize( spnrSize, spnrSize ); spnr->setInnerRadius( spnrSize / 2 ); spnr->setLineLength( spnrSize / 2 ); spnr->setLineWidth( spnrSize / 8 ); spnr->start(); m_waitingLabel->setAlignment( Qt::AlignCenter ); waitingLayout->addSpacing( spnrSize / 2 ); waitingLayout->addWidget( m_waitingLabel ); waitingLayout->addStretch(); CalamaresUtils::unmarginLayout( waitingLayout ); } void WaitingWidget::setText( const QString& text ) { m_waitingLabel->setText( text ); } calamares-3.1.12/src/libcalamaresui/widgets/WaitingWidget.h000066400000000000000000000021401322271446000236550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef WAITINGWIDGET_H #define WAITINGWIDGET_H #include class QLabel; class WaitingWidget : public QWidget { Q_OBJECT public: explicit WaitingWidget( const QString& text, QWidget* parent = nullptr ); void setText( const QString& text ); private: QLabel* m_waitingLabel; }; #endif // WAITINGWIDGET_H calamares-3.1.12/src/libcalamaresui/widgets/waitingspinnerwidget.cpp000066400000000000000000000204411322271446000257130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: MIT * License-Filename: LICENSES/MIT-QtWaitingSpinner */ /* Original Work Copyright (c) 2012-2014 Alexander Turkin Modified 2014 by William Hallatt Modified 2015 by Jacob Dawid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Own includes #include "waitingspinnerwidget.h" // Standard includes #include #include // Qt includes #include #include WaitingSpinnerWidget::WaitingSpinnerWidget(QWidget *parent, bool centerOnParent, bool disableParentWhenSpinning) : QWidget(parent), _centerOnParent(centerOnParent), _disableParentWhenSpinning(disableParentWhenSpinning) { initialize(); } WaitingSpinnerWidget::WaitingSpinnerWidget(Qt::WindowModality modality, QWidget *parent, bool centerOnParent, bool disableParentWhenSpinning) : QWidget(parent, Qt::Dialog | Qt::FramelessWindowHint), _centerOnParent(centerOnParent), _disableParentWhenSpinning(disableParentWhenSpinning){ initialize(); // We need to set the window modality AFTER we've hidden the // widget for the first time since changing this property while // the widget is visible has no effect. setWindowModality(modality); setAttribute(Qt::WA_TranslucentBackground); } void WaitingSpinnerWidget::initialize() { _color = Qt::black; _roundness = 100.0; _minimumTrailOpacity = 3.14159265358979323846; _trailFadePercentage = 80.0; _revolutionsPerSecond = 1.57079632679489661923; _numberOfLines = 20; _lineLength = 10; _lineWidth = 2; _innerRadius = 10; _currentCounter = 0; _isSpinning = false; _timer = new QTimer(this); connect(_timer, SIGNAL(timeout()), this, SLOT(rotate())); updateSize(); updateTimer(); hide(); } void WaitingSpinnerWidget::paintEvent(QPaintEvent *) { updatePosition(); QPainter painter(this); painter.fillRect(this->rect(), Qt::transparent); painter.setRenderHint(QPainter::Antialiasing, true); if (_currentCounter >= _numberOfLines) { _currentCounter = 0; } painter.setPen(Qt::NoPen); for (int i = 0; i < _numberOfLines; ++i) { painter.save(); painter.translate(_innerRadius + _lineLength, _innerRadius + _lineLength); qreal rotateAngle = static_cast(360 * i) / static_cast(_numberOfLines); painter.rotate(rotateAngle); painter.translate(_innerRadius, 0); int distance = lineCountDistanceFromPrimary(i, _currentCounter, _numberOfLines); QColor color = currentLineColor(distance, _numberOfLines, _trailFadePercentage, _minimumTrailOpacity, _color); painter.setBrush(color); // TODO improve the way rounded rect is painted painter.drawRoundedRect( QRect(0, -_lineWidth / 2, _lineLength, _lineWidth), _roundness, _roundness, Qt::RelativeSize); painter.restore(); } } void WaitingSpinnerWidget::start() { updatePosition(); _isSpinning = true; show(); if(parentWidget() && _disableParentWhenSpinning) { parentWidget()->setEnabled(false); } if (!_timer->isActive()) { _timer->start(); _currentCounter = 0; } } void WaitingSpinnerWidget::stop() { _isSpinning = false; hide(); if(parentWidget() && _disableParentWhenSpinning) { parentWidget()->setEnabled(true); } if (_timer->isActive()) { _timer->stop(); _currentCounter = 0; } } void WaitingSpinnerWidget::setNumberOfLines(int lines) { _numberOfLines = lines; _currentCounter = 0; updateTimer(); } void WaitingSpinnerWidget::setLineLength(int length) { _lineLength = length; updateSize(); } void WaitingSpinnerWidget::setLineWidth(int width) { _lineWidth = width; updateSize(); } void WaitingSpinnerWidget::setInnerRadius(int radius) { _innerRadius = radius; updateSize(); } QColor WaitingSpinnerWidget::color() { return _color; } qreal WaitingSpinnerWidget::roundness() { return _roundness; } qreal WaitingSpinnerWidget::minimumTrailOpacity() { return _minimumTrailOpacity; } qreal WaitingSpinnerWidget::trailFadePercentage() { return _trailFadePercentage; } qreal WaitingSpinnerWidget::revolutionsPersSecond() { return _revolutionsPerSecond; } int WaitingSpinnerWidget::numberOfLines() { return _numberOfLines; } int WaitingSpinnerWidget::lineLength() { return _lineLength; } int WaitingSpinnerWidget::lineWidth() { return _lineWidth; } int WaitingSpinnerWidget::innerRadius() { return _innerRadius; } bool WaitingSpinnerWidget::isSpinning() const { return _isSpinning; } void WaitingSpinnerWidget::setRoundness(qreal roundness) { _roundness = std::max(0.0, std::min(100.0, roundness)); } void WaitingSpinnerWidget::setColor(QColor color) { _color = color; } void WaitingSpinnerWidget::setRevolutionsPerSecond(qreal revolutionsPerSecond) { _revolutionsPerSecond = revolutionsPerSecond; updateTimer(); } void WaitingSpinnerWidget::setTrailFadePercentage(qreal trail) { _trailFadePercentage = trail; } void WaitingSpinnerWidget::setMinimumTrailOpacity(qreal minimumTrailOpacity) { _minimumTrailOpacity = minimumTrailOpacity; } void WaitingSpinnerWidget::rotate() { ++_currentCounter; if (_currentCounter >= _numberOfLines) { _currentCounter = 0; } update(); } void WaitingSpinnerWidget::updateSize() { int size = (_innerRadius + _lineLength) * 2; setFixedSize(size, size); } void WaitingSpinnerWidget::updateTimer() { _timer->setInterval(1000 / (_numberOfLines * _revolutionsPerSecond)); } void WaitingSpinnerWidget::updatePosition() { if (parentWidget() && _centerOnParent) { move(parentWidget()->width() / 2 - width() / 2, parentWidget()->height() / 2 - height() / 2); } } int WaitingSpinnerWidget::lineCountDistanceFromPrimary(int current, int primary, int totalNrOfLines) { int distance = primary - current; if (distance < 0) { distance += totalNrOfLines; } return distance; } QColor WaitingSpinnerWidget::currentLineColor(int countDistance, int totalNrOfLines, qreal trailFadePerc, qreal minOpacity, QColor color) { if (countDistance == 0) { return color; } const qreal minAlphaF = minOpacity / 100.0; int distanceThreshold = static_cast(ceil((totalNrOfLines - 1) * trailFadePerc / 100.0)); if (countDistance > distanceThreshold) { color.setAlphaF(minAlphaF); } else { qreal alphaDiff = color.alphaF() - minAlphaF; qreal gradient = alphaDiff / static_cast(distanceThreshold + 1); qreal resultAlpha = color.alphaF() - gradient * countDistance; // If alpha is out of bounds, clip it. resultAlpha = std::min(1.0, std::max(0.0, resultAlpha)); color.setAlphaF(resultAlpha); } return color; } calamares-3.1.12/src/libcalamaresui/widgets/waitingspinnerwidget.h000066400000000000000000000100431322271446000253550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: MIT * License-Filename: LICENSES/MIT-QtWaitingSpinner */ /* Original Work Copyright (c) 2012-2014 Alexander Turkin Modified 2014 by William Hallatt Modified 2015 by Jacob Dawid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once // Qt includes #include #include #include class WaitingSpinnerWidget : public QWidget { Q_OBJECT public: /*! Constructor for "standard" widget behaviour - use this * constructor if you wish to, e.g. embed your widget in another. */ WaitingSpinnerWidget(QWidget *parent = 0, bool centerOnParent = true, bool disableParentWhenSpinning = true); /*! Constructor - use this constructor to automatically create a modal * ("blocking") spinner on top of the calling widget/window. If a valid * parent widget is provided, "centreOnParent" will ensure that * QtWaitingSpinner automatically centres itself on it, if not, * "centreOnParent" is ignored. */ WaitingSpinnerWidget(Qt::WindowModality modality, QWidget *parent = 0, bool centerOnParent = true, bool disableParentWhenSpinning = true); public slots: void start(); void stop(); public: void setColor(QColor color); void setRoundness(qreal roundness); void setMinimumTrailOpacity(qreal minimumTrailOpacity); void setTrailFadePercentage(qreal trail); void setRevolutionsPerSecond(qreal revolutionsPerSecond); void setNumberOfLines(int lines); void setLineLength(int length); void setLineWidth(int width); void setInnerRadius(int radius); void setText(QString text); QColor color(); qreal roundness(); qreal minimumTrailOpacity(); qreal trailFadePercentage(); qreal revolutionsPersSecond(); int numberOfLines(); int lineLength(); int lineWidth(); int innerRadius(); bool isSpinning() const; private slots: void rotate(); protected: void paintEvent(QPaintEvent *paintEvent); private: static int lineCountDistanceFromPrimary(int current, int primary, int totalNrOfLines); static QColor currentLineColor(int distance, int totalNrOfLines, qreal trailFadePerc, qreal minOpacity, QColor color); void initialize(); void updateSize(); void updateTimer(); void updatePosition(); private: QColor _color; qreal _roundness; // 0..100 qreal _minimumTrailOpacity; qreal _trailFadePercentage; qreal _revolutionsPerSecond; int _numberOfLines; int _lineLength; int _lineWidth; int _innerRadius; private: WaitingSpinnerWidget(const WaitingSpinnerWidget&); WaitingSpinnerWidget& operator=(const WaitingSpinnerWidget&); QTimer *_timer; bool _centerOnParent; bool _disableParentWhenSpinning; int _currentCounter; bool _isSpinning; }; calamares-3.1.12/src/modules/000077500000000000000000000000001322271446000157665ustar00rootroot00000000000000calamares-3.1.12/src/modules/CMakeLists.txt000066400000000000000000000030521322271446000205260ustar00rootroot00000000000000include( CMakeColors ) # The variable SKIP_MODULES can be set to skip particular modules; # individual modules can also decide they must be skipped (e.g. OS-specific # modules, or ones with unmet dependencies). Collect the skipped modules # in this list. set( LIST_SKIPPED_MODULES "" ) if( BUILD_TESTING ) add_executable( test_conf test_conf.cpp ) target_link_libraries( test_conf ${YAMLCPP_LIBRARY} ) endif() file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) string( REPLACE " " ";" SKIP_LIST "${SKIP_MODULES}" ) foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) list( FIND SKIP_LIST ${SUBDIRECTORY} DO_SKIP ) if( NOT DO_SKIP EQUAL -1 ) message( "${ColorReset}-- Skipping module ${BoldRed}${SUBDIRECTORY}${ColorReset}." ) message( "" ) list( APPEND LIST_SKIPPED_MODULES "${SUBDIRECTORY} (user request)" ) elseif( ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) AND ( DO_SKIP EQUAL -1 ) ) set( SKIPPED_MODULES ) calamares_add_module_subdirectory( ${SUBDIRECTORY} ) if ( SKIPPED_MODULES ) list( APPEND LIST_SKIPPED_MODULES "${SKIPPED_MODULES}" ) endif() endif() endforeach() if ( LIST_SKIPPED_MODULES ) message( "${ColorReset}-- Skipped modules:" ) foreach( SUBDIRECTORY ${LIST_SKIPPED_MODULES} ) message( "${ColorReset}-- Skipped ${BoldRed}${SUBDIRECTORY}${ColorReset}." ) endforeach() message( "" ) endif() include( CalamaresAddTranslations ) add_calamares_python_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) calamares-3.1.12/src/modules/README.md000066400000000000000000000116441322271446000172530ustar00rootroot00000000000000# Calamares modules Calamares modules are plugins that provide features like installer pages, batch jobs, etc. An installer page (visible to the user) is called a "view", while other modules are "jobs". Each Calamares module lives in its own directory. All modules are installed in `$DESTDIR/lib/calamares/modules`. # Module types There are two types of Calamares module: * viewmodule, for user-visible modules. These may be in C++, or PythonQt. * jobmodule, for not-user-visible modules. These may be done in C++, Python, or as external processes. # Module interfaces There are three (four) interfaces for Calamares modules: * qtplugin, * python (jobmodules only), * pythonqt (optional), * process (jobmodules only). # Module directory Each Calamares module lives in its own directory. The contents of the directory depend on the interface and type of the module. ## Module descriptor A Calamares module must have a *module descriptor file*, named `module.desc`. For C++ (qtplugin) modules using CMake as a build- system and using the calamares_add_plugin() function -- this is the recommended way to create such modules -- the module descriptor file is optional, since it can be generated by the build system. For other module interfaces, the module descriptor file is required. The module descriptor file must be placed in the module's directory. The module descriptor file is a YAML 1.2 document which defines the module's name, type, interface and possibly other properties. The name of the module as defined in `module.desc` must be the same as the name of the module's directory. Module descriptors must have the following keys: - *name* (an identifier; must be the same as the directory name) - *type* ("job" or "view") - *interface* (see below for the different interfaces; generally we refer to the kinds of modules by their interface) ## Module-specific configuration A Calamares module *may* read a module configuration file, named `.conf`. If such a file is present in the module's directory, it is shipped as a *default* configuration file. The module configuration file, if it exists, is a YAML 1.2 document which contains a YAML map of anything. All default module configuration files are installed in `$DESTDIR/share/calamares/modules` but can be overridden by files with the same name placed manually (or by the packager) in `/etc/calamares/modules`. ## C++ modules Currently the recommended way to write a module which exposes one or more installer pages (viewmodule) is through a C++ and Qt plugin. Viewmodules must implement `Calamares::ViewStep`. They can also implement `Calamares::Job` to provide jobs. To add a Qt plugin module, put it in a subdirectory and make sure it has a `CMakeLists.txt` with a `calamares_add_plugin` call. It will be picked up automatically by our CMake magic. The `module.desc` file is optional. ## Python modules Modules may use one of the python interfaces, which may be present in a Calamares installation (but also may not be). These modules must have a `module.desc` file. The Python script must implement one or more of the Python interfaces for Calamares -- either the python jobmodule interface, or the experimental pythonqt job- and viewmodule interfaces. To add a Python or process jobmodule, put it in a subdirectory and make sure it has a `module.desc`. It will be picked up automatically by our CMake magic. For all kinds of Python jobs, the key *script* must be set to the name of the main python file for the job. This is almost universally "main.py". `CMakeLists.txt` is *not* used for Python and process jobmodules. Calamares offers a Python API for module developers, the core Calamares functionality is exposed as `libcalamares.job` for job data, `libcalamares.globalstorage` for shared data and `libcalamares.utils` for generic utility functions. Documentation is inline. All code in Python job modules must obey PEP8, the only exception are `libcalamares.globalstorage` keys, which should always be camelCaseWithLowerCaseInitial to match the C++ identifier convention. For testing and debugging we provide the `testmodule.py` script which fakes a limited Calamares Python environment for running a single jobmodule. ### Python Jobmodule A Python jobmodule is a Python program which imports libcalamares and has a function `run()` as entry point. The function `run()` must return `None` if everything went well, or a tuple `(str,str)` with an error message and description if something went wrong. ### PythonQt Jobmodule A PythonQt jobmodule implements the experimental Job interface by defining a subclass of something. ### PythonQt Viewmodule A PythonQt viewmodule implements the experimental View interface by defining a subclass of something. ## Process jobmodules A process jobmodule runs a (single) command. The interface is "process", while the module type must be "job" or "jobmodule". The key *command* should have a string as value, which is passed to the shell -- remember to quote it properly. calamares-3.1.12/src/modules/bootloader/000077500000000000000000000000001322271446000201205ustar00rootroot00000000000000calamares-3.1.12/src/modules/bootloader/bootloader.conf000066400000000000000000000023101322271446000231150ustar00rootroot00000000000000--- # Define which bootloader you want to use for EFI installations # Possible options are 'grub' and 'systemd-boot'. efiBootLoader: "grub" # systemd-boot configuration files settings, set kernel and initramfs file names # and amount of time before default selection boots kernel: "/vmlinuz-linux" img: "/initramfs-linux.img" fallback: "/initramfs-linux-fallback.img" timeout: "10" # Optionally set the menu entry name and kernel name to use in systemd-boot. # If not specified here, these settings will be taken from branding.desc. # bootloaderEntryName: "Generic GNU/Linux" # kernelLine: ", with Stable-Kernel" # fallbackKernelLine: ", with Stable-Kernel (fallback initramfs)" # GRUB 2 binary names and boot directory # Some distributions (e.g. Fedora) use grub2-* (resp. /boot/grub2/) names. grubInstall: "grub-install" grubMkconfig: "grub-mkconfig" grubCfg: "/boot/grub/grub.cfg" # Optionally set the --bootloader-id to use for EFI. If not set, this defaults # to the bootloaderEntryName from branding.desc with problematic characters # replaced. If an efiBootloaderId is specified here, it is taken to already be a # valid directory name, so no such postprocessing is done in this case. # efiBootloaderId: "dirname" calamares-3.1.12/src/modules/bootloader/main.py000066400000000000000000000306071322271446000214240ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Aurélien Gâteau # Copyright 2014, Anke Boersma # Copyright 2014, Daniel Hillenbrand # Copyright 2014, Benjamin Vaudour # Copyright 2014, Kevin Kofler # Copyright 2015-2017, Philip Mueller # Copyright 2016-2017, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, Adriaan de Groot # Copyright 2017, Gabriel Craciunescu # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import shutil import subprocess import libcalamares from libcalamares.utils import check_target_env_call def get_uuid(): """ Checks and passes 'uuid' to other routine. :return: """ root_mount_point = libcalamares.globalstorage.value("rootMountPoint") print("Root mount point: \"{!s}\"".format(root_mount_point)) partitions = libcalamares.globalstorage.value("partitions") print("Partitions: \"{!s}\"".format(partitions)) for partition in partitions: if partition["mountPoint"] == "/": print("Root partition uuid: \"{!s}\"".format(partition["uuid"])) return partition["uuid"] return "" def get_bootloader_entry_name(): """ Passes 'bootloader_entry_name' to other routine based on configuration file. :return: """ if "bootloaderEntryName" in libcalamares.job.configuration: return libcalamares.job.configuration["bootloaderEntryName"] else: branding = libcalamares.globalstorage.value("branding") return branding["bootloaderEntryName"] def get_kernel_line(kernel_type): """ Passes 'kernel_line' to other routine based on configuration file. :param kernel_type: :return: """ if kernel_type == "fallback": if "fallbackKernelLine" in libcalamares.job.configuration: return libcalamares.job.configuration["fallbackKernelLine"] else: return " (fallback)" else: if "kernelLine" in libcalamares.job.configuration: return libcalamares.job.configuration["kernelLine"] else: return "" def create_systemd_boot_conf(uuid, conf_path, kernel_line): """ Creates systemd-boot configuration files based on given parameters. :param uuid: :param conf_path: :param kernel_line: """ distribution = get_bootloader_entry_name() kernel = libcalamares.job.configuration["kernel"] img = libcalamares.job.configuration["img"] kernel_params = ["quiet"] partitions = libcalamares.globalstorage.value("partitions") swap_uuid = "" cryptdevice_params = [] # Take over swap settings: # - unencrypted swap partition sets swap_uuid # - encrypted root sets cryptdevice_params for partition in partitions: has_luks = "luksMapperName" in partition if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"] if partition["mountPoint"] == "/" and has_luks: cryptdevice_params = ["cryptdevice=UUID=" + partition["luksUuid"] + ":" + partition["luksMapperName"], "root=/dev/mapper/" + partition["luksMapperName"], "resume=/dev/mapper/" + partition["luksMapperName"]] if cryptdevice_params: kernel_params.extend(cryptdevice_params) else: kernel_params.append("root=UUID={!s}".format(uuid)) if swap_uuid: kernel_params.append("resume=UUID={!s}".format(swap_uuid)) lines = [ '## This is just an example config file.\n', '## Please edit the paths and kernel parameters according\n', '## to your system.\n', '\n', "title {!s}{!s}\n".format(distribution, kernel_line), "linux {!s}\n".format(kernel), "initrd {!s}\n".format(img), "options {!s} rw\n".format(" ".join(kernel_params)), ] with open(conf_path, 'w') as conf_file: for line in lines: conf_file.write(line) def create_loader(loader_path): """ Writes configuration for loader. :param loader_path: """ distribution = get_bootloader_entry_name() timeout = libcalamares.job.configuration["timeout"] file_name_sanitizer = str.maketrans(" /", "_-") distribution_translated = distribution.translate(file_name_sanitizer) lines = [ "timeout {!s}\n".format(timeout), "default {!s}\n".format(distribution_translated), ] with open(loader_path, 'w') as loader_file: for line in lines: loader_file.write(line) def install_systemd_boot(efi_directory): """ Installs systemd-boot as bootloader for EFI setups. :param efi_directory: """ print("Bootloader: systemd-boot") install_path = libcalamares.globalstorage.value("rootMountPoint") install_efi_directory = install_path + efi_directory uuid = get_uuid() distribution = get_bootloader_entry_name() file_name_sanitizer = str.maketrans(" /", "_-") distribution_translated = distribution.translate(file_name_sanitizer) conf_path = os.path.join(install_efi_directory, "loader", "entries", distribution_translated + ".conf") fallback_path = os.path.join(install_efi_directory, "loader", "entries", distribution_translated + "-fallback.conf") loader_path = os.path.join(install_efi_directory, "loader", "loader.conf") subprocess.call(["bootctl", "--path={!s}".format(install_efi_directory), "install"]) kernel_line = get_kernel_line("default") print("Configure: \"{!s}\"".format(kernel_line)) create_systemd_boot_conf(uuid, conf_path, kernel_line) kernel_line = get_kernel_line("fallback") print("Configure: \"{!s}\"".format(kernel_line)) create_systemd_boot_conf(uuid, fallback_path, kernel_line) create_loader(loader_path) def install_grub(efi_directory, fw_type): """ Installs grub as bootloader, either in pc or efi mode. :param efi_directory: :param fw_type: """ if fw_type == "efi": print("Bootloader: grub (efi)") install_path = libcalamares.globalstorage.value("rootMountPoint") install_efi_directory = install_path + efi_directory if not os.path.isdir(install_efi_directory): os.makedirs(install_efi_directory) if "efiBootloaderId" in libcalamares.job.configuration: efi_bootloader_id = libcalamares.job.configuration[ "efiBootloaderId"] else: branding = libcalamares.globalstorage.value("branding") distribution = branding["bootloaderEntryName"] file_name_sanitizer = str.maketrans(" /", "_-") efi_bootloader_id = distribution.translate(file_name_sanitizer) # get bitness of the underlying UEFI try: sysfile = open("/sys/firmware/efi/fw_platform_size", "r") efi_bitness = sysfile.read(2) except Exception: # if the kernel is older than 4.0, the UEFI bitness likely isn't # exposed to the userspace so we assume a 64 bit UEFI here efi_bitness = "64" bitness_translate = {"32": "--target=i386-efi", "64": "--target=x86_64-efi"} check_target_env_call([libcalamares.job.configuration["grubInstall"], bitness_translate[efi_bitness], "--efi-directory=" + efi_directory, "--bootloader-id=" + efi_bootloader_id, "--force"]) # VFAT is weird, see issue CAL-385 install_efi_directory_firmware = (vfat_correct_case( install_efi_directory, "EFI")) if not os.path.exists(install_efi_directory_firmware): os.makedirs(install_efi_directory_firmware) # there might be several values for the boot directory # most usual they are boot, Boot, BOOT install_efi_boot_directory = (vfat_correct_case( install_efi_directory_firmware, "boot")) if not os.path.exists(install_efi_boot_directory): os.makedirs(install_efi_boot_directory) # Workaround for some UEFI firmwares efi_file_source = {"32": os.path.join(install_efi_directory_firmware, efi_bootloader_id, "grubia32.efi"), "64": os.path.join(install_efi_directory_firmware, efi_bootloader_id, "grubx64.efi")} efi_file_target = {"32": os.path.join(install_efi_boot_directory, "bootia32.efi"), "64": os.path.join(install_efi_boot_directory, "bootx64.efi")} shutil.copy2(efi_file_source[efi_bitness], efi_file_target[efi_bitness]) else: print("Bootloader: grub (bios)") if libcalamares.globalstorage.value("bootLoader") is None: return boot_loader = libcalamares.globalstorage.value("bootLoader") if boot_loader["installPath"] is None: return check_target_env_call([libcalamares.job.configuration["grubInstall"], "--target=i386-pc", "--recheck", "--force", boot_loader["installPath"]]) # The file specified in grubCfg should already be filled out # by the grubcfg job module. check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", libcalamares.job.configuration["grubCfg"]]) def vfat_correct_case(parent, name): for candidate in os.listdir(parent): if name.lower() == candidate.lower(): return os.path.join(parent, candidate) return os.path.join(parent, name) def prepare_bootloader(fw_type): """ Prepares bootloader. Based on value 'efi_boot_loader', it either calls systemd-boot or grub to be installed. :param fw_type: :return: """ efi_boot_loader = libcalamares.job.configuration["efiBootLoader"] efi_directory = libcalamares.globalstorage.value("efiSystemPartition") if efi_boot_loader == "systemd-boot" and fw_type == "efi": install_systemd_boot(efi_directory) else: install_grub(efi_directory, fw_type) def run(): """ Starts procedure and passes 'fw_type' to other routine. :return: """ fw_type = libcalamares.globalstorage.value("firmwareType") if (libcalamares.globalstorage.value("bootLoader") is None and fw_type != "efi"): return None partitions = libcalamares.globalstorage.value("partitions") if fw_type == "efi": esp_found = False for partition in partitions: if (partition["mountPoint"] == libcalamares.globalstorage.value("efiSystemPartition")): esp_found = True if not esp_found: return None prepare_bootloader(fw_type) return None calamares-3.1.12/src/modules/bootloader/module.desc000066400000000000000000000001321322271446000222410ustar00rootroot00000000000000--- type: "job" name: "bootloader" interface: "python" script: "main.py" calamares-3.1.12/src/modules/bootloader/test.yaml000066400000000000000000000001621322271446000217620ustar00rootroot00000000000000rootMountPoint: /tmp/mount bootLoader: installPath: /dev/sdb branding: shortProductName: "Generic Distro" calamares-3.1.12/src/modules/displaymanager/000077500000000000000000000000001322271446000207665ustar00rootroot00000000000000calamares-3.1.12/src/modules/displaymanager/displaymanager.conf000066400000000000000000000017031322271446000246360ustar00rootroot00000000000000--- #The DM module attempts to set up all the DMs found in this list, in that precise order. #It also sets up autologin, if the feature is enabled in globalstorage. #The displaymanagers list can also be set in globalstorage, and in that case it overrides anything set up here. displaymanagers: - slim - sddm - lightdm - gdm - mdm - lxdm - kdm #Enable the following settings to force a desktop environment in your displaymanager configuration file: #defaultDesktopEnvironment: # executable: "startkde" # desktopFile: "plasma" #If true, try to ensure that the user, group, /var directory etc. for the #display manager are set up correctly. This is normally done by the distribution #packages, and best left to them. Therefore, it is disabled by default. basicSetup: false #If true, setup autologin for openSUSE. This only makes sense on openSUSE #derivatives or other systems where /etc/sysconfig/displaymanager exists. sysconfigSetup: false calamares-3.1.12/src/modules/displaymanager/main.py000066400000000000000000000627661322271446000223050ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014-2017, Philip Müller # Copyright 2014-2015, Teo Mrnjavac # Copyright 2014, Kevin Kofler # Copyright 2017, Alf Gaida # Copyright 2017, Bernhard Landauer # Copyright 2017, Adriaan de Groot # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import collections import re import libcalamares import configparser DesktopEnvironment = collections.namedtuple( 'DesktopEnvironment', ['executable', 'desktop_file'] ) desktop_environments = [ DesktopEnvironment('/usr/bin/startkde', 'plasma'), # KDE Plasma 5 DesktopEnvironment('/usr/bin/startkde', 'kde-plasma'), # KDE Plasma 4 DesktopEnvironment('/usr/bin/gnome-session', 'gnome'), DesktopEnvironment('/usr/bin/startxfce4', 'xfce'), DesktopEnvironment('/usr/bin/cinnamon-session-cinnamon', 'cinnamon'), DesktopEnvironment('/usr/bin/mate-session', 'mate'), DesktopEnvironment('/usr/bin/enlightenment_start', 'enlightenment'), DesktopEnvironment('/usr/bin/lxsession', 'LXDE'), DesktopEnvironment('/usr/bin/startlxde', 'LXDE'), DesktopEnvironment('/usr/bin/lxqt-session', 'lxqt'), DesktopEnvironment('/usr/bin/pekwm', 'pekwm'), DesktopEnvironment('/usr/bin/pantheon-session', 'pantheon'), DesktopEnvironment('/usr/bin/budgie-session', 'budgie-session'), DesktopEnvironment('/usr/bin/budgie-desktop', 'budgie-desktop'), DesktopEnvironment('/usr/bin/i3', 'i3'), DesktopEnvironment('/usr/bin/startdde', 'deepin'), DesktopEnvironment('/usr/bin/openbox-session', 'openbox') ] def find_desktop_environment(root_mount_point): """ Checks which desktop environment is currently installed. :param root_mount_point: :return: """ for desktop_environment in desktop_environments: if (os.path.exists("{!s}{!s}".format( root_mount_point, desktop_environment.executable ) ) and os.path.exists( "{!s}/usr/share/xsessions/{!s}.desktop".format( root_mount_point, desktop_environment.desktop_file ) )): return desktop_environment return None def have_dm(dm_name, root_mount_point): """ Checks if display manager is properly installed. :param dm_name: :param root_mount_point: :return: """ bin_path = "{!s}/usr/bin/{!s}".format(root_mount_point, dm_name) sbin_path = "{!s}/usr/sbin/{!s}".format(root_mount_point, dm_name) return (os.path.exists(bin_path) or os.path.exists(sbin_path) ) def set_autologin(username, displaymanager, default_desktop_environment, root_mount_point): """ Enables automatic login for the installed desktop managers. :param username: :param displaymanager: str The displaymanager for which to configure autologin. :param default_desktop_environment: :param root_mount_point: """ do_autologin = True if username is None: do_autologin = False if "mdm" == displaymanager: # Systems with MDM as Desktop Manager mdm_conf_path = os.path.join(root_mount_point, "etc/mdm/custom.conf") if os.path.exists(mdm_conf_path): with open(mdm_conf_path, 'r') as mdm_conf: text = mdm_conf.readlines() with open(mdm_conf_path, 'w') as mdm_conf: for line in text: if '[daemon]' in line: if do_autologin: line = ( "[daemon]\n" "AutomaticLogin={!s}\n" "AutomaticLoginEnable=True\n".format(username) ) else: line = ( "[daemon]\n" "AutomaticLoginEnable=False\n" ) mdm_conf.write(line) else: with open(mdm_conf_path, 'w') as mdm_conf: mdm_conf.write( '# Calamares - Configure automatic login for user\n' ) mdm_conf.write('[daemon]\n') if do_autologin: mdm_conf.write("AutomaticLogin={!s}\n".format(username)) mdm_conf.write('AutomaticLoginEnable=True\n') else: mdm_conf.write('AutomaticLoginEnable=False\n') if "gdm" == displaymanager: # Systems with GDM as Desktop Manager gdm_conf_path = os.path.join(root_mount_point, "etc/gdm/custom.conf") if os.path.exists(gdm_conf_path): with open(gdm_conf_path, 'r') as gdm_conf: text = gdm_conf.readlines() with open(gdm_conf_path, 'w') as gdm_conf: for line in text: if '[daemon]' in line: if do_autologin: line = ( "[daemon]\n" "AutomaticLogin={!s}\n" "AutomaticLoginEnable=True\n".format(username) ) else: line = "[daemon]\nAutomaticLoginEnable=False\n" gdm_conf.write(line) else: with open(gdm_conf_path, 'w') as gdm_conf: gdm_conf.write( '# Calamares - Enable automatic login for user\n' ) gdm_conf.write('[daemon]\n') if do_autologin: gdm_conf.write("AutomaticLogin={!s}\n".format(username)) gdm_conf.write('AutomaticLoginEnable=True\n') else: gdm_conf.write('AutomaticLoginEnable=False\n') if (do_autologin): accountservice_dir = "{!s}/var/lib/AccountsService/users".format( root_mount_point ) userfile_path = "{!s}/{!s}".format(accountservice_dir, username) if os.path.exists(accountservice_dir): with open(userfile_path, "w") as userfile: userfile.write("[User]\n") if default_desktop_environment is not None: userfile.write("XSession={!s}\n".format( default_desktop_environment.desktop_file)) userfile.write("Icon=\n") if "kdm" == displaymanager: # Systems with KDM as Desktop Manager kdm_conf_path = os.path.join( root_mount_point, "usr/share/config/kdm/kdmrc" ) # Check which path is in use: SUSE does something else. # Also double-check the default setting. Pick the first # one that exists in the target. for candidate_kdmrc in ( "usr/share/config/kdm/kdmrc", "usr/share/kde4/config/kdm/kdmrc", ): p = os.path.join(root_mount_point, candidate_kdmrc) if os.path.exists(p): kdm_conf_path = p break text = [] if os.path.exists(kdm_conf_path): with open(kdm_conf_path, 'r') as kdm_conf: text = kdm_conf.readlines() with open(kdm_conf_path, 'w') as kdm_conf: for line in text: if 'AutoLoginEnable=' in line: if do_autologin: line = 'AutoLoginEnable=true\n' else: line = 'AutoLoginEnable=false\n' if do_autologin and 'AutoLoginUser=' in line: line = "AutoLoginUser={!s}\n".format(username) kdm_conf.write(line) else: return ( "Cannot write KDM configuration file", "KDM config file {!s} does not exist".format(kdm_conf_path) ) if "lxdm" == displaymanager: # Systems with LXDM as Desktop Manager lxdm_conf_path = os.path.join(root_mount_point, "etc/lxdm/lxdm.conf") text = [] if os.path.exists(lxdm_conf_path): with open(lxdm_conf_path, 'r') as lxdm_conf: text = lxdm_conf.readlines() with open(lxdm_conf_path, 'w') as lxdm_conf: for line in text: if 'autologin=' in line: if do_autologin: line = "autologin={!s}\n".format(username) else: line = "# autologin=\n" lxdm_conf.write(line) else: return ( "Cannot write LXDM configuration file", "LXDM config file {!s} does not exist".format(lxdm_conf_path) ) if "lightdm" == displaymanager: # Systems with LightDM as Desktop Manager # Ideally, we should use configparser for the ini conf file, # but we just do a simple text replacement for now, as it # worksforme(tm) lightdm_conf_path = os.path.join( root_mount_point, "etc/lightdm/lightdm.conf" ) text = [] if os.path.exists(lightdm_conf_path): with open(lightdm_conf_path, 'r') as lightdm_conf: text = lightdm_conf.readlines() with open(lightdm_conf_path, 'w') as lightdm_conf: for line in text: if 'autologin-user=' in line: if do_autologin: line = "autologin-user={!s}\n".format(username) else: line = "#autologin-user=\n" lightdm_conf.write(line) else: try: # Create a new lightdm.conf file; this is documented to be # read last, after aeverything in lightdm.conf.d/ with open(lightdm_conf_path, 'w') as lightdm_conf: if do_autologin: lightdm_conf.write( "autologin-user={!s}\n".format(username)) else: lightdm_conf.write( "#autologin-user=\n") except FileNotFoundError: return ( "Cannot write LightDM configuration file", "LightDM config file {!s} does not exist".format( lightdm_conf_path ) ) if "slim" == displaymanager: # Systems with Slim as Desktop Manager slim_conf_path = os.path.join(root_mount_point, "etc/slim.conf") text = [] if os.path.exists(slim_conf_path): with open(slim_conf_path, 'r') as slim_conf: text = slim_conf.readlines() with open(slim_conf_path, 'w') as slim_conf: for line in text: if 'auto_login' in line: if do_autologin: line = 'auto_login yes\n' else: line = 'auto_login no\n' if do_autologin and 'default_user' in line: line = "default_user {!s}\n".format(username) slim_conf.write(line) else: return ( "Cannot write SLIM configuration file", "SLIM config file {!s} does not exist".format(slim_conf_path) ) if "sddm" == displaymanager: # Systems with Sddm as Desktop Manager sddm_conf_path = os.path.join(root_mount_point, "etc/sddm.conf") sddm_config = configparser.ConfigParser(strict=False) # Make everything case sensitive sddm_config.optionxform = str if os.path.isfile(sddm_conf_path): sddm_config.read(sddm_conf_path) if 'Autologin' not in sddm_config: sddm_config.add_section('Autologin') if do_autologin: sddm_config.set('Autologin', 'User', username) elif sddm_config.has_option('Autologin', 'User'): sddm_config.remove_option('Autologin', 'User') if default_desktop_environment is not None: sddm_config.set( 'Autologin', 'Session', default_desktop_environment.desktop_file ) with open(sddm_conf_path, 'w') as sddm_config_file: sddm_config.write(sddm_config_file, space_around_delimiters=False) if "sysconfig" == displaymanager: dmauto = "DISPLAYMANAGER_AUTOLOGIN" os.system( "sed -i -e 's|^{!s}=.*|{!s}=\"{!s}\"|' " "{!s}/etc/sysconfig/displaymanager".format( dmauto, dmauto, username if do_autologin else "", root_mount_point ) ) return None def run(): """ Configure display managers. We acquire a list of displaymanagers, either from config or (overridden) from globalstorage. This module will try to set up (including autologin) all the displaymanagers in the list, in that specific order. Most distros will probably only ship one displaymanager. If a displaymanager is in the list but not installed, a debugging message is printed and the entry ignored. """ if "displaymanagers" in libcalamares.job.configuration: displaymanagers = libcalamares.job.configuration["displaymanagers"] if libcalamares.globalstorage.contains("displayManagers"): displaymanagers = libcalamares.globalstorage.value("displayManagers") if displaymanagers is None: return ( "No display managers selected for the displaymanager module.", "The displaymanagers list is empty or undefined in both" "globalstorage and displaymanager.conf." ) username = libcalamares.globalstorage.value("autologinUser") root_mount_point = libcalamares.globalstorage.value("rootMountPoint") if "default_desktop_environment" in libcalamares.job.configuration: entry = libcalamares.job.configuration["defaultDesktopEnvironment"] default_desktop_environment = DesktopEnvironment( entry["executable"], entry["desktopFile"] ) else: default_desktop_environment = find_desktop_environment( root_mount_point ) if "basicSetup" in libcalamares.job.configuration: enable_basic_setup = libcalamares.job.configuration["basicSetup"] else: enable_basic_setup = False # Setup slim if "slim" in displaymanagers: if not have_dm("slim", root_mount_point): libcalamares.utils.debug("slim selected but not installed") displaymanagers.remove("slim") # Setup sddm if "sddm" in displaymanagers: if not have_dm("sddm", root_mount_point): libcalamares.utils.debug("sddm selected but not installed") displaymanagers.remove("sddm") # setup lightdm if "lightdm" in displaymanagers: if have_dm("lightdm", root_mount_point): lightdm_conf_path = os.path.join( root_mount_point, "etc/lightdm/lightdm.conf" ) if enable_basic_setup: libcalamares.utils.target_env_call( ['mkdir', '-p', '/run/lightdm'] ) if libcalamares.utils.target_env_call( ['getent', 'group', 'lightdm'] ) != 0: libcalamares.utils.target_env_call( ['groupadd', '-g', '620', 'lightdm'] ) if libcalamares.utils.target_env_call( ['getent', 'passwd', 'lightdm'] ) != 0: libcalamares.utils.target_env_call( ['useradd', '-c', '"LightDM Display Manager"', '-u', '620', '-g', 'lightdm', '-d', '/var/run/lightdm', '-s', '/usr/bin/nologin', 'lightdm' ] ) libcalamares.utils.target_env_call('passwd', '-l', 'lightdm') libcalamares.utils.target_env_call( ['chown', '-R', 'lightdm:lightdm', '/run/lightdm'] ) libcalamares.utils.target_env_call( ['chmod', '+r' '/etc/lightdm/lightdm.conf'] ) if default_desktop_environment is not None: os.system( "sed -i -e \"s/^.*user-session=.*/user-session={!s}/\" " "{!s}".format( default_desktop_environment.desktop_file, lightdm_conf_path ) ) # configure lightdm-greeter greeter_path = os.path.join( root_mount_point, "usr/share/xgreeters" ) if (os.path.exists(greeter_path)): # configure first found lightdm-greeter for entry in os.listdir(greeter_path): if entry.endswith('.desktop'): greeter = entry.split('.')[0] libcalamares.utils.debug( "found greeter {!s}".format(greeter) ) os.system( "sed -i -e \"s/^.*greeter-session=.*" "/greeter-session={!s}/\" {!s}".format( greeter, lightdm_conf_path ) ) libcalamares.utils.debug( "{!s} configured as greeter.".format(greeter) ) break else: return ("No lightdm greeter installed.") else: libcalamares.utils.debug("lightdm selected but not installed") displaymanagers.remove("lightdm") # Setup gdm if "gdm" in displaymanagers: if have_dm("gdm", root_mount_point): if enable_basic_setup: if libcalamares.utils.target_env_call( ['getent', 'group', 'gdm'] ) != 0: libcalamares.utils.target_env_call( ['groupadd', '-g', '120', 'gdm'] ) if libcalamares.utils.target_env_call( ['getent', 'passwd', 'gdm'] ) != 0: libcalamares.utils.target_env_call( ['useradd', '-c', '"Gnome Display Manager"', '-u', '120', '-g', 'gdm', '-d', '/var/lib/gdm', '-s', '/usr/bin/nologin', 'gdm' ] ) libcalamares.utils.target_env_call( ['passwd', '-l', 'gdm'] ) libcalamares.utils.target_env_call( ['chown', '-R', 'gdm:gdm', '/var/lib/gdm'] ) else: libcalamares.utils.debug("gdm selected but not installed") displaymanagers.remove("gdm") # Setup mdm if "mdm" in displaymanagers: if have_dm("mdm", root_mount_point): if enable_basic_setup: if libcalamares.utils.target_env_call( ['getent', 'group', 'mdm'] ) != 0: libcalamares.utils.target_env_call( ['groupadd', '-g', '128', 'mdm'] ) if libcalamares.utils.target_env_call( ['getent', 'passwd', 'mdm'] ) != 0: libcalamares.utils.target_env_call( ['useradd', '-c', '"Linux Mint Display Manager"', '-u', '128', '-g', 'mdm', '-d', '/var/lib/mdm', '-s', '/usr/bin/nologin', 'mdm' ] ) libcalamares.utils.target_env_call( ['passwd', '-l', 'mdm'] ) libcalamares.utils.target_env_call( ['chown', 'root:mdm', '/var/lib/mdm'] ) libcalamares.utils.target_env_call( ['chmod', '1770', '/var/lib/mdm'] ) if default_desktop_environment is not None: os.system( "sed -i \"s|default.desktop|{!s}.desktop|g\" " "{!s}/etc/mdm/custom.conf".format( default_desktop_environment.desktop_file, root_mount_point ) ) else: libcalamares.utils.debug("mdm selected but not installed") displaymanagers.remove("mdm") # Setup lxdm if "lxdm" in displaymanagers: if have_dm("lxdm", root_mount_point): if enable_basic_setup: if libcalamares.utils.target_env_call( ['getent', 'group', 'lxdm'] ) != 0: libcalamares.utils.target_env_call( ['groupadd', '--system', 'lxdm'] ) libcalamares.utils.target_env_call( ['chgrp', '-R', 'lxdm', '/var/lib/lxdm'] ) libcalamares.utils.target_env_call( ['chgrp', 'lxdm', '/etc/lxdm/lxdm.conf'] ) libcalamares.utils.target_env_call( ['chmod', '+r', '/etc/lxdm/lxdm.conf'] ) if default_desktop_environment is not None: os.system( "sed -i -e \"s|^.*session=.*|session={!s}|\" " "{!s}/etc/lxdm/lxdm.conf".format( default_desktop_environment.executable, root_mount_point ) ) else: libcalamares.utils.debug("lxdm selected but not installed") displaymanagers.remove("lxdm") # Setup kdm if "kdm" in displaymanagers: if have_dm("kdm", root_mount_point): if enable_basic_setup: if libcalamares.utils.target_env_call( ['getent', 'group', 'kdm'] ) != 0: libcalamares.utils.target_env_call( ['groupadd', '-g', '135', 'kdm'] ) if libcalamares.utils.target_env_call( ['getent', 'passwd', 'kdm'] ) != 0: libcalamares.utils.target_env_call( ['useradd', '-u', '135', '-g', 'kdm', '-d', '/var/lib/kdm', '-s', '/bin/false', '-r', '-M', 'kdm' ] ) libcalamares.utils.target_env_call( ['chown', '-R', '135:135', 'var/lib/kdm'] ) else: libcalamares.utils.debug("kdm selected but not installed") displaymanagers.remove("kdm") if username is not None: libcalamares.utils.debug( "Setting up autologin for user {!s}.".format(username) ) else: libcalamares.utils.debug("Unsetting autologin.") libcalamares.globalstorage.insert("displayManagers", displaymanagers) dm_setup_message = [] for dm in displaymanagers: dm_message = set_autologin( username, dm, default_desktop_environment, root_mount_point ) if dm_message is not None: dm_setup_message.append("{!s}: {!s}".format(*dm_message)) if ("sysconfigSetup" in libcalamares.job.configuration and libcalamares.job.configuration["sysconfigSetup"]): set_autologin(username, "sysconfig", None, root_mount_point) if dm_setup_message: return ("Display manager configuration was incomplete", "\n".join(dm_setup_message)) calamares-3.1.12/src/modules/displaymanager/module.desc000066400000000000000000000001551322271446000231140ustar00rootroot00000000000000--- type: "job" name: "displaymanager" interface: "python" requires: [] script: "main.py" calamares-3.1.12/src/modules/dracut/000077500000000000000000000000001322271446000172505ustar00rootroot00000000000000calamares-3.1.12/src/modules/dracut/main.py000066400000000000000000000026521322271446000205530ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014-2015, Philip Müller # Copyright 2014, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares from libcalamares.utils import target_env_call def run_dracut(): """ Creates initramfs, even when initramfs already exists. :return: """ return target_env_call(['dracut', '-f']) def run(): """ Starts routine to create initramfs. It passes back the exit code if it fails. :return: """ return_code = run_dracut() if return_code != 0: return ("Failed to run dracut on the target", "The exit code was {}".format(return_code)) calamares-3.1.12/src/modules/dracut/module.desc000066400000000000000000000001261322271446000213740ustar00rootroot00000000000000--- type: "job" name: "dracut" interface: "python" script: "main.py" calamares-3.1.12/src/modules/dracutlukscfg/000077500000000000000000000000001322271446000206275ustar00rootroot00000000000000calamares-3.1.12/src/modules/dracutlukscfg/CMakeLists.txt000066400000000000000000000002751322271446000233730ustar00rootroot00000000000000calamares_add_plugin( dracutlukscfg TYPE job EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES DracutLuksCfgJob.cpp LINK_PRIVATE_LIBRARIES calamares SHARED_LIB ) calamares-3.1.12/src/modules/dracutlukscfg/DracutLuksCfgJob.cpp000066400000000000000000000134431322271446000244740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "DracutLuksCfgJob.h" #include #include #include #include #include "CalamaresVersion.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" // static const QLatin1Literal DracutLuksCfgJob::CONFIG_FILE( "/etc/dracut.conf.d/calamares-luks.conf" ); // static const char *DracutLuksCfgJob::CONFIG_FILE_HEADER = "# Configuration file automatically written by the Calamares system installer\n" "# (This file is written once at install time and should be safe to edit.)\n" "# Enables support for LUKS full disk encryption with single sign on from GRUB.\n" "\n"; // static const char *DracutLuksCfgJob::CONFIG_FILE_CRYPTTAB_KEYFILE_LINE = "# force installing /etc/crypttab even if hostonly=\"no\", install the keyfile\n" "install_items+=\" /etc/crypttab /crypto_keyfile.bin \"\n"; // static const char *DracutLuksCfgJob::CONFIG_FILE_CRYPTTAB_LINE = "# force installing /etc/crypttab even if hostonly=\"no\"\n" "install_items+=\" /etc/crypttab \"\n"; // static const QLatin1Literal DracutLuksCfgJob::CONFIG_FILE_SWAPLINE( "# enable automatic resume from swap\nadd_device+=\" /dev/disk/by-uuid/%1 \"\n" ); // static QString DracutLuksCfgJob::rootMountPoint() { Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage(); return globalStorage->value( QStringLiteral( "rootMountPoint" ) ).toString(); } // static QVariantList DracutLuksCfgJob::partitions() { Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage(); return globalStorage->value( QStringLiteral( "partitions" ) ).toList(); } // static bool DracutLuksCfgJob::isRootEncrypted() { const QVariantList partitions = DracutLuksCfgJob::partitions(); for ( const QVariant &partition : partitions ) { QVariantMap partitionMap = partition.toMap(); QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString(); if ( mountPoint == QStringLiteral( "/" ) ) return partitionMap.contains( QStringLiteral( "luksMapperName" ) ); } return false; } // static bool DracutLuksCfgJob::hasUnencryptedSeparateBoot() { const QVariantList partitions = DracutLuksCfgJob::partitions(); for ( const QVariant &partition : partitions ) { QVariantMap partitionMap = partition.toMap(); QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString(); if ( mountPoint == QStringLiteral( "/boot" ) ) return !partitionMap.contains( QStringLiteral( "luksMapperName" ) ); } return false; } // static QString DracutLuksCfgJob::swapOuterUuid() { const QVariantList partitions = DracutLuksCfgJob::partitions(); for ( const QVariant &partition : partitions ) { QVariantMap partitionMap = partition.toMap(); QString fsType = partitionMap.value( QStringLiteral( "fs" ) ).toString(); if ( fsType == QStringLiteral( "linuxswap" ) && partitionMap.contains( QStringLiteral( "luksMapperName" ) ) ) return partitionMap.value( QStringLiteral( "luksUuid" ) ).toString(); } return QString(); } DracutLuksCfgJob::DracutLuksCfgJob( QObject* parent ) : Calamares::CppJob( parent ) { } DracutLuksCfgJob::~DracutLuksCfgJob() { } QString DracutLuksCfgJob::prettyName() const { if ( isRootEncrypted() ) return tr( "Write LUKS configuration for Dracut to %1" ).arg( CONFIG_FILE ); else return tr( "Skip writing LUKS configuration for Dracut: \"/\" partition is not encrypted" ); } Calamares::JobResult DracutLuksCfgJob::exec() { if ( isRootEncrypted() ) { const QString realConfigFilePath = rootMountPoint() + CONFIG_FILE; cDebug() << "[DRACUTLUKSCFG]: Writing" << realConfigFilePath; QDir( QStringLiteral( "/" ) ).mkpath( QFileInfo( realConfigFilePath ).absolutePath() ); QFile configFile( realConfigFilePath ); if ( ! configFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) { cDebug() << "[DRACUTLUKSCFG]: Failed to open" << realConfigFilePath; return Calamares::JobResult::error( tr( "Failed to open %1" ).arg( realConfigFilePath ) ); } QTextStream outStream( &configFile ); outStream << CONFIG_FILE_HEADER << ( hasUnencryptedSeparateBoot() ? CONFIG_FILE_CRYPTTAB_LINE : CONFIG_FILE_CRYPTTAB_KEYFILE_LINE ); const QString swapOuterUuid = DracutLuksCfgJob::swapOuterUuid(); if ( ! swapOuterUuid.isEmpty() ) { cDebug() << "[DRACUTLUKSCFG]: Swap outer UUID" << swapOuterUuid; outStream << QString(CONFIG_FILE_SWAPLINE).arg( swapOuterUuid ).toLatin1(); } cDebug() << "[DRACUTLUKSCFG]: Wrote config to" << realConfigFilePath; } else cDebug() << "[DRACUTLUKSCFG]: / not encrypted, skipping"; return Calamares::JobResult::ok(); } CALAMARES_PLUGIN_FACTORY_DEFINITION( DracutLuksCfgJobFactory, registerPlugin(); ) calamares-3.1.12/src/modules/dracutlukscfg/DracutLuksCfgJob.h000066400000000000000000000035071322271446000241410ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Kevin Kofler * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DRACUTLUKSCFGJOB_H #define DRACUTLUKSCFGJOB_H #include #include #include #include #include class PLUGINDLLEXPORT DracutLuksCfgJob : public Calamares::CppJob { Q_OBJECT public: explicit DracutLuksCfgJob( QObject* parent = nullptr ); virtual ~DracutLuksCfgJob() override; QString prettyName() const override; Calamares::JobResult exec() override; private: static const QLatin1Literal CONFIG_FILE; static const char *CONFIG_FILE_HEADER; static const char *CONFIG_FILE_CRYPTTAB_KEYFILE_LINE; static const char *CONFIG_FILE_CRYPTTAB_LINE; static const QLatin1Literal CONFIG_FILE_SWAPLINE; static QString rootMountPoint(); static QVariantList partitions(); static bool isRootEncrypted(); static bool hasUnencryptedSeparateBoot(); static QString swapOuterUuid(); }; CALAMARES_PLUGIN_FACTORY_DECLARATION( DracutLuksCfgJobFactory ) #endif // DRACUTLUKSCFGJOB_H calamares-3.1.12/src/modules/dummycpp/000077500000000000000000000000001322271446000176245ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummycpp/CMakeLists.txt000066400000000000000000000002631322271446000223650ustar00rootroot00000000000000calamares_add_plugin( dummycpp TYPE job EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES DummyCppJob.cpp LINK_PRIVATE_LIBRARIES calamares SHARED_LIB ) calamares-3.1.12/src/modules/dummycpp/DummyCppJob.cpp000066400000000000000000000111461322271446000225240ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac (original dummypython code) * Copyright 2016, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "DummyCppJob.h" #include #include #include #include "CalamaresVersion.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" DummyCppJob::DummyCppJob( QObject* parent ) : Calamares::CppJob( parent ) { } DummyCppJob::~DummyCppJob() { } QString DummyCppJob::prettyName() const { return tr( "Dummy C++ Job" ); } static QString variantListToString( const QVariantList& variantList ); static QString variantMapToString( const QVariantMap& variantMap ); static QString variantHashToString( const QVariantHash& variantHash ); static QString variantToString( const QVariant& variant ) { switch ( variant.type() ) { case QVariant::Map: return variantMapToString( variant.toMap() ); case QVariant::Hash: return variantHashToString( variant.toHash() ); case QVariant::List: case QVariant::StringList: return variantListToString( variant.toList() ); default: return variant.toString(); } } static QString variantListToString( const QVariantList& variantList ) { QStringList result; for ( const QVariant& variant : variantList ) result.append( variantToString( variant ) ); return '{' + result.join(',') + '}'; } static QString variantMapToString( const QVariantMap& variantMap ) { QStringList result; for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it ) result.append( it.key() + '=' + variantToString( it.value() ) ); return '[' + result.join(',') + ']'; } static QString variantHashToString( const QVariantHash& variantHash ) { QStringList result; for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it ) result.append( it.key() + '=' + variantToString( it.value() ) ); return '<' + result.join(',') + '>'; } Calamares::JobResult DummyCppJob::exec() { // Ported from dummypython QProcess::execute( "/bin/sh", QStringList() << "-c" << "touch ~/calamares-dummycpp" ); QString accumulator = QDateTime::currentDateTimeUtc().toString( Qt::ISODate ) + '\n'; accumulator += QStringLiteral( "Calamares version: " ) + CALAMARES_VERSION_SHORT + '\n'; accumulator += QStringLiteral( "This job's name: " ) + prettyName() + '\n'; accumulator += QStringLiteral( "Configuration map: %1\n" ).arg( variantMapToString( m_configurationMap ) ); accumulator += QStringLiteral( " *** globalstorage test ***\n" ); Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage(); accumulator += QStringLiteral( "lala: " ) + (globalStorage->contains( "lala" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; accumulator += QStringLiteral( "foo: " ) + (globalStorage->contains( "foo" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; accumulator += QStringLiteral( "count: " ) + QString::number( globalStorage->count() ) + '\n'; globalStorage->insert( "item2", "value2" ); globalStorage->insert( "item3", 3 ); accumulator += QStringLiteral( "keys: %1\n" ).arg( globalStorage->keys().join( ',' ) ); accumulator += QStringLiteral( "remove: %1\n" ).arg( QString::number( globalStorage->remove( "item2" ) ) ); accumulator += QStringLiteral( "values: %1 %2 %3\n" ).arg( globalStorage->value( "foo" ).toString(), globalStorage->value( "item2" ).toString(), globalStorage->value( "item3" ).toString() ); emit progress( 0.1 ); cDebug() << "[DUMMYCPP]: " << accumulator; QThread::sleep( 3 ); return Calamares::JobResult::ok(); } void DummyCppJob::setConfigurationMap( const QVariantMap& configurationMap ) { m_configurationMap = configurationMap; } CALAMARES_PLUGIN_FACTORY_DEFINITION( DummyCppJobFactory, registerPlugin(); ) calamares-3.1.12/src/modules/dummycpp/DummyCppJob.h000066400000000000000000000027341322271446000221740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Kevin Kofler * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DUMMYCPPJOB_H #define DUMMYCPPJOB_H #include #include #include #include #include class PLUGINDLLEXPORT DummyCppJob : public Calamares::CppJob { Q_OBJECT public: explicit DummyCppJob( QObject* parent = nullptr ); virtual ~DummyCppJob() override; QString prettyName() const override; Calamares::JobResult exec() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: QVariantMap m_configurationMap; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( DummyCppJobFactory ) #endif // DUMMYCPPJOB_H calamares-3.1.12/src/modules/dummycpp/dummycpp.conf000066400000000000000000000005441322271446000223340ustar00rootroot00000000000000--- syntax: "YAML map of anything" example: whats_this: "module-specific configuration" from_where: "dummycpp.conf" a_list: - "item1" - "item2" - "item3" - "item4" a_list_of_maps: - name: "an Item" contents: - "an element" - "another element" - name: "another item" contents: - "not much"calamares-3.1.12/src/modules/dummycpp/module.desc000066400000000000000000000014501322271446000217510ustar00rootroot00000000000000# Module metadata file for dummycpp job # # The metadata for C++ (qtplugin) plugins is almost never interesting: # the CMakeLists.txt should be using calamares_add_plugin() which will # generate the metadata file during the build. Only C++ plugins that # have strange settings should have a module.desc (non-C++ plugins, # on the other hand, must have one, since they don't have CMakeLists.txt). # # Syntax is YAML 1.2 # # All four keys are mandatory. For C++ (qtplugin) modules, the interface # value must be "qtplugin"; type is one of "job" or "view"; the name # is the machine-identifier for the module and the load value should # be the filename of the library that contains the implementation. # --- type: "job" name: "dummycpp" interface: "qtplugin" load: "libcalamares_job_dummycpp.so" calamares-3.1.12/src/modules/dummyprocess/000077500000000000000000000000001322271446000205205ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummyprocess/module.desc000066400000000000000000000003531322271446000226460ustar00rootroot00000000000000# Module metadata file for dummy process jobmodule # Syntax is YAML 1.2 --- type: "job" name: "dummyprocess" interface: "process" chroot: false command: "/bin/sh -c \"touch ~/calamares-dummyprocess\"" timeout: 5 calamares-3.1.12/src/modules/dummypython/000077500000000000000000000000001322271446000203635ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypython/dummypython.conf000066400000000000000000000005471322271446000236350ustar00rootroot00000000000000--- syntax: "YAML map of anything" example: whats_this: "module-specific configuration" from_where: "dummypython.conf" a_list: - "item1" - "item2" - "item3" - "item4" a_list_of_maps: - name: "an Item" contents: - "an element" - "another element" - name: "another item" contents: - "not much"calamares-3.1.12/src/modules/dummypython/main.py000066400000000000000000000074161322271446000216710ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, Adriaan de Groot # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . """ === Example Python jobmodule. A Python jobmodule is a Python program which imports libcalamares and has a function run() as entry point. run() must return None if everything went well, or a tuple (str,str) with an error message and description if something went wrong. """ import libcalamares import os from time import gmtime, strftime, sleep import gettext _ = gettext.translation("calamares-python", localedir=libcalamares.utils.gettext_path(), languages=libcalamares.utils.gettext_languages(), fallback=True).gettext def pretty_name(): return _("Dummy python job.") def run(): """Dummy python job.""" libcalamares.utils.debug("LocaleDir=" + str(libcalamares.utils.gettext_path())) libcalamares.utils.debug("Languages=" + str(libcalamares.utils.gettext_languages())) os.system("/bin/sh -c \"touch ~/calamares-dummypython\"") accumulator = strftime("%Y-%m-%d %H:%M:%S", gmtime()) + "\n" accumulator += "Calamares version: " + libcalamares.VERSION_SHORT + "\n" accumulator += "This job's name: " + libcalamares.job.pretty_name + "\n" accumulator += "This job's path: " + libcalamares.job.working_path libcalamares.utils.debug(accumulator) accumulator = "*** Job configuration " accumulator += str(libcalamares.job.configuration) libcalamares.utils.debug(accumulator) accumulator = "*** globalstorage test ***" accumulator += "lala: " accumulator += str(libcalamares.globalstorage.contains("lala")) + "\n" accumulator += "foo: " accumulator += str(libcalamares.globalstorage.contains("foo")) + "\n" accumulator += "count: " + str(libcalamares.globalstorage.count()) libcalamares.utils.debug(accumulator) libcalamares.globalstorage.insert("item2", "value2") libcalamares.globalstorage.insert("item3", 3) accumulator = "keys: {}\n".format(str(libcalamares.globalstorage.keys())) libcalamares.utils.debug(accumulator) accumulator = "remove: {}\n".format( str(libcalamares.globalstorage.remove("item2"))) accumulator += "values: {} {} {}\n".format( str(libcalamares.globalstorage.value("foo")), str(libcalamares.globalstorage.value("item2")), str(libcalamares.globalstorage.value("item3"))) libcalamares.utils.debug(accumulator) libcalamares.utils.debug("Run dummy python") sleep(1) try: configlist = list(libcalamares.job.configuration["a_list"]) except KeyError: configlist = ["no list"] c = 1 for k in configlist: libcalamares.utils.debug(_("Dummy python step {}").format(str(k))) sleep(1) libcalamares.job.setprogress(c * 1.0 / len(configlist)) c += 1 sleep(3) # To indicate an error, return a tuple of: # (message, detailed-error-message) return None calamares-3.1.12/src/modules/dummypython/module.desc000066400000000000000000000002421322271446000225060ustar00rootroot00000000000000# Module metadata file for dummy python jobmodule # Syntax is YAML 1.2 --- type: "job" name: "dummypython" interface: "python" script: "main.py" calamares-3.1.12/src/modules/dummypythonqt/000077500000000000000000000000001322271446000207305ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/dummypythonqt.conf000066400000000000000000000005521322271446000245430ustar00rootroot00000000000000--- syntax: "YAML map of anything" example: whats_this: "module-specific configuration" from_where: "dummypythonqt.conf" a_list: - "item1" - "item2" - "item3" - "item4" a_list_of_maps: - name: "an Item" contents: - "an element" - "another element" - name: "another item" contents: - "not much" calamares-3.1.12/src/modules/dummypythonqt/lang/000077500000000000000000000000001322271446000216515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ar/000077500000000000000000000000001322271446000222535ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/000077500000000000000000000000001322271446000240405ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000007671322271446000273510ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ar Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5; calamares-3.1.12/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.po000066400000000000000000000023161322271446000273440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/ast/000077500000000000000000000000001322271446000224405ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ast/LC_MESSAGES/000077500000000000000000000000001322271446000242255ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ast/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016261322271446000275310ustar00rootroot00000000000000L | ( 686 # /EPA new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: enolp , 2017 Language-Team: Asturian (https://www.transifex.com/calamares/teams/20061/ast/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ast Plural-Forms: nplurals=2; plural=(n != 1); Una QLabel nueva.Un mensaxe d'estáu pal trabayu maniquín de PythonQt.¡Prímime!El trabayu maniquín de PythonQtEsti ye'l trabayu maniquín de PythonQt. El trabayu maniquín diz: {}calamares-3.1.12/src/modules/dummypythonqt/lang/ast/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025551322271446000275360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: enolp , 2017\n" "Language-Team: Asturian (https://www.transifex.com/calamares/teams/20061/ast/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "¡Prímime!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Una QLabel nueva." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "El trabayu maniquín de PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Esti ye'l trabayu maniquín de PythonQt. El trabayu maniquín diz: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Un mensaxe d'estáu pal trabayu maniquín de PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/bg/000077500000000000000000000000001322271446000222415ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/000077500000000000000000000000001322271446000240265ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006471322271446000273340ustar00rootroot00000000000000$,8m9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: bg Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021761322271446000273360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/ca/000077500000000000000000000000001322271446000222345ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ca/LC_MESSAGES/000077500000000000000000000000001322271446000240215ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ca/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016741322271446000273300ustar00rootroot00000000000000T ( 6)`2GPi:A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Davidmp , 2016 Language-Team: Catalan (https://www.transifex.com/calamares/teams/20061/ca/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ca Plural-Forms: nplurals=2; plural=(n != 1); Una etiqueta Q nova.Un missatge d'estat per a la tasca Dummy PythonQt.Clica'm!Vistes de Dummy PythonQtLa tasca Dummy PythonQtSóc la tasca Dummy PythonQt. La tasca diu el següent: {}calamares-3.1.12/src/modules/dummypythonqt/lang/ca/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025521322271446000273270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Davidmp , 2016\n" "Language-Team: Catalan (https://www.transifex.com/calamares/teams/20061/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Clica'm!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Una etiqueta Q nova." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Vistes de Dummy PythonQt" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "La tasca Dummy PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Sóc la tasca Dummy PythonQt. La tasca diu el següent: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Un missatge d'estat per a la tasca Dummy PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/cs_CZ/000077500000000000000000000000001322271446000226525ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/cs_CZ/LC_MESSAGES/000077500000000000000000000000001322271446000244375ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/cs_CZ/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017631322271446000277450ustar00rootroot00000000000000T ( 6)` -.;jyAA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: pavelrz , 2016 Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: cs_CZ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; Nový QLabel.Stavová zpráva o testovací úloze PythonQt.Klikni na mě!Testovací PythonQt ViewStepTestovací úloha PythonQtToto je testovací úloha PythonQt. Testovací úloha říká: {}calamares-3.1.12/src/modules/dummypythonqt/lang/cs_CZ/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026411322271446000277440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: pavelrz , 2016\n" "Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klikni na mě!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Nový QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Testovací PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Testovací úloha PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Toto je testovací úloha PythonQt. Testovací úloha říká: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Stavová zpráva o testovací úloze PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/da/000077500000000000000000000000001322271446000222355ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/da/LC_MESSAGES/000077500000000000000000000000001322271446000240225ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/da/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016731322271446000273300ustar00rootroot00000000000000T ( 6)` + DRn6A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: scootergrisen , 2017 Language-Team: Danish (https://www.transifex.com/calamares/teams/20061/da/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: da Plural-Forms: nplurals=2; plural=(n != 1); En ny QLabel.En statusmeddelelse til dummy PythonQt-job.Klik på mig!Dummy PythonQt-visningstrinDummy PythonQt-jobbetDette er dummy PythonQt-jobbet. Dummy-jobbet siger: {}calamares-3.1.12/src/modules/dummypythonqt/lang/da/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025511322271446000273270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: scootergrisen , 2017\n" "Language-Team: Danish (https://www.transifex.com/calamares/teams/20061/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klik på mig!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "En ny QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt-visningstrin" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Dummy PythonQt-jobbet" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Dette er dummy PythonQt-jobbet. Dummy-jobbet siger: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "En statusmeddelelse til dummy PythonQt-job." calamares-3.1.12/src/modules/dummypythonqt/lang/de/000077500000000000000000000000001322271446000222415ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/de/LC_MESSAGES/000077500000000000000000000000001322271446000240265ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/de/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000015711322271446000273310ustar00rootroot00000000000000L | ( 68/ (9?A new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Christian Spaan , 2017 Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: de Plural-Forms: nplurals=2; plural=(n != 1); Ein neues QLabel.Eine Statusmeldung für den Dummy-PythonQt-Job.Klick mich!Der Dummy-PythonQt-JobDies ist der Dummy-PythonQt-Job. Der Dummy-Job lautet: {}calamares-3.1.12/src/modules/dummypythonqt/lang/de/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025201322271446000273270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Christian Spaan , 2017\n" "Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klick mich!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Ein neues QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Der Dummy-PythonQt-Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Dies ist der Dummy-PythonQt-Job. Der Dummy-Job lautet: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Eine Statusmeldung für den Dummy-PythonQt-Job." calamares-3.1.12/src/modules/dummypythonqt/lang/dummypythonqt.pot000066400000000000000000000023641322271446000253440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Click me!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "A new QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "The Dummy PythonQt Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "This is the Dummy PythonQt Job. The dummy job says: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "A status message for Dummy PythonQt Job." calamares-3.1.12/src/modules/dummypythonqt/lang/el/000077500000000000000000000000001322271446000222515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/el/LC_MESSAGES/000077500000000000000000000000001322271446000240365ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/el/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006431322271446000273400ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Greek (https://www.transifex.com/calamares/teams/20061/el/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: el Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/el/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021721322271446000273420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Greek (https://www.transifex.com/calamares/teams/20061/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/en_GB/000077500000000000000000000000001322271446000226235ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/en_GB/LC_MESSAGES/000077500000000000000000000000001322271446000244105ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/en_GB/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006741322271446000277160ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: en_GB Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/en_GB/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022231322271446000277110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/es/000077500000000000000000000000001322271446000222605ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es/LC_MESSAGES/000077500000000000000000000000001322271446000240455ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017121322271446000273450ustar00rootroot00000000000000T ( 6)`5 FRp>A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: strel , 2016 Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es Plural-Forms: nplurals=2; plural=(n != 1); Una nueva QLabel.Un mensaje de estado para la Tarea PythonQt Ficticia.¡Púlsame!ViewStep de PythonQt FicticiaLa Tarea PythonQt FicticiaEsta es la Tarea PythonQt Ficticia. La tarea ficticia dice: {}calamares-3.1.12/src/modules/dummypythonqt/lang/es/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025701322271446000273530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: strel , 2016\n" "Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "¡Púlsame!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Una nueva QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "ViewStep de PythonQt Ficticia" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "La Tarea PythonQt Ficticia" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Esta es la Tarea PythonQt Ficticia. La tarea ficticia dice: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Un mensaje de estado para la Tarea PythonQt Ficticia." calamares-3.1.12/src/modules/dummypythonqt/lang/es_ES/000077500000000000000000000000001322271446000226475ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_ES/LC_MESSAGES/000077500000000000000000000000001322271446000244345ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_ES/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006631322271446000277400ustar00rootroot00000000000000$,8y9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Spain) (https://www.transifex.com/calamares/teams/20061/es_ES/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_ES Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/es_ES/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022121322271446000277330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/calamares/teams/20061/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/es_MX/000077500000000000000000000000001322271446000226645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/000077500000000000000000000000001322271446000244515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006641322271446000277560ustar00rootroot00000000000000$,8z9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_MX Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022131322271446000277510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/es_PR/000077500000000000000000000000001322271446000226615ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_PR/LC_MESSAGES/000077500000000000000000000000001322271446000244465ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/es_PR/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006711322271446000277510ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Spanish (Puerto Rico) (https://www.transifex.com/calamares/teams/20061/es_PR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es_PR Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/es_PR/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022201322271446000277440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Spanish (Puerto Rico) (https://www.transifex.com/calamares/teams/20061/es_PR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_PR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/et/000077500000000000000000000000001322271446000222615ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/et/LC_MESSAGES/000077500000000000000000000000001322271446000240465ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006461322271446000273530ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: et Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021751322271446000273550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/eu/000077500000000000000000000000001322271446000222625ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/000077500000000000000000000000001322271446000240475ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006441322271446000273520ustar00rootroot00000000000000$,8j9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: eu Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021731322271446000273540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/fa/000077500000000000000000000000001322271446000222375ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fa/LC_MESSAGES/000077500000000000000000000000001322271446000240245ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fa/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006361322271446000273300ustar00rootroot00000000000000$,8d9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Persian (https://www.transifex.com/calamares/teams/20061/fa/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fa Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/src/modules/dummypythonqt/lang/fa/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021651322271446000273320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Persian (https://www.transifex.com/calamares/teams/20061/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/fi_FI/000077500000000000000000000000001322271446000226255ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fi_FI/LC_MESSAGES/000077500000000000000000000000001322271446000244125ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fi_FI/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006651322271446000277200ustar00rootroot00000000000000$,8{9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Finnish (Finland) (https://www.transifex.com/calamares/teams/20061/fi_FI/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fi_FI Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/fi_FI/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022141322271446000277130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Finnish (Finland) (https://www.transifex.com/calamares/teams/20061/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/fr/000077500000000000000000000000001322271446000222605ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/000077500000000000000000000000001322271446000240455ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006431322271446000273470ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fr Plural-Forms: nplurals=2; plural=(n > 1); calamares-3.1.12/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021721322271446000273510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/fr_CH/000077500000000000000000000000001322271446000226325ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fr_CH/LC_MESSAGES/000077500000000000000000000000001322271446000244175ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/fr_CH/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006671322271446000277270ustar00rootroot00000000000000$,8}9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: French (Switzerland) (https://www.transifex.com/calamares/teams/20061/fr_CH/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: fr_CH Plural-Forms: nplurals=2; plural=(n > 1); calamares-3.1.12/src/modules/dummypythonqt/lang/fr_CH/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022161322271446000277220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: French (Switzerland) (https://www.transifex.com/calamares/teams/20061/fr_CH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_CH\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/gl/000077500000000000000000000000001322271446000222535ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/gl/LC_MESSAGES/000077500000000000000000000000001322271446000240405ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/gl/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006461322271446000273450ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Galician (https://www.transifex.com/calamares/teams/20061/gl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: gl Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/gl/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021751322271446000273470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Galician (https://www.transifex.com/calamares/teams/20061/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/gu/000077500000000000000000000000001322271446000222645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/gu/LC_MESSAGES/000077500000000000000000000000001322271446000240515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/gu/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006461322271446000273560ustar00rootroot00000000000000$,8l9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Gujarati (https://www.transifex.com/calamares/teams/20061/gu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: gu Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/gu/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021751322271446000273600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Gujarati (https://www.transifex.com/calamares/teams/20061/gu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/he/000077500000000000000000000000001322271446000222455ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/he/LC_MESSAGES/000077500000000000000000000000001322271446000240325ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/he/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000020141322271446000273260ustar00rootroot00000000000000T ( 6)`;O:`!NA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Eli Shleifer , 2017 Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: he Plural-Forms: nplurals=2; plural=(n != 1); QLabel חדש.הודעת מצב עבור משימת דמה של PythonQt.לחץ עליי!שלב הצפייה של משימת הדמה של PythonQtמשימת הדמה של PythonQtזוהי משימת הדמה של PythonQt. משימת הדמה אומרת: {}calamares-3.1.12/src/modules/dummypythonqt/lang/he/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026721322271446000273430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Eli Shleifer , 2017\n" "Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "לחץ עליי!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "QLabel חדש." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "שלב הצפייה של משימת הדמה של PythonQt" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "משימת הדמה של PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "זוהי משימת הדמה של PythonQt. משימת הדמה אומרת: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "הודעת מצב עבור משימת דמה של PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/hi/000077500000000000000000000000001322271446000222515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/000077500000000000000000000000001322271446000240365ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006431322271446000273400ustar00rootroot00000000000000$,8i9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hi Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021721322271446000273420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/hr/000077500000000000000000000000001322271446000222625ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hr/LC_MESSAGES/000077500000000000000000000000001322271446000240475ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hr/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000020021322271446000273400ustar00rootroot00000000000000T ( 6)` W*d 7A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Lovro Kudelić , 2016 Language-Team: Croatian (https://www.transifex.com/calamares/teams/20061/hr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hr Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; Novi QLabel.Statusna poruka za testni PythonQt posao.Klikni me!Testni PythonQt ViewStepTestni PythonQt posaoOvo je testni PythonQt posao. Testni posao kaže: {}calamares-3.1.12/src/modules/dummypythonqt/lang/hr/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026601322271446000273550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Lovro Kudelić , 2016\n" "Language-Team: Croatian (https://www.transifex.com/calamares/teams/20061/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klikni me!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Novi QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Testni PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Testni PythonQt posao" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Ovo je testni PythonQt posao. Testni posao kaže: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Statusna poruka za testni PythonQt posao." calamares-3.1.12/src/modules/dummypythonqt/lang/hu/000077500000000000000000000000001322271446000222655ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hu/LC_MESSAGES/000077500000000000000000000000001322271446000240525ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/hu/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016511322271446000273540ustar00rootroot00000000000000T ( 6)`& 6D\5sA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: miku84 , 2017 Language-Team: Hungarian (https://www.transifex.com/calamares/teams/20061/hu/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: hu Plural-Forms: nplurals=2; plural=(n != 1); Egy új QLabel.Sztátus üzenet egy PythonQt Job-hoz.Kattints ide!Hamis PythonQt ViewStepEgy PythonQt Job tesztEz egy PythonQt Job teszt. A teszt job azt mondja: {}calamares-3.1.12/src/modules/dummypythonqt/lang/hu/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025271322271446000273620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: miku84 , 2017\n" "Language-Team: Hungarian (https://www.transifex.com/calamares/teams/20061/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Kattints ide!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Egy új QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Hamis PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Egy PythonQt Job teszt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Ez egy PythonQt Job teszt. A teszt job azt mondja: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Sztátus üzenet egy PythonQt Job-hoz." calamares-3.1.12/src/modules/dummypythonqt/lang/id/000077500000000000000000000000001322271446000222455ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/id/LC_MESSAGES/000077500000000000000000000000001322271446000240325ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/id/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016541322271446000273370ustar00rootroot00000000000000T ( 6)`- >Ia7tA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Wantoyo , 2016 Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: id Plural-Forms: nplurals=1; plural=0; Sebuah QLabel baru.Sebuah pesan status untuk Dummy PythonQt Job.Klik saya!Dummy PythonQt ViewStepDummy PythonQt JobIni adalah Dummy PythonQt Job. Dummy job mengatakan: {}calamares-3.1.12/src/modules/dummypythonqt/lang/id/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025321322271446000273360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Wantoyo , 2016\n" "Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klik saya!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Sebuah QLabel baru." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Dummy PythonQt Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Ini adalah Dummy PythonQt Job. Dummy job mengatakan: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Sebuah pesan status untuk Dummy PythonQt Job." calamares-3.1.12/src/modules/dummypythonqt/lang/is/000077500000000000000000000000001322271446000222645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/is/LC_MESSAGES/000077500000000000000000000000001322271446000240515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/is/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017161322271446000273550ustar00rootroot00000000000000T ( 6)` +*9 dq1A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Kristján Magnússon , 2017 Language-Team: Icelandic (https://www.transifex.com/calamares/teams/20061/is/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: is Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11); Nýtt QLabel.Stöðuskilaboð fyrir Dummy PythonQt Job.Smelltu mig!Dummy PythonQt ViewStepDummy PythonQt JobÞetta er Dummy PythonQt Job. Dummy job segir: {}calamares-3.1.12/src/modules/dummypythonqt/lang/is/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025741322271446000273630ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kristján Magnússon , 2017\n" "Language-Team: Icelandic (https://www.transifex.com/calamares/teams/20061/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Smelltu mig!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Nýtt QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Dummy PythonQt Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Þetta er Dummy PythonQt Job. Dummy job segir: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Stöðuskilaboð fyrir Dummy PythonQt Job." calamares-3.1.12/src/modules/dummypythonqt/lang/it_IT/000077500000000000000000000000001322271446000226615ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/000077500000000000000000000000001322271446000244465ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016201322271446000277440ustar00rootroot00000000000000L | ( 680 3?:UA new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Saverio , 2016 Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: it_IT Plural-Forms: nplurals=2; plural=(n != 1); Una nuova QLabel.Un messaggio di stato per il Job Dummy PythonQt.Clicca qui!Il Job Dummy PythonQtQuesto è il Job Dummy PythonQt. Il dummy job notifica: {}calamares-3.1.12/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025471322271446000277600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Saverio , 2016\n" "Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Clicca qui!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Una nuova QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Il Job Dummy PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Questo è il Job Dummy PythonQt. Il dummy job notifica: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Un messaggio di stato per il Job Dummy PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/ja/000077500000000000000000000000001322271446000222435ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ja/LC_MESSAGES/000077500000000000000000000000001322271446000240305ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ja/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017311322271446000273310ustar00rootroot00000000000000T ( 6)` &Dd|EA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Takefumi Nagata , 2016 Language-Team: Japanese (https://www.transifex.com/calamares/teams/20061/ja/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ja Plural-Forms: nplurals=1; plural=0; 新しいQLabelダミーのPythonQtジョブの状態クリックしてください!Dummy PythonQt ViewStepThe Dummy PythonQt JobこれはDummy PythonQtジョブです。Dummy ジョブの出力: {}calamares-3.1.12/src/modules/dummypythonqt/lang/ja/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026071322271446000273370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Takefumi Nagata , 2016\n" "Language-Team: Japanese (https://www.transifex.com/calamares/teams/20061/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "クリックしてください!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "新しいQLabel" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "The Dummy PythonQt Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "これはDummy PythonQtジョブです。Dummy ジョブの出力: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "ダミーのPythonQtジョブの状態" calamares-3.1.12/src/modules/dummypythonqt/lang/kk/000077500000000000000000000000001322271446000222565ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/kk/LC_MESSAGES/000077500000000000000000000000001322271446000240435ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/kk/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006351322271446000273460ustar00rootroot00000000000000$,8c9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Kazakh (https://www.transifex.com/calamares/teams/20061/kk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: kk Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/src/modules/dummypythonqt/lang/kk/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021641322271446000273500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Kazakh (https://www.transifex.com/calamares/teams/20061/kk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/lo/000077500000000000000000000000001322271446000222635ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/lo/LC_MESSAGES/000077500000000000000000000000001322271446000240505ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/lo/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006321322271446000273500ustar00rootroot00000000000000$,8`9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Lao (https://www.transifex.com/calamares/teams/20061/lo/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: lo Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/src/modules/dummypythonqt/lang/lo/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021611322271446000273520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Lao (https://www.transifex.com/calamares/teams/20061/lo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lo\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/lt/000077500000000000000000000000001322271446000222705ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/lt/LC_MESSAGES/000077500000000000000000000000001322271446000240555ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/lt/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000020041322271446000273500ustar00rootroot00000000000000T ( 6)`93H|>A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Moo , 2016 Language-Team: Lithuanian (https://www.transifex.com/calamares/teams/20061/lt/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: lt Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); Naujas QLabel.Fiktyvios PythonQt užduoties būsenos pranešimas.Spustelėkite mane!Fiktyvi PythonQt ViewStepFiktyvi PythonQt užduotisTai yra fiktyvi PythonQt užduotis. Fiktyvi užduotis sako: {}calamares-3.1.12/src/modules/dummypythonqt/lang/lt/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026621322271446000273650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Moo , 2016\n" "Language-Team: Lithuanian (https://www.transifex.com/calamares/teams/20061/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Spustelėkite mane!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Naujas QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Fiktyvi PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Fiktyvi PythonQt užduotis" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Tai yra fiktyvi PythonQt užduotis. Fiktyvi užduotis sako: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Fiktyvios PythonQt užduoties būsenos pranešimas." calamares-3.1.12/src/modules/dummypythonqt/lang/mr/000077500000000000000000000000001322271446000222675ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/mr/LC_MESSAGES/000077500000000000000000000000001322271446000240545ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/mr/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006451322271446000273600ustar00rootroot00000000000000$,8k9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Marathi (https://www.transifex.com/calamares/teams/20061/mr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: mr Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/mr/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021741322271446000273620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Marathi (https://www.transifex.com/calamares/teams/20061/mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/nb/000077500000000000000000000000001322271446000222505ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/nb/LC_MESSAGES/000077500000000000000000000000001322271446000240355ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/nb/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006571322271446000273440ustar00rootroot00000000000000$,8u9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Norwegian Bokmål (https://www.transifex.com/calamares/teams/20061/nb/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: nb Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/nb/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022061322271446000273370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/calamares/teams/20061/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/nl/000077500000000000000000000000001322271446000222625ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/nl/LC_MESSAGES/000077500000000000000000000000001322271446000240475ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/nl/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016731322271446000273550ustar00rootroot00000000000000T ( 6)`2 FPh7A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: De Zeeappel , 2016 Language-Team: Dutch (https://www.transifex.com/calamares/teams/20061/nl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: nl Plural-Forms: nplurals=2; plural=(n != 1); Een nieuw QLabelEen statusbericht voor de Dummy PythonQt opdracht.Klik mij!Dummy PythonQt ViewStepDe Dummy PythonQt opdrachtDit is de Dummy PythonQt opdracht. De opdracht zegt: {}calamares-3.1.12/src/modules/dummypythonqt/lang/nl/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025511322271446000273540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: De Zeeappel , 2016\n" "Language-Team: Dutch (https://www.transifex.com/calamares/teams/20061/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Klik mij!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Een nieuw QLabel" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "De Dummy PythonQt opdracht" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Dit is de Dummy PythonQt opdracht. De opdracht zegt: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Een statusbericht voor de Dummy PythonQt opdracht." calamares-3.1.12/src/modules/dummypythonqt/lang/pl/000077500000000000000000000000001322271446000222645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pl/LC_MESSAGES/000077500000000000000000000000001322271446000240515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pl/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000020661322271446000273540ustar00rootroot00000000000000T ( 6)/` ,, A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: m4sk1n , 2016 Language-Team: Polish (https://www.transifex.com/calamares/teams/20061/pl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pl Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3); Nowy QLabel.Wiadomość o stanie zadania Dummy PythonQt.Naciśnij mnie!Dummy PythonQt ViewStepZadanie Dummy PythonQtTo jest zadanie Dummy PythonQt mówiące: {}calamares-3.1.12/src/modules/dummypythonqt/lang/pl/LC_MESSAGES/dummypythonqt.po000066400000000000000000000027441322271446000273620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: m4sk1n , 2016\n" "Language-Team: Polish (https://www.transifex.com/calamares/teams/20061/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Naciśnij mnie!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Nowy QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Zadanie Dummy PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "To jest zadanie Dummy PythonQt mówiące: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Wiadomość o stanie zadania Dummy PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/pl_PL/000077500000000000000000000000001322271446000226575ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pl_PL/LC_MESSAGES/000077500000000000000000000000001322271446000244445ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pl_PL/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000011051322271446000277400ustar00rootroot00000000000000$,8 9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Polish (Poland) (https://www.transifex.com/calamares/teams/20061/pl_PL/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pl_PL Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3); calamares-3.1.12/src/modules/dummypythonqt/lang/pl_PL/LC_MESSAGES/dummypythonqt.po000066400000000000000000000024341322271446000277510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Polish (Poland) (https://www.transifex.com/calamares/teams/20061/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_PL\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/pt_BR/000077500000000000000000000000001322271446000226575ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/000077500000000000000000000000001322271446000244445ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017731322271446000277530ustar00rootroot00000000000000T ( 6)`8/hw CA new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Guilherme M.S. , 2017 Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pt_BR Plural-Forms: nplurals=2; plural=(n > 1); Uma nova QLabel.Uma mensagem de status para Trabalho Fictício PythonQt.Clique em mim!ViewStep do PythonQt fictícioO trabalho de modelo do PythonQtEste é o trabalho do modelo PythonQt. O trabalho fictício diz: {}calamares-3.1.12/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026511322271446000277520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Guilherme M.S. , 2017\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Clique em mim!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Uma nova QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "ViewStep do PythonQt fictício" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "O trabalho de modelo do PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Este é o trabalho do modelo PythonQt. O trabalho fictício diz: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Uma mensagem de status para Trabalho Fictício PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/pt_PT/000077500000000000000000000000001322271446000226775ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pt_PT/LC_MESSAGES/000077500000000000000000000000001322271446000244645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/pt_PT/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017321322271446000277660ustar00rootroot00000000000000T ( 6)`!42 gr7A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Ricardo Simões , 2016 Language-Team: Portuguese (Portugal) (https://www.transifex.com/calamares/teams/20061/pt_PT/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pt_PT Plural-Forms: nplurals=2; plural=(n != 1); Uma nova QLabel.Uma mensagem de estado para a Tarefa Dummy PythonQt.Clique-me!Dummy PythonQt ViewStepA Tarefa Dummy PythonQtEsta é a tarefa Dummy PythonQt. A tarefa dummy diz: {}calamares-3.1.12/src/modules/dummypythonqt/lang/pt_PT/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026101322271446000277650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Ricardo Simões , 2016\n" "Language-Team: Portuguese (Portugal) (https://www.transifex.com/calamares/teams/20061/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Clique-me!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Uma nova QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Dummy PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "A Tarefa Dummy PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Esta é a tarefa Dummy PythonQt. A tarefa dummy diz: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Uma mensagem de estado para a Tarefa Dummy PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/ro/000077500000000000000000000000001322271446000222715ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ro/LC_MESSAGES/000077500000000000000000000000001322271446000240565ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ro/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016511322271446000273600ustar00rootroot00000000000000L | ( 68 / IT9oA new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Baadur Jobava , 2016 Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ro Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1)); Un nou QLabel.Un mesaj de stare pentru jobul fictiv PythonQt.Clic aici!Un job job fictiv PythonQtAcesta este jobul fictiv PythonQt. Descrierea jobului: {}calamares-3.1.12/src/modules/dummypythonqt/lang/ro/LC_MESSAGES/dummypythonqt.po000066400000000000000000000026001322271446000273560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Baadur Jobava , 2016\n" "Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Clic aici!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Un nou QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Un job job fictiv PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Acesta este jobul fictiv PythonQt. Descrierea jobului: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Un mesaj de stare pentru jobul fictiv PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/ru/000077500000000000000000000000001322271446000222775ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ru/LC_MESSAGES/000077500000000000000000000000001322271446000240645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ru/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016251322271446000273670ustar00rootroot00000000000000Dl ( /@$e~A new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Simon Schwartz , 2017 Language-Team: Russian (https://www.transifex.com/calamares/teams/20061/ru/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ru Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3); Новый QLabel.Сообщение состояния для Dummy PythonQt Job.Нажать здесь!The Dummy PythonQt Jobcalamares-3.1.12/src/modules/dummypythonqt/lang/ru/LC_MESSAGES/dummypythonqt.po000066400000000000000000000027041322271446000273710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Simon Schwartz , 2017\n" "Language-Team: Russian (https://www.transifex.com/calamares/teams/20061/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Нажать здесь!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Новый QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "The Dummy PythonQt Job" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Сообщение состояния для Dummy PythonQt Job." calamares-3.1.12/src/modules/dummypythonqt/lang/sk/000077500000000000000000000000001322271446000222665ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sk/LC_MESSAGES/000077500000000000000000000000001322271446000240535ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sk/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016471322271446000273620ustar00rootroot00000000000000L | ( 68/ ?M?gA new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Dušan Kazik , 2016 Language-Team: Slovak (https://www.transifex.com/calamares/teams/20061/sk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sk Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; Nová menovka QLabel.Stavová správa pre fiktívnu úlohu PythonQt.Kliknite sem!Fiktívna úloha PythonQtToto je fiktívna úloha PythonQt. Fiktívna úloha hovorí: {}calamares-3.1.12/src/modules/dummypythonqt/lang/sk/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025761322271446000273670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Dušan Kazik , 2016\n" "Language-Team: Slovak (https://www.transifex.com/calamares/teams/20061/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Kliknite sem!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Nová menovka QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Fiktívna úloha PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Toto je fiktívna úloha PythonQt. Fiktívna úloha hovorí: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Stavová správa pre fiktívnu úlohu PythonQt." calamares-3.1.12/src/modules/dummypythonqt/lang/sl/000077500000000000000000000000001322271446000222675ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sl/LC_MESSAGES/000077500000000000000000000000001322271446000240545ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sl/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000007331322271446000273560ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Slovenian (https://www.transifex.com/calamares/teams/20061/sl/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sl Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3); calamares-3.1.12/src/modules/dummypythonqt/lang/sl/LC_MESSAGES/dummypythonqt.po000066400000000000000000000022621322271446000273600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Slovenian (https://www.transifex.com/calamares/teams/20061/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/sr/000077500000000000000000000000001322271446000222755ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sr/LC_MESSAGES/000077500000000000000000000000001322271446000240625ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sr/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000020461322271446000273630ustar00rootroot00000000000000L | ( 68)NC0OA new QLabel.A status message for Dummy PythonQt Job.Click me!The Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Slobodan Simić , 2017 Language-Team: Serbian (https://www.transifex.com/calamares/teams/20061/sr/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sr Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Нова КуОзнакаПорука стања за провизорни ПитонКуТ посао.Кликни ме!Провизорни ПитонКуТ посаоОво је провизорни ПитонКуТ посао. Он каже: {}calamares-3.1.12/src/modules/dummypythonqt/lang/sr/LC_MESSAGES/dummypythonqt.po000066400000000000000000000027751322271446000273770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Slobodan Simić , 2017\n" "Language-Team: Serbian (https://www.transifex.com/calamares/teams/20061/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Кликни ме!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Нова КуОзнака" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Провизорни ПитонКуТ посао" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Ово је провизорни ПитонКуТ посао. Он каже: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Порука стања за провизорни ПитонКуТ посао." calamares-3.1.12/src/modules/dummypythonqt/lang/sr@latin/000077500000000000000000000000001322271446000234255ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sr@latin/LC_MESSAGES/000077500000000000000000000000001322271446000252125ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sr@latin/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000010031322271446000305030ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Serbian (Latin) (https://www.transifex.com/calamares/teams/20061/sr@latin/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sr@latin Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); calamares-3.1.12/src/modules/dummypythonqt/lang/sr@latin/LC_MESSAGES/dummypythonqt.po000066400000000000000000000023321322271446000305140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Serbian (Latin) (https://www.transifex.com/calamares/teams/20061/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/sv/000077500000000000000000000000001322271446000223015ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sv/LC_MESSAGES/000077500000000000000000000000001322271446000240665ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/sv/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006451322271446000273720ustar00rootroot00000000000000$,8k9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sv Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/sv/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021741322271446000273740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/th/000077500000000000000000000000001322271446000222645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/th/LC_MESSAGES/000077500000000000000000000000001322271446000240515ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/th/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006331322271446000273520ustar00rootroot00000000000000$,8a9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Thai (https://www.transifex.com/calamares/teams/20061/th/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: th Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/src/modules/dummypythonqt/lang/th/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021621322271446000273540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Thai (https://www.transifex.com/calamares/teams/20061/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/tr_TR/000077500000000000000000000000001322271446000227035ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/tr_TR/LC_MESSAGES/000077500000000000000000000000001322271446000244705ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/tr_TR/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017201322271446000277670ustar00rootroot00000000000000T ( 6)`5 Ve7A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Demiray Muhterem , 2016 Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: tr_TR Plural-Forms: nplurals=1; plural=0; Yeni bir QLabel.Kukla PythonQt Çalışması için bir durum mesajı.Buraya tıkla!Sahte PythonQt görünümüSahte PythonQt işleriKukla PythonQt işleri. Sahte işleri şöyle diyor: {}calamares-3.1.12/src/modules/dummypythonqt/lang/tr_TR/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025761322271446000300040ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Demiray Muhterem , 2016\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "Buraya tıkla!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "Yeni bir QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "Sahte PythonQt görünümü" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "Sahte PythonQt işleri" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "Kukla PythonQt işleri. Sahte işleri şöyle diyor: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "Kukla PythonQt Çalışması için bir durum mesajı." calamares-3.1.12/src/modules/dummypythonqt/lang/uk/000077500000000000000000000000001322271446000222705ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/uk/LC_MESSAGES/000077500000000000000000000000001322271446000240555ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/uk/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000007611322271446000273600ustar00rootroot00000000000000$,89Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: uk Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); calamares-3.1.12/src/modules/dummypythonqt/lang/uk/LC_MESSAGES/dummypythonqt.po000066400000000000000000000023101322271446000273530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/ur/000077500000000000000000000000001322271446000222775ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ur/LC_MESSAGES/000077500000000000000000000000001322271446000240645ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/ur/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006421322271446000273650ustar00rootroot00000000000000$,8h9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Urdu (https://www.transifex.com/calamares/teams/20061/ur/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ur Plural-Forms: nplurals=2; plural=(n != 1); calamares-3.1.12/src/modules/dummypythonqt/lang/ur/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021711322271446000273670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Urdu (https://www.transifex.com/calamares/teams/20061/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/uz/000077500000000000000000000000001322271446000223075ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/uz/LC_MESSAGES/000077500000000000000000000000001322271446000240745ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/uz/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000006341322271446000273760ustar00rootroot00000000000000$,8b9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language-Team: Uzbek (https://www.transifex.com/calamares/teams/20061/uz/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: uz Plural-Forms: nplurals=1; plural=0; calamares-3.1.12/src/modules/dummypythonqt/lang/uz/LC_MESSAGES/dummypythonqt.po000066400000000000000000000021631322271446000274000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Language-Team: Uzbek (https://www.transifex.com/calamares/teams/20061/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "" calamares-3.1.12/src/modules/dummypythonqt/lang/zh_CN/000077500000000000000000000000001322271446000226525ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/zh_CN/LC_MESSAGES/000077500000000000000000000000001322271446000244375ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/zh_CN/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000016751322271446000277470ustar00rootroot00000000000000T ( 6)` (*Sc-A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Mingcong Bai , 2017 Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: zh_CN Plural-Forms: nplurals=1; plural=0; 一个平淡无奇的 QLabel。来自 PythonQt 任务的状态消息。按我按我!坠吼滴 PythonQt ViewStepPythonQt 任务我是个 PythonQt 任务。任务提示:{}calamares-3.1.12/src/modules/dummypythonqt/lang/zh_CN/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025531322271446000277460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Mingcong Bai , 2017\n" "Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "按我按我!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "一个平淡无奇的 QLabel。" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "坠吼滴 PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "PythonQt 任务" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "我是个 PythonQt 任务。任务提示:{}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "来自 PythonQt 任务的状态消息。" calamares-3.1.12/src/modules/dummypythonqt/lang/zh_TW/000077500000000000000000000000001322271446000227045ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/000077500000000000000000000000001322271446000244715ustar00rootroot00000000000000calamares-3.1.12/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.mo000066400000000000000000000017061322271446000277740ustar00rootroot00000000000000T ( 6)` (" KXu9A new QLabel.A status message for Dummy PythonQt Job.Click me!Dummy PythonQt ViewStepThe Dummy PythonQt JobThis is the Dummy PythonQt Job. The dummy job says: {}Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-09-04 08:16-0400 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Jeff Huang , 2016 Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: zh_TW Plural-Forms: nplurals=1; plural=0; 一個新的 QLabel。假的 PythonQt 工作的狀態訊息。點擊我!假的 PythonQt 檢視步驟假的 PythonQt 工作這是一個假的 PythonQt 工作。假工作表示:{}calamares-3.1.12/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.po000066400000000000000000000025641322271446000300020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-09-04 08:16-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Jeff Huang , 2016\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" msgstr "點擊我!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." msgstr "一個新的 QLabel。" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" msgstr "假的 PythonQt 檢視步驟" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" msgstr "假的 PythonQt 工作" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgstr "這是一個假的 PythonQt 工作。假工作表示:{}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." msgstr "假的 PythonQt 工作的狀態訊息。" calamares-3.1.12/src/modules/dummypythonqt/main.py000066400000000000000000000210641322271446000222310ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2016-2017, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import platform from PythonQt.QtGui import * import PythonQt.calamares as calamares # WARNING: the Calamares PythonQt API is considered EXPERIMENTAL as of # Calamares 2.5. It comes with no promise or commitment to API stability. # Set up translations. # You may skip this if your Calamares module has no user visible strings. # DO NOT install _ into the builtin namespace because each module loads # its own catalog. # DO use the gettext class-based API and manually alias _ as described in: # https://docs.python.org/3.5/library/gettext.html#localizing-your-module import gettext import inspect import os _filename = inspect.getframeinfo(inspect.currentframe()).filename _path = os.path.dirname(os.path.abspath(_filename)) _ = gettext.gettext # Example Python ViewModule. # A Python ViewModule is a Python program which defines a ViewStep class. # One UI module ==> one ViewStep. # This class must be marked with the @calamares_module decorator. A # ViewModule may define other classes, but only one may be decorated with # @calamares_module. Such a class must conform to the Calamares ViewStep # interface and functions as the entry point of the module. # A ViewStep manages one or more "wizard pages" through methods like # back/next, and reports its status through isNextEnabled/isBackEnabled/ # isAtBeginning/isAtEnd. The whole UI, including all the pages, must be # exposed as a single QWidget, returned by the widget function. # # For convenience, both C++ and PythonQt ViewSteps are considered to be # implementations of ViewStep.h. Additionally, the Calamares PythonQt API # allows Python developers to keep their identifiers more Pythonic on the # Python side. Thus, all of the following are considered valid method # identifiers in a ViewStep implementation: isNextEnabled, isnextenabled, # is_next_enabled. @calamares_module class DummyPythonQtViewStep: def __init__(self): # Importing PythonQt.QtGui provides access to most Qt widget classes. self.main_widget = QFrame() self.main_widget.setLayout(QVBoxLayout()) label = QLabel() self.main_widget.layout().addWidget(label) accumulator = "\nCalamares+PythonQt running embedded Python " +\ platform.python_version() label.text = accumulator btn = QPushButton() # Python strings can be used wherever a method wants a QString. Python # gettext translations can be used seamlessly as well. btn.setText(_("Click me!")) self.main_widget.layout().addWidget(btn) # The syntax for signal-slot connections is very simple, though # slightly different from the C++ equivalent. There are no SIGNAL and # SLOT macros, and a signal can be connected to any Python method # (without a special "slot" designation). btn.connect("clicked(bool)", self.on_btn_clicked) def on_btn_clicked(self): self.main_widget.layout().addWidget(QLabel(_("A new QLabel."))) def prettyName(self): return _("Dummy PythonQt ViewStep") def isNextEnabled(self): return True # The "Next" button should be clickable def isBackEnabled(self): return True # The "Back" button should be clickable def isAtBeginning(self): # True means the currently shown UI page is the first page of this # module, thus a "Back" button click will not be handled by this # module and will cause a skip to the previous ViewStep instead # (if any). False means that the present ViewStep provides other UI # pages placed logically "before" the current one, thus a "Back" button # click will be handled by this module instead of skipping to another # ViewStep. A module (ViewStep) with only one page will always return # True here. return True def isAtEnd(self): # True means the currently shown UI page is the last page of this # module, thus a "Next" button click will not be handled by this # module and will cause a skip to the next ViewStep instead (if any). # False means that the present ViewStep provides other UI pages placed # logically "after" the current one, thus a "Next" button click will # be handled by this module instead of skipping to another ViewStep. # A module (ViewStep) with only one page will always return True here. return True def jobs(self): # Returns a list of objects that implement Calamares::Job. return [DummyPQJob("Dummy PythonQt job reporting for duty")] def widget(self): # Returns the base QWidget of this module's UI. return self.main_widget def retranslate(self, locale_name): # This is where it gets slightly weird. In most desktop applications we # shouldn't need this kind of mechanism, because we could assume that # the operating environment is configured to use a certain language. # Usually the user would change the system-wide language in a settings # UI, restart the application, done. # Alas, Calamares runs on an unconfigured live system, and one of the # core features of Calamares is to allow the user to pick a language. # Unfortunately, strings in the UI do not automatically react to a # runtime language change. To get UI strings in a new language, all # user-visible strings must be retranslated (by calling tr() in C++ or # _() in Python) and reapplied on the relevant widgets. # When the user picks a new UI translation language, Qt raises a QEvent # of type LanguageChange, which propagates through the QObject # hierarchy. By catching and reacting to this event, we can show # user-visible strings in the new language at the right time. # The C++ side of the Calamares PythonQt API catches the LanguageChange # event and calls the present method. It is then up to the module # developer to add here all the needed code to load the module's # translation catalog for the new language (which is separate from the # main Calamares strings catalog) and reapply any user-visible strings. calamares.utils.debug("PythonQt retranslation event " "for locale name: {}".format(locale_name)) # First we load the catalog file for the new language... try: global _ _t = gettext.translation('dummypythonqt', localedir=os.path.join(_path, 'lang'), languages=[locale_name]) _ = _t.gettext except OSError as e: calamares.utils.debug(e) pass # ... and then we can call setText(_("foo")) and similar methods on # the relevant widgets here to reapply the strings. # An example Job class. Implements Calamares::Job. For method identifiers, the # same rules apply as for ViewStep. No decorators are necessary here, because # only the ViewStep implementation is the unique entry point, and a module can # have any number of jobs. class DummyPQJob: def __init__(self, my_msg): self.my_msg = my_msg def pretty_name(self): return _("The Dummy PythonQt Job") def pretty_description(self): return _("This is the Dummy PythonQt Job. " "The dummy job says: {}").format(self.my_msg) def pretty_status_message(self): return _("A status message for Dummy PythonQt Job.") def exec(self): # As an example, we touch a file in the target root filesystem. rmp = calamares.global_storage['rootMountPoint'] os.system("touch {}/calamares_dpqt_was_here".format(rmp)) calamares.utils.debug("the dummy job says {}".format(self.my_msg)) return {'ok': True} calamares-3.1.12/src/modules/dummypythonqt/module.desc000066400000000000000000000003261322271446000230560ustar00rootroot00000000000000# Module metadata file for dummy pythonqt jobmodule # Syntax is YAML 1.2 --- type: "view" name: "dummypythonqt" interface: "pythonqt" script: "main.py" #assumed relative to the current directory calamares-3.1.12/src/modules/finished/000077500000000000000000000000001322271446000175575ustar00rootroot00000000000000calamares-3.1.12/src/modules/finished/CMakeLists.txt000066400000000000000000000006141322271446000223200ustar00rootroot00000000000000find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED DBus Network ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( finished TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES FinishedViewStep.cpp FinishedPage.cpp UI FinishedPage.ui LINK_PRIVATE_LIBRARIES calamaresui Qt5::DBus SHARED_LIB ) calamares-3.1.12/src/modules/finished/FinishedPage.cpp000066400000000000000000000064231322271446000226160ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "FinishedPage.h" #include "ui_FinishedPage.h" #include "CalamaresVersion.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include "ViewManager.h" #include #include #include #include #include #include "Branding.h" FinishedPage::FinishedPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::FinishedPage ) , m_restartSetUp( false ) { cDebug() << "FinishedPage()"; ui->setupUi( this ); ui->mainText->setAlignment( Qt::AlignCenter ); ui->mainText->setWordWrap( true ); ui->mainText->setOpenExternalLinks( true ); CALAMARES_RETRANSLATE( ui->retranslateUi( this ); ui->mainText->setText( tr( "

All done.


" "%1 has been installed on your computer.
" "You may now restart into your new system, or continue " "using the %2 Live environment." ) .arg( *Calamares::Branding::VersionedName ) .arg( *Calamares::Branding::ProductName ) ); ) } void FinishedPage::setRestartNowEnabled( bool enabled ) { ui->restartCheckBox->setVisible( enabled ); } void FinishedPage::setRestartNowChecked( bool checked ) { ui->restartCheckBox->setChecked( checked ); } void FinishedPage::setRestartNowCommand( const QString& command ) { m_restartNowCommand = command; } void FinishedPage::setUpRestart() { cDebug() << "FinishedPage::setUpRestart()"; if ( !m_restartSetUp ) { connect( qApp, &QApplication::aboutToQuit, this, [this] { if ( ui->restartCheckBox->isVisible() && ui->restartCheckBox->isChecked() ) QProcess::execute( "/bin/sh", { "-c", m_restartNowCommand } ); } ); } } void FinishedPage::focusInEvent( QFocusEvent* e ) { e->accept(); } void FinishedPage::onInstallationFailed( const QString& message, const QString& details ) { Q_UNUSED( details ); ui->mainText->setText( tr( "

Installation Failed


" "%1 has not been installed on your computer.
" "The error message was: %2." ) .arg( *Calamares::Branding::VersionedName ) .arg( message ) ); setRestartNowEnabled( false ); } calamares-3.1.12/src/modules/finished/FinishedPage.h000066400000000000000000000030331322271446000222550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef FINISHEDPAGE_H #define FINISHEDPAGE_H #include namespace Ui { class FinishedPage; } class FinishedPage : public QWidget { Q_OBJECT public: explicit FinishedPage( QWidget* parent = nullptr ); void setRestartNowEnabled( bool enabled ); void setRestartNowChecked( bool checked ); void setRestartNowCommand( const QString& command ); void setUpRestart(); public slots: void onInstallationFailed( const QString& message, const QString& details ); protected: void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus private: Ui::FinishedPage* ui; QString m_restartNowCommand; bool m_restartSetUp; }; #endif // FINISHEDPAGE_H calamares-3.1.12/src/modules/finished/FinishedPage.ui000066400000000000000000000047761322271446000224620ustar00rootroot00000000000000 FinishedPage 0 0 593 400 Form Qt::Vertical QSizePolicy::Fixed 20 20 Qt::Vertical 20 50 3 0 <Calamares finished text> Qt::Vertical 20 49 &Restart now false Qt::Vertical QSizePolicy::Fixed 20 20 calamares-3.1.12/src/modules/finished/FinishedViewStep.cpp000066400000000000000000000122731322271446000235100ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "FinishedViewStep.h" #include "FinishedPage.h" #include "JobQueue.h" #include "utils/Logger.h" #include #include #include #include #include "Branding.h" FinishedViewStep::FinishedViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new FinishedPage() ) , installFailed( false ) , m_notifyOnFinished( false ) { auto jq = Calamares::JobQueue::instance(); connect( jq, &Calamares::JobQueue::failed, m_widget, &FinishedPage::onInstallationFailed ); connect( jq, &Calamares::JobQueue::failed, this, &FinishedViewStep::onInstallationFailed ); emit nextStatusChanged( true ); } FinishedViewStep::~FinishedViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString FinishedViewStep::prettyName() const { return tr( "Finish" ); } QWidget* FinishedViewStep::widget() { return m_widget; } void FinishedViewStep::next() { emit done(); } void FinishedViewStep::back() {} bool FinishedViewStep::isNextEnabled() const { return false; } bool FinishedViewStep::isBackEnabled() const { return false; } bool FinishedViewStep::isAtBeginning() const { return true; } bool FinishedViewStep::isAtEnd() const { return true; } void FinishedViewStep::sendNotification() { // If the installation failed, don't send notification popup; // there's a (modal) dialog popped up with the failure notice. if ( installFailed ) return; QDBusInterface notify( "org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications" ); if ( notify.isValid() ) { QDBusReply r = notify.call( "Notify", QString( "Calamares" ), QVariant( 0U ), QString( "calamares" ), tr( "Installation Complete" ), tr( "The installation of %1 is complete." ).arg( *Calamares::Branding::VersionedName ), QStringList(), QVariantMap(), QVariant( 0 ) ); if ( !r.isValid() ) cDebug() << "Could not call notify for end of installation." << r.error(); } else cDebug() << "Could not get dbus interface for notifications." << notify.lastError(); } void FinishedViewStep::onActivate() { m_widget->setUpRestart(); if ( m_notifyOnFinished ) sendNotification(); } QList< Calamares::job_ptr > FinishedViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void FinishedViewStep::onInstallationFailed( const QString& message, const QString& details ) { Q_UNUSED( message ); Q_UNUSED( details ); installFailed = true; } void FinishedViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains( "restartNowEnabled" ) && configurationMap.value( "restartNowEnabled" ).type() == QVariant::Bool ) { bool restartNowEnabled = configurationMap.value( "restartNowEnabled" ).toBool(); m_widget->setRestartNowEnabled( restartNowEnabled ); if ( restartNowEnabled ) { if ( configurationMap.contains( "restartNowChecked" ) && configurationMap.value( "restartNowChecked" ).type() == QVariant::Bool ) m_widget->setRestartNowChecked( configurationMap.value( "restartNowChecked" ).toBool() ); if ( configurationMap.contains( "restartNowCommand" ) && configurationMap.value( "restartNowCommand" ).type() == QVariant::String ) m_widget->setRestartNowCommand( configurationMap.value( "restartNowCommand" ).toString() ); else m_widget->setRestartNowCommand( "systemctl -i reboot" ); } } if ( configurationMap.contains( "notifyOnFinished" ) && configurationMap.value( "notifyOnFinished" ).type() == QVariant::Bool ) m_notifyOnFinished = configurationMap.value( "notifyOnFinished" ).toBool(); } CALAMARES_PLUGIN_FACTORY_DEFINITION( FinishedViewStepFactory, registerPlugin(); ) calamares-3.1.12/src/modules/finished/FinishedViewStep.h000066400000000000000000000041071322271446000231520ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef FINISHEDPAGEPLUGIN_H #define FINISHEDPAGEPLUGIN_H #include #include #include #include class FinishedPage; class PLUGINDLLEXPORT FinishedViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit FinishedViewStep( QObject* parent = nullptr ); virtual ~FinishedViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; void onActivate() override; QList< Calamares::job_ptr > jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; public slots: void onInstallationFailed( const QString& message, const QString& details ); private: FinishedPage* m_widget; /** * @brief At the end of installation (when this step is activated), * send a desktop notification via DBus that the install is done. */ void sendNotification(); bool installFailed; bool m_notifyOnFinished; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( FinishedViewStepFactory ) #endif // FINISHEDPAGEPLUGIN_H calamares-3.1.12/src/modules/finished/finished.conf000066400000000000000000000014411322271446000222170ustar00rootroot00000000000000# Configuration for the "finished" page, which is usually shown only at # the end of the installation (successful or not). --- # The finished page can hold a "restart system now" checkbox. # If this is false, no checkbox is show and the system is not restarted # when Calamares exits. restartNowEnabled: true # Initial state of the checkbox "restart now". restartNowChecked: false # If the checkbox is shown, and the checkbox is checked, then when # Calamares exits from the finished-page it will run this command. restartNowCommand: "systemctl -i reboot" # When the last page is (successfully) reached, send a DBus notification # to the desktop that the installation is done. This works only if the # user as whom Calamares is run, can reach the regular desktop session bus. notifyOnFinished: false calamares-3.1.12/src/modules/fstab/000077500000000000000000000000001322271446000170655ustar00rootroot00000000000000calamares-3.1.12/src/modules/fstab/fstab.conf000066400000000000000000000005471322271446000210410ustar00rootroot00000000000000--- mountOptions: default: defaults,noatime btrfs: defaults,noatime,space_cache,autodefrag ssdExtraMountOptions: ext4: discard jfs: discard xfs: discard swap: discard btrfs: discard,compress=lzo crypttabOptions: luks # For Debian and Debian-based distributions, change the above line to: # crypttabOptions: luks,keyscript=/bin/cat calamares-3.1.12/src/modules/fstab/main.py000066400000000000000000000250551322271446000203720ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Aurélien Gâteau # Copyright 2016, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import re import subprocess import libcalamares FSTAB_HEADER = """# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a device; this may # be used with UUID= as a more robust way to name devices that works even if # disks are added and removed. See fstab(5). # # """ CRYPTTAB_HEADER = """# /etc/crypttab: mappings for encrypted partitions. # # Each mapped device will be created in /dev/mapper, so your /etc/fstab # should use the /dev/mapper/ paths for encrypted devices. # # See crypttab(5) for the supported syntax. # # NOTE: Do not list your root (/) partition here, it must be set up # beforehand by the initramfs (/etc/mkinitcpio.conf). The same applies # to encrypted swap, which should be set up with mkinitcpio-openswap # for resume support. # # """ # Turn Parted filesystem names into fstab names FS_MAP = { "fat16": "vfat", "fat32": "vfat", "linuxswap": "swap", } def mkdir_p(path): """ Create directory. :param path: """ if not os.path.exists(path): os.makedirs(path) def is_ssd_disk(disk_name): """ Checks if given disk is actually a ssd disk. :param disk_name: :return: """ filename = os.path.join("/sys/block", disk_name, "queue/rotational") if not os.path.exists(filename): # Should not happen unless sysfs changes, but better safe than sorry return False with open(filename) as sysfile: return sysfile.read() == "0\n" def disk_name_for_partition(partition): """ Returns disk name for each found partition. :param partition: :return: """ name = os.path.basename(partition["device"]) if name.startswith("/dev/mmcblk") or name.startswith("/dev/nvme"): return re.sub("p[0-9]+$", "", name) return re.sub("[0-9]+$", "", name) class FstabGenerator(object): """ Class header :param partitions: :param root_mount_point: :param mount_options: :param ssd_extra_mount_options: """ def __init__(self, partitions, root_mount_point, mount_options, ssd_extra_mount_options, crypttab_options): self.partitions = partitions self.root_mount_point = root_mount_point self.mount_options = mount_options self.ssd_extra_mount_options = ssd_extra_mount_options self.crypttab_options = crypttab_options self.ssd_disks = set() self.root_is_ssd = False def run(self): """ Calls needed sub routines. :return: """ self.find_ssd_disks() self.generate_fstab() self.generate_crypttab() self.create_mount_points() return None def find_ssd_disks(self): """ Checks for ssd disks """ disks = {disk_name_for_partition(x) for x in self.partitions} self.ssd_disks = {x for x in disks if is_ssd_disk(x)} def generate_crypttab(self): """ Create crypttab. """ mkdir_p(os.path.join(self.root_mount_point, "etc")) crypttab_path = os.path.join(self.root_mount_point, "etc", "crypttab") with open(crypttab_path, "w") as crypttab_file: print(CRYPTTAB_HEADER, file=crypttab_file) for partition in self.partitions: dct = self.generate_crypttab_line_info(partition) if dct: self.print_crypttab_line(dct, file=crypttab_file) def generate_crypttab_line_info(self, partition): """ Generates information for each crypttab entry. """ if "luksMapperName" not in partition or "luksUuid" not in partition: return None mapper_name = partition["luksMapperName"] mount_point = partition["mountPoint"] luks_uuid = partition["luksUuid"] if not mapper_name or not luks_uuid: return None return dict( name=mapper_name, device="UUID=" + luks_uuid, password="/crypto_keyfile.bin", options=self.crypttab_options, ) def print_crypttab_line(self, dct, file=None): """ Prints line to '/etc/crypttab' file. """ line = "{:21} {:<45} {} {}".format(dct["name"], dct["device"], dct["password"], dct["options"], ) print(line, file=file) def generate_fstab(self): """ Create fstab. """ mkdir_p(os.path.join(self.root_mount_point, "etc")) fstab_path = os.path.join(self.root_mount_point, "etc", "fstab") with open(fstab_path, "w") as fstab_file: print(FSTAB_HEADER, file=fstab_file) for partition in self.partitions: # Special treatment for a btrfs root with @ and @home # subvolumes if (partition["fs"] == "btrfs" and partition["mountPoint"] == "/"): output = subprocess.check_output(['btrfs', 'subvolume', 'list', self.root_mount_point]) output_lines = output.splitlines() for line in output_lines: if line.endswith(b'path @'): root_entry = partition root_entry["subvol"] = "@" dct = self.generate_fstab_line_info(root_entry) if dct: self.print_fstab_line(dct, file=fstab_file) elif line.endswith(b'path @home'): home_entry = partition home_entry["mountPoint"] = "/home" home_entry["subvol"] = "@home" dct = self.generate_fstab_line_info(home_entry) if dct: self.print_fstab_line(dct, file=fstab_file) else: dct = self.generate_fstab_line_info(partition) if dct: self.print_fstab_line(dct, file=fstab_file) if self.root_is_ssd: # Mount /tmp on a tmpfs dct = dict(device="tmpfs", mount_point="/tmp", fs="tmpfs", options="defaults,noatime,mode=1777", check=0, ) self.print_fstab_line(dct, file=fstab_file) def generate_fstab_line_info(self, partition): """ Generates information for each fstab entry. """ filesystem = partition["fs"].lower() has_luks = "luksMapperName" in partition mount_point = partition["mountPoint"] disk_name = disk_name_for_partition(partition) is_ssd = disk_name in self.ssd_disks filesystem = FS_MAP.get(filesystem, filesystem) if not mount_point and not filesystem == "swap": return None if not mount_point: mount_point = "swap" options = self.mount_options.get(filesystem, self.mount_options["default"]) if is_ssd: extra = self.ssd_extra_mount_options.get(filesystem) if extra: options += "," + extra if mount_point == "/": check = 1 elif mount_point: check = 2 else: check = 0 if mount_point == "/": self.root_is_ssd = is_ssd if filesystem == "btrfs" and "subvol" in partition: options="subvol={},".format(partition["subvol"]) + options if has_luks: device="/dev/mapper/" + partition["luksMapperName"] else: device="UUID=" + partition["uuid"] return dict(device=device, mount_point=mount_point, fs=filesystem, options=options, check=check, ) def print_fstab_line(self, dct, file=None): """ Prints line to '/etc/fstab' file. """ line = "{:41} {:<14} {:<7} {:<10} 0 {}".format(dct["device"], dct["mount_point"], dct["fs"], dct["options"], dct["check"], ) print(line, file=file) def create_mount_points(self): """ Creates mount points """ for partition in self.partitions: if partition["mountPoint"]: mkdir_p(self.root_mount_point + partition["mountPoint"]) def run(): """ Configures fstab. :return: """ global_storage = libcalamares.globalstorage conf = libcalamares.job.configuration partitions = global_storage.value("partitions") root_mount_point = global_storage.value("rootMountPoint") mount_options = conf["mountOptions"] ssd_extra_mount_options = conf.get("ssdExtraMountOptions", {}) crypttab_options = conf.get("crypttabOptions", "luks") generator = FstabGenerator(partitions, root_mount_point, mount_options, ssd_extra_mount_options, crypttab_options) return generator.run() calamares-3.1.12/src/modules/fstab/module.desc000066400000000000000000000001251322271446000212100ustar00rootroot00000000000000--- type: "job" name: "fstab" interface: "python" script: "main.py" calamares-3.1.12/src/modules/fstab/test.yaml000066400000000000000000000005561322271446000207360ustar00rootroot00000000000000rootMountPoint: /tmp/mount partitions: - device: /dev/sda1 fs: ext4 mountPoint: / uuid: 2a00f1d5-1217-49a7-bedd-b55c85764732 - device: /dev/sda2 fs: swap uuid: 59406569-446f-4730-a874-9f6b4b44fee3 mountPoint: - device: /dev/sdb1 fs: btrfs mountPoint: /home uuid: 59406569-abcd-1234-a874-9f6b4b44fee3 calamares-3.1.12/src/modules/grubcfg/000077500000000000000000000000001322271446000174055ustar00rootroot00000000000000calamares-3.1.12/src/modules/grubcfg/grubcfg.conf000066400000000000000000000010631322271446000216730ustar00rootroot00000000000000--- # If set to true, always creates /etc/default/grub from scratch even if the file # already existed. If set to false, edits the existing file instead. overwrite: false # Default entries to write to /etc/default/grub if it does not exist yet or if # we are overwriting it. Note that in addition, GRUB_CMDLINE_LINUX_DEFAULT and # GRUB_DISTRIBUTOR will always be written, with automatically detected values. defaults: GRUB_TIMEOUT: 5 GRUB_DEFAULT: "saved" GRUB_DISABLE_SUBMENU: true GRUB_TERMINAL_OUTPUT: "console" GRUB_DISABLE_RECOVERY: true calamares-3.1.12/src/modules/grubcfg/main.py000066400000000000000000000173701322271446000207130ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014-2015, Philip Müller # Copyright 2015-2017, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, Adriaan de Groot # Copyright 2017, Gabriel Craciunescu # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares import os import re def modify_grub_default(partitions, root_mount_point, distributor): """ Configures '/etc/default/grub' for hibernation and plymouth. @see bootloader/main.py, for similar handling of kernel parameters :param partitions: :param root_mount_point: :param distributor: :return: """ default_dir = os.path.join(root_mount_point, "etc/default") default_grub = os.path.join(default_dir, "grub") distributor_replace = distributor.replace("'", "'\\''") dracut_bin = libcalamares.utils.target_env_call( ["sh", "-c", "which dracut"] ) have_dracut = dracut_bin == 0 # Shell exit value 0 means success use_splash = "" swap_uuid = "" swap_outer_uuid = "" swap_outer_mappername = None if libcalamares.globalstorage.contains("hasPlymouth"): if libcalamares.globalstorage.value("hasPlymouth"): use_splash = "splash" cryptdevice_params = [] if have_dracut: for partition in partitions: has_luks = "luksMapperName" in partition if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"] if (partition["fs"] == "linuxswap" and has_luks): swap_outer_uuid = partition["luksUuid"] swap_outer_mappername = partition["luksMapperName"] if (partition["mountPoint"] == "/" and has_luks): cryptdevice_params = [ "rd.luks.uuid={!s}".format(partition["luksUuid"]) ] else: for partition in partitions: has_luks = "luksMapperName" in partition if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"] if (partition["mountPoint"] == "/" and has_luks): cryptdevice_params = [ "cryptdevice=UUID={!s}:{!s}".format( partition["luksUuid"], partition["luksMapperName"] ), "root=/dev/mapper/{!s}".format( partition["luksMapperName"] ), "resume=/dev/mapper/{!s}".format( partition["luksMapperName"] ) ] kernel_params = ["quiet"] if cryptdevice_params: kernel_params.extend(cryptdevice_params) if use_splash: kernel_params.append(use_splash) if swap_uuid: kernel_params.append("resume=UUID={!s}".format(swap_uuid)) if have_dracut and swap_outer_uuid: kernel_params.append("rd.luks.uuid={!s}".format(swap_outer_uuid)) if have_dracut and swap_outer_mappername: kernel_params.append("resume=/dev/mapper/{!s}".format( swap_outer_mappername)) distributor_line = "GRUB_DISTRIBUTOR='{!s}'".format(distributor_replace) if not os.path.exists(default_dir): os.mkdir(default_dir) have_kernel_cmd = False have_distributor_line = False if "overwrite" in libcalamares.job.configuration: overwrite = libcalamares.job.configuration["overwrite"] else: overwrite = False if os.path.exists(default_grub) and not overwrite: with open(default_grub, 'r') as grub_file: lines = [x.strip() for x in grub_file.readlines()] for i in range(len(lines)): if lines[i].startswith("#GRUB_CMDLINE_LINUX_DEFAULT"): kernel_cmd = "GRUB_CMDLINE_LINUX_DEFAULT=\"{!s}\"".format( " ".join(kernel_params) ) lines[i] = kernel_cmd have_kernel_cmd = True elif lines[i].startswith("GRUB_CMDLINE_LINUX_DEFAULT"): regex = re.compile(r"^GRUB_CMDLINE_LINUX_DEFAULT\s*=\s*") line = regex.sub("", lines[i]) line = line.lstrip() line = line.lstrip("\"") line = line.lstrip("'") line = line.rstrip() line = line.rstrip("\"") line = line.rstrip("'") existing_params = line.split() for existing_param in existing_params: existing_param_name = existing_param.split("=")[0] # the only ones we ever add if existing_param_name not in [ "quiet", "resume", "splash"]: kernel_params.append(existing_param) kernel_cmd = "GRUB_CMDLINE_LINUX_DEFAULT=\"{!s}\"".format( " ".join(kernel_params) ) lines[i] = kernel_cmd have_kernel_cmd = True elif (lines[i].startswith("#GRUB_DISTRIBUTOR") or lines[i].startswith("GRUB_DISTRIBUTOR")): lines[i] = distributor_line have_distributor_line = True else: lines = [] if "defaults" in libcalamares.job.configuration: for key, value in libcalamares.job.configuration[ "defaults"].items(): if value.__class__.__name__ == "bool": if value: escaped_value = "true" else: escaped_value = "false" else: escaped_value = str(value).replace("'", "'\\''") lines.append("{!s}='{!s}'".format(key, escaped_value)) if not have_kernel_cmd: kernel_cmd = "GRUB_CMDLINE_LINUX_DEFAULT=\"{!s}\"".format( " ".join(kernel_params) ) lines.append(kernel_cmd) if not have_distributor_line: lines.append(distributor_line) if cryptdevice_params: lines.append("GRUB_ENABLE_CRYPTODISK=y") with open(default_grub, 'w') as grub_file: grub_file.write("\n".join(lines) + "\n") return None def run(): """ Calls routine with given parameters to modify '/etc/default/grub'. :return: """ fw_type = libcalamares.globalstorage.value("firmwareType") if (libcalamares.globalstorage.value("bootLoader") is None and fw_type != "efi"): return None partitions = libcalamares.globalstorage.value("partitions") if fw_type == "efi": esp_found = False for partition in partitions: if (partition["mountPoint"] == libcalamares.globalstorage.value("efiSystemPartition")): esp_found = True if not esp_found: return None root_mount_point = libcalamares.globalstorage.value("rootMountPoint") branding = libcalamares.globalstorage.value("branding") distributor = branding["bootloaderEntryName"] return modify_grub_default(partitions, root_mount_point, distributor) calamares-3.1.12/src/modules/grubcfg/module.desc000066400000000000000000000001271322271446000215320ustar00rootroot00000000000000--- type: "job" name: "grubcfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/hwclock/000077500000000000000000000000001322271446000174205ustar00rootroot00000000000000calamares-3.1.12/src/modules/hwclock/main.py000066400000000000000000000040611322271446000207170ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014 - 2015, Philip Müller # Copyright 2014, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, Gabriel Craciunescu # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares def run(): """ Set hardware clock. """ hwclock_rtc = ["hwclock", "--systohc", "--utc"] hwclock_isa = ["hwclock", "--systohc", "--utc", "--directisa"] is_broken_rtc = False is_broken_isa = False ret = libcalamares.utils.target_env_call(hwclock_rtc) if ret != 0: is_broken_rtc = True libcalamares.utils.debug("Hwclock returned error code {}".format(ret)) libcalamares.utils.debug(" .. RTC method failed, trying ISA bus method.") else: libcalamares.utils.debug("Hwclock set using RTC method.") if is_broken_rtc: ret = libcalamares.utils.target_env_call(hwclock_isa) if ret != 0: is_broken_isa = True libcalamares.utils.debug("Hwclock returned error code {}".format(ret)) libcalamares.utils.debug(" .. ISA bus method failed.") else: libcalamares.utils.debug("Hwclock set using ISA bus methode.") if is_broken_rtc and is_broken_isa: libcalamares.utils.debug("BIOS or Kernel BUG: Setting hwclock failed.") return None calamares-3.1.12/src/modules/hwclock/module.desc000066400000000000000000000001461322271446000215460ustar00rootroot00000000000000--- type: "job" name: "hwclock" interface: "python" requires: [] script: "main.py" calamares-3.1.12/src/modules/initcpio/000077500000000000000000000000001322271446000176045ustar00rootroot00000000000000calamares-3.1.12/src/modules/initcpio/initcpio.conf000066400000000000000000000000251322271446000222660ustar00rootroot00000000000000--- kernel: linux312 calamares-3.1.12/src/modules/initcpio/main.py000066400000000000000000000022771322271446000211120ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Philip Müller # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares from libcalamares.utils import check_target_env_call def run_mkinitcpio(): """ Runs mkinitcpio with given kernel profile """ kernel = libcalamares.job.configuration['kernel'] check_target_env_call(['mkinitcpio', '-p', kernel]) def run(): """ Calls routine to create kernel initramfs image. :return: """ run_mkinitcpio() return None calamares-3.1.12/src/modules/initcpio/module.desc000066400000000000000000000001301322271446000217230ustar00rootroot00000000000000--- type: "job" name: "initcpio" interface: "python" script: "main.py" calamares-3.1.12/src/modules/initcpiocfg/000077500000000000000000000000001322271446000202645ustar00rootroot00000000000000calamares-3.1.12/src/modules/initcpiocfg/main.py000066400000000000000000000123271322271446000215670ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Rohan Garg # Copyright 2015, Philip Müller # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares import os from collections import OrderedDict def cpuinfo(): """ Return the information in /proc/cpuinfo as a dictionary in the following format: cpu_info['proc0']={...} cpu_info['proc1']={...} """ cpu_info = OrderedDict() procinfo = OrderedDict() nprocs = 0 with open('/proc/cpuinfo') as cpuinfo_file: for line in cpuinfo_file: if not line.strip(): # end of one processor cpu_info["proc{!s}".format(nprocs)] = procinfo nprocs += 1 # Reset procinfo = OrderedDict() else: if len(line.split(':')) == 2: splitted_line = line.split(':')[1].strip() procinfo[line.split(':')[0].strip()] = splitted_line else: procinfo[line.split(':')[0].strip()] = '' return cpu_info def write_mkinitcpio_lines(hooks, modules, files, root_mount_point): """ Set up mkinitcpio.conf. :param hooks: :param modules: :param files: :param root_mount_point: """ hostfile = "/etc/mkinitcpio.conf" try: with open(hostfile, "r") as mkinitcpio_file: mklins = [x.strip() for x in mkinitcpio_file.readlines()] except FileNotFoundError: libcalamares.utils.debug("Could not open host file '%s'" % hostfile) mklins = [] for i in range(len(mklins)): if mklins[i].startswith("HOOKS"): joined_hooks = ' '.join(hooks) mklins[i] = "HOOKS=\"{!s}\"".format(joined_hooks) elif mklins[i].startswith("MODULES"): joined_modules = ' '.join(modules) mklins[i] = "MODULES=\"{!s}\"".format(joined_modules) elif mklins[i].startswith("FILES"): joined_files = ' '.join(files) mklins[i] = "FILES=\"{!s}\"".format(joined_files) path = os.path.join(root_mount_point, "etc/mkinitcpio.conf") with open(path, "w") as mkinitcpio_file: mkinitcpio_file.write("\n".join(mklins) + "\n") def modify_mkinitcpio_conf(partitions, root_mount_point): """ Modifies mkinitcpio.conf :param partitions: :param root_mount_point: """ cpu = cpuinfo() swap_uuid = "" btrfs = "" hooks = ["base", "udev", "autodetect", "modconf", "block", "keyboard", "keymap"] modules = [] files = [] encrypt_hook = False openswap_hook = False unencrypted_separate_boot = False # It is important that the plymouth hook comes before any encrypt hook plymouth_bin = os.path.join(root_mount_point, "usr/bin/plymouth") if os.path.exists(plymouth_bin): hooks.append("plymouth") for partition in partitions: if partition["fs"] == "linuxswap": swap_uuid = partition["uuid"] if "luksMapperName" in partition: openswap_hook = True if partition["fs"] == "btrfs": btrfs = "yes" if partition["mountPoint"] == "/" and "luksMapperName" in partition: encrypt_hook = True if (partition["mountPoint"] == "/boot" and "luksMapperName" not in partition): unencrypted_separate_boot = True if encrypt_hook: hooks.append("encrypt") if not unencrypted_separate_boot and \ os.path.isfile( os.path.join(root_mount_point, "crypto_keyfile.bin") ): files.append("/crypto_keyfile.bin") if swap_uuid != "": if encrypt_hook and openswap_hook: hooks.extend(["openswap"]) hooks.extend(["resume", "filesystems"]) else: hooks.extend(["filesystems"]) if btrfs == "yes" and cpu['proc0']['vendor_id'].lower() != "genuineintel": modules.append("crc32c") elif (btrfs == "yes" and cpu['proc0']['vendor_id'].lower() == "genuineintel"): modules.append("crc32c-intel") else: hooks.append("fsck") write_mkinitcpio_lines(hooks, modules, files, root_mount_point) def run(): """ Calls routine with given parameters to modify '/etc/mkinitcpio.conf'. :return: """ partitions = libcalamares.globalstorage.value("partitions") root_mount_point = libcalamares.globalstorage.value("rootMountPoint") modify_mkinitcpio_conf(partitions, root_mount_point) return None calamares-3.1.12/src/modules/initcpiocfg/module.desc000066400000000000000000000001331322271446000224060ustar00rootroot00000000000000--- type: "job" name: "initcpiocfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/initramfs/000077500000000000000000000000001322271446000177625ustar00rootroot00000000000000calamares-3.1.12/src/modules/initramfs/README.md000066400000000000000000000007621322271446000212460ustar00rootroot00000000000000## initramfs module This module is specific to Debian based distros. Post installation on Debian the initramfs needs to be updated so as to not interrupt the boot process with a error about fsck.ext4 not being found. ## Debian specific notes If you're using live-build to build your ISO and setup the runtime env make sure that you purge the live-\* packages on the target system before running this module, since live-config dpkg-diverts update-initramfs and can cause all sorts of fun issues. calamares-3.1.12/src/modules/initramfs/main.py000066400000000000000000000024051322271446000212610ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Philip Müller # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . from libcalamares.utils import target_env_call def run(): """ Generate an initramfs image. :return: """ return_code = target_env_call(["update-initramfs", "-k", "all", "-c", "-t"]) if return_code != 0: return ( "Failed to run update-initramfs on the target", "The exit code was {}".format(return_code) ) calamares-3.1.12/src/modules/initramfs/module.desc000066400000000000000000000001311322271446000221020ustar00rootroot00000000000000--- type: "job" name: "initramfs" interface: "python" script: "main.py" calamares-3.1.12/src/modules/initramfscfg/000077500000000000000000000000001322271446000204425ustar00rootroot00000000000000calamares-3.1.12/src/modules/initramfscfg/encrypt_hook000077500000000000000000000005661322271446000231030ustar00rootroot00000000000000#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions if [ -f /crypto_keyfile.bin ] then cp /crypto_keyfile.bin ${DESTDIR} fi if [ -f /etc/crypttab ] then cp /etc/crypttab ${DESTDIR}/etc/ fi calamares-3.1.12/src/modules/initramfscfg/encrypt_hook_nokey000077500000000000000000000004451322271446000243040ustar00rootroot00000000000000#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions if [ -f /etc/crypttab ] then cp /etc/crypttab ${DESTDIR}/etc/ fi calamares-3.1.12/src/modules/initramfscfg/main.py000066400000000000000000000051571322271446000217500ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Rohan Garg # Copyright 2015, Philip Müller # Copyright 2016, David McKinney # Copyright 2016, Kevin Kofler # Copyright 2017, Alf Gaida # Copyright 2017, Adriaan de Groot # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares import inspect import os import shutil def copy_initramfs_hooks(partitions, root_mount_point): """ Copies initramfs hooks so they are picked up by update-initramfs :param partitions: :param root_mount_point: """ encrypt_hook = False unencrypted_separate_boot = False for partition in partitions: if partition["mountPoint"] == "/" and "luksMapperName" in partition: encrypt_hook = True if (partition["mountPoint"] == "/boot" and "luksMapperName" not in partition): unencrypted_separate_boot = True if encrypt_hook: target = "{!s}/usr/share/initramfs-tools/hooks/encrypt_hook".format( root_mount_point) # Find where this module is installed _filename = inspect.getframeinfo(inspect.currentframe()).filename _path = os.path.dirname(os.path.abspath(_filename)) if unencrypted_separate_boot: shutil.copy2( os.path.join(_path, "encrypt_hook_nokey"), target ) else: shutil.copy2( os.path.join(_path, "encrypt_hook"), target ) os.chmod(target, 0o755) def run(): """ Calls routine with given parameters to configure initramfs :return: """ partitions = libcalamares.globalstorage.value("partitions") root_mount_point = libcalamares.globalstorage.value("rootMountPoint") copy_initramfs_hooks(partitions, root_mount_point) return None calamares-3.1.12/src/modules/initramfscfg/module.desc000066400000000000000000000001341322271446000225650ustar00rootroot00000000000000--- type: "job" name: "initramfscfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/interactiveterminal/000077500000000000000000000000001322271446000220375ustar00rootroot00000000000000calamares-3.1.12/src/modules/interactiveterminal/CMakeLists.txt000066400000000000000000000012341322271446000245770ustar00rootroot00000000000000find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) include(KDEInstallDirs) include(GenerateExportHeader) find_package( KF5 REQUIRED Service Parts ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ${QTERMWIDGET_INCLUDE_DIR} ) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules ) calamares_add_plugin( interactiveterminal TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES InteractiveTerminalViewStep.cpp InteractiveTerminalPage.cpp LINK_PRIVATE_LIBRARIES calamaresui KF5::Service KF5::Parts SHARED_LIB ) calamares-3.1.12/src/modules/interactiveterminal/InteractiveTerminalPage.cpp000066400000000000000000000104621322271446000273140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "InteractiveTerminalPage.h" #include "viewpages/ViewStep.h" #include "utils/Retranslator.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include #include #include #include #include #include #include #include InteractiveTerminalPage::InteractiveTerminalPage( QWidget* parent ) : QWidget( parent ) , m_layout( new QVBoxLayout( this ) ) , m_termHostWidget( nullptr ) { setLayout( m_layout ); m_layout->setContentsMargins( 0, 0, 0, 0 ); m_headerLabel = new QLabel( this ); m_layout->addWidget( m_headerLabel ); } void InteractiveTerminalPage::onActivate() { if ( m_termHostWidget ) return; // For whatever reason, instead of simply linking against a library we // need to do a runtime query to KService just to get a sodding terminal // widget. KService::Ptr service = KService::serviceByDesktopName( "konsolepart" ); if ( !service ) { // And all of this hoping the Konsole application is installed. If not, // tough cookies. // Maybe linking against a library seemed too simple and elegant so // someone decided to have a terminal widget depend on over 9000 other // KDElibs things that have nothing to do with a terminal widget, and // have the loading happen at runtime so it's more likely to fail at // an inconvenient time. QMessageBox::critical( this, tr( "Konsole not installed"), tr( "Please install the kde konsole and try again!" ), QMessageBox::Ok); return ; } // Create one instance of konsolepart. KParts::ReadOnlyPart* p = service->createInstance< KParts::ReadOnlyPart >( this, this, {} ); if ( !p ) { // One more opportunity for the loading operation to fail. QMessageBox::critical( this, tr( "Konsole not installed"), tr( "Please install the kde konsole and try again!" ), QMessageBox::Ok); return; } // Cast the konsolepart to the TerminalInterface... TerminalInterface* t = qobject_cast< TerminalInterface* >( p ); if ( !t ) { // This is why we can't have nice things. QMessageBox::critical( this, tr( "Konsole not installed"), tr( "Please install the kde konsole and try again!" ), QMessageBox::Ok); return; } // Make the widget persist even if the KPart goes out of scope... p->setAutoDeleteWidget( false ); // ... but kill the KPart if the widget goes out of scope. p->setAutoDeletePart( true ); m_termHostWidget = p->widget(); m_layout->addWidget( m_termHostWidget ); cDebug() << "Part widget ought to be" << m_termHostWidget->metaObject()->className(); t->showShellInDir( QDir::home().path() ); t->sendInput( QString( "%1\n" ).arg( m_command ) ); } void InteractiveTerminalPage::setCommand( const QString& command ) { m_command = command; CALAMARES_RETRANSLATE( m_headerLabel->setText( tr( "Executing script:  %1" ) .arg( m_command ) ); ) } calamares-3.1.12/src/modules/interactiveterminal/InteractiveTerminalPage.h000066400000000000000000000024031322271446000267550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef INTERACTIVETERMINALPAGE_H #define INTERACTIVETERMINALPAGE_H #include class QLabel; class QVBoxLayout; class InteractiveTerminalPage : public QWidget { Q_OBJECT public: explicit InteractiveTerminalPage( QWidget* parent = nullptr ); void onActivate(); void setCommand( const QString& command ); private: QVBoxLayout* m_layout; QWidget* m_termHostWidget; QString m_command; QLabel* m_headerLabel; }; #endif // INTERACTIVETERMINALPAGE_H calamares-3.1.12/src/modules/interactiveterminal/InteractiveTerminalViewStep.cpp000066400000000000000000000046271322271446000302140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "InteractiveTerminalViewStep.h" #include "InteractiveTerminalPage.h" #include CALAMARES_PLUGIN_FACTORY_DEFINITION( InteractiveTerminalViewStepFactory, registerPlugin(); ) InteractiveTerminalViewStep::InteractiveTerminalViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new InteractiveTerminalPage() ) { emit nextStatusChanged( true ); } InteractiveTerminalViewStep::~InteractiveTerminalViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString InteractiveTerminalViewStep::prettyName() const { return tr( "Script" ); } QWidget* InteractiveTerminalViewStep::widget() { return m_widget; } void InteractiveTerminalViewStep::next() { emit done(); } void InteractiveTerminalViewStep::back() {} bool InteractiveTerminalViewStep::isNextEnabled() const { return true; } bool InteractiveTerminalViewStep::isBackEnabled() const { return true; } bool InteractiveTerminalViewStep::isAtBeginning() const { return true; } bool InteractiveTerminalViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > InteractiveTerminalViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void InteractiveTerminalViewStep::onActivate() { m_widget->onActivate(); } void InteractiveTerminalViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains( "command" ) && configurationMap.value( "command").type() == QVariant::String ) m_widget->setCommand( configurationMap.value( "command" ).toString() ); } calamares-3.1.12/src/modules/interactiveterminal/InteractiveTerminalViewStep.h000066400000000000000000000036241322271446000276550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef INTERACTIVETERMINALPAGEPLUGIN_H #define INTERACTIVETERMINALPAGEPLUGIN_H #include #include #include #include class InteractiveTerminalPage; class PLUGINDLLEXPORT InteractiveTerminalViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit InteractiveTerminalViewStep( QObject* parent = nullptr ); virtual ~InteractiveTerminalViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; protected: void setConfigurationMap( const QVariantMap& configurationMap ) override; private: InteractiveTerminalPage* m_widget; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( InteractiveTerminalViewStepFactory ) #endif // INTERACTIVETERMINALPAGEPLUGIN_H calamares-3.1.12/src/modules/interactiveterminal/interactiveterminal.conf000066400000000000000000000000411322271446000267520ustar00rootroot00000000000000--- command: "echo Hello" calamares-3.1.12/src/modules/keyboard/000077500000000000000000000000001322271446000175665ustar00rootroot00000000000000calamares-3.1.12/src/modules/keyboard/CMakeLists.txt000066400000000000000000000007631322271446000223340ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( keyboard TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES KeyboardViewStep.cpp KeyboardPage.cpp KeyboardLayoutModel.cpp SetKeyboardLayoutJob.cpp keyboardwidget/keyboardglobal.cpp keyboardwidget/keyboardpreview.cpp UI KeyboardPage.ui RESOURCES keyboard.qrc LINK_PRIVATE_LIBRARIES calamaresui SHARED_LIB ) calamares-3.1.12/src/modules/keyboard/KeyboardLayoutModel.cpp000066400000000000000000000043101322271446000242070ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "KeyboardLayoutModel.h" #include KeyboardLayoutModel::KeyboardLayoutModel( QObject* parent ) : QAbstractListModel( parent ) { init(); } int KeyboardLayoutModel::rowCount( const QModelIndex& parent ) const { Q_UNUSED( parent ); return m_layouts.count(); } QVariant KeyboardLayoutModel::data( const QModelIndex& index, int role ) const { if ( !index.isValid() ) return QVariant(); switch ( role ) { case Qt::DisplayRole: return m_layouts.at( index.row() ).second.description; case KeyboardVariantsRole: return QVariant::fromValue( m_layouts.at( index.row() ).second.variants ); case KeyboardLayoutKeyRole: return m_layouts.at( index.row() ).first; } return QVariant(); } void KeyboardLayoutModel::init() { QMap< QString, KeyboardGlobal::KeyboardInfo > layouts = KeyboardGlobal::getKeyboardLayouts(); for ( QMap< QString, KeyboardGlobal::KeyboardInfo >::const_iterator it = layouts.constBegin(); it != layouts.constEnd(); ++it ) { m_layouts.append( qMakePair( it.key(), it.value() ) ); } std::stable_sort( m_layouts.begin(), m_layouts.end(), []( const QPair< QString, KeyboardGlobal::KeyboardInfo >& a, const QPair< QString, KeyboardGlobal::KeyboardInfo >& b ) { return a.second.description < b.second.description; } ); } calamares-3.1.12/src/modules/keyboard/KeyboardLayoutModel.h000066400000000000000000000027221322271446000236610ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KEYBOARDLAYOUTMODEL_H #define KEYBOARDLAYOUTMODEL_H #include "keyboardwidget/keyboardglobal.h" #include #include #include class KeyboardLayoutModel : public QAbstractListModel { Q_OBJECT public: enum Roles : int { KeyboardVariantsRole = Qt::UserRole, KeyboardLayoutKeyRole }; KeyboardLayoutModel( QObject* parent = nullptr ); int rowCount( const QModelIndex& parent = QModelIndex() ) const override; QVariant data( const QModelIndex& index, int role ) const override; private: void init(); QList< QPair< QString, KeyboardGlobal::KeyboardInfo > > m_layouts; }; #endif // KEYBOARDLAYOUTMODEL_H calamares-3.1.12/src/modules/keyboard/KeyboardPage.cpp000066400000000000000000000252621322271446000226360ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "KeyboardPage.h" #include "ui_KeyboardPage.h" #include "keyboardwidget/keyboardpreview.h" #include "SetKeyboardLayoutJob.h" #include "KeyboardLayoutModel.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include #include #include class LayoutItem : public QListWidgetItem { public: QString data; virtual ~LayoutItem(); }; LayoutItem::~LayoutItem() { } static QPersistentModelIndex findLayout( const KeyboardLayoutModel* klm, const QString& currentLayout ) { QPersistentModelIndex currentLayoutItem; for ( int i = 0; i < klm->rowCount(); ++i ) { QModelIndex idx = klm->index( i ); if ( idx.isValid() && idx.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString() == currentLayout ) currentLayoutItem = idx; } return currentLayoutItem; } KeyboardPage::KeyboardPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::Page_Keyboard ) , m_keyboardPreview( new KeyBoardPreview( this ) ) , m_defaultIndex( 0 ) { ui->setupUi( this ); // Keyboard Preview ui->KBPreviewLayout->addWidget( m_keyboardPreview ); m_setxkbmapTimer.setSingleShot( true ); // Connect signals and slots connect( ui->listVariant, &QListWidget::currentItemChanged, this, &KeyboardPage::onListVariantCurrentItemChanged ); connect( ui->buttonRestore, &QPushButton::clicked, [this] { ui->comboBoxModel->setCurrentIndex( m_defaultIndex ); }); connect( ui->comboBoxModel, static_cast< void ( QComboBox::* )( const QString& ) >( &QComboBox::currentIndexChanged ), [this]( const QString& text ) { QString model = m_models.value( text, "pc105" ); // Set Xorg keyboard model QProcess::execute( QLatin1Literal( "setxkbmap" ), QStringList() << "-model" << model ); }); CALAMARES_RETRANSLATE( ui->retranslateUi( this ); ) } KeyboardPage::~KeyboardPage() { delete ui; } void KeyboardPage::init() { //### Detect current keyboard layout and variant QString currentLayout; QString currentVariant; QProcess process; process.start( "setxkbmap", QStringList() << "-print" ); if ( process.waitForFinished() ) { const QStringList list = QString( process.readAll() ) .split( "\n", QString::SkipEmptyParts ); for ( QString line : list ) { line = line.trimmed(); if ( !line.startsWith( "xkb_symbols" ) ) continue; line = line.remove( "}" ) .remove( "{" ) .remove( ";" ); line = line.mid( line.indexOf( "\"" ) + 1 ); QStringList split = line.split( "+", QString::SkipEmptyParts ); if ( split.size() >= 2 ) { currentLayout = split.at( 1 ); if ( currentLayout.contains( "(" ) ) { int parenthesisIndex = currentLayout.indexOf( "(" ); currentVariant = currentLayout.mid( parenthesisIndex + 1 ) .trimmed(); currentVariant.chop( 1 ); currentLayout = currentLayout .mid( 0, parenthesisIndex ) .trimmed(); } break; } } } //### Models m_models = KeyboardGlobal::getKeyboardModels(); QMapIterator< QString, QString > mi( m_models ); ui->comboBoxModel->blockSignals( true ); while ( mi.hasNext() ) { mi.next(); if ( mi.value() == "pc105" ) m_defaultIndex = ui->comboBoxModel->count(); ui->comboBoxModel->addItem( mi.key() ); } ui->comboBoxModel->blockSignals( false ); // Set to default value pc105 ui->comboBoxModel->setCurrentIndex( m_defaultIndex ); //### Layouts and Variants KeyboardLayoutModel* klm = new KeyboardLayoutModel( this ); ui->listLayout->setModel( klm ); connect( ui->listLayout->selectionModel(), &QItemSelectionModel::currentChanged, this, &KeyboardPage::onListLayoutCurrentItemChanged ); // Block signals ui->listLayout->blockSignals( true ); QPersistentModelIndex currentLayoutItem = findLayout( klm, currentLayout ); if ( !currentLayoutItem.isValid() && ( ( currentLayout == "latin" ) || ( currentLayout == "pc" ) ) ) { currentLayout = "us"; currentLayoutItem = findLayout( klm, currentLayout ); } // Set current layout and variant if ( currentLayoutItem.isValid() ) { ui->listLayout->setCurrentIndex( currentLayoutItem ); updateVariants( currentLayoutItem, currentVariant ); } // Unblock signals ui->listLayout->blockSignals( false ); // Default to the first available layout if none was set // Do this after unblocking signals so we get the default variant handling. if ( !currentLayoutItem.isValid() && klm->rowCount() > 0 ) ui->listLayout->setCurrentIndex( klm->index( 0 ) ); } QString KeyboardPage::prettyStatus() const { QString status; status += tr( "Set keyboard model to %1.
" ) .arg( ui->comboBoxModel->currentText() ); status += tr( "Set keyboard layout to %1/%2." ) .arg( ui->listLayout->currentIndex().data().toString() ) .arg( ui->listVariant->currentItem()->text() ); return status; } QList< Calamares::job_ptr > KeyboardPage::createJobs( const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ) { QList< Calamares::job_ptr > list; QString selectedModel = m_models.value( ui->comboBoxModel->currentText(), "pc105" ); Calamares::Job* j = new SetKeyboardLayoutJob( selectedModel, m_selectedLayout, m_selectedVariant, xOrgConfFileName, convertedKeymapPath, writeEtcDefaultKeyboard ); list.append( Calamares::job_ptr( j ) ); return list; } void KeyboardPage::onActivate() { ui->listLayout->setFocus(); } void KeyboardPage::finalize() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( !m_selectedLayout.isEmpty() ) { gs->insert( "keyboardLayout", m_selectedLayout ); gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant } //FIXME: also store keyboard model for something? } void KeyboardPage::updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant ) { // Block signals ui->listVariant->blockSignals( true ); QMap< QString, QString > variants = currentItem.data( KeyboardLayoutModel::KeyboardVariantsRole ) .value< QMap< QString, QString > >(); QMapIterator< QString, QString > li( variants ); LayoutItem* defaultItem = nullptr; ui->listVariant->clear(); while ( li.hasNext() ) { li.next(); LayoutItem* item = new LayoutItem(); item->setText( li.key() ); item->data = li.value(); ui->listVariant->addItem( item ); // currentVariant defaults to QString(). It is only non-empty during the // initial setup. if ( li.value() == currentVariant ) defaultItem = item; } // Unblock signals ui->listVariant->blockSignals( false ); // Set to default value if ( defaultItem ) ui->listVariant->setCurrentItem( defaultItem ); } void KeyboardPage::onListLayoutCurrentItemChanged( const QModelIndex& current, const QModelIndex& previous ) { Q_UNUSED( previous ); if ( !current.isValid() ) return; updateVariants( QPersistentModelIndex( current ) ); } /* Returns stringlist with suitable setxkbmap command-line arguments * to set the given @p layout and @p variant. */ static inline QStringList xkbmap_args( QStringList&& r, const QString& layout, const QString& variant) { r << "-layout" << layout; if ( !variant.isEmpty() ) r << "-variant" << variant; return r; } void KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ) { Q_UNUSED( previous ); QPersistentModelIndex layoutIndex = ui->listLayout->currentIndex(); LayoutItem* variantItem = dynamic_cast< LayoutItem* >( current ); if ( !layoutIndex.isValid() || !variantItem ) return; QString layout = layoutIndex.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString(); QString variant = variantItem->data; m_keyboardPreview->setLayout( layout ); m_keyboardPreview->setVariant( variant ); //emit checkReady(); // Set Xorg keyboard layout if ( m_setxkbmapTimer.isActive() ) { m_setxkbmapTimer.stop(); m_setxkbmapTimer.disconnect( this ); } connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { QProcess::execute( QLatin1Literal( "setxkbmap" ), xkbmap_args( QStringList(), layout, variant ) ); cDebug() << "xkbmap selection changed to: " << layout << "-" << variant; m_setxkbmapTimer.disconnect( this ); } ); m_setxkbmapTimer.start( QApplication::keyboardInputInterval() ); m_selectedLayout = layout; m_selectedVariant = variant; } calamares-3.1.12/src/modules/keyboard/KeyboardPage.h000066400000000000000000000044631322271446000223030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KEYBOARDPAGE_H #define KEYBOARDPAGE_H #include "keyboardwidget/keyboardglobal.h" #include "Typedefs.h" #include #include #include namespace Ui { class Page_Keyboard; } class KeyBoardPreview; class KeyboardPage : public QWidget { Q_OBJECT public: explicit KeyboardPage( QWidget* parent = nullptr ); virtual ~KeyboardPage(); void init(); QString prettyStatus() const; QList< Calamares::job_ptr > createJobs( const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ); void onActivate(); void finalize(); protected slots: void onListLayoutCurrentItemChanged( const QModelIndex& current, const QModelIndex& previous ); void onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ); private: void updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant = QString() ); Ui::Page_Keyboard* ui; KeyBoardPreview* m_keyboardPreview; int m_defaultIndex; QMap< QString, QString > m_models; QString m_selectedLayout; QString m_selectedVariant; QTimer m_setxkbmapTimer; }; #endif // KEYBOARDPAGE_H calamares-3.1.12/src/modules/keyboard/KeyboardPage.ui000066400000000000000000000072141322271446000224660ustar00rootroot00000000000000 Page_Keyboard 0 0 830 573 Form 9 0 12 12 Qt::Horizontal 40 20 Qt::Horizontal 40 20 0 Keyboard Model: 0 0 :/images/restore.png:/images/restore.png 18 18 9 50 false Type here to test your keyboard comboBoxModel listLayout listVariant LE_TestKeyboard buttonRestore calamares-3.1.12/src/modules/keyboard/KeyboardViewStep.cpp000066400000000000000000000073371322271446000235330ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "KeyboardViewStep.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "KeyboardPage.h" CALAMARES_PLUGIN_FACTORY_DEFINITION( KeyboardViewStepFactory, registerPlugin(); ) KeyboardViewStep::KeyboardViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new KeyboardPage() ) , m_nextEnabled( false ) , m_writeEtcDefaultKeyboard( true ) { m_widget->init(); m_nextEnabled = true; emit nextStatusChanged( m_nextEnabled ); } KeyboardViewStep::~KeyboardViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString KeyboardViewStep::prettyName() const { return tr( "Keyboard" ); } QString KeyboardViewStep::prettyStatus() const { return m_prettyStatus; } QWidget* KeyboardViewStep::widget() { return m_widget; } void KeyboardViewStep::next() { //TODO: actually save those settings somewhere emit done(); } void KeyboardViewStep::back() {} bool KeyboardViewStep::isNextEnabled() const { return m_nextEnabled; } bool KeyboardViewStep::isBackEnabled() const { return true; } bool KeyboardViewStep::isAtBeginning() const { return true; } bool KeyboardViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > KeyboardViewStep::jobs() const { return m_jobs; } void KeyboardViewStep::onActivate() { m_widget->onActivate(); } void KeyboardViewStep::onLeave() { m_widget->finalize(); m_jobs = m_widget->createJobs( m_xOrgConfFileName, m_convertedKeymapPath, m_writeEtcDefaultKeyboard ); m_prettyStatus = m_widget->prettyStatus(); } void KeyboardViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains( "xOrgConfFileName" ) && configurationMap.value( "xOrgConfFileName" ).type() == QVariant::String && !configurationMap.value( "xOrgConfFileName" ).toString().isEmpty() ) { m_xOrgConfFileName = configurationMap.value( "xOrgConfFileName" ) .toString(); } else { m_xOrgConfFileName = "00-keyboard.conf"; } if ( configurationMap.contains( "convertedKeymapPath" ) && configurationMap.value( "convertedKeymapPath" ).type() == QVariant::String && !configurationMap.value( "convertedKeymapPath" ).toString().isEmpty() ) { m_convertedKeymapPath = configurationMap.value( "convertedKeymapPath" ) .toString(); } else { m_convertedKeymapPath = QString(); } if ( configurationMap.contains( "writeEtcDefaultKeyboard" ) && configurationMap.value( "writeEtcDefaultKeyboard" ).type() == QVariant::Bool ) { m_writeEtcDefaultKeyboard = configurationMap.value( "writeEtcDefaultKeyboard" ).toBool(); } else { m_writeEtcDefaultKeyboard = true; } } calamares-3.1.12/src/modules/keyboard/KeyboardViewStep.h000066400000000000000000000040551322271446000231720ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KEYBOARDVIEWSTEP_H #define KEYBOARDVIEWSTEP_H #include #include #include #include class KeyboardPage; class PLUGINDLLEXPORT KeyboardViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit KeyboardViewStep( QObject* parent = nullptr ); virtual ~KeyboardViewStep() override; QString prettyName() const override; QString prettyStatus() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; void onLeave() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: KeyboardPage* m_widget; bool m_nextEnabled; QString m_prettyStatus; QString m_xOrgConfFileName; QString m_convertedKeymapPath; bool m_writeEtcDefaultKeyboard; QList< Calamares::job_ptr > m_jobs; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( KeyboardViewStepFactory ) #endif // KEYBOARDVIEWSTEP_H calamares-3.1.12/src/modules/keyboard/README.md000066400000000000000000000003111322271446000210400ustar00rootroot00000000000000Keyboard layout configuration viewmodule --- Requires ckbcomp script. * Debian package console-setup or * Manjaro package keyboardctl https://github.com/manjaro/packages-core/tree/master/keyboardctl calamares-3.1.12/src/modules/keyboard/SetKeyboardLayoutJob.cpp000066400000000000000000000261371322271446000243500ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2014, Kevin Kofler * * Portions from systemd (localed.c): * Copyright 2011 Lennart Poettering * Copyright 2013 Kay Sievers * (originally under LGPLv2.1+, used under the LGPL to GPL conversion clause) * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" #include #include #include #include #include SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model, const QString& layout, const QString& variant, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard) : Calamares::Job() , m_model( model ) , m_layout( layout ) , m_variant( variant ) , m_xOrgConfFileName( xOrgConfFileName ) , m_convertedKeymapPath( convertedKeymapPath ) , m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard ) { } QString SetKeyboardLayoutJob::prettyName() const { return tr( "Set keyboard model to %1, layout to %2-%3" ).arg( m_model ) .arg( m_layout ) .arg( m_variant ); } QString SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) const { // No search path supplied, assume the distribution does not provide // converted keymaps if ( convertedKeymapPath.isEmpty() ) return QString(); QDir convertedKeymapDir( convertedKeymapPath ); QString name = m_variant.isEmpty() ? m_layout : ( m_layout + '-' + m_variant ); if ( convertedKeymapDir.exists( name + ".map" ) || convertedKeymapDir.exists( name + ".map.gz" ) ) { cDebug() << "Found converted keymap" << name; return name; } return QString(); } QString SetKeyboardLayoutJob::findLegacyKeymap() const { int bestMatching = 0; QString name; QFile file( ":/kbd-model-map" ); file.open( QIODevice::ReadOnly | QIODevice::Text ); QTextStream stream( &file ); while ( !stream.atEnd() ) { QString line = stream.readLine().trimmed(); if ( line.isEmpty() || line.startsWith( '#' ) ) continue; QStringList mapping = line.split( '\t', QString::SkipEmptyParts ); if ( mapping.size() < 5 ) continue; int matching = 0; // Determine how well matching this entry is // We assume here that we have one X11 layout. If the UI changes to // allow more than one layout, this should change too. if ( m_layout == mapping[1] ) // If we got an exact match, this is best matching = 10; // Look for an entry whose first layout matches ours else if ( mapping[1].startsWith( m_layout + ',' ) ) matching = 5; if ( matching > 0 ) { if ( m_model.isEmpty() || m_model == mapping[2] ) matching++; QString mappingVariant = mapping[3]; if ( mappingVariant == "-" ) mappingVariant = QString(); else if ( mappingVariant.startsWith( ',' ) ) mappingVariant.remove( 1, 0 ); if ( m_variant == mappingVariant ) matching++; // We ignore mapping[4], the xkb options, for now. If we ever // allow setting options in the UI, we should match them here. } // The best matching entry so far, then let's save that if ( matching >= qMax( bestMatching, 1 ) ) { cDebug() << "Found legacy keymap" << mapping[0] << "with score" << matching; if ( matching > bestMatching ) { bestMatching = matching; name = mapping[0]; } } } return name; } bool SetKeyboardLayoutJob::writeVConsoleData( const QString& vconsoleConfPath, const QString& convertedKeymapPath ) const { QString keymap = findConvertedKeymap( convertedKeymapPath ); if ( keymap.isEmpty() ) keymap = findLegacyKeymap(); if ( keymap.isEmpty() ) { cDebug() << "Trying to use X11 layout" << m_layout << "as the virtual console layout"; keymap = m_layout; } QStringList existingLines; // Read in the existing vconsole.conf, if it exists QFile file( vconsoleConfPath ); if ( file.exists() ) { file.open( QIODevice::ReadOnly | QIODevice::Text ); QTextStream stream( &file ); while ( !stream.atEnd() ) existingLines << stream.readLine(); file.close(); if ( stream.status() != QTextStream::Ok ) return false; } // Write out the existing lines and replace the KEYMAP= line file.open( QIODevice::WriteOnly | QIODevice::Text ); QTextStream stream( &file ); bool found = false; foreach ( const QString& existingLine, existingLines ) { if ( existingLine.trimmed().startsWith( "KEYMAP=" ) ) { stream << "KEYMAP=" << keymap << '\n'; found = true; } else stream << existingLine << '\n'; } // Add a KEYMAP= line if there wasn't any if ( !found ) stream << "KEYMAP=" << keymap << '\n'; stream.flush(); file.close(); cDebug() << "Written KEYMAP=" << keymap << "to vconsole.conf"; return ( stream.status() == QTextStream::Ok ); } bool SetKeyboardLayoutJob::writeX11Data( const QString& keyboardConfPath ) const { QFile file( keyboardConfPath ); file.open( QIODevice::WriteOnly | QIODevice::Text ); QTextStream stream( &file ); stream << "# Read and parsed by systemd-localed. It's probably wise not to edit this file\n" "# manually too freely.\n" "Section \"InputClass\"\n" " Identifier \"system-keyboard\"\n" " MatchIsKeyboard \"on\"\n"; if ( !m_layout.isEmpty() ) stream << " Option \"XkbLayout\" \"" << m_layout << "\"\n"; if ( !m_model.isEmpty() ) stream << " Option \"XkbModel\" \"" << m_model << "\"\n"; if ( !m_variant.isEmpty() ) stream << " Option \"XkbVariant\" \"" << m_variant << "\"\n"; stream << "EndSection\n"; stream.flush(); file.close(); cDebug() << "Written XkbLayout" << m_layout << "; XkbModel" << m_model << "; XkbVariant" << m_variant << "to X.org file" << keyboardConfPath; return ( stream.status() == QTextStream::Ok ); } bool SetKeyboardLayoutJob::writeDefaultKeyboardData( const QString& defaultKeyboardPath ) const { QFile file( defaultKeyboardPath ); file.open( QIODevice::WriteOnly | QIODevice::Text ); QTextStream stream( &file ); stream << "# KEYBOARD CONFIGURATION FILE\n\n" "# Consult the keyboard(5) manual page.\n\n"; stream << "XKBMODEL=\"" << m_model << "\"\n"; stream << "XKBLAYOUT=\"" << m_layout << "\"\n"; stream << "XKBVARIANT=\"" << m_variant << "\"\n"; stream << "XKBOPTIONS=\"\"\n\n"; stream << "BACKSPACE=\"guess\"\n"; stream.flush(); file.close(); cDebug() << "Written XKBMODEL" << m_model << "; XKBLAYOUT" << m_layout << "; XKBVARIANT" << m_variant << "to /etc/default/keyboard file" << defaultKeyboardPath; return ( stream.status() == QTextStream::Ok ); } Calamares::JobResult SetKeyboardLayoutJob::exec() { cDebug() << "Executing SetKeyboardLayoutJob"; // Read the location of the destination's / in the host file system from // the global settings Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QDir destDir( gs->value( "rootMountPoint" ).toString() ); // Get the path to the destination's /etc/vconsole.conf QString vconsoleConfPath = destDir.absoluteFilePath( "etc/vconsole.conf" ); // Get the path to the destination's /etc/X11/xorg.conf.d/00-keyboard.conf QString xorgConfDPath; QString keyboardConfPath; if ( QDir::isAbsolutePath( m_xOrgConfFileName ) ) { keyboardConfPath = m_xOrgConfFileName; while ( keyboardConfPath.startsWith( '/' ) ) keyboardConfPath.remove( 0, 1 ); keyboardConfPath = destDir.absoluteFilePath( keyboardConfPath ); xorgConfDPath = QFileInfo( keyboardConfPath ).path(); } else { xorgConfDPath = destDir.absoluteFilePath( "etc/X11/xorg.conf.d" ); keyboardConfPath = QDir( xorgConfDPath ) .absoluteFilePath( m_xOrgConfFileName ); } destDir.mkpath( xorgConfDPath ); QString defaultKeyboardPath; if ( QDir( destDir.absoluteFilePath( "etc/default" ) ).exists() ) { defaultKeyboardPath = destDir.absoluteFilePath( "etc/default/keyboard" ); } // Get the path to the destination's path to the converted key mappings QString convertedKeymapPath = m_convertedKeymapPath; if ( !convertedKeymapPath.isEmpty() ) { while ( convertedKeymapPath.startsWith( '/' ) ) convertedKeymapPath.remove( 0, 1 ); convertedKeymapPath = destDir.absoluteFilePath( convertedKeymapPath ); } if ( !writeVConsoleData( vconsoleConfPath, convertedKeymapPath ) ) return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for the virtual console." ), tr( "Failed to write to %1" ).arg( vconsoleConfPath ) ); if ( !writeX11Data( keyboardConfPath ) ) return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for X11." ), tr( "Failed to write to %1" ).arg( keyboardConfPath ) ); if ( !defaultKeyboardPath.isEmpty() && m_writeEtcDefaultKeyboard ) { if ( !writeDefaultKeyboardData( defaultKeyboardPath ) ) return Calamares::JobResult::error( tr( "Failed to write keyboard configuration to existing /etc/default directory." ), tr( "Failed to write to %1" ).arg( keyboardConfPath ) ); } return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/keyboard/SetKeyboardLayoutJob.h000066400000000000000000000037631322271446000240150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2014, Kevin Kofler * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETKEYBOARDLAYOUTJOB_H #define SETKEYBOARDLAYOUTJOB_H #include class SetKeyboardLayoutJob : public Calamares::Job { Q_OBJECT public: SetKeyboardLayoutJob( const QString& model, const QString& layout, const QString& variant, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ); QString prettyName() const override; Calamares::JobResult exec() override; private: QString findConvertedKeymap( const QString& convertedKeymapPath ) const; QString findLegacyKeymap() const; bool writeVConsoleData( const QString& vconsoleConfPath, const QString& convertedKeymapPath ) const; bool writeX11Data( const QString& keyboardConfPath ) const; bool writeDefaultKeyboardData( const QString& defaultKeyboardPath ) const; QString m_model; QString m_layout; QString m_variant; QString m_xOrgConfFileName; QString m_convertedKeymapPath; const bool m_writeEtcDefaultKeyboard; }; #endif /* SETKEYBOARDLAYOUTJOB_H */ calamares-3.1.12/src/modules/keyboard/images/000077500000000000000000000000001322271446000210335ustar00rootroot00000000000000calamares-3.1.12/src/modules/keyboard/images/restore.png000066400000000000000000000015541322271446000232310ustar00rootroot00000000000000PNG  IHDR@@iq3IDATx^@!d#ut#P"6^"#X`!^fvmwS}gjm}~oK)!(=\hTWbַX#T(,,\5! Y?㬯?/NDw+tk산AItXʻN D ; = !Z,VF义"Զ< 6Txpɉ +Vh~ )ۜ~ XAC 3EI&$WC!H4DNiBCbG@ritE ef![@$ 7[OnX HtHcXI9Ή]];;Č ͅmF3@4tXZj0jM8w)_.Gtt T/ԘţW@`J@O%k`o)0%@|5) [e$kI-UPl[E?pwTM8:*H#SDɟ @A闌70R[3D6@L-->d_G@ht5+r[["71 D˨Xh72s08*d-hRF^W9"B%w+Mjl " ПhM]a>1yq$8o3AH\QMC#9|+,,x XBs\QDB4̉vv'RTyBk<b= 7IENDB`calamares-3.1.12/src/modules/keyboard/kbd-model-map000066400000000000000000000072421322271446000221270ustar00rootroot00000000000000# Copied from systemd-localed # http://cgit.freedesktop.org/systemd/systemd/log/src/locale/kbd-model-map # (originally under LGPLv2.1+, used under the LGPL to GPL conversion clause) # Generated from system-config-keyboard's model list # consolelayout xlayout xmodel xvariant xoptions sg ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp nl nl pc105 - terminate:ctrl_alt_bksp mk-utf mk,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll trq tr pc105 - terminate:ctrl_alt_bksp uk gb pc105 - terminate:ctrl_alt_bksp is-latin1 is pc105 - terminate:ctrl_alt_bksp de de pc105 - terminate:ctrl_alt_bksp la-latin1 latam pc105 - terminate:ctrl_alt_bksp us us pc105+inet - terminate:ctrl_alt_bksp ko kr pc105 - terminate:ctrl_alt_bksp ro-std ro pc105 std terminate:ctrl_alt_bksp de-latin1 de pc105 - terminate:ctrl_alt_bksp slovene si pc105 - terminate:ctrl_alt_bksp hu101 hu pc105 qwerty terminate:ctrl_alt_bksp jp106 jp jp106 - terminate:ctrl_alt_bksp croat hr pc105 - terminate:ctrl_alt_bksp it2 it pc105 - terminate:ctrl_alt_bksp hu hu pc105 - terminate:ctrl_alt_bksp sr-latin rs pc105 latin terminate:ctrl_alt_bksp fi fi pc105 - terminate:ctrl_alt_bksp fr_CH ch pc105 fr terminate:ctrl_alt_bksp dk-latin1 dk pc105 - terminate:ctrl_alt_bksp fr fr pc105 - terminate:ctrl_alt_bksp it it pc105 - terminate:ctrl_alt_bksp ua-utf ua,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll fr-latin1 fr pc105 - terminate:ctrl_alt_bksp sg-latin1 ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp be-latin1 be pc105 - terminate:ctrl_alt_bksp dk dk pc105 - terminate:ctrl_alt_bksp fr-pc fr pc105 - terminate:ctrl_alt_bksp bg_pho-utf8 bg,us pc105 ,phonetic terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll it-ibm it pc105 - terminate:ctrl_alt_bksp cz-us-qwertz cz,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll br-abnt2 br abnt2 - terminate:ctrl_alt_bksp ro ro pc105 - terminate:ctrl_alt_bksp us-acentos us pc105 intl terminate:ctrl_alt_bksp pt-latin1 pt pc105 - terminate:ctrl_alt_bksp ro-std-cedilla ro pc105 std_cedilla terminate:ctrl_alt_bksp tj_alt-UTF8 tj pc105 - terminate:ctrl_alt_bksp de-latin1-nodeadkeys de pc105 nodeadkeys terminate:ctrl_alt_bksp no no pc105 - terminate:ctrl_alt_bksp bg_bds-utf8 bg,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll dvorak us pc105 dvorak terminate:ctrl_alt_bksp dvorak us pc105 dvorak-alt-intl terminate:ctrl_alt_bksp ru ru,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll cz-lat2 cz pc105 qwerty terminate:ctrl_alt_bksp pl2 pl pc105 - terminate:ctrl_alt_bksp es es pc105 - terminate:ctrl_alt_bksp ro-cedilla ro pc105 cedilla terminate:ctrl_alt_bksp ie ie pc105 - terminate:ctrl_alt_bksp et ee pc105 - terminate:ctrl_alt_bksp sk-qwerty sk pc105 - terminate:ctrl_alt_bksp,qwerty sk-qwertz sk pc105 - terminate:ctrl_alt_bksp fr-latin9 fr pc105 latin9 terminate:ctrl_alt_bksp fr_CH-latin1 ch pc105 fr terminate:ctrl_alt_bksp cf ca pc105 - terminate:ctrl_alt_bksp sv-latin1 se pc105 - terminate:ctrl_alt_bksp sr-cy rs pc105 - terminate:ctrl_alt_bksp gr gr,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll by by,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll il il pc105 - terminate:ctrl_alt_bksp kazakh kz,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll lt.baltic lt pc105 - terminate:ctrl_alt_bksp lt.l4 lt pc105 - terminate:ctrl_alt_bksp lt lt pc105 - terminate:ctrl_alt_bksp khmer kh,us pc105 - terminate:ctrl_alt_bksp calamares-3.1.12/src/modules/keyboard/keyboard.conf000066400000000000000000000011421322271446000222330ustar00rootroot00000000000000--- # The name of the file to write X11 keyboard settings to # The default value is the name used by upstream systemd-localed. # Relative paths are assumed to be relative to /etc/X11/xorg.conf.d xOrgConfFileName: "/etc/X11/xorg.conf.d/00-keyboard.conf" # The path to search for keymaps converted from X11 to kbd format # Leave this empty if the setting does not make sense on your distribution. convertedKeymapPath: "/lib/kbd/keymaps/xkb" # Write keymap configuration to /etc/default/keyboard, usually # found on Debian-related systems. # Defaults to true if nothing is set. #writeEtcDefaultKeyboard: true calamares-3.1.12/src/modules/keyboard/keyboard.qrc000066400000000000000000000002041322271446000220710ustar00rootroot00000000000000 kbd-model-map images/restore.png calamares-3.1.12/src/modules/keyboard/keyboardwidget/000077500000000000000000000000001322271446000225725ustar00rootroot00000000000000calamares-3.1.12/src/modules/keyboard/keyboardwidget/keyboardglobal.cpp000066400000000000000000000120701322271446000262570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "keyboardglobal.h" //### //### Public methods //### QMap KeyboardGlobal::getKeyboardLayouts() { return parseKeyboardLayouts(XKB_FILE); } QMap KeyboardGlobal::getKeyboardModels() { return parseKeyboardModels(XKB_FILE); } //### //### Private methods //### //### Source by Georg Grabler ###// QMap KeyboardGlobal::parseKeyboardModels(QString filepath) { QMap models; QFile fh(filepath); fh.open(QIODevice::ReadOnly); if (!fh.isOpen()) { qDebug() << "X11 Keyboard model definitions not found!"; return models; } bool modelsFound = false; // read the file until the end or until we break the loop while (!fh.atEnd()) { QByteArray line = fh.readLine(); // check if we start with the model section in the file if (!modelsFound && line.startsWith("! model")) modelsFound = true; else if (modelsFound && line.startsWith ("!")) break; else if (!modelsFound) continue; // here we are in the model section, otherwhise we would continue or break QRegExp rx; rx.setPattern("^\\s+(\\S+)\\s+(\\w.*)\n$"); // insert into the model map if (rx.indexIn(line) != -1) { QString modelDesc = rx.cap(2); QString model = rx.cap(1); if (model == "pc105") modelDesc += " - " + QObject::tr("Default Keyboard Model"); models.insert(modelDesc, model); } } return models; } QMap< QString, KeyboardGlobal::KeyboardInfo > KeyboardGlobal::parseKeyboardLayouts(QString filepath) { QMap< QString, KeyboardInfo > layouts; //### Get Layouts ###// QFile fh(filepath); fh.open(QIODevice::ReadOnly); if (!fh.isOpen()) { qDebug() << "X11 Keyboard layout definitions not found!"; return layouts; } bool layoutsFound = false; // read the file until the end or we break the loop while (!fh.atEnd()) { QByteArray line = fh.readLine(); // find the layout section otherwhise continue. If the layout section is at it's end, break the loop if (!layoutsFound && line.startsWith("! layout")) layoutsFound = true; else if (layoutsFound && line.startsWith ("!")) break; else if (!layoutsFound) continue; QRegExp rx; rx.setPattern("^\\s+(\\S+)\\s+(\\w.*)\n$"); // insert into the layout map if (rx.indexIn(line) != -1) { KeyboardInfo info; info.description = rx.cap(2); info.variants.insert(QObject::tr("Default"), ""); layouts.insert(rx.cap(1), info); } } fh.reset(); //### Get Variants ###// bool variantsFound = false; // read the file until the end or until we break while (!fh.atEnd()) { QByteArray line = fh.readLine(); // continue until we found the variant section. If found, read until the next section is found if (!variantsFound && line.startsWith("! variant")) { variantsFound = true; continue; } else if (variantsFound && line.startsWith ("!")) break; else if (!variantsFound) continue; QRegExp rx; rx.setPattern("^\\s+(\\S+)\\s+(\\S+): (\\w.*)\n$"); // insert into the variants multimap, if the pattern matches if (rx.indexIn(line) != -1) { if (layouts.find(rx.cap(2)) != layouts.end()) { // in this case we found an entry in the multimap, and add the values to the multimap layouts.find(rx.cap(2)).value().variants.insert(rx.cap(3), rx.cap(1)); } else { // create a new map in the multimap - the value was not found. KeyboardInfo info; info.description = rx.cap(2); info.variants.insert(QObject::tr("Default"), ""); info.variants.insert(rx.cap(3), rx.cap(1)); layouts.insert(rx.cap(2), info); } } } return layouts; } calamares-3.1.12/src/modules/keyboard/keyboardwidget/keyboardglobal.h000066400000000000000000000032321322271446000257240ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KEYBOARDGLOBAL_H #define KEYBOARDGLOBAL_H #include #include #include #include #include #include #include #include #include #include #define XKB_FILE "/usr/share/X11/xkb/rules/base.lst" class KeyboardGlobal { public: struct KeyboardInfo { QString description; QMap< QString, QString > variants; }; static QMap< QString, KeyboardInfo > getKeyboardLayouts(); static QMap< QString, QString > getKeyboardModels(); private: static QMap< QString, QString > parseKeyboardModels(QString filepath); static QMap< QString, KeyboardInfo > parseKeyboardLayouts(QString filepath); }; #endif // KEYBOARDGLOBAL_H calamares-3.1.12/src/modules/keyboard/keyboardwidget/keyboardpreview.cpp000066400000000000000000000221421322271446000265010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "keyboardpreview.h" KeyBoardPreview::KeyBoardPreview( QWidget* parent ) : QWidget( parent ) , layout( "us" ) , space( 0 ) , usable_width( 0 ) , key_w( 0 ) { setMinimumSize(700, 191); // We must set up the font size in pixels to fit the keys lowerFont = QFont("Helvetica", 10, QFont::DemiBold); lowerFont.setPixelSize(16); upperFont = QFont("Helvetica", 8); upperFont.setPixelSize(13); // Setup keyboard types kbList[KB_104].kb_extended_return = false; kbList[KB_104].keys.append(QList() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd); kbList[KB_104].keys.append(QList() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b << 0x2b); kbList[KB_104].keys.append(QList() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28); kbList[KB_104].keys.append(QList() << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35); kbList[KB_105].kb_extended_return = true; kbList[KB_105].keys.append(QList() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd); kbList[KB_105].keys.append(QList() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b); kbList[KB_105].keys.append(QList() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28 << 0x2b); kbList[KB_105].keys.append(QList() << 0x54 << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35); kbList[KB_106].kb_extended_return = true; kbList[KB_106].keys.append(QList() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd << 0xe); kbList[KB_106].keys.append(QList() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b); kbList[KB_106].keys.append(QList() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28 << 0x29); kbList[KB_106].keys.append(QList() << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35 << 0x36); kb = &kbList[KB_104]; } void KeyBoardPreview::setLayout(QString _layout) { layout = _layout; } void KeyBoardPreview::setVariant(QString _variant) { variant = _variant; if (!loadCodes()) return; loadInfo(); repaint(); } //### //### Private //### void KeyBoardPreview::loadInfo() { // kb_104 if (layout == "us" || layout == "th") kb = &kbList[KB_104]; // kb_106 else if (layout == "jp") kb = &kbList[KB_106]; // most keyboards are 105 key so default to that else kb = &kbList[KB_105]; } bool KeyBoardPreview::loadCodes() { if (layout.isEmpty()) return false; QStringList param; param << "-model" << "pc106" << "-layout" << layout << "-compact"; if (!variant.isEmpty()) param << "-variant" << variant; QProcess process; process.setEnvironment(QStringList() << "LANG=C" << "LC_MESSAGES=C"); process.start("ckbcomp", param); if (!process.waitForStarted()) return false; if (!process.waitForFinished()) return false; // Clear codes codes.clear(); const QStringList list = QString(process.readAll()).split("\n", QString::SkipEmptyParts); for (const QString &line : list) { if (!line.startsWith("keycode") || !line.contains('=')) continue; QStringList split = line.split('=').at(1).trimmed().split(' '); if (split.size() < 4) continue; Code code; code.plain = fromUnicodeString(split.at(0)); code.shift = fromUnicodeString(split.at(1)); code.ctrl = fromUnicodeString(split.at(2)); code.alt = fromUnicodeString(split.at(3)); if (code.ctrl == code.plain) code.ctrl = ""; if (code.alt == code.plain) code.alt = ""; codes.append(code); } return true; } QString KeyBoardPreview::fromUnicodeString(QString raw) { if (raw.startsWith("U+")) return QChar(raw.mid(2).toInt(0, 16)); else if (raw.startsWith("+U")) return QChar(raw.mid(3).toInt(0, 16)); return ""; } QString KeyBoardPreview::regular_text(int index) { if (index < 0 || index >= codes.size()) return ""; return codes.at(index - 1).plain; } QString KeyBoardPreview::shift_text(int index) { if (index < 0 || index >= codes.size()) return ""; return codes.at(index - 1).shift; } QString KeyBoardPreview::ctrl_text(int index) { if (index < 0 || index >= codes.size()) return ""; return codes.at(index - 1).ctrl; } QString KeyBoardPreview::alt_text(int index) { if (index < 0 || index >= codes.size()) return ""; return codes.at(index - 1).alt; } void KeyBoardPreview::resizeEvent(QResizeEvent *) { space = 6; usable_width = width()-7; key_w = (usable_width - 14 * space)/15; setMaximumHeight(key_w*4 + space*5 + 1); } void KeyBoardPreview::paintEvent(QPaintEvent* event) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); p.setBrush(QColor(0xd6, 0xd6, 0xd6)); p.drawRect(rect()); QPen pen; pen.setWidth(1); pen.setColor(QColor(0x58, 0x58, 0x58)); p.setPen(pen); p.setBrush(QColor(0x58, 0x58, 0x58)); p.setBackgroundMode(Qt::TransparentMode); p.translate(0.5, 0.5); int rx = 3; int x=6; int y=6; int first_key_w = 0; int remaining_x[] = {0,0,0,0}; int remaining_widths[] = {0,0,0,0}; for (int i = 0; i < 4; i++) { if (first_key_w > 0) { first_key_w = int(first_key_w * 1.375); if (kb == &kbList[KB_105] && i == 3) first_key_w = int(key_w * 1.275); p.drawRoundedRect(QRectF(6, y, first_key_w, key_w), rx, rx); x = 6 + first_key_w + space; } else { first_key_w = key_w; } bool last_end = (i==1 && ! kb->kb_extended_return); int rw=usable_width-x; int ii=0; for (int k : kb->keys.at(i)) { QRectF rect = QRectF(x, y, key_w, key_w); if (ii == kb->keys.at(i).size()-1 && last_end) rect.setWidth(rw); p.drawRoundedRect(rect, rx, rx); rect.adjust(5, 1, 0, 0); p.setPen(QColor(0x9e, 0xde, 0x00)); p.setFont(upperFont); p.drawText(rect, Qt::AlignLeft | Qt::AlignTop, shift_text(k)); rect.setBottom(rect.bottom() - 2.5); p.setPen(QColor(0xff, 0xff, 0xff)); p.setFont(lowerFont); p.drawText(rect, Qt::AlignLeft | Qt::AlignBottom, regular_text(k)); rw = rw - space - key_w; x = x + space + key_w; ii = ii+1; p.setPen(pen); } remaining_x[i] = x; remaining_widths[i] = rw; if (i != 1 && i != 2) p.drawRoundedRect(QRectF(x, y, rw, key_w), rx, rx); y = y + space + key_w; } if (kb->kb_extended_return) { rx=rx*2; int x1 = remaining_x[1]; int y1 = 6 + key_w*1 + space*1; int w1 = remaining_widths[1]; int x2 = remaining_x[2]; int y2 = 6 + key_w*2 + space*2; // this is some serious crap... but it has to be so // maybe one day keyboards won't look like this... // one can only hope QPainterPath pp; pp.moveTo(x1, y1+rx); pp.arcTo(x1, y1, rx, rx, 180, -90); pp.lineTo(x1+w1-rx, y1); pp.arcTo(x1+w1-rx, y1, rx, rx, 90, -90); pp.lineTo(x1+w1, y2+key_w-rx); pp.arcTo(x1+w1-rx, y2+key_w-rx, rx, rx, 0, -90); pp.lineTo(x2+rx, y2+key_w); pp.arcTo(x2, y2+key_w-rx, rx, rx, -90, -90); pp.lineTo(x2, y1+key_w); pp.lineTo(x1+rx, y1+key_w); pp.arcTo(x1, y1+key_w-rx, rx, rx, -90, -90); pp.closeSubpath(); p.drawPath(pp); } else { x= remaining_x[2]; y = 6 + key_w*2 + space*2; p.drawRoundedRect(QRectF(x, y, remaining_widths[2], key_w), rx, rx); } QWidget::paintEvent(event); } calamares-3.1.12/src/modules/keyboard/keyboardwidget/keyboardpreview.h000066400000000000000000000041131322271446000261440ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KEYBOARDPREVIEW_H #define KEYBOARDPREVIEW_H #include #include #include #include #include #include #include #include #include #include #include class KeyBoardPreview : public QWidget { Q_OBJECT public: explicit KeyBoardPreview( QWidget* parent = nullptr ); void setLayout(QString layout); void setVariant(QString variant); private: enum KB_TYPE { KB_104, KB_105, KB_106 }; struct KB { bool kb_extended_return; QList > keys; }; struct Code { QString plain, shift, ctrl, alt; }; QString layout, variant; QFont lowerFont, upperFont; KB* kb, kbList[3]; QList codes; int space, usable_width, key_w; void loadInfo(); bool loadCodes(); QString regular_text(int index); QString shift_text(int index); QString ctrl_text(int index); QString alt_text(int index); QString fromUnicodeString(QString raw); protected: void paintEvent(QPaintEvent* event); void resizeEvent(QResizeEvent* event); }; #endif // KEYBOARDPREVIEW_H calamares-3.1.12/src/modules/license/000077500000000000000000000000001322271446000174105ustar00rootroot00000000000000calamares-3.1.12/src/modules/license/CMakeLists.txt000066400000000000000000000010251322271446000221460ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( license set_source_files_properties( PROPERTIES LANGUAGE CXX ) find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED DBus ) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules ) TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES LicenseViewStep.cpp LicensePage.cpp UI LicensePage.ui LINK_PRIVATE_LIBRARIES calamaresui SHARED_LIB ) calamares-3.1.12/src/modules/license/LicensePage.cpp000066400000000000000000000206101322271446000222720ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Anke Boersma * Copyright 2015, Alexandre Arnt * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LicensePage.h" #include "ui_LicensePage.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include "ViewManager.h" #include #include #include #include #include #include #include LicensePage::LicensePage(QWidget *parent) : QWidget( parent ) , ui( new Ui::LicensePage ) , m_isNextEnabled( false ) { ui->setupUi( this ); ui->verticalLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() ); ui->mainText->setAlignment( Qt::AlignCenter ); ui->mainText->setWordWrap( true ); ui->mainText->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); ui->additionalText->setWordWrap( true ); ui->verticalLayout->insertSpacing( 4, CalamaresUtils::defaultFontHeight() / 2 ); ui->verticalLayout->setContentsMargins( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() * 3, CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ); ui->acceptFrame->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); ui->acceptFrame->setStyleSheet( "#acceptFrame { border: 1px solid red;" "background-color: #fff6f6;" "border-radius: 4px;" "padding: 2px; }" ); ui->acceptFrame->layout()->setMargin( CalamaresUtils::defaultFontHeight() / 2 ); connect( ui->acceptCheckBox, &QCheckBox::toggled, this, [ this ]( bool checked ) { Calamares::JobQueue::instance()->globalStorage()->insert( "licenseAgree", checked ); m_isNextEnabled = checked; if ( !checked ) { ui->acceptFrame->setStyleSheet( "#acceptFrame { border: 1px solid red;" "background-color: #fff8f8;" "border-radius: 4px;" "padding: 2px; }" ); } else { ui->acceptFrame->setStyleSheet( "#acceptFrame { padding: 3px }" ); } emit nextStatusChanged( checked ); } ); CALAMARES_RETRANSLATE( ui->acceptCheckBox->setText( tr( "I accept the terms and conditions above." ) ); ); } void LicensePage::setEntries( const QList< LicenseEntry >& entriesList ) { CalamaresUtils::clearLayout( ui->licenseEntriesLayout ); bool required = false; for ( const LicenseEntry& entry : entriesList ) { if ( entry.required ) { required = true; break; } } m_isNextEnabled = !required; nextStatusChanged( m_isNextEnabled ); CALAMARES_RETRANSLATE( if ( required ) { ui->mainText->setText( tr( "

License Agreement

" "This setup procedure will install proprietary " "software that is subject to licensing terms." ) ); ui->additionalText->setText( tr( "Please review the End User License " "Agreements (EULAs) above.
" "If you do not agree with the terms, the setup procedure cannot continue." ) ); } else { ui->mainText->setText( tr( "

License Agreement

" "This setup procedure can install proprietary " "software that is subject to licensing terms " "in order to provide additional features and enhance the user " "experience." ) ); ui->additionalText->setText( tr( "Please review the End User License " "Agreements (EULAs) above.
" "If you do not agree with the terms, proprietary software will not " "be installed, and open source alternatives will be used instead." ) ); } ui->retranslateUi( this ); ) for ( const LicenseEntry& entry : entriesList ) { QWidget* widget = new QWidget( this ); QPalette pal( palette() ); pal.setColor( QPalette::Background, palette().background().color().lighter( 108 ) ); widget->setAutoFillBackground( true ); widget->setPalette( pal ); widget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); widget->setContentsMargins( 4, 4, 4, 4 ); QHBoxLayout* wiLayout = new QHBoxLayout; widget->setLayout( wiLayout ); QLabel* label = new QLabel( widget ); label->setWordWrap( true ); wiLayout->addWidget( label ); label->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ); QString productDescription; switch ( entry.type ) { case LicenseEntry::Driver: //: %1 is an untranslatable product name, example: Creative Audigy driver productDescription = tr( "%1 driver
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); break; case LicenseEntry::GpuDriver: //: %1 is usually a vendor name, example: Nvidia graphics driver productDescription = tr( "%1 graphics driver
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); break; case LicenseEntry::BrowserPlugin: productDescription = tr( "%1 browser plugin
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); break; case LicenseEntry::Codec: productDescription = tr( "%1 codec
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); break; case LicenseEntry::Package: productDescription = tr( "%1 package
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); break; default: productDescription = tr( "%1
" "by %2" ) .arg( entry.prettyName ) .arg( entry.prettyVendor ); } label->setText( productDescription ); QLabel* viewLicenseLabel = new QLabel( widget ); wiLayout->addWidget( viewLicenseLabel ); viewLicenseLabel->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); viewLicenseLabel->setOpenExternalLinks( true ); viewLicenseLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); viewLicenseLabel->setText( tr( "view license agreement" ) .arg( entry.url.toString() ) ); ui->licenseEntriesLayout->addWidget( widget ); } ui->licenseEntriesLayout->addStretch(); } bool LicensePage::isNextEnabled() const { return m_isNextEnabled; } calamares-3.1.12/src/modules/license/LicensePage.h000066400000000000000000000032001322271446000217330ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Anke Boersma * Copyright 2015, Alexandre Arnt * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LICENSEPAGE_H #define LICENSEPAGE_H #include #include namespace Ui { class LicensePage; } struct LicenseEntry { enum Type : unsigned char { Software = 0, Driver, GpuDriver, BrowserPlugin, Codec, Package }; QString id; QString prettyName; QString prettyVendor; Type type; QUrl url; bool required; }; class LicensePage : public QWidget { Q_OBJECT public: explicit LicensePage( QWidget* parent = nullptr ); void setEntries( const QList< LicenseEntry >& entriesList ); bool isNextEnabled() const; signals: void nextStatusChanged( bool status ); private: Ui::LicensePage* ui; bool m_isNextEnabled; }; #endif //LICENSEPAGE_H calamares-3.1.12/src/modules/license/LicensePage.ui000066400000000000000000000073471322271446000221410ustar00rootroot00000000000000 LicensePage 0 0 799 400 Form 0 0 <Calamares license text> Qt::Vertical 20 40 Qt::Vertical 20 40 0 0 <additionalText> 0 Qt::Horizontal 1 20 0 0 CheckBox Qt::Horizontal 1 20 calamares-3.1.12/src/modules/license/LicenseViewStep.cpp000066400000000000000000000075631322271446000232000ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Anke Boersma * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LicenseViewStep.h" #include "LicensePage.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include CALAMARES_PLUGIN_FACTORY_DEFINITION( LicenseViewStepFactory, registerPlugin(); ) LicenseViewStep::LicenseViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new LicensePage ) { emit nextStatusChanged( false ); connect( m_widget, &LicensePage::nextStatusChanged, this, &LicenseViewStep::nextStatusChanged ); } LicenseViewStep::~LicenseViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString LicenseViewStep::prettyName() const { return tr( "License" ); } QWidget* LicenseViewStep::widget() { return m_widget; } void LicenseViewStep::next() { emit done(); } void LicenseViewStep::back() {} bool LicenseViewStep::isNextEnabled() const { return m_widget->isNextEnabled(); } bool LicenseViewStep::isBackEnabled() const { return true; } bool LicenseViewStep::isAtBeginning() const { return true; } bool LicenseViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > LicenseViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void LicenseViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { QList< LicenseEntry > entriesList; if ( configurationMap.contains( "entries" ) && configurationMap.value( "entries" ).type() == QVariant::List ) { const auto entries = configurationMap.value( "entries" ).toList(); for ( const QVariant& entryV : entries ) { if ( entryV.type() != QVariant::Map ) continue; QVariantMap entryMap = entryV.toMap(); if ( !entryMap.contains( "id" ) || !entryMap.contains( "name" ) || !entryMap.contains( "url" ) ) continue; LicenseEntry entry; entry.id = entryMap[ "id" ].toString(); entry.prettyName = entryMap[ "name" ].toString(); entry.prettyVendor =entryMap.value( "vendor" ).toString(); entry.url = QUrl( entryMap[ "url" ].toString() ); entry.required = entryMap.value( "required", QVariant( false ) ).toBool(); QString entryType = entryMap.value( "type", "software" ).toString(); if ( entryType == "driver" ) entry.type = LicenseEntry::Driver; else if ( entryType == "gpudriver" ) entry.type = LicenseEntry::GpuDriver; else if ( entryType == "browserplugin" ) entry.type = LicenseEntry::BrowserPlugin; else if ( entryType == "codec" ) entry.type = LicenseEntry::Codec; else if ( entryType == "package" ) entry.type = LicenseEntry::Package; else entry.type = LicenseEntry::Software; entriesList.append( entry ); } } m_widget->setEntries( entriesList ); } calamares-3.1.12/src/modules/license/LicenseViewStep.h000066400000000000000000000034311322271446000226330ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Anke Boersma * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LICENSEPAGEPLUGIN_H #define LICENSEPAGEPLUGIN_H #include #include #include #include #include #include class LicensePage; class PLUGINDLLEXPORT LicenseViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit LicenseViewStep( QObject* parent = nullptr ); virtual ~LicenseViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: LicensePage* m_widget; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( LicenseViewStepFactory ) #endif // LICENSEPAGEPLUGIN_H calamares-3.1.12/src/modules/license/README.md000066400000000000000000000016571322271446000207000ustar00rootroot00000000000000### License Approval Module --------- For distributions shipping proprietary software, this module creates a globalstorage entry when the user accepts or declines one or more presented End User License Agreements files. The number of licenses shown are configurable. The license.conf file has a few examples of how to add URLs. If you do not want to include this module in your Calamares build, add ```-DSKIP_MODULES="license"``` to your build settings (CMake call). How to implement the removal or not installing of proprietary software is up to any distribution to implement. For example, proprietary graphics drivers cannot simply be removed in the packages module, a free version will need to be installed. An example of where the licenseAgree globalstorage entry is used: https://github.com/KaOSx/calamares/blob/master/src/modules/nonfree_drivers/main.py ![License Page](http://wstaw.org/m/2015/09/14/Screenshot_20150914_113333.png) calamares-3.1.12/src/modules/license/license.conf000066400000000000000000000025361322271446000217070ustar00rootroot00000000000000# Configuration file for License viewmodule, Calamares # Syntax is YAML 1.2 --- # YAML: list of maps. entries: - id: nvidia # Entry identifier, must be unique. Not user visible. YAML: string. name: Nvidia # Pretty name for the software product, user visible and untranslatable. YAML: string. vendor: Nvidia Corporation # Pretty name for the software vendor, user visible and untranslatable. YAML: string, optional, default is empty. type: driver # Package type for presentation, not user visible but affects user visible strings. YAML: string, allowed values: driver, gpudriver, browserplugin, codec, package, software; optional, default is software. url: http://developer.download.nvidia.com/cg/Cg_3.0/license.pdf # Url of license text to display in a web view. YAML: string. required: false # If set to true, the user cannot proceed without accepting this license. YAML: boolean, optional, default is false. - id: amd name: Catalyst vendor: "Advanced Micro Devices, Inc." type: gpudriver url: http://support.amd.com/en-us/download/eula required: false - id: flashplugin name: Adobe Flash vendor: Adobe Systems Incorporated type: browserplugin url: http://www.adobe.com/products/eulas/pdfs/PlatformClients_PC_WWEULA_Combined_20100108_1657.pdf required: true calamares-3.1.12/src/modules/locale/000077500000000000000000000000001322271446000172255ustar00rootroot00000000000000calamares-3.1.12/src/modules/locale/CMakeLists.txt000066400000000000000000000010251322271446000217630ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( locale TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES LCLocaleDialog.cpp LocaleConfiguration.cpp LocalePage.cpp LocaleViewStep.cpp SetTimezoneJob.cpp timezonewidget/timezonewidget.cpp timezonewidget/localeglobal.cpp UI RESOURCES locale.qrc LINK_PRIVATE_LIBRARIES calamaresui Qt5::Network ${YAMLCPP_LIBRARY} SHARED_LIB ) calamares-3.1.12/src/modules/locale/LCLocaleDialog.cpp000066400000000000000000000065521322271446000224770ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LCLocaleDialog.h" #include #include #include #include #include LCLocaleDialog::LCLocaleDialog( const QString& guessedLCLocale, const QStringList& localeGenLines, QWidget* parent ) : QDialog( parent ) { setModal( true ); setWindowTitle( tr( "System locale setting" ) ); QBoxLayout* mainLayout = new QVBoxLayout; setLayout( mainLayout ); QLabel* upperText = new QLabel( this ); upperText->setWordWrap( true ); upperText->setText( tr( "The system locale setting affects the language and character " "set for some command line user interface elements.
" "The current setting is %1." ) .arg( guessedLCLocale ) ); mainLayout->addWidget( upperText ); setMinimumWidth( upperText->fontMetrics().height() * 24 ); m_localesWidget = new QListWidget( this ); m_localesWidget->addItems( localeGenLines ); m_localesWidget->setSelectionMode( QAbstractItemView::SingleSelection ); mainLayout->addWidget( m_localesWidget ); int selected = -1; for ( int i = 0; i < localeGenLines.count(); ++i ) { if ( localeGenLines[ i ].contains( guessedLCLocale ) ) { selected = i; break; } } QDialogButtonBox* dbb = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this ); dbb->button( QDialogButtonBox::Cancel )->setText( tr( "&Cancel" ) ); dbb->button( QDialogButtonBox::Ok )->setText( tr( "&OK" ) ); mainLayout->addWidget( dbb ); connect( dbb->button( QDialogButtonBox::Ok ), &QPushButton::clicked, this, &QDialog::accept ); connect( dbb->button( QDialogButtonBox::Cancel ), &QPushButton::clicked, this, &QDialog::reject ); connect( m_localesWidget, &QListWidget::itemDoubleClicked, this, &QDialog::accept ); connect( m_localesWidget, &QListWidget::itemSelectionChanged, [this, dbb]() { if ( m_localesWidget->selectedItems().isEmpty() ) dbb->button( QDialogButtonBox::Ok )->setEnabled( false ); else dbb->button( QDialogButtonBox::Ok )->setEnabled( true ); } ); if ( selected > -1 ) m_localesWidget->setCurrentRow( selected ); } QString LCLocaleDialog::selectedLCLocale() { return m_localesWidget->selectedItems().first()->text(); } calamares-3.1.12/src/modules/locale/LCLocaleDialog.h000066400000000000000000000023171322271446000221370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LCLOCALEDIALOG_H #define LCLOCALEDIALOG_H #include class QListWidget; class LCLocaleDialog : public QDialog { Q_OBJECT public: explicit LCLocaleDialog( const QString& guessedLCLocale, const QStringList& localeGenLines, QWidget* parent = nullptr ); QString selectedLCLocale(); private: QListWidget* m_localesWidget; }; #endif // LCLOCALEDIALOG_H calamares-3.1.12/src/modules/locale/LocaleConfiguration.cpp000066400000000000000000000301011322271446000236530ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LocaleConfiguration.h" #include LocaleConfiguration::LocaleConfiguration() : explicit_lang( false ) , explicit_lc( false ) { } LocaleConfiguration LocaleConfiguration::createDefault() { LocaleConfiguration lc = LocaleConfiguration(); lc.lang = lc.lc_numeric = lc.lc_time = lc.lc_monetary = lc.lc_paper = lc.lc_name = lc.lc_address = lc.lc_telephone = lc.lc_measurement = lc.lc_identification = "en_US.UTF-8"; return lc; } LocaleConfiguration LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, const QStringList& availableLocales, const QString& countryCode ) { LocaleConfiguration lc = LocaleConfiguration(); QString language = languageLocale.split( '_' ).first(); lc.myLanguageLocaleBcp47 = QLocale(language).bcp47Name(); QStringList linesForLanguage; for ( const QString &line : availableLocales ) { if ( line.startsWith( language ) ) linesForLanguage.append( line ); } QString lang; if ( linesForLanguage.length() == 0 || languageLocale.isEmpty() ) lang = "en_US.UTF-8"; else if ( linesForLanguage.length() == 1 ) lang = linesForLanguage.first(); else { QStringList linesForLanguageUtf; // FIXME: this might be useless if we already filter out non-UTF8 locales foreach ( QString line, linesForLanguage ) { if ( line.contains( "UTF-8", Qt::CaseInsensitive ) || line.contains( "utf8", Qt::CaseInsensitive ) ) linesForLanguageUtf.append( line ); } if ( linesForLanguageUtf.length() == 1 ) lang = linesForLanguageUtf.first(); } // lang could still be empty if we found multiple locales that satisfy myLanguage // The following block was inspired by Ubiquity, scripts/localechooser-apply. // No copyright statement found in file, assuming GPL v2 or later. /* # In the special cases of Portuguese and Chinese, selecting a # different location may imply a different dialect of the language. # In such cases, make LANG reflect the selected language (for # messages, character types, and collation) and make the other # locale categories reflect the selected location. */ if ( language == "pt" || language == "zh" ) { QString proposedLocale = QString( "%1_%2" ).arg( language ) .arg( countryCode ); foreach ( QString line, linesForLanguage ) { if ( line.contains( proposedLocale ) ) { lang = line; break; } } } // If we found no good way to set a default lang, do a search with the whole // language locale and pick the first result, if any. if ( lang.isEmpty() ) { for ( const QString &line : availableLocales ) { if ( line.startsWith( languageLocale ) ) { lang = line; break; } } } // Else we have an unrecognized or unsupported locale, all we can do is go with // en_US.UTF-8 UTF-8. This completes all default language setting guesswork. if ( lang.isEmpty() ) lang = "en_US.UTF-8"; // The following block was inspired by Ubiquity, scripts/localechooser-apply. // No copyright statement found in file, assuming GPL v2 or later. /* # It is relatively common for the combination of language and location (as # selected on the timezone page) not to identify a supported combined # locale. For example, this happens when the user is a migrant, or when # they prefer to use a different language to interact with their computer # because that language is better-supported. # # In such cases, we would like to be able to use a locale reflecting the # selected language in LANG for messages, character types, and collation, # and to make the other locale categories reflect the selected location. # This means that we have to guess at a suitable locale for the selected # location, and we do not want to ask yet another locale-related question. # Nevertheless, some cases are ambiguous: a user who has asked for the # English language and identifies their location as Switzerland will get # different numeric representation depending on which Swiss locale we pick. # # The goal of identifying a reasonable default for migrants makes things # easier: it is reasonable to default to French for France despite the # existence of several minority languages there, because anyone who prefers # those languages will probably already have selected them and won't arrive # here. However, in some cases we're unsure, and in some cases we actively # don't want to pick a "preferred" language: selecting either Greek or # Turkish as the default language for migrants to Cyprus would probably # offend somebody! In such cases we simply punt to the old behaviour of not # setting up a locale reflecting the location, which is suboptimal but is at # least unlikely to give offence. # # Our best shot at general criteria for selecting a default language in # these circumstances are as follows: # # * Exclude special-purpose (e.g. en_DK) and artificial (e.g. la_AU, # tlh_GB) locales. # * If there is a language specific to or very strongly associated with the # country in question, prefer it unless it has rather few native # speakers. # * Exclude minority languages that are relatively unlikely to be spoken by # migrants who have not already selected them as their preferred language # earlier in the installer. # * If there is an official national language likely to be seen in print # media, road signs, etc., then prefer that. # * In cases of doubt, selecting no default language is safe. */ // We make a proposed locale based on the UI language and the timezone's country. There is no // guarantee that this will be a valid, supported locale (often it won't). QString lc_formats; QString combined = QString( "%1_%2" ).arg( language ) .arg( countryCode ); // We look up if it's a supported locale. for ( const QString &line : availableLocales ) { if ( line.startsWith( combined ) ) { lang = line; lc_formats = line; break; } } if ( lc_formats.isEmpty() ) { QStringList available; for ( const QString &line : availableLocales ) { if ( line.contains( QString( "_%1" ).arg( countryCode ) ) ) { available.append( line ); } } available.sort(); if ( available.count() == 1 ) { lc_formats = available.first(); } else { QMap< QString, QString > countryToDefaultLanguage { { "AU", "en" }, { "CN", "zh" }, { "DE", "de" }, { "DK", "da" }, { "DZ", "ar" }, { "ES", "es" }, // Somewhat unclear: Oromo has the greatest number of // native speakers; English is the most widely spoken // language and taught in secondary schools; Amharic is // the official language and was taught in primary // schools. { "ET", "am" }, { "FI", "fi" }, { "FR", "fr" }, { "GB", "en" }, // Irish (Gaelic) is strongly associated with Ireland, // but nearly all its native speakers also speak English, // and migrants are likely to use English. { "IE", "en" }, { "IT", "it" }, { "MA", "ar" }, { "MK", "mk" }, { "NG", "en" }, { "NL", "nl" }, { "NZ", "en" }, { "IL", "he" }, // Filipino is a de facto version of Tagalog, which is // also spoken; English is also an official language. { "PH", "fil" }, { "PK", "ur" }, { "PL", "pl" }, { "RU", "ru" }, // Chinese has more speakers, but English is the "common // language of the nation" (Wikipedia) and official // documents must be translated into English to be // accepted. { "SG", "en" }, { "SN", "wo" }, { "TR", "tr" }, { "TW", "zh" }, { "UA", "uk" }, { "US", "en" }, { "ZM", "en" } }; if ( countryToDefaultLanguage.contains( countryCode ) ) { QString combinedLocale = QString( "%1_%2" ).arg( countryToDefaultLanguage.value( countryCode ) ) .arg( countryCode ); for ( const QString &line : availableLocales ) { if ( line.startsWith( combinedLocale ) ) { lc_formats = line; break; } } } } } // If we cannot make a good choice for a given country we go with the LANG // setting, which defaults to en_US.UTF-8 UTF-8 if all else fails. if ( lc_formats.isEmpty() ) lc_formats = lang; lc.lang = lang; lc.lc_address = lc.lc_identification = lc.lc_measurement = lc.lc_monetary = lc.lc_name = lc.lc_numeric = lc.lc_paper = lc.lc_telephone = lc.lc_time = lc_formats; return lc; } bool LocaleConfiguration::isEmpty() const { return lang.isEmpty() && lc_numeric.isEmpty() && lc_time.isEmpty() && lc_monetary.isEmpty() && lc_paper.isEmpty() && lc_name.isEmpty() && lc_address.isEmpty() && lc_telephone.isEmpty() && lc_measurement.isEmpty() && lc_identification.isEmpty(); } QMap< QString, QString > LocaleConfiguration::toMap() { QMap< QString, QString > map; if ( !lang.isEmpty() ) map.insert( "LANG", lang ); if ( !lc_numeric.isEmpty() ) map.insert( "LC_NUMERIC", lc_numeric ); if ( !lc_time.isEmpty() ) map.insert( "LC_TIME", lc_time ); if ( !lc_monetary.isEmpty() ) map.insert( "LC_MONETARY", lc_monetary ); if ( !lc_paper.isEmpty() ) map.insert( "LC_PAPER", lc_paper ); if ( !lc_name.isEmpty() ) map.insert( "LC_NAME", lc_name ); if ( !lc_address.isEmpty() ) map.insert( "LC_ADDRESS", lc_address ); if ( !lc_telephone.isEmpty() ) map.insert( "LC_TELEPHONE", lc_telephone ); if ( !lc_measurement.isEmpty() ) map.insert( "LC_MEASUREMENT", lc_measurement ); if ( !lc_identification.isEmpty() ) map.insert( "LC_IDENTIFICATION", lc_identification ); return map; } calamares-3.1.12/src/modules/locale/LocaleConfiguration.h000066400000000000000000000035571322271446000233370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALECONFIGURATION_H #define LOCALECONFIGURATION_H #include #include class LocaleConfiguration { public: explicit LocaleConfiguration(); static LocaleConfiguration createDefault(); static LocaleConfiguration fromLanguageAndLocation( const QString& language, const QStringList& availableLocales, const QString& countryCode ); bool isEmpty() const; // These become all uppercase in locale.conf, but we keep them lowercase here to // avoid confusion with locale.h. QString lang, lc_numeric, lc_time, lc_monetary, lc_paper, lc_name, lc_address, lc_telephone, lc_measurement, lc_identification; QString myLanguageLocaleBcp47; QMap< QString, QString > toMap(); // If the user has explicitly selected language (from the dialog) // or numbers format, set these to avoid implicit changes to them. bool explicit_lang, explicit_lc; }; #endif // LOCALECONFIGURATION_H calamares-3.1.12/src/modules/locale/LocalePage.cpp000066400000000000000000000440231322271446000217300ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LocalePage.h" #include "timezonewidget/timezonewidget.h" #include "SetTimezoneJob.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "LCLocaleDialog.h" #include "Settings.h" #include #include #include #include #include LocalePage::LocalePage( QWidget* parent ) : QWidget( parent ) , m_blockTzWidgetSet( false ) { QBoxLayout* mainLayout = new QVBoxLayout; QBoxLayout* tzwLayout = new QHBoxLayout; mainLayout->addLayout( tzwLayout ); m_tzWidget = new TimeZoneWidget( this ); tzwLayout->addStretch(); tzwLayout->addWidget( m_tzWidget ); tzwLayout->addStretch(); setMinimumWidth( m_tzWidget->width() ); QBoxLayout* bottomLayout = new QHBoxLayout; mainLayout->addLayout( bottomLayout ); m_regionLabel = new QLabel( this ); bottomLayout->addWidget( m_regionLabel ); m_regionCombo = new QComboBox( this ); bottomLayout->addWidget( m_regionCombo ); m_regionCombo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); m_regionLabel->setBuddy( m_regionCombo ); bottomLayout->addSpacing( 20 ); m_zoneLabel = new QLabel( this ); bottomLayout->addWidget( m_zoneLabel ); m_zoneCombo = new QComboBox( this ); m_zoneCombo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); bottomLayout->addWidget( m_zoneCombo ); m_zoneLabel->setBuddy( m_zoneCombo ); mainLayout->addStretch(); QBoxLayout* localeLayout = new QHBoxLayout; m_localeLabel = new QLabel( this ); m_localeLabel->setWordWrap( true ); m_localeLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); localeLayout->addWidget( m_localeLabel ); m_localeChangeButton = new QPushButton( this ); m_localeChangeButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); localeLayout->addWidget( m_localeChangeButton ); mainLayout->addLayout( localeLayout ); QBoxLayout* formatsLayout = new QHBoxLayout; m_formatsLabel = new QLabel( this ); m_formatsLabel->setWordWrap( true ); m_formatsLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); formatsLayout->addWidget( m_formatsLabel ); m_formatsChangeButton = new QPushButton( this ); m_formatsChangeButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); formatsLayout->addWidget( m_formatsChangeButton ); mainLayout->addLayout( formatsLayout ); setLayout( mainLayout ); connect( m_regionCombo, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ), [this]( int currentIndex ) { Q_UNUSED( currentIndex ); QHash< QString, QList< LocaleGlobal::Location > > regions = LocaleGlobal::getLocations(); if ( !regions.contains( m_regionCombo->currentData().toString() ) ) return; m_zoneCombo->blockSignals( true ); m_zoneCombo->clear(); const QList< LocaleGlobal::Location > zones = regions.value( m_regionCombo->currentData().toString() ); for ( const LocaleGlobal::Location& zone : zones ) { m_zoneCombo->addItem( LocaleGlobal::Location::pretty( zone.zone ), zone.zone ); } m_zoneCombo->model()->sort( 0 ); m_zoneCombo->blockSignals( false ); m_zoneCombo->currentIndexChanged( m_zoneCombo->currentIndex() ); } ); connect( m_zoneCombo, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ), [this]( int currentIndex ) { Q_UNUSED( currentIndex ) if ( !m_blockTzWidgetSet ) m_tzWidget->setCurrentLocation( m_regionCombo->currentData().toString(), m_zoneCombo->currentData().toString() ); updateGlobalStorage(); } ); connect( m_tzWidget, &TimeZoneWidget::locationChanged, [this]( LocaleGlobal::Location location ) { m_blockTzWidgetSet = true; // Set region index int index = m_regionCombo->findData( location.region ); if ( index < 0 ) return; m_regionCombo->setCurrentIndex( index ); // Set zone index index = m_zoneCombo->findData( location.zone ); if ( index < 0 ) return; m_zoneCombo->setCurrentIndex( index ); m_blockTzWidgetSet = false; updateGlobalStorage(); } ); connect( m_localeChangeButton, &QPushButton::clicked, [this] { LCLocaleDialog* dlg = new LCLocaleDialog( m_selectedLocaleConfiguration.isEmpty() ? guessLocaleConfiguration().lang : m_selectedLocaleConfiguration.lang, m_localeGenLines, this ); dlg->exec(); if ( dlg->result() == QDialog::Accepted && !dlg->selectedLCLocale().isEmpty() ) { m_selectedLocaleConfiguration.lang = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.explicit_lang = true; this->updateLocaleLabels(); } dlg->deleteLater(); } ); connect( m_formatsChangeButton, &QPushButton::clicked, [this] { LCLocaleDialog* dlg = new LCLocaleDialog( m_selectedLocaleConfiguration.isEmpty() ? guessLocaleConfiguration().lc_numeric : m_selectedLocaleConfiguration.lc_numeric, m_localeGenLines, this ); dlg->exec(); if ( dlg->result() == QDialog::Accepted && !dlg->selectedLCLocale().isEmpty() ) { // TODO: improve the granularity of this setting. m_selectedLocaleConfiguration.lc_numeric = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_time = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_monetary = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_paper = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_name = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_address = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_telephone = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_measurement = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.lc_identification = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.explicit_lc = true; this->updateLocaleLabels(); } dlg->deleteLater(); } ); CALAMARES_RETRANSLATE( m_regionLabel->setText( tr( "Region:" ) ); m_zoneLabel->setText( tr( "Zone:" ) ); updateLocaleLabels(); m_localeChangeButton->setText( tr( "&Change..." ) ); m_formatsChangeButton->setText( tr( "&Change..." ) ); ) } LocalePage::~LocalePage() {} void LocalePage::updateLocaleLabels() { LocaleConfiguration lc = m_selectedLocaleConfiguration.isEmpty() ? guessLocaleConfiguration() : m_selectedLocaleConfiguration; auto labels = prettyLocaleStatus( lc ); m_localeLabel->setText( labels.first ); m_formatsLabel->setText( labels.second ); } void LocalePage::init( const QString& initialRegion, const QString& initialZone, const QString& localeGenPath ) { m_regionCombo->blockSignals( true ); m_zoneCombo->blockSignals( true ); // Setup locations QHash< QString, QList< LocaleGlobal::Location > > regions = LocaleGlobal::getLocations(); QStringList keys = regions.keys(); keys.sort(); foreach ( const QString& key, keys ) { m_regionCombo->addItem( LocaleGlobal::Location::pretty( key ), key ); } m_regionCombo->blockSignals( false ); m_zoneCombo->blockSignals( false ); m_regionCombo->currentIndexChanged( m_regionCombo->currentIndex() ); // Default location auto containsLocation = []( const QList< LocaleGlobal::Location >& locations, const QString& zone ) -> bool { for ( const LocaleGlobal::Location& location : locations ) { if ( location.zone == zone ) return true; } return false; }; if ( keys.contains( initialRegion ) && containsLocation( regions.value( initialRegion ), initialZone ) ) { m_tzWidget->setCurrentLocation( initialRegion, initialZone ); } else { m_tzWidget->setCurrentLocation( "America", "New_York" ); } emit m_tzWidget->locationChanged( m_tzWidget->getCurrentLocation() ); // Some distros come with a meaningfully commented and easy to parse locale.gen, // and others ship a separate file /usr/share/i18n/SUPPORTED with a clean list of // supported locales. We first try that one, and if it doesn't exist, we fall back // to parsing the lines from locale.gen m_localeGenLines.clear(); QFile supported( "/usr/share/i18n/SUPPORTED" ); QByteArray ba; if ( supported.exists() && supported.open( QIODevice::ReadOnly | QIODevice::Text ) ) { ba = supported.readAll(); supported.close(); const auto lines = ba.split( '\n' ); for ( const QByteArray &line : lines ) { m_localeGenLines.append( QString::fromLatin1( line.simplified() ) ); } } else { QFile localeGen( localeGenPath ); if ( localeGen.open( QIODevice::ReadOnly | QIODevice::Text ) ) { ba = localeGen.readAll(); localeGen.close(); } else { cDebug() << "Cannot open file" << localeGenPath << ". Assuming the supported languages are already built into " "the locale archive."; QProcess localeA; localeA.start( "locale", QStringList() << "-a" ); localeA.waitForFinished(); ba = localeA.readAllStandardOutput(); } const auto lines = ba.split( '\n' ); for ( const QByteArray &line : lines ) { if ( line.startsWith( "## " ) || line.startsWith( "# " ) || line.simplified() == "#" ) continue; QString lineString = QString::fromLatin1( line.simplified() ); if ( lineString.startsWith( "#" ) ) lineString.remove( '#' ); lineString = lineString.simplified(); if ( lineString.isEmpty() ) continue; m_localeGenLines.append( lineString ); } } if ( m_localeGenLines.isEmpty() ) { cDebug() << "WARNING: cannot acquire a list of available locales." << "The locale and localecfg modules will be broken as long as this " "system does not provide" << "\n\t " << "* a well-formed" << supported.fileName() << "\n\tOR" << "* a well-formed" << (localeGenPath.isEmpty() ? QLatin1Literal("/etc/locale.gen") : localeGenPath) << "\n\tOR" << "* a complete pre-compiled locale-gen database which allows complete locale -a output."; return; // something went wrong and there's nothing we can do about it. } // Assuming we have a list of supported locales, we usually only want UTF-8 ones // because it's not 1995. for ( auto it = m_localeGenLines.begin(); it != m_localeGenLines.end(); ) { if ( !it->contains( "UTF-8", Qt::CaseInsensitive ) && !it->contains( "utf8", Qt::CaseInsensitive ) ) it = m_localeGenLines.erase( it ); else ++it; } // We strip " UTF-8" from "en_US.UTF-8 UTF-8" because it's redundant redundant. for ( auto it = m_localeGenLines.begin(); it != m_localeGenLines.end(); ++it ) { if ( it->endsWith( " UTF-8" ) ) it->chop( 6 ); *it = it->simplified(); } updateGlobalStorage(); } std::pair< QString, QString > LocalePage::prettyLocaleStatus( const LocaleConfiguration& lc ) const { return std::make_pair< QString, QString >( tr( "The system language will be set to %1." ) .arg( prettyLCLocale( lc.lang ) ), tr( "The numbers and dates locale will be set to %1." ) .arg( prettyLCLocale( lc.lc_numeric ) ) ); } QString LocalePage::prettyStatus() const { QString status; status += tr( "Set timezone to %1/%2.
" ) .arg( m_regionCombo->currentText() ) .arg( m_zoneCombo->currentText() ); LocaleConfiguration lc = m_selectedLocaleConfiguration.isEmpty() ? guessLocaleConfiguration() : m_selectedLocaleConfiguration; auto labels = prettyLocaleStatus(lc); status += labels.first + "
"; status += labels.second + "
"; return status; } QList< Calamares::job_ptr > LocalePage::createJobs() { QList< Calamares::job_ptr > list; LocaleGlobal::Location location = m_tzWidget->getCurrentLocation(); Calamares::Job* j = new SetTimezoneJob( location.region, location.zone ); list.append( Calamares::job_ptr( j ) ); return list; } QMap< QString, QString > LocalePage::localesMap() { return m_selectedLocaleConfiguration.isEmpty() ? guessLocaleConfiguration().toMap() : m_selectedLocaleConfiguration.toMap(); } void LocalePage::onActivate() { m_regionCombo->setFocus(); if ( m_selectedLocaleConfiguration.isEmpty() || !m_selectedLocaleConfiguration.explicit_lang ) { auto newLocale = guessLocaleConfiguration(); m_selectedLocaleConfiguration.lang = newLocale.lang; updateLocaleLabels(); } } LocaleConfiguration LocalePage::guessLocaleConfiguration() const { QLocale myLocale; // User-selected language // If we cannot say anything about available locales if ( m_localeGenLines.isEmpty() ) { cDebug() << "WARNING: guessLocaleConfiguration can't guess from an empty list."; return LocaleConfiguration::createDefault(); } QString myLanguageLocale = myLocale.name(); if ( myLanguageLocale.isEmpty() ) return LocaleConfiguration::createDefault(); return LocaleConfiguration::fromLanguageAndLocation( myLanguageLocale, m_localeGenLines, m_tzWidget->getCurrentLocation().country ); } QString LocalePage::prettyLCLocale( const QString& lcLocale ) const { QString localeString = lcLocale; if ( localeString.endsWith( " UTF-8" ) ) localeString.remove( " UTF-8" ); QLocale locale( localeString ); //: Language (Country) return tr( "%1 (%2)" ).arg( QLocale::languageToString( locale.language() ) ) .arg( QLocale::countryToString( locale.country() ) ); } void LocalePage::updateGlobalStorage() { LocaleGlobal::Location location = m_tzWidget->getCurrentLocation(); Calamares::JobQueue::instance()->globalStorage() ->insert( "locationRegion", location.region ); Calamares::JobQueue::instance()->globalStorage() ->insert( "locationZone", location.zone ); Calamares::JobQueue::instance()->globalStorage() ->insert( "locale", m_selectedLocaleConfiguration.myLanguageLocaleBcp47); // If we're in chroot mode (normal install mode), then we immediately set the // timezone on the live system. if ( Calamares::Settings::instance()->doChroot() ) { QProcess ::execute( "timedatectl", // depends on systemd { "set-timezone", location.region + '/' + location.zone } ); } // Preserve those settings that have been made explicit. auto newLocale = guessLocaleConfiguration(); if ( !m_selectedLocaleConfiguration.isEmpty() && m_selectedLocaleConfiguration.explicit_lang ) newLocale.lang = m_selectedLocaleConfiguration.lang; if ( !m_selectedLocaleConfiguration.isEmpty() && m_selectedLocaleConfiguration.explicit_lc ) { newLocale.lc_numeric = m_selectedLocaleConfiguration.lc_numeric; newLocale.lc_time = m_selectedLocaleConfiguration.lc_time; newLocale.lc_monetary = m_selectedLocaleConfiguration.lc_monetary; newLocale.lc_paper = m_selectedLocaleConfiguration.lc_paper; newLocale.lc_name = m_selectedLocaleConfiguration.lc_name; newLocale.lc_address = m_selectedLocaleConfiguration.lc_address; newLocale.lc_telephone = m_selectedLocaleConfiguration.lc_telephone; newLocale.lc_measurement = m_selectedLocaleConfiguration.lc_measurement; newLocale.lc_identification = m_selectedLocaleConfiguration.lc_identification; } newLocale.explicit_lang = m_selectedLocaleConfiguration.explicit_lang; newLocale.explicit_lc = m_selectedLocaleConfiguration.explicit_lc; m_selectedLocaleConfiguration = newLocale; updateLocaleLabels(); } calamares-3.1.12/src/modules/locale/LocalePage.h000066400000000000000000000042651322271446000214010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALEPAGE_H #define LOCALEPAGE_H #include "Typedefs.h" #include "LocaleConfiguration.h" #include class QComboBox; class QLabel; class QPushButton; class TimeZoneWidget; class LocalePage : public QWidget { Q_OBJECT public: explicit LocalePage( QWidget* parent = nullptr ); virtual ~LocalePage(); void init( const QString& initialRegion, const QString& initialZone, const QString& localeGenPath ); QString prettyStatus() const; QList< Calamares::job_ptr > createJobs(); QMap< QString, QString > localesMap(); void onActivate(); private: LocaleConfiguration guessLocaleConfiguration() const; QString prettyLCLocale( const QString& localesMap ) const; // For the given locale config, return two strings describing // the settings for language and numbers. std::pair< QString, QString > prettyLocaleStatus( const LocaleConfiguration& ) const; void updateGlobalStorage(); void updateLocaleLabels(); TimeZoneWidget* m_tzWidget; QComboBox* m_regionCombo; QComboBox* m_zoneCombo; QLabel* m_regionLabel; QLabel* m_zoneLabel; QLabel* m_localeLabel; QPushButton* m_localeChangeButton; QLabel* m_formatsLabel; QPushButton* m_formatsChangeButton; LocaleConfiguration m_selectedLocaleConfiguration; QStringList m_localeGenLines; bool m_blockTzWidgetSet; }; #endif // LOCALEPAGE_H calamares-3.1.12/src/modules/locale/LocaleViewStep.cpp000066400000000000000000000175671322271446000226370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "LocaleViewStep.h" #include "LocalePage.h" #include "timezonewidget/localeglobal.h" #include "widgets/WaitingWidget.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/YamlUtils.h" #include #include #include #include #include #include CALAMARES_PLUGIN_FACTORY_DEFINITION( LocaleViewStepFactory, registerPlugin(); ) LocaleViewStep::LocaleViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new QWidget() ) , m_actualWidget( new LocalePage() ) , m_nextEnabled( false ) { QBoxLayout* mainLayout = new QHBoxLayout; m_widget->setLayout( mainLayout ); CalamaresUtils::unmarginLayout( mainLayout ); m_waitingWidget = new WaitingWidget( tr( "Loading location data..." ) ); mainLayout->addWidget( m_waitingWidget ); connect( &m_initWatcher, &QFutureWatcher< void >::finished, this, [=] { bool hasInternet = Calamares::JobQueue::instance()->globalStorage() ->value( "hasInternet" ).toBool(); if ( m_geoipUrl.isEmpty() || !hasInternet ) setUpPage(); else fetchGeoIpTimezone(); }); QFuture< void > initFuture = QtConcurrent::run( [=] { LocaleGlobal::init(); if ( m_geoipUrl.isEmpty() ) return; Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); // Max 10sec wait for RequirementsChecker to finish, assuming the welcome // module is used. // If welcome is not used, either "hasInternet" should be set by other means, // or the GeoIP feature should be disabled. for ( int i = 0; i < 10; ++i ) if ( !gs->contains( "hasInternet" ) ) QThread::sleep( 1 ); } ); m_initWatcher.setFuture( initFuture ); emit nextStatusChanged( m_nextEnabled ); } LocaleViewStep::~LocaleViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } void LocaleViewStep::setUpPage() { m_actualWidget->init( m_startingTimezone.first, m_startingTimezone.second, m_localeGenPath ); m_widget->layout()->removeWidget( m_waitingWidget ); m_waitingWidget->deleteLater(); m_widget->layout()->addWidget( m_actualWidget ); m_nextEnabled = true; emit nextStatusChanged( m_nextEnabled ); } void LocaleViewStep::fetchGeoIpTimezone() { QNetworkAccessManager *manager = new QNetworkAccessManager( this ); connect( manager, &QNetworkAccessManager::finished, [=]( QNetworkReply* reply ) { if ( reply->error() == QNetworkReply::NoError ) { QByteArray data = reply->readAll(); try { YAML::Node doc = YAML::Load( data ); QVariant var = CalamaresUtils::yamlToVariant( doc ); if ( !var.isNull() && var.isValid() && var.type() == QVariant::Map ) { QVariantMap map = var.toMap(); if ( map.contains( "time_zone" ) && !map.value( "time_zone" ).toString().isEmpty() ) { QString timezoneString = map.value( "time_zone" ).toString(); QStringList tzParts = timezoneString.split( '/', QString::SkipEmptyParts ); if ( tzParts.size() >= 2 ) { cDebug() << "GeoIP reporting" << timezoneString; QString region = tzParts.takeFirst(); QString zone = tzParts.join( '/' ); m_startingTimezone = qMakePair( region, zone ); } } } } catch ( YAML::Exception& e ) { CalamaresUtils::explainYamlException( e, data, "GeoIP data"); } } reply->deleteLater(); manager->deleteLater(); setUpPage(); } ); QNetworkRequest request; QString requestUrl = QString( "%1/json" ) .arg( QUrl::fromUserInput( m_geoipUrl ).toString() ); request.setUrl( QUrl( requestUrl ) ); request.setAttribute( QNetworkRequest::FollowRedirectsAttribute, true ); manager->get( request ); } QString LocaleViewStep::prettyName() const { return tr( "Location" ); } QString LocaleViewStep::prettyStatus() const { return m_prettyStatus; } QWidget* LocaleViewStep::widget() { return m_widget; } void LocaleViewStep::next() { emit done(); } void LocaleViewStep::back() {} bool LocaleViewStep::isNextEnabled() const { return m_nextEnabled; } bool LocaleViewStep::isBackEnabled() const { return true; } bool LocaleViewStep::isAtBeginning() const { return true; } bool LocaleViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > LocaleViewStep::jobs() const { return m_jobs; } void LocaleViewStep::onActivate() { m_actualWidget->onActivate(); } void LocaleViewStep::onLeave() { m_jobs.clear(); m_jobs.append( m_actualWidget->createJobs() ); m_prettyStatus = m_actualWidget->prettyStatus(); auto map = m_actualWidget->localesMap(); QVariantMap vm; for ( auto it = map.constBegin(); it != map.constEnd(); ++it ) vm.insert( it.key(), it.value() ); Calamares::JobQueue::instance()->globalStorage() ->insert( "localeConf", vm ); } void LocaleViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains( "region" ) && configurationMap.value( "region" ).type() == QVariant::String && !configurationMap.value( "region" ).toString().isEmpty() && configurationMap.contains( "zone" ) && configurationMap.value( "zone" ).type() == QVariant::String && !configurationMap.value( "zone" ).toString().isEmpty() ) { m_startingTimezone = qMakePair( configurationMap.value( "region" ).toString(), configurationMap.value( "zone" ).toString() ); } else { m_startingTimezone = qMakePair( QStringLiteral( "America" ), QStringLiteral( "New_York" ) ); } if ( configurationMap.contains( "localeGenPath" ) && configurationMap.value( "localeGenPath" ).type() == QVariant::String && !configurationMap.value( "localeGenPath" ).toString().isEmpty() ) { m_localeGenPath = configurationMap.value( "localeGenPath" ).toString(); } else { m_localeGenPath = QStringLiteral( "/etc/locale.gen" ); } // Optional if ( configurationMap.contains( "geoipUrl" ) && configurationMap.value( "geoipUrl" ).type() == QVariant::String && !configurationMap.value( "geoipUrl" ).toString().isEmpty() ) { m_geoipUrl = configurationMap.value( "geoipUrl" ).toString(); } } calamares-3.1.12/src/modules/locale/LocaleViewStep.h000066400000000000000000000043061322271446000222670ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALEVIEWSTEP_H #define LOCALEVIEWSTEP_H #include #include #include #include #include class LocalePage; class WaitingWidget; class PLUGINDLLEXPORT LocaleViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit LocaleViewStep( QObject* parent = nullptr ); virtual ~LocaleViewStep() override; QString prettyName() const override; QString prettyStatus() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; void onLeave() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private slots: void setUpPage(); private: void fetchGeoIpTimezone(); QWidget* m_widget; QFutureWatcher< void > m_initWatcher; WaitingWidget* m_waitingWidget; LocalePage* m_actualWidget; bool m_nextEnabled; QString m_prettyStatus; QPair< QString, QString > m_startingTimezone; QString m_localeGenPath; QString m_geoipUrl; QList< Calamares::job_ptr > m_jobs; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( LocaleViewStepFactory ) #endif // LOCALEVIEWSTEP_H calamares-3.1.12/src/modules/locale/SetTimezoneJob.cpp000066400000000000000000000075421322271446000226420ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * Copyright 2015, Rohan Garg * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "JobQueue.h" #include "GlobalStorage.h" #include "Settings.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" #include #include SetTimezoneJob::SetTimezoneJob( const QString& region, const QString& zone ) : Calamares::Job() , m_region( region ) , m_zone( zone ) { } QString SetTimezoneJob::prettyName() const { return tr( "Set timezone to %1/%2" ).arg( m_region ).arg( m_zone ); } Calamares::JobResult SetTimezoneJob::exec() { // do not call timedatectl in a chroot, it is not safe (timedatectl talks // to a running timedated over D-Bus), and we have code that works if ( !Calamares::Settings::instance()->doChroot() ) { int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "timedatectl", "set-timezone", m_region + '/' + m_zone } ); if ( !ec ) return Calamares::JobResult::ok(); } QString localtimeSlink( "/etc/localtime" ); QString zoneinfoPath( "/usr/share/zoneinfo" ); zoneinfoPath.append( QDir::separator() + m_region ); zoneinfoPath.append( QDir::separator() + m_zone ); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QFileInfo zoneFile( gs->value( "rootMountPoint" ).toString() + zoneinfoPath ); if ( !zoneFile.exists() || !zoneFile.isReadable() ) return Calamares::JobResult::error( tr( "Cannot access selected timezone path." ), tr( "Bad path: %1" ).arg( zoneFile.absolutePath() ) ); // Make sure /etc/localtime doesn't exist, otherwise symlinking will fail CalamaresUtils::System::instance()-> targetEnvCall( { "rm", "-f", localtimeSlink } ); int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "ln", "-s", zoneinfoPath, localtimeSlink } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot set timezone." ), tr( "Link creation failed, target: %1; link name: %2" ) .arg( zoneinfoPath ) .arg( "/etc/localtime" ) ); QFile timezoneFile( gs->value( "rootMountPoint" ).toString() + "/etc/timezone" ); if ( !timezoneFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) ) return Calamares::JobResult::error( tr( "Cannot set timezone,"), tr( "Cannot open /etc/timezone for writing")); QTextStream out(&timezoneFile); out << m_region << '/' << m_zone << "\n"; timezoneFile.close(); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/locale/SetTimezoneJob.h000066400000000000000000000022351322271446000223010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETTIMEZONEJOB_H #define SETTIMEZONEJOB_H #include class SetTimezoneJob : public Calamares::Job { Q_OBJECT public: SetTimezoneJob( const QString& region, const QString& zone ); QString prettyName() const override; Calamares::JobResult exec() override; private: QString m_region; QString m_zone; }; #endif /* SETTIMEZONEJOB_H */ calamares-3.1.12/src/modules/locale/images/000077500000000000000000000000001322271446000204725ustar00rootroot00000000000000calamares-3.1.12/src/modules/locale/images/bg.png000066400000000000000000005260221322271446000215770ustar00rootroot00000000000000PNG  IHDR T_,gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xIDATxwٖ6yqι羧ޱme $D9$D9%2Y]{׮;Z,\eʵX1~a<8/])7q'f>s޿._AWEW>Wp3 m|D"`H1yr _+P)_4,t1519Kp~(ė L ]," _^"/l}rDdg钰U/"4E ݨE 0 }H,yl=睽e@RwP& i$=@o~Ҹy3*{n;+ѵ[|rQ<~d$IzI $=1H|H` 1 nr6Xw݀=7cELmMt8 /_z!;h$ $cxIu@HzI1H6C(ELҧ'!j "CtU!,xW=;Y8Scjc,-AQwS '6I_=&;Ip $=IG$N</zE#7P^&V~ >X]@S>$tI£)|G *Uy!gPx<"< ۆ%^,HFe1yIc"A~\!\ėzI $@HzI }9z 8`jQH.Fbt-Op15AoD OҔǢ"OiNASwǀ'F1H"&HFmxh?a'+C REF!@6o(Kmocr_'2#MPGtA9dsθIC;U$Q0k,؆ 4|HzI W|I $@Ov.'AWغ@Zt6\ C`LT1* "Gy3(R$dA*Bzv&Po{3L(A I^X^Z GgOep..1ȳÙ'xb?7zI*=I  $=>wo0t9t?F MF0H= h BCj<] T?wcR|2&Q̣O2:k%ql/a*2H /Ks&WZckSVRl9_$k'Yhl4+dfukx~xlneK+lfn3[D*6Q:ijPEau24n;wi2{zQŞqE='@\JC?uT"]hڙ*ff֚nc`nsfvd/\>=:9ޮl EGGGG'G{Gg'oNj}qajN VR(.-721r}\G9 :u4 Z?DK(MHpƈ?" =|S{*ڜ4X"G5{ !|bTȕ{$> /9=8o\<;<~(>ӓgG'p*)<9?Z(lZvqq=Y gE:ߨ"P=IV@W lSyJhI;&3H/َ![9QL%aɨ10sZe{p(pr~tp~xxq|/djV&\ #xr4kf+/ %br$tV8~ҩC CZ\`{8ǣAsL+BbfYEplzfy=%`mn0b puyUKUxYptp p9|8A' 7_>?>=:=<9'?\]\ӳf214G}@g򮫭ڜL$U7~L|ŰI!>i/?',7EC_/nybגk>DLRd$=>$o6^ 0K%ñs5lr F>_𧣉Zn:8r[pCԏ|x x ΋,Mf!HFN<'GoNq}y}3 ̣5,`Y^2&9qvKt+RY܊r"@]ޘc(<3T4Wo/NԷ3мPxJ-ݩ5ffWzT+{&DG{Px"=>>97 fRW+l~a~9MWs|6_6)_]Y\ndɹ)kX2Ԯ%:L Z窸x@jmg"UAt_uI:~ϮK))q nLGQE/ "G:>"5~Cl#z$O:p ]&f6D'=Y@Cpf(8EN.J#B_/ƤD>9Oήc\Rrji]Ӫs8ۮ6 z7?D@¾<>~{q۷w>Cg|vryb cI_O|7|1>ǚg5.-\cqh AQZ`/gs ɏ}vu~txzxn2Z#>=s3JUP; # ;PfHL-@9\M[?A"g b+ <*LqtaaNn\_X:goOvLq+LtB|B9YXl?7#LV.TVVShlNOBD&=&V[|L>Az>K4K]>q8۩n/.lm&6C8o^;=Bf}Bv `EMqgܬODOZ#a na&0|YX4-hz=Y 5RM'Ș2Z q1tpϨHpF02<<p-cFs^! sh\b'{& :Y \nn6s kSW0g[b.o)6¨Lngv/]*Z-. v >^ xsz9!=(zFNWxvv)pR(tg ӃY%9. ;>'u$NN >.Խ}v֨nڿ>:j .1'p5?xxw/M,^16d7bdGuIאQTfWFe> t ?oɃoom]mDc%c]u(MUܔl Ĕp3UAܩ3GR\< L8KxȘ<4@D"ΑY\-&gsLĔOx_O:Cp]X9?\XY/| N<4$>)6,\*GQYp3ѳU?e@'7IzI $J JFh'Dp,K* 0UrZ."Fެ|HtlN9(tC/]O܁T.[خl Bp™FTBCN^f;Vff)_Wk? ?0Zo6,Wz%1'g۵Z-O=212$)`xgk,- ]g֔b*5%XG2撙"*Rzv-3 Θ\i?(t~&_6k확Vzܽ:9lM9H,;Bbds+)NV`'SԪ;+]`/IA^I2QP & ɋr#QE[ov&;ܢM` l,-q*p0J/Jsg&@?+H<H7f4RՐ Vc5C`Kz, 3xlumkTst&Tf3TɭO`I%j8W;^#M^G43E\Ԥ%Ql_r+h1j}"D#%7O*}Z+7jKW$} 2I gNsHO04 1 IT" >Ce-ᙹBj'xp}qy|lqD̎vNO&4ί6ĴHy)lX''?\_~{~/zmsƬKO*+P-31 (W)iz.>=9?<:=\ZXo4uRG⤫һ}x~ܢ`cj Qū2WI_p ãB-o0A4X WIl 'FwXU[і Ǘw{{əمٓقf::3Q(TVr2 I֚ajni?e\P[g8Gd": 8MSklm-k0^Dl/׉{ #;X=PG$~#S)j՝f'/X*%E0i xp𤋆'u=#D$Hqn/UȕIcR[]JǗ\XX39b#@VpEs}ǜטF:?9H9 s~&}{$}E..dnwCS9jhZKjVB1;6vzpHF65ڃ]ɚze[u'r[>߹>>oo~}o$ ӾDr}Q鞹tlѪ vnt1Ui8+}l1M?C?6ӯβ0;_-~'B>=\_SjW/Ľ+Ct%G ͭoI" O, Q"@ר3ʘ=]x\,2DŽHK4ͅMwQ#ӷ {I;o'3cD!KxP&քY["'fkmƲ(]zh'U;.'FWfp4 0voPSa *mga[_mv\4&Gp{h4>kc|Hp38{ztHi$U9EG 'V7cu0e6w+3;}奍BT)VJyx5@po緤S1DTَhO?fK:7[JDmEj\$@oX1.k  Q@L؈EƱ׬<Fl|nvK ݿ:E$ #kQB1e*D4푘 @hlN0e*X;it1Zjmvv9YRW/m璙%xDFDH Рf|0=xN߰vkYxZ,{L:#ɐhDmt%p/ H3lϴt P&(KxH$)yV459c£1h;>s+͂˗hg1V`ʮ1~Y)UvvOߞ*5ȅsKT/|"8IR|O~p { `8@)b7 %H2CK=Y1lNf` Zmm=G(. 1! G8<Xy-LSF)P3$!~L3 opfkլ7N66ss^:G7 B .²bO۽ hr#2IΎ{untU۵BXsV\)=K,y%|>ˠ%cjHs=fXzX/ƍBYwL/os[f!Úga{Tڪ1i?낤Dk@,?\!O3Y2ƏQ8"um-YTA~. zW&r[)Jp_azAsU?>iDWGI]^[WBҖ&HzOLj[\J]\8!DYq5.MSU]dKm|eGI}@!sJݹ~A4! Mq\˜g&-af8&hwO>iH{E* JpuQ,0r- "<+#Xu\-Oӥ#|:>S³c$SD'&ط jmI&]bD2RUϪ=lk&l0Lmh: 0=}+SzrGL>Hj}|1g__oomʔ5{0yz~Ժ;w;hŗTFفt֞'ǞX ;DHa8"DaN>{4}ϸf쭔Ja݋OO8_ZXz2gf"c* 1[ {U$Qضōم | q t@{؜~:9?=ӚܩgT veb0gR/l5償truPoQܒۺ):u7T"p#᫖JwX?'otRi?zXDy4!x cSI "9~3  ʼnOV瘿֌ WW۷6aJCRU10qm,/ZYY nD+#W{ I;U|Mw&9'4gÍTAhp`$=_|f#.6 E%1EGgv%t"3^.V:h>JjSM" %* LIr<'0?()?.W:^ @rJ#+|xMÑ9=șLmd׶V׶֑ZA2lTk\%mCB@N"v֬{נǶ @Y RE6ѻaDlGoN/ g)AxydpbLLҝy[]{{);㘏INR佊?s\L&Ix)1f| )pPL(yFKr E碉͍*5IҚSt'ߟsXri}X.mËLbK2yG}-&̏60:"RtpRqtrt 2.d G $\ƛT] \>Nʜ I53TQp tef*xF0ÉIgNˈDf]R,%i!t܁t4-5D;|$6+V K YXXϤfWVW)K@38B _s+\#b\ȍ!#{X~ɶ=Orüiܡ7,|oV;;. q|,i-C\:9:*@ @iwOB_$1aq-Q_v͍E9ǭN~u~~t7+83ȳb81DZRш&GluH<':ɄN8I͙n{oOl%[S21*u>V8.uuwP:pREP"lLcy(=)OpQa}xrl^9;8<GNs@>ТG3Hefb lW N? )V+d':ըΉ\".糀ovk$ tufV1/KKv >od!^g;Hzbw}}zQhͱ^9/=?FvZsm0^ ӛ`5 G[jtvnEtNoPx.wۥ& 0rۄJ骥JM.%vB3,P02Y_ohxDT;>ޭ׋^A&HHk0G1 `X`|pДVFlU$<4&q{p̮x 5ܥ'GH6jl׷6j, hM!G8I'bmD<N?_›#l,l&q1FNQhޅ|gvsvoI 1y3UH! l8"B-AT_aJ,< GPMǦݙ@t1\ 5! nz6GAX:>g40DVƓ_|~Y8aemvȯE:1㣱ɧ^5>02jSQ-(^ h*ۋze;i떏=ʼnz-Jxmr !) 1.#b{hUÃ]#·tHnЬ~!]`UDhLaDHd h0ߘLexW f{TXH}<ǐ>r\hi}=IjPޭ7m %,%}c{{;D[g(B#͠ɠ_[̮,z$2V\ߟ>_)#/XZҕ(=߇/e06"˼*\ [*ոո)Uݰʿ j&7q &8'AjR/aX@?ޅdI|4!5HYڛ0n_aV%'@ҿ,Hz %m ԑ-A3$tlϙ>" VODR*K-:A 8 ^!@ 1eiS{QבMfD.u)oFb ⎟~mkRLDz%\c@|Yd|]Z@!ug}26>915Gslie%;mO<__Z=kF$i9l6UFzE`^^'86Bt+j!4cy2S1f7oє֏{{qr00h<w(%_6sx2Ϭ+TY`KOfGa!JAIͶ1_"@<›%cխv7W*cLZ~6nv%N/1dQ1wμحɾn^Ih ti4,}:gNjW a vbD:†@,p( &qm$AD^1L/铏):F/ B` h|#+M׻ n- 1,AEE@xB_%I !''3/G`BNAܽ< _$$$.|wOMOǧ̈́kĪ|:9& <@'mRGەf9D3T)BR Zn@*GKu!6$G!p-C)>l;A3hsi  [SХEhAM ^/e%c-wd d 㨵SO .gf&v;yDQ0M\+LLՃ&)W(R-R;{oDχyNg5f/3pjfR%)-/|տXۇAa! l(-NQ~&42 AR[ 5GDa]5HϬx͍lX9ݻjR)PXڄ@"YE blzДf٧6|e $Cd<0 h-ߟT$iBxXaN$zMCb)at䈌,a5ȳYBTcY\^͇TE|pc0ڌ-řUwwA~ 0[Rj2p0.leTyIE=gC@ $k#GTP_(j>U8GC`lfMIuDvߗx5E$L_$9@WIqDa_;MieDvxۘԧ4dS`AT&t:#D9DS9a"A!,CAc;>xgDn ,d7ɥ {Rf en59wpOi^'!̬VN:ZS>;%WMxl:hk[,#[EAL$--ՖpI!Xl~V/wۋs2v.ONJ|\>Gp˭Qs_]/d rހպΒX$+ܒEJ+8_'GE/=7]ǒ2 ME GADxǡ`"1"Q?E-AR֢e?UzlXaK&bV߼'f8:g}{Q^_Nh[P; Ftq:K? ֺ7)_dY:nդ#]W Yif@XnXmWV`l1YuPzb;^q=5&I9&"WTyNlkm5{qLHQk-veDD:'& 3qӓ+ͭZ ۋ4ߨlSj-}oMyx'xm%Ȁ8.@p˜`M,^g'R P<O׫5N(pK[m"D|q[_ $,峙̢v=34c6sUhrčXq}dԃmIW_2&J b"QZY+®+ԒS>HgDdH#[pL  -a# NX^r}`2/{Lv6oZ9{XRn{ py4 ,Rcp\PIWH7I[q;t&Mq5XG%b(r:G7s8ز?cr9YU仔%Atf'R+jE1<U |?o`$>R%]' ~HCT8&"Ǹ:~mɿ$IcM'c/Ij .Vw =շkkm)܋qݷC 51>9Jg8>*Ƌ$E2C:$pG vjhy%;,BҌ0 z, xfqLh]j-_blM;;9?<}k/43i|Kc 1!R>DzQO^S4lc/]yJU>SxCLeϘѰ^  +q 7(_XEgU^f|:>jL oh  A˚d&ө\_V|4>ouE\k"" Nw(ɡai+{ts#M.{[[^js|7Cҵm H]&8И,@CT_ωӮ[ ˻G4i}w+Z2 R Rqz{z'; |rfX.v^8]sي՛$tE$~SM>_^:hdeNʛX]+ma1L1]g. H'N/,nVA$T̗1 Cz4-\TX<1>0լVOxb˓1SɨI\Qu/hcG>3w#)UhDz6~9{4,sr2 ` "uHwoڢn0sOGO) *GJG#g!ijQգaw56U Ru@]'+K+:d8O66vhZb2T$ {`u+'V ?ćf,2߯IGR~7+ +_jTi^ B34zsgHe'/fV fZ{8A<\֕*E IZ.xjy+CC;]N")E^8~ r&+Z~=z|O.(`l*@R(KkX 'v;E:8v Byv8EI$CeDrllϱޚ2.lnjz"!4D[fB[?4L}eAm/HasgC9z$}m FcH]p{X}Ŷb#ik~EaNF+ǩKqLhq`&=Y*L GfU;ķ s,ɴ̮ٝ lTll\4@C 5rL|;**[O݅;7M'xpO *Mq<$qشh"N*C|G@}ҿbrTVcm]ɔ> 2T:*{5DyS.UĆ3F[wI]ˍwJ{Q JWks,2|7$r!& H5[R[tP֒꨹)Db1.$66{>[_ (KCs'J}8AE4-ɍۭ"](A*.pv&ݏeJ}}cubF57pTtjB\z.5Qx1E$$HH6HFHlm]O$D^) 䃫cx^.%GGj`woc䋮l3LMC]D0rY$+$A+%ӝ!jŨ֫I!LwҤ.TH<;fjZvPȣi#AϏ'hK Faf~=Z,ps:oY dlR{‹ҩX1">2. qMt9ml7`3CبcE oZn+'K4kRގWBs$$?s~ؒE#\g6 k` 6 B["ux-"{DM'G׸XhZĬq.mgIȽnN)rD89,rpUcJݴ$(97 ÚsϘ>Ƿԙ$O|//," ˷08]Ȼ gMKhF1b-D&46LRCI@>< '4"OUcHsjtܒq=elopu!H\ CWhp R68~ ޱrc?'nn `(8z9,tssi:9A77k P׷; #B+ Cly7"ʛ[JVTc"xzI 38BpԯɬaWYHS!{ @\TԷda&1 Gn{FQp'e:?^\\_Yނvrp7 M8 NT`*]Ci0m{L5Xc"3[n#<9-17KNm璤|;i ov՛sޭQ EZ??JkF:WbmTO٢5~!`X3I$C"7gAHw!~ixSGPIhD7x!#uo3ܽ:3nbqa~ j됆&uB}qQpP߭ w.AT&@=Ÿ{mHqRyrw" sp`_vQRMPߍ`;P%1wTJ2<_D],s~ԡtr৏gGV6k(QӮ۟~g;1ؗ$<:ǿf" :RT dڣf7߯gx"u$u*k*Q:*nlB)_VOb0:gv&]ؘvzgSyq&H!_dw!Vۅ)Ye=l S$=3h>uDB|2?]ɈHܽ<t}6(ph!F; ӳ p۳S@'Rena]9L|GQ??a=O=|zŶ ~*noo~$Ƴ,Ӱ3L4kL:^0O BKC_`<սbNU^ƙL-lέ.Ҷ rv+O|>W`'8L0vyǭϯۼI8F8da0Nol.1"l4wDw[zQcXpQR3 )i^o^"Hg'he se&iDh-7jvcvaL 4QkggJSTl =l+Jc@=i̡OXTYЌ|:G.L23~;czꗿ?j:@b CbAaT0>)??Q>Q ,%>鞏_?z *hbish~Z_/h-!<#"rriFOppCS%+ i{ДB/E d8"9h7R8[y?' ΃0z:-[Y/f}9DHMK{}~efD /Tc/o}kӀ{dWO`#8^4Тiu9,uI$IH(e/IaN>fW "JiVHTˋSdЛ;$j? E猖K0̃B72LI\c>3LMu& yVv葉XjI[;×L<@ID~FO1oZI?x7yX)nݮj8-X#I*DxVy!ރӂ #h\ ϐ 9>->Aj;~+DkonZaLqիQCbқC\k8̀3(HTYpL)L}:QbG2PdaHc2p!lay$n6霕O;\*4pǍ1;^^Y2u;Ǥ$HVosw0 ㅻ?Nq;= KЕ!>*da#> >,4D0GwLbX͍ 'b"cHi&˵pDHJ6HI&RBꢰnLnze$N3,B .a Ihv{-՗x 3i=egX$}U )E{Sp ,}QAk 3†s~˳b kI=}\$v;FvL&cmBeuoOͬ!~x~) i#tA?mBky@9'e"6&fVF4f lf#0h0 ÎbɥcZ_0L`s ,Z> ̭շgii<ٕ/l˖+ͭr4.1Ɔ_'}`gX_)4FOa,OzɓEvX-pLjwoqa5S*3)拀<762V*fXTKHzE;x MԢV%gfW:"6ܮI0 XӨ""{T"wX|m%ZY؈i1BI,Ss hi|CR2<\+K c0xQY+& JV(T^ݩ5N;j_aZe[UObT%:h4^Y\:k^4aA(0|ͭj5+|ۜ<\";/AS;ʞ¤3ʤ38$"%B0"d\@m;Ds\g+=6~\YojAϻ PDۨ(ڵ+ZXEyI $αa5="t3O> vAKHh%We̎' F9ñF>\G#A?5` /Y̭@O 8 \/]j)&XY.Uu` P{xo!H[ݶMz|3łJo?DWXJ]榉"Gm YI_x t%ꝥdJzX="v4xvÂIq3$zh4d0̷sQkLC77 %=uۥ2S^\\e>I)aen~3_"l5 " wTQ9;r3[Bdu'!&GtEpi9 uH0K!6k;$:ϔ5˚C~6a`'?;' ^~1 QsI >Z٨rLl1ss Į1ecѬ76R͍<ܨc\2yw&?`HcI2 HG?bX0W;!,lnN:][լ/ES`&Y KiD,"hSz-@үln5kco{\uLOw5 *BHx.4'JYs_>zflÛrĵ(KM O: GZ |ߜHmAÜ κjrg emucY0}}%abfv^N*DžvrǢGJ=Y,Fˮ;8,Rjfe^d5%xvn.h`Z0,tMe=:dz6ьǣ<:mzŶ=c:6$Be LtT" 3OdX8).2I?$I`/P&i#_3H#[Xcyx}QۛӋ#0-TuS,G9̬2 [% N5$T,T$@c"XăgߠjW-w8^:{E>*"ھ"k6!Z .ބtu{: H"_̛bqS\&[LҐƆh6M5qvt g!hzsL]"_d DP]_׫ۍ4 [j&GXS_diD"kKۋY{v;&tT~)7N3~ŋq d:,pPMe ÷Cx9B9:=٫ T}% ?r\]A>r=dX:e ./{MܛԳ៾3eP}huLRhN&!MH8" pTigt&-Gha=?=U"|i}|d4ْ;fڕJq{L#D=8D+L$9|.@|K37$p>3 ,Y;vv#O}ťbH 4ifh5+{$?$1}H>帑Ɩ|F&g8#7Lnc}cmsaam޸:9!cJ=bS:9S#Hw?QP1?H">L;l[">A ʠ?Ȭ5j{3dO(W28:3X!2 \C|["QY{Ŭ_,3U Ɨ!i`F @QV-VffWy*>c0S]H)"!De_z6w"3:SJ mb/Mn ,BL1cT$}hfcLXdAy\b3b*IgoN\7oś3x?`wI s\3A)}ԡb@鿚^U?.^YD_Sk~o섢/u ŖJi{aq% MhәxlfQ 3]g[gFUn'utD%,}m&`Z63JO/ 2}*g^@0 O/`!{Egޝ߯/K%OnTkpi D 7Zj<>Zt;;#}`pEnAsUm nX#G9|qю˂Q +Ꙥ׈4 ԇp [5Sl?_/bNpX6Hʬ4z'4ExN7i͑vbRA|جeϟT<;4jKY$o,,ldI"Xzܨ$#/BW5BT矶;:l6v,o^_ͣR/2z8A (j#jl'Cx?)23K''GۑݨV[[{-$:67D[ >Ûc@d)sbYD炦&1z'L m3;98dM^:_ʏbN@EY*9)SD DQzw/ggH`_Dɵ`Hbb#x3jh%{aퟁL4i".8QY`~<?#_=GR ^j~~rO<ޤX'fVggW5 S AZn>5d4*H4Oƌü#O =ʛ|1vPjȐZ6:_BxWr/|{%E=LˋqVFGV]UKhlv ΌRP]XM{Pׅ ;%p)]!"]  })Mg7lN6֙!~ZZ8zZ V@j=O&疗WF[UQ\ )#^PZRtO)uu1t>=ķۺ_=HJ*~<5YFb| EL q*n?I( nw`[X7[GEN>M?m2Bz#Fc;@<& =l  ~EL7)a\Z┄O˛/hG 3 &T?~P@'Ǘ8z<9]JdR9O`F!AsW?E2.f8|m`LRLEBb͖=ytDg&Be~q-{74`[dvtvtc;;4Q MpXi0S&OLg)&W#r_4%_ֱ1fyg}-@x;cTExDRJf!e. qF+"Lҝ_жHa !J^~j@|cTcIj8D:Dk#'xK;xތ7T=c:vD-Ä:ńlㄺ~ ˶ p})=ix㌎so?oH ]skϮX ҷ ~-"DJ`% :X>.R(X<}r;1;Vog!yѧyP0K,)u&Ks+`(: a+XJhfҳ'̮! ݻDcxfk3?new2|d byd?7۸-i f~8?) G;HSc?r%{~cj76 ԃ{fa~U2lZrEe|+*8tw5'# H ! ,ٸ $˂ض 3iG(˵rD2׃%3) @<]RN8Uz(PgR8 a]OI$~O*H?g[&4`3oNWД]!-m0}= @!:8+0Կ?MYCo*]W`dvP:mguN|^(nmUF ]}cȜɑgOisD(=zxi9'55%˜ez:5`^΂wAIDATqsVP~#ezKLdLQ-N淶{p}ި5R.?ՆN$ IH8`׍zkaO]UCQEHeNlnE9fftThہ$I$FB,NQk953HbTUwk'{|PxQsY76ʩT?: l\<A~} RW@hAX&Vt7kq[/j3>0*>VU/>֐9HnJ[a{TG jcC3ZЬ;t DgDRjŗؑiޏf=۴Ӛ#m`o}6>1(t3a5% '~+ٟҌbT")# ~$+pRp _i@;^'C&Wxz~v`fZnmJj֌VٚP/6(ՑK`X JB@&XFV*o{c2oFMEKon}} NƕLx|1ǥBQOR{R0a ' lHr" 9@>Hxa;P+Im=- bHݾЌ[#fW\Shr r?5;d7$}P -u ge:= Wj\AR)ifq%̮Ĕ=f U(0d2nZFZ]įM$`(F3kh>=TGgflj0}sqx<9J\¾@Z%kno6~!gHBY߁m^-S4zpxR;HQ67I<2D)^]=?y}z ;<@z\'1GEHr55,c]Rw2)- u;LvQ H &=\G?` Ty gX5!Oe}LRp1!"ԃ;Vjr;o奍R {Dx']*c" 贶DkwϕBAUI]ǓF\oW`8͍od* Lf)C#L[КAQ%]<R'lv-Aҭ4 yEAҝMOyy_ |b+KeN2%ffvffjx۵Skn{tpqX0 FDTqͪ[a 3. Kk%qJ:Y"BSz֗ K%ӌjnҤk1EC bNpWGae}- ^}?T(;gP0[[;Z+gkxU@H*tY2R6KU>ުe@H|'V ;:]ݒd TW,"0*ou6Ȼo18*Hd{3GOieRP1 `ɨ ugsI"2!LuE Oʝ7<ꑁ$ݷDFD^ƄnYNקG[ߛ9~)ʀ[}}~ځV(wz.uR9) yH)^u /#sNωwhy.b[$c\͋q}sl>9r3-xDx!sq&)?bHbP6Q/VOß%#NuS5vV÷BȻc{DM;b{W ;|T<`a 6⺡ccLohF0MN{X|.J{͵խxr.Zpa0:OX}si)ʋ3sVUod ~e=v?JAwo\ruu3Wu(0!i`GPl0dV,hw@lo:GG`}=_OWLs/݄gX(x>, KMKn&f6IGZeN0^V ]eC4@)dk@PQG޼D򙭻iH&4xI_Bp Pj[aLL[sӥ3 }8mFQ./Q5~u|߯8:nE1HXibBh2cDKPܛ4'>}\bӚg닄# 'E ^7Y|HhI1;<ɘ·žoF):[ %VSQzG|RrBigdX#~# dP`3%^ut)638Ee+355KT gl 3WHd2{RԞacTb ĜDtsXS_ƓN̒kRMxS}7(jVw\nsZCb`h',jB0Ij^]Ng=>Z̶NC#~ؕ4a6=9~uag<Ĥ7ggWHIc pNN^P+e?ɰtgIWuZhs {+kJJH7P`l c(#:8QIkJ 8n6"ªhHͯfW ˹xf ,;hr vcx-.mJjM6zŶJקG? OJB+mm JZ_XN:S"]*rSP |/p>Uw"zٷD2-$9` %aG: '9=\ ()ozƖ=eW'hn"j(Ju!_timXzY]ZINLl6/2{;.0y{uN]֚ŠPX?SIdVS@mo{0=c!6.Q~;c^x%x}wzbphX!A'>i ҄&pbF"Ek] [^ {ǔB?:Bf\۩5"EMA=& + Ü o_#a GgQ=tv=Q8}>3gN2*'3;}FꔰߟU:C ͽ.r,1;m yjKbT*̛GNXRH> fÑzgjcy"_U(i%m6&=ʿ3OuoM6}6Lk&U\Csj!JWO83kXrH/-m]dQ;;o-Iv^.4,/,^0ș\"E.4)6[]5GvSĝy1V ܴwC!b H% Z$$ֱAmy2T2 fꇫs\G9fm'+[/TCX9}ZWJӛSPݠ<tHbwe ܉{ [[,vuʥ\7F<pwہ6oiفA_Nf6T K fW>CkO|Ga+]:=|j˖`#7gkyMLm˚e<4g&mU-C>E-Pwp8|E 9(D $DqIH$<;Fk5ε4OJ&HCJL9" M= c8:eٍ-Ä8i[]^CUAЈ- vn3P{BH4q?;^O2'o~4~NU4ԓ_D,& j[]4\u+b4?:@Wti&<3kMJoNPꕪm;1!JoʃKx bK,Ѱlnn%YTJ?緲e-5"D)%X`㓏Ex$ZRaD%s| 0L3ܔf:>Rd:Gn-Av:,!1L ąJӘccRʋF'}$TbIح<ñ?{ƵGJٟL_3Թ:Qx'کJ~0(y,'W,3^,ѣh7ʤI-H 1ei)a֘B"h tC6WW7WV"$2{M'zţ"}Fc&5r5?&D:QlwБ&hH&Anl;'%눦Ko/!(QLBZG}829 H^}<S+eDmhz+&itU22 pSW,üǣ:U)?,]%ÍPxc=tc`,yP/W#4OfvPaP<2ϱiailkIݹ@j:[bZjfMe udf騕i; \YσoXY&@zܪVȮB:yg^'l'k`j;.u P/k`ZdQeQ{(fZIž :3KX~O?ׅs[+9ϳ۸F(㫘$3k#Q 8a[|p]ޯoB%XdHs.XJ|Z)[dT0W'\S`Ŋ}< MaрӞ]_oI_UO9N}BI.PWU x;yVip×1ɯUk;=mlŢI\hlr&]be\03~4|L5UHРiBbh<;1D1!]>lѹu/%6v}GI BD.E|qk K%C< 977C G]G饅Faž˽W? jjt0Wrsk륕b$քg"0,DZ>M=Mq\`KK\2z.u<h}s [[[B[ZBt99ƑL/{K!TJU3w8>|wƊT7j?`zDvuz 'qԻje>tt9; UF@EFc=yY>>{pv [[֗=:=٫.j8VT>/vyFx~y9C!zAghlk@V H_Xq jr"=+ D7k% Mdv}c wΎesT`I!G/S; ߟ +<LZCVWTw~? j&K4!Oi@_O&3O&@H2tf;y@cϨh;c7qhKݹR> 4xQn?ÖS3jQLB@^z%{4Sh#! >i\VSgOu[]LWW6!BpqW5O9H"O9w+ݐ GzH^--ce_)D&\shj>^'+ ŀCz.$K]|+$"u#ԓ5A#Tc{0RF;Rɗ֯$ͮn/ ޻VD*]<=1PS#Qppg6SjnXp*$>ܛs̘]o6mOpNu3%f% \);c2Ûm;/=R=۝`/7vq,?_Gx&+6vAmoɍ A&SXӔA LM@C_]/AJ<_hkvoHq~^@%@fŭlffi~a3]P"49/@# tsu{ۖ;LM硆pmVw8;uxP%i볓F&OGhXݐ!>DZ"mKgTœ(@oZHs#u$}.ᅮ,Oy@!`?"{WFm - :&[0YL7|@ik1 pם&?m1T:;:8;X^k-qH3,Ex~cw~a=Yњ<ǐA9Y і؁wV v:#[ɍ8jQ} ึع' \F: FUOFofg/U/Z-UvtK*aאI[s°Yd< @)p8p, _'!g]_Z{$O=Y,U`HvRv5і*pMFԒ2.-p}IJ򤕇lѯ$9"4;S 9׮&Ć!L,q_.sfCj pve3 cgP˷(Q/A-;;k|pwt8ߩ5vv++s+_%b ǣ;vnWWb5v}}hxV.y+{3עRhFym5=+,-K\zӁD??Hj.fsl0qg~0j= aD;J Py7xInR@ :pQ?gg F9[gnjuf|&G]!}U b1(_ $-S$؋+0ۃ 8 .;|}xlO kC _^ɐcm$9dtq IY/nt[9OdAgo/zX󹷹M&vǽ*PI*R_(]fھLr{߈i Kl+2p%; H^n@[f9M#E"~!|=>) eA9^0AaMY1I׿B`o;muSm ؤ5!F"v.2I~ոƚD$tfe0\DjqyscsbSs&s86vs 1[y:TgCsAi@/{:B[y=~ƹG9`7PLH!2x| {eoϷ@viF .7lfdz}}wos˶wYHtT1|C J҆l\Ĭm]8^PhMglb됇ԅˁ /n|~9h,*;G;b\zO ޳AHBWdͮ$WZ$؝45J\Rñ^f$Ab\-!GGzs3Ř5ռ*[oECģViqeSDqRH$"tIbۖ\gV@n $;ߞtppR+Ph~/Mn <(NR0Y;RIϾZojE}vXXN'ҫm՘: 靃pC@mJAJ|]a0ߵPd?4b/ g~UŠ(_.xjĚ×__z~zΆakyLcz? g: nYxRg{2&ݒaiܼcKۧ!jOlA-sFb}!mlzv8 nrΨȽ9m0VyǸlѽ {Ϸ?)߼b eD,NQ}kvyye>c6 {}xkq?/7VV&¡M^`wx⩉I{)OȣFCdɣ\qM6=ALSH͈/k"Ĺ}Dɬk98,Zivc67] 3pPc`!sGJ=hX9b*IO $hCD>͹~Cbw9LbUZR2vX>%ڿ>eѥRմkn5AZק~ :|?Z.YTް7]To]""NSȓԛ4*f(* #k H$;'6\'QhOX#F?|r|Dj]EݨXD`/$`X(<$qxVV;*oêcܼۣ;;_JR*T W{{>d_UI|g<ͶMBvB_I=ܪAJ⾢ϗ!l_Y^OϮS|JҥT&ޫ{R8:eD H-7۝KSɧTY+Kk$ZxK{qޝ`w. ~ƦdճiyUڞMif=}FJ53]\UCy F7Vz$ 5WΊDj8Y $6 J G ȴ0;8$O=oLCO奵p \YX_JgMӀ A7GlNIG&@!wXz@ fsvtflaO!2\c`Ez!@`A \[14ۖ<+l^gKY O@p-lɍ"*l bqJIl;UhbKL;^7w{/(,XLDB8=eˁw!.h nv~}P>F }T = 8fW8Ool7 ID L2QEQ<,LK/:V 3—ܟ_X[[qoXf9fHz4_$!`?B& A*GDfbg2;GXG4hܻ̯HRqc* dPu xniͫЯ@liHt%1N\`K5#}rX8"}_yxr|$r>_'<ַ3t,:g$JSwI..Y]"|G!լC]/ ~ Hl2M|]3 2wSo˥'QC+]< "}c !fKG.IǍ.qv e[d76dT3HIY3ХuJ}};QwCA"8$X+DkA[&ŭ~+T<<Hs#Ꝫ(Ǚ_WclikU>g -!g׺iWJiHBYbZ 9_jWܟlX6ܗ ]xAR`ż%e0;;q\zpQez#2F./19psdY~X8#gwais$]^`$s< U<|rzw k}{;a:e/tM͵IB~$ӧ_j^ c]޽cJ m]?E=e#F,Y}cB'% I d$[jpT =#m>Hyhs|>7յ4D Jj)׺*G"aӮݲ'.{u)sFv=@ 6Nۤt9 ۸8Z r)>恄N$MV%UYb -oKhh:+m+&?FG(\" Ύڽx;E3Horʸ\GX#GE6uxIa6uRWMp.U* "kΛRޞxB*#5v]CO6i` Sxf*wȣyw-fD;WȜx;{IW+HGLMD'\ D >Թ}KX Gp+pVyP}=Z&y"7X3K~JµC4c~|q:|*T\Y۫>\\4u[gScHpLV12VlFV׳ibD`Y2uLV1xn  {?E/{O.fz6e3 eW#;Ԯ+#]avEYhue7t>6J8BK1}6h*zPyAS w-"J#~*Y,pԃNV=ķ; XpYR%#9/`JmAUyJ $)mt0 -<=sKF|c濽?#&Ay% jLWdK ò0-.2Pt/{3_fibM42mIxP\ 8.;~.b!+z/˼ eq H@vl[ݏS>-_bL K&uvP_"S;{{RN;7ߴ ~:Mx_O|9 d7~[yy5R"52F["Mʯq;&gg!ڤ.6\omgĽ^ R7 exm]ۓy9Ǫ$]trvӲ2?VuDd'^,di}>hnOcՊ29R'GZXeeli tXя¡xJMr&^Giw'$cn!B3^kmt1-Up6J!ٸ9󓑴D͍=h_E ˩_fʐ@+֠$Y&¢ mvsiu/KZQZK1**90 ZI G!u ̌i=#"9"~IWͬFث^L13[BkÓB4u! $9jjGjG'Gi _{=xbM2@KlND" )I878=wiI{epq i zO\MĐ$AlG4)ܿ~S2f1 [ϿޜFeai+5yZ:]xȚkiLQi^T<ǒud3Eyu`h7Pl70T*{uBk0YέM%3:_M8I5 nB35]}~9gAS:=$/%l~~x^*,xM4Bw 2vvW}aEhc- z$9E42yA޵CFi7l갯1B ׶?ZGm`Mv t<Ŕ]"mX E 뜉Xbl.ijS<;Pi:LϹ[c: x)ӝ}b"wtQyrnEB \dOnrS($3JqTZɘ5%Dђ>#HDK GܤS` L:9{9EPB(lLZkxRg;L'k˗ uL^BɏGb}R?ZiJIs ^2 c+ZZ4R)؍Hdz(җ6Nl/Np]> 7hL0Kw{$"/@/M"U6INN4x)]ʖݱHaQd?{)v*4Cd"L{ҧΘXi#oJh862aoNdϐ J+c.)/γWXM*SSV߷"{W5>]::"گC(m8a+-`iׂ}^K7~ )L"`Z9#G!w\\|!$}.y*ـgE޳Cu[daH=X #y$3Mh;[FԫjfvpƟtImtqgc\= \bg۞^ Ltj[}B2653dK.1ն!aos}nghqKU&($T0좊ӘeI^r] BM j3݃>s#[w%EZ[M2q.Ҽd;{kk1\ۃbcf[0<<3 i,v, O[[ڸ+2{v].nJ6o3ADo,IRifRGo4GƵ|6Ӫq?+Yz#}|y&˾cRhzd{{_VXNeKTxVng}/4P.IcIBFeI` "KsB8mӿbAE1 h$0sUE_ L2*wzY;m\ jpZؓ^zG*JD;T$r]c$R(Z_^[Ia*R Ȅ'5<:6`?@ vj8k/f [[yZiU7P 2hfO!F :d^0l#}L>£^0R_CH۷# f"Nӆ|37w'E/~Δ5$? ZD<ljwMtڷ{^*}%C6BDOH[r~Yh[naMPaHlLLE*h B6{mbM4)E!oaiE^Qs%17cYRL)ۥiT ɸޔ5l2Ndϻo7{ 9r@J±I7Į^X Zh@m~};_xJJ4S@'ğ'v׊P2IE‘R"0ڗ4}צU}1pHp}vfTL+l2'i$QڡtGW.+=aFW6GD׽b.Mikk{@4ʆѩ>u+SEgxB].mzǪ! mX[ff׶w>Vf"KQC8<ƯzF*}6. TnZ•iw'ΑZaB)6|8)Hx}}zD-9檲$!!;r< 5o/)OF&FZD& WQ%R59<㴭΁ÄΥT[Uix #q!sU'n['z,1sV6p")|vǃU3@Pz=@(-c'ubܿIx(^sX5S*zs~hsOu+z`}*2u/zo h7 wÍ6 HwƐ:N>o@ck,3ŭl:s*݆˸,s2ZvQ؀v@N|M#CӶqּuw Ǥ6gYC{CF6"@98Z;>];o9:2a"1"r}ٸ%U[s&2v ,$_ؼ *uI7y:aά.,n2pqxDJ\=h㍭rU2 hv-kmk8fD [݂̓tfx+?т˚vOy6t3!tt <W102FRRꂧ2`⏏MϹ7bߔK?e`֖3C%0:MBA@ި_| 1Ëg\1OTpȿWҗ Nl8j*\oF"ly,b~*t_jcy?H%B DzGKu*(#%o!90|!-w^ L3H eЁ%-LJҰ649`P#T 򒄡c$,c=Lsum[o]Z BgDx\rV(,)3,Sww` /ZIΰ7B3DSk%}24p݋jjDl:a{6Y(SjaAV63t`lG+W0g6Z7GfghbNF{_E {..o*tjnn *2ׯKER}4ӳ~5#4ì3jԂgG !䌸%҉c9@}.* X \NoG pC输&wXՇĤ䞁qA9c .דMwgC)iՄ-K&mϠ\Fs^O NST)cܭ ) 7 Yh6Rh&"' ~^ҵ.ltlJ޺jvlĖ־iBL*3ibnw'h>!bfFo4}ʀ"0OUb0Y5B@+F5rIUT:H@'Ȝq}QoJ2ْb"`M~:\Z+#Oc<[0߽|ҩX,FI:?c}&c1{T\=&BgEDjt&xZ]sd:'*o0!=q0S?uJt~=V҄!%kY ˪B *B2炍 i؅oeA[wffI*W[u T|wZ&.Wt?H":̡ ޶VyMS+-rbH]#v˙Drܸ֏1 [(GUP$%U*CW7e4Ĉ[SdS/O?vHJܢҺXb3[jrWǸJ܄FİYxd!W+_/{ZVڸ~rb$j35`\VŌetL6ZKKw$rU*@# ):<8o;F^N4s4\]G4Md : f΀?ݯp86%$qa]@_$EV2TтӷƤIDƉ"ՐӒ'كZV8k@RuO']Ec[qI|K>U_m]CJn=;|>' =@xR1^oaY.R(Cݱ냄$bNLF`Y!]"XO\S+* r0V` kANP]O H/RIa\`}R) N2%nȐ _w'& RN>1Dy\="< xI9L d]]O(o[D=68杳+U"䳹{PK 8]ݲ#hh6"FdMbP !D%T&z.V IdB# &|kI ,H'ɒ<|Tœ(njɳ=˨&lw:{x5.k~~yɽtN=9Au $=VaV&ZD!&X*Y ŋPmM40.]t֓7‘il;pF(,վC%bIOB4J@ux*Y);$Q!$1>|u.!J ;"ct#U49e9e$`D2~{i_ݘd#q~sOzgs뗳S#*dk[diyӓg)1}jv(5$nȥӐ*" ܺ>h5Dgabs$$aԆlSD7ʘ'P^-!FBB _8UO'q^;8. !:cxT 1G(D P S* ;0 MduF&AcJ\_":G: ~>;%AVfuUQv?ߓaS"lXzH-c8Fi(Q8F\…q@8$t9MXB3"5IC$qGJ'\}.0'dii9[ץUC \ O{ԬaǤe]61 hHE:U+4Ť*H΍Mo}F4Sp+K!cᄝm X42Ԧp_2I5Do**ZJD+;oʑ9opԻ獆HQo5a"/C0ę2-P*i*`܅!=;06rzx !e^xRuT녫}Sקb+f$.aECҦz15,=z=;t@ݾw|P[D#cp6](uDV8_=]i|T;IrNp)Q*o#\n{#tq軓\mka(_U LugHy#crGKAtVlUW2Sb h2M/xr>6a }wM6:aģTnwvq^_o Hg ǣ_Ύ2չާkݣϻO:dT== OGFʶ/>O`muӳW;/aL<3ȣW&k, ^ pvV.%R@A&bQ W;q\5||78p 4Y 0gVCPoIri<*b 7>2)2L2,p5:d m\ @:XWX3Εm[Őϲ:$H)UzX4lF7"Sԫ[G9p0l=kk}$TB ˊx\R4O6$NgRץR}ڃTF:j]; -r*Aӵr`o+Ҕqe0{]*_tͭ&tglܪ573O(==W)rt`qq&aݖir rdL[C7(7$\ILtGmMQQ53U<M_/t1K6BL|w :OO54Oka)k_oʥ9o~_N~>=a*q7oOJs #1} OT~>-/lT\x%0cց3EG&0hHM +g<C`YG&]T,5*H Q!0pI Ć6V]^Cp{$Nz@Nؽk GO咩wpߞ -l8 Kjp L_?EoU1P:@uv>!vu\Qn`?&i葋ƭ-O0 d }JfS~{z,NNV,  H RI؜hAd 8I{z ╁]W̩iwnFYCg=cxNt(9toîzٌev6lI*D"D14b_e W5Q-$aW, ՑKxDxh+M(gX$rk W&,X._HYS"ôu &3L6{BnB?$]2{F !A`ө 1ף~0)_&>=XB$KὌUPk ~T@kX){Byww[P 0q"eIh' ]Dgwl>>sǭəh–+d)w'_N\"O'n11̞ki!"ӤȈZy:a %jx<8K߶J|$lD([*9zQ\r!\婖%Bu 4 JƗQD*JԀu@х%c4^8̕D{t3- K+x'ou "R85wV吺H!6C΍]fSSեuϞ\ FA:zӏo]'5uh@v6zpXAtݛd<^PL̐L4s}V h.Y[0E%><dޭ$vH2uQʾm>F[8,""S>㬳_wtRg(H2rͭ& FۙZc wo?>& )Ճ$^([}2pMd`$+I";^ NZ="Ύ[ VQ6ތEX\]}" H. V#Nar*VQuVDj|6G:ۯZREQJ7 ƩuɅص 9tO 冠wz|t^*"G F‰چ~Hv 7HB I! ~13` Y-Wtͭ)|Iv!bF:8#%hr6Ӱ׬X?V #<mN/mmWj`L wbj">.U U,V=0MI.Q a7fD+B#] >c_H}l G9kdLb9Sm|]{t *i SjLRVUj=knȄ֡~-WbwWNWԮ83bO0)!HlN i}bb5%$$w Mm<}_RĞCS:_O1]͒d3Km ?ZŴI+ȞAs ; N$t- *+| -$r00Ƭ?l4 6)}`rHiƌ܄ƶ Bp(HiaT?Tp}.eK&:6 6pROxy{ F\/zid?w#U<6BB)H5ʤ]4unhԙ,\=ꕁ;Uj"yc{k'k[hgp0&pb{m_VBn0Q5#"5뎆A2DCvof5 HLMh9\/iWc}DVZvH\ A-l$Ɔy߰~euQoȯ67+l/|S2z?"Cb;;2SS'_3xW"H]DD i<K5ѝ;?. e /#͂PȻG#a 0m]E:c*fT[Zb;]jpg{xq]O)Vk}m=U m0lWb\:dsՎ`Pvv5!A˭S`I #j^ μ;-z #{~i+MG,UڻP 6 =5Lfcn̤/(#8ɎiݨĚlc*Fupz~.]zDrueS?u>H;Gv_GMǚ!3$./+O×NgVv{Ƣ(722n~wR!!]@KvRb/js.`GAHW2߫$]QXvY`GDS!2jz4!4NşxvWcN$*#I]U/ 4*{OͯjE ozŜ`ia+0̎iTjESOB 3¯R8B>3H&=x41-.Z6aCqъ}0,dH_(2C\"ܩzVlò#\r~ zmwa#R =[5lip֩elJͯw丄e,,dڐS{}X"6ڿT23t .\|pR_h!ذUwt7S QVFQ aȤ )}~@2Kg YO?iI{4]jC* |V}IIiNkL mL*5:is/ǑR(o}(BpEɿH"gEa9+<ŭIr"0J@yV'W1uLǿ):Q6ͣX\:]P;ēn[FCIw+#-VHf2Wc*4#Ͼ?Bw1 B$rԅ:OXӖŽ=Rqnq-5pX# }Rރky$K"p v/\aKUoFq@pdڶb:wڮ(r(_]2)LH_ .Md01p( [Xh.{H֜.jR sqƵF~sOD2.LdDfDHҊ.}z};}K$S98 Y]ڛؓ#Q6n;WiiwǛNC|?(L&%N}~T΂đYfv7ֶ'rF{h*ś]wJn6=e^eHl@O]ib!w8'Cgw7[5ojSe\-T8iѺ mI]Z3[ K&QJ$cԑ1+^7iͫ.o5ъ,R5'/mch8]ob〳z;۞2.M&9ǣqGyB3qt~Ԫ 7I"ɜL&^IsBך5D\#73ǔCB@*wq,tI..>1@%L&oB|y!é>"i ]KX.3,J9bq*H݆D3')zSWg0dC}@ҥLz(UE[<u@PITP 22n28 BS޻K(@P n(gX, O$. ںL&Q]j"07fXИYCiY/{G` B >>B$rv߰@$FݰU .^q]l`HM)-5 Fϊǰv=IBWid/&FTjqj@0FT\휱v6Q[Ml 6@HᎭm9)rEX~o?Qe(|z5ΏA: y.-?{VSm1|>}p"JxJQ|HB(6-d9$.-`cl'zm 3|ItO(|mg?q1% BR\4X"OJDE=x8 3D۟6xdw<FY_p"UDg 'FoK%Y]pM{z$Aִe9sށ@=IDAT gEDZT#ă^X޽U$={g;_̞bPt}}O2.lyD 6]W,$yA|qJD2o!Ȍ\c'HiԪpCD>cCM db֧Z؃!a&v)obZĠנ"{6+k(Hs Gl0k2Y~`L[ޱ6ۀv#~$:L4 w'bZ(R(`_»`5_[؄ vD^qgRWdy-_Q@s`dMT\E#|Kﳯ38gPiAZS_@i8E7mf3_Ԑ3WIUد$}p;e5{3G72a1|.90XK:"SleH"4C yD{$]BHEgdZ0l#j ib(XJ-\mb;Xv*4cA(,{ã{nI7$7E.2g6DJL&O-x-Q-\B b!CV덥l>[I4`jaXK)rTl~iu҇Dx+ nYtXFZE!{;w;[[;ϸV{urDeL!};kbM KN+D#k d-\>l4,W,Ro>g{;EQ&C"1GCXՄX]pA`}%379H1W5CEܺIOy"%.Z&۹T䣵?B} z~[_GG~}(>a0 :$mX)z^0:'C,_U"87 !!1d.*olr._;ZyozQ C( *F^iI {Lp `&u Ȭ~UCJdwI_ՈZIǭ챗=#/h;Z2&D]C$V;Hx% G>K'X!+ ^ԄH`*$u@pI+]l^X嬌GVX a\L J go΋t<jLT,g0[/YV$I0zA!S9 {HPY1L)'g~tpT/ircctDp|Ҹ7`nߗ}-J ȶ';xS߶kMn-31R8cjmYgZj_72'yS٤kw7om & qi8CgQ긗PP:cAϠp]kK9"@E)Op ?zdkSX^zM dKtG'ܠbKƋ0mE:Gt=_ޛ[ ٓqq6Kp3qz| q' *_$,?Xc4a--\mȌDNE5w N@\[qNsd$R׊žDzŚl3RUU'`)I4@~%ދ#P]êV$Ҿ+ZXx+s e{Cggh8ƒ JT?* (@G݊FCfԛf6Ha(.,$3Z9% l$#mgo;-a2up^􌶰mʿ7h$zV h_ibO!O7Wm=jaRJ\7ٗo%cl d 4A<@v~K,kwfmS]d(Xi3c,g?)NB+p r BK=T}Lpl3&\Z;-d,h8ܳl_O66w9kDmF#cX2"GGXWf8LCMHEY)j\ T@/M6g6VvQ RcJ%JK`ms;-fl@d]@{*2E.iٴexx~Y43۟v!ʴ]ɒaTXWP:[0B&Hhnp}X騪 +6g4,M:忴r'a2 B  bs6 ' Vڽ ;)}>4gP#Gq )߫h vΥowCb?I% u n{W[8M1mtSy{:c oKX}o,΋%_aKd!X~b?A҅Z:Ƈ,ŸL0m-rۑKeFu{F~yqygw/ D!yCT;_)0a֗(lRg28Cp(U򞵽I˕Sε¢V(b1l.68B>lhJW 1Q<VgJӰ 0 Y,U]&)N׮wpߜ7V>FL?,DH ϏC6j sV<*E'h0=FjRO%G+gP~zPtgGq'-aq l*;A,3 9VH*@-;I,L+Z9aɥ8D{cnU1ag },1S/r At`6@/Is MZè`;n !Uk͓7#Olڧg]vvhr Cb1 +i I54, $0j؞չ&/zTBhs*w]N@B6pb7M)SoGw{$R]p̮ FeI>lZ+IdWȾ݅JH0llǑ)Ru} tY =?.@6O G4 dWƝb )^Q[7ɴ{e7Y|-}Æ){ɻ2]w,y,F養-\=Sg8DaMKT+- oV)Z]i%ҽOX.0.ߕA^<}>;kJD'Ո2[sٮ!gąs28cT:gI,j%]=j0m]@kIuNT6?!UrG*P q"dO̶![Ss+gǰ)fs`S [B|P=*_X9q׆r8[&HlM5XNHT)_gv,1khҪP z{Zw6xHnX^نuk!^ueL(L4v%X )a_?JòL1|s3I.ƠIhymg%_,>b9}ghI!{4O|"S M BeA C6 oK:KWI~`0I5Tcp[>C'-!u n2p.&޻w!G񒨑?WQN˻{~-6]H>.H҉.]{٣jdxz=[˄8UĪ2dk!IZvNc([~٣l#IfIrx;!?Τ~{{mwk[=dk*lXX|wZ:X7^̸̉žFH_1%J}6?/?6 ;޷PIi _M>z$ahD WdԈ5׉;'dDLWo(}tt DûL>NaUd{;2fLƒwy{۪ oO^_9UУ j'.m<+'C:Z7yq~sLjX,̎ÀEZz0vGB37'R-Cr+Y͂fq;I)ͻ=?yܸb!O䍬fTk)ugP=IDaZsݓ}R,k<'Hp1CmxVta_9bv&~uN9BD{Ra+Skkk;HemG?w5;9x2v1=(8Un(A'wgܟa+nI+S~=?Mœb[+ꆈ]3 ~0b72\ j|K)'@ !$_ɸk5 ‚){%Ά^U+OovAmlkڵ$3jz/AtTS5 f7>L@2ߚrDDb₿ƛ"ZSmZmuMZ'rSvN c]q'xrO8wgGF `@LO gl mnd<[^xcO(Q, )rɫ$CHy{F<릝wu% 2υPK=)$žpG7IĦ*42t&e9r|Z~S.a*,c /$=Jӻ{`(fyƺү;yvvAHn-(nE֚,䄽kFH)nc-Zsd\:BJ2͠+Dd ϋŷw ;d^|ˑY |d>ov PZP8o?]'D:f UX%ILMO:n3 C0a͵% Bdp2P\c3/8l MV.ݕ,%qF::|[h3  ŎkҺXbȀK:uvHb%E^[܋x_˒_v5y8g(`KStő nxԴ °{j!C['I~& IS "YH[`Mݷ'%؉y"8;-.OQ̟\,)3ɔjj?_pG#_>n;EoYާ!xre۪OoZb X{8@A6dobJtȷm&MDڮձ5nmQcB,ї]CsCR;)&ç1zk 2S^v!d")6J 2mE"Ns|TۮNc}M7 T"tSB"p*y^EZ$$"R̯ntW_@D'<_F-;GxL3 )-K1EkgTڙ2W g&F]ފ|Xf72O0M` S-k[$UQ;(ijagѻQL<(񋪾c L-< $de7]P?[nHB-Hֱ;l9Ϻ z&M|vH(+."'o75?R5_O wJe>$=&-}]DYcp5t.EmUD Fh;`{ne*:mlU+kEMޱ6cvl_vw5|E`b6XT!$ JE=fWta;OWK}ɸ{ɘhbM fWʙlaOc=VƈPYY^/~ yi|9d%V0d2`38rt7bUbaϽ@. xQ.wvu +"Rv;/"-]xg @rC=$/sP2FdWXD;dff$fk4E}ѣК~񱲹@S`(ɨF`!e@ʝT9t5λ.DXN{iJ~ڦ}KL՝(S7JDf"79sFs-Z>I'1w<^fcc(;/;\? ~oI'X `JHcߥ' vJװ%d`!K OSEV44mKq!81IBROyN)ыW,}8<"$. !6VGqo? WǏ>+èu?M;\^D"=NޝoiU@(8Ҭ&D(m=oSH!;8\+Llp 7Kǎ8ҙ5ZXx9= #F=?~ Cy%A{;wg ׫^u`zھTLwV@n8Vv9R o7 YUU?f%&TI2"& FۢufA:jKI9/ײ &='ݍ`[NGι^ewikm-_s{3t rmw E>>q)8 zAG2x Nv0#qPĚպrt"HDZ5|>L6n?M`I@˥R"y%V<|^B\q.5yp41_v8|M)uTg'HP;d*UwKhUW8kq2(0v¡H4MX T, >ݵ:uN|-,!6uהIF' HBrmA[wj[椌G_م0m=d3D)2F i(qAYYo{[D Us͠l}DT&rb׺b0Eb/‹BČx Vu3SeLu'_S MԱ^;WVDFR*X? vH nI 8.L =ݪ%CC6?7dzyy ~2\n9ZwǃW w.ޮ10F^^U\'56ԍ,u+g} e?ǭd;prڮJFgyjU|69L.T+OmӥN&uФ.-LJƜaKWTWߤ@f14<5[RXuL2PX:Dv iC0- «V50昙O_#k =lS'=1_NK[.qpkJ+M5#ľޝ bMX};H';YDW8/N+lҢczKuL"yq*n׎*bM@pv/&kGޔJ ?vHXȁd`cȖڶwX#i035-l7}Bp58nNtj@RnBV8 e?Z I8{as=/b@ >~!$hߟ}CTjgc#5ZYk+oII%TcwouW s%M[ bsc#Z [|A_Nr8+zsJ/ges?hBE`n7R-sJj{1oj雸Z8QzG7:5=obj X հ߳* iOt=HƬ-.EFp Z:e/)IcAodH<5TDgP3?4R~|a~xpxrɦ L>~RI) [l e~aÞ?*$xRb1<8lY?\Ķ3pp4B1>x(8{eX";pPjq-"8Hro,/nBHHaooN=ȩm؉4 Ls׌njʥE  6& cx*Iǻe (< &IҒ0D)V#!'!ǥL s!A7Z][ :ˊ^^ݏGxX;GPlrvql* 's,:?$qXeUO/ճztM{#s{K giL4կcj5{]"3s_ Vh ΟElxIԚ& .y~k˳O=UO'iGh^z5j'!hxI{N.+h3seȆ Vk*< iFoCF"ep#2$s@C wƹtIg\* ! I*,%c raGOT;}BIWfx0xi k/*JZn: 2%}J[1Y૖2WȌGҖD$2[0^X8EZ(OrE jbd {Ak WǕCۓ ؖ**`]`SHM\{@bI\# @o޽$bօ\:קhJcZ2ڈ31 عf=X8U2''&mm udE+=Ssk. K8'B7.(Zu2X _2N ۛFc 66:X}R6h?-.אַ&\ۓz;ϠAD[i¿6=iLvahjCc={[cr[gvw}&{o Uwr-t%B>Λ2+[6 վa@/5Yl6#}HC?qϽ\,P~~"))SP6[Ӓ_s ٱ降ͭU0ĞLSFd2h 9NmON uK:p$A $MQJ~-/DϣǓkbH $xaIH 3ɔjk?sda: E|Difq/n$'| 8ȳNH.>+U"4E* uH|fvOf`#iqaH 7ȈZA!ۮ"jbFmZ 9|̴qǍ5Fi&^u$ 1nnˇ;RX&` P33Hs%0A Lbڀ)& 1hhXJ~ ('e$@H}c?Xj(."4u Y dļ{}oׇpkYnl>?o<$L,f2λ!A juc)TTG{qʴyyq3hn^w1`U ӫyb\oܺO'H&vtZ^1'tŷm^Tc >[y4w-zv̭-_Ng@s>CV}zT7g{M @XGo._!oO8'}g^͆c76WB8NW-dED63OuPS" vw<=7cX< I2ZGc8]8ކ,LnOz=kr1 Ltq\Kdnj.Ыt.C҉Y>BvKYFȺf\C $ ̋oeBxR:$=@#UȀ̡fz~ʢTp┥'ֻ.iInl.q-MYE2Ј)uyy6jD|Pb_`#"{NSjȰ 3ڗh A+mȎ1d.8Hvz H]D߫TmP'N&4< ?zFK7u ͭ|c: nRm$Hx]SC> ;4w4u07^d+v@R"OzU˛Ϩ/@OOneŃR)~-3|>}BA; %݅P>Ak[4nYa ڨXOC@63Rv)<]# K!SEFШ.зۅŻ#b!/u@Y"KdF,ō5o5˞"<ߗ]7~1JYˉX>0G#$v02!BvC嵽X Mg5}=8ő{%v:R,BH=h*\%H#B$@YkkaO̺~{}rSXÎ%E~rQ*ÏIߝD_~`P8*؍9^O0\c{нy@9_wY9-s7!!HA!PIH+o v6Tsg MKf4-<lHAnTGņz@zܪ [?2Hb_Rկ)پ8Z_3G&l8Ku!Mcp7OxmCulv%{9J ك5SGv72Fo2凙lxߔޮ&.Y3cD2juk!8X{L~ȳ #~xm jD! 03=FSp4~DT $*_|-чFZ6Rjd(0 ](!!Eӏ8 £@T&.qKH!arS*t()3t*(qW/O>w?i|&C+Q8#?uH61۸S N3MhsC U!ofwvC24 Ppwo/~-nK_O"$ Mo!JgTbHtNdmkRG^t [N*kF!7|H7Pf7kBy4pX-oD~Ȭ+bUy0B^o,%C!Ɩ (&vPf0K,Otl&" 夣WȚPHRS>ާMOZ]a0;+j5^hiӯ4&br<}TC" n i@ put D8)`@)Z$ 4LsN/l$F x`"MthG&$+VOBɨ)'uK cR热X+55=c39`$C8 xLZd-+Dʤ41Njkc?QIv-|FLpuhW6;2ip;-x_K*ەk``! {}X00Q!SpT68$" S:WU_?yHws0IQ& u'~hAK?kiHBlM; "3> @cDvvh|qy'8}FSr݃6&{35ID$s ;{]/'[o˸}bXj3h62H6`2>a5~ţ\&vNh /8Z{\wFZ 0,VPVK ɞ! :.'wFxrHZz[8Sm\M#c? |^:`KeOPX_;4m#x>cn-`SRۿ`R2`9c4Q.AN".3AŸ>׹o$ I96heju\B!5ջhD{1jvhGlJ5oO `ϵ3d7tyF7X<3Xrw7 PXtZSv+rz^.CF]]!C:U0uc-\M;oZt+_;dwD ?IƼ"Q϶).fx5'{Gmw1U2ePF}PsLXI $;h9濞s&yao>H z$:&@;dvg=sFHJ^/\dz/^ ?v ~9LCReD9U7CDUJ^9ONu}(xAd"0rXZi?A $q\E361~sG;V+Ə(ۡPM)SD(>t #\* !򾷾3P ']sZ!<ʩZ 8C6ǔÍ@ IhaFq^QŗI8]⤋w 8?H")d1K>udp||JKN7vO(2dn x93~P(3PEs®-:Lw M1XyC* L NZ;%*s)b`gx^rACƢ١1T:iy)M)~9-au1R!L{-m]i$qo >msg`jں EH[ `*``E@Hmx8t?p8"dͬp26knx+R,8Xm-BlrZ3G"cS1#$xV 9xގ.x WxqZ,rV6O4B1%BcfNsC@#64Ce&Io]F>ԏa&x{ ,p>'HͭJi"dz}-ڃIZ1#DV\>_XwM/m qTZ ;[yEW62'8;B=kX쑅 qPI' ľ~\C1O49v}ը$"_,i8*&)1|&se$7zR̡oϺd/Cɰ"%j Ow Su/rZ*f܏t T{;Ӊy 7b*nqeWX {e t P٩x+P9>`vL25N*_ѤrU302,sZ]U3fB0Oh bH 3Kb^o2)bLBG’YpIk]4Iv4$ 49:17Iw76i`r9CYRhϬȗ2Rׅ +;}CSiW,#&D {tZDp!,[EHUC6*%怄b.{Öf#$s;_ QVhƎDI0e"&+q 6P0qm{`g;Mev;8hL? wjIRl|_}{9{ d#y{/r2ݽO?֒a*j9* D*se3m!s24 yWBz& p?E_ I`$,CD(ͯ;p׎A!b&qDv>eNϮIލZ$^rY+bϚ GqOxooύYFˊ)Uķ3M#TYvw|rEgr588sJ_?-W;7-} 60=8jY'DpXnc2) hRd:usҧΥRq\08œېGRl{Wm`a֤"2KtSWۮ?j<ɲy8N,@n|k ‘! Q4"e)}GN/pyʇdq]UmA .t0|'xFǼFD^xFVNWC>"k@J&+ =G6X ڒT˟@Ro]p@&9!TӋ@M$j{%;nm>ch`3g?.\aw!H[GóRKs&f+)|edx#a3dH^gk ͗G-rZ퐪ͨ&$ƽQ/ ЙG$ѥW|Ӡ)o֌hXٱ1So7Fc^rFc>U05X[[%V>?},ihh_ .H'hfvi߯~}}/ΰK(l>AHc"RHc{L~6M&śje~BSGӁ]}n&>~ F~&KPn7Δ "WLygxqߵ+ť \73` gO0ZR!0zƞt` 3^[Cx VP6@"dkK'L^:85ܣFCo~I`gc,vgLCdz_*Icb[%@ 2 vRO̅%7d|7NWaJ` Chw!˂$3\& M/"V6L5A u 5?F*BB>4ӣg F,0W Qm!  @y.5uH?ZILcrbi+|k, xR ^Ǫ|r,!q,Ch!$ᤧމXZE6!EM:43Lx٦xз &cApxzX}/Wc8]lŅO}!:bSTbO "YN5iSX!513ٽl~}m6/4 }v'<|ϗA`$?ήn ',t"م(#*e‘A % UpNf ?V#HzIă|T c#OzHXǭ!L-%I"nlkx P O7.bP*m-v)R^`^$ڵ wf!40dq$sS֠me 24yVzOy.ҽ8ы4.JѕnL$75 X j>f hgNb+r?!tcL!jYg=Rޏ3 ִ!c"bEddfP3@6=8:劁|ٻS$ څ&DY7&zrB!ndI6y[&~eW&rff"x''HVX"Hd]zqՃ\Qֿn`r Yz,|:I5qok%{3SyL2K N'=CO4qp1yA^`(TH~l~{h̽0lB\M$ @5):n)4B1:BxvćIeķFS {f,]ޙ=4 R $M_V lME2:he|&?hN tŤ/FJ7|"m7`lrg;Qi^%g`hG2p`.EG[C<!‚"WW2l5w!Uke$t4&uI0Qo:O_p&zd.C'`j kiaK/ĔZ:{ rXm^_Is!Y0Z<_}ߩ'6 &8gAsdl\8$tG!)"f0# }:Ė&_IΪR}.r,&ЋM4[R;.'7: jaB7,wgjp҃EV\6ѣ Ns&$GaCjIz83&PYG:ēlӭ=] $D "`aX]J&*]mUW$~-R[ XB]CR])@/ (kXlt.w | 7@3WOΪ&Y( HP Lo/%㳜+&kŐOFJ;$M1dhPYjNJ(grhA\*r~&owK TCB54&Evq8jo7$GƮ.LH"?4ifu=qVK҈94阦!lw] 8B|,HG7`di~a Rc }m}DbԽo.jݱUu(@ari/(F"{rؿ%ɐ7\o!,R&BT $2q[xwIlH@c(h%o;OГ|:}ǿρw #+eHwQVElغ{u}z*9M7PΊ'&+<(ĐU1AZtKN U8lixOpZ_$Q1$K48ӓ %8Ia@Q`tag{;Ťpc1R!Bh7S{kS,WV!}wZXZf>?%"鄻ClgX ~аf`b!qQBTnS:EYJ[0kk0_pFE̔;C6 0MXwznE>^bf$SAfLd UT>ibۻk*x Kp)w[٪)I?B MrnZvk~F o@ jEl{ͭ Օur&z`BK`BO 2BN a^]qˑ Kyw' kO #|*ϯ,,3i|kNoHA5zBKt.D\1bT ]ljC39\;<-êӌ&d8@8IAl_ߠo|dtBFgHZ;{6E'#q$}HC r^@Gn)pGuD $[T*H@WKIL2Ge5_?,M.i,Ma+n=vB_$"IB)"ʅKp8 Z4f^<-*jc$?y [=Jw4n =SY L/ɯwgoO'a>G`?z3!6-umb{=3!Cv+mͼ=C|Enpv.5LzFmѥݽވmf2#ȌyK{dvkviivg̩՘m,900hͤUÞg=#2S?*$-264 3$v?H]ߴ!SC ]=&o#хT,*GXhtV"OwѸQxxE 7ɐb($X(J< Q~؁^2܋nM:E{J/Md]hNzٯv2wTJ4Hty*&_0jb+ۻ7'FU*,Gګ"L/4u)e(a}])ߊn&6hZod Бކ( E,27u6DL:iY l %*HfQa`%śDv \dd GAX=9"L8.cI"`ZOyhRwW) ?!a~C ((/A?c%n,aKuL*}QA5@R,JB2rǣp$#D|&)U԰{ "T?>vp:/I3N1Iu4AN؀qXzNRkJh7@v˗ծyF׾`~k@6njٙ.D ЧFjjc$? ~{; jbZ58Җr`+5K%e:%f,O11XfecQpT<; RO;B&X`^w0_ 6s;E4vڿߜPy2ӱ4e2y*,5A_hw}>|]b^6{t;;{{Evhs~O H+)xGP b&&Pː`xBN8 Zk!R(@0WIwwU.V FኑdI,upӨ|Sm I4/# 8{ݢ5Q+9*dv?B869o^1rH>\$ʝa^ ibYSHaZ"}C"i<˨è j&T`ym#H=hm ɜQyMk:wxv#),.oT kؖ/*ȋnp6Y[$=ȓKtRxƮ]HPmn^!T'MwI[_hvsxz7iS6b.uOF& f&f ϮzqL2 '-,Q4's}KŃ7ҿ/No.N?OK'd=~}Ns+?v-#VA#Hzv}%QnXN&f$]b_sQ.#O۷;?[% T;;Dⴁy*wS`!1BC.zʕ!jz*_I!@Ep41]$ pa_IVvR$dw՟ϪoO+oN˿Vs篃$R͕$AelP s#wY vN!NEl܆ O#LD F>ҥB*+V^ v#q8UG[IAp͔;B6or'/Ww#ooΰor7ѡɩ)߬/8%֌h#$@=tCI amWT~g!bgLLţ }iir|tQ.^NfFI BksďI""/ 5SgFO? $^G' >S/$_yq "EHr6@Sn| !b|8 Ҍ}?S2^RZ]b3ǃȽ$Ds2'̔Z'{7e'->K{2.mjFw "3+Od/!Ӭ(%ww/*R"Z*x|BP`$q?>&]}3$6h$x% _>4zB5 pw|E6peͭx>GG,Gn4#|;ِJ!oԪF"h:/`A$ݘ Y66v3eX[z۫6 aNjwgIPֱ^KO]ʟȽ R%2n 7[o wym%An@OA}鳋IJҭ!_!!A~xxf jڮ^pgjܡuH^Vܩ=juMG_pFmbS[p5ǒz.쐠Le+SI!,T׭~}jNXNBLvlҍEbyYǘ ׁ`Fn7VW/%7§ Xq ^\kQ"fJer+!f;Is# z#z"TM4ѩ쳍g E M5vS;wZ:Nfz/0h⎵G;DFͺ2X^Cj9q=G@ҵ9 .刻o;œϳޙUI"GCM HCHtnd^$7@3;ܸм'HD_$fkBZβ ´G/ |.4 :KG+)pt"׮[ Np?jvK/|Z!+^gzbο\m./F #&%`wG^H_/ c0>X1y3ؚ@` YKkh\y# Cx0s> 9 ŕC@MÕ)+#+Ĝ뛽B;;ٺw5ɀ\.Ln`-K&~8YţT, fp .tbuFy DtEuv~C9glwI]HIMasusTpfCLJBe$ҖMg1J`$<#;W#?ˆpR:{@N҇A$f' _cH] RJe㻉a6y`k`b  XL lTOrC7'Fxx PF*ꂓT'nxS#HzI_$5VAA%XD6}jrԽ*}t"Y<<('P:8@o8E!hOcX>J_[$5RO^\|ޭKk]\@"F~ózU]+fJ4d?_lM-?PCHX xkMWCd!l2dv#{6ZIelR ql`A=Y^ZkbKW!AnZ71u#@h frDfzn-dvŒ;i}vDstˑLeoTpUSL]b{ͯc/zFL*z8{ YElAb3XvAI~Ŏ+( I|!X P~67MkFSɝ@,RT&,-mxOW"{F$Jx |&]^ݱz>Ðښ,u_چ$_xI\U409Dy'8cgt{i''@ s/}rommµxHZEN;;$^߈c[(px%ѹ:%6ڋ[5$!F^}C~w]Q8:%v4£j"@{+6rAC;!b8;:$5Ӎ$S5V-eSGwWbHD\A! : 6)[';zzRnthZ*"Wg뫮di%{Vފ>lz9s.TB4w#dKOS!K_k@4IDATK7=9ITYLv#KqwcTţ|*Yv G^ ߩFqʇlzS)A֑\յr Kgx:K!-rMd/P pF>R;X@|^*'tzBc1&Eq !g8MҤjx37xϛҲIIl2Y::$ꠕqA~/:"5L!īFմ. .”ZI=POAu`Gt }Zw֞G0ܤ7r~b D Emt5w$24dc"3׋q7鐤;GĺBE xlVg->J]6jKnN$0  ;c~;ג.[c/ӡL#qѐ68v=$Q*Kl2uo}#f a!S[SS Γb_"xpPj|XgӺG͛D*rCg'G+a̱-?Fn''ZM= (7`"Lyգژ*Au3VZH .TO*=k9kY$A,dbm"Pfo/Yo:^ߌmm$ox~J+q`kTw n. 껑Y<n/o\ʬ]JՃ$yAGrql~7 vTibkb(  I44IJ31%1d6Yfp3*bws.ŀ~i&U GBm׾!%D||tN6w]`h!݉/r`H'#oۤߵ+~R?إC]7vSG~>jxb4iX1Pu#[s%.AllF9 $Hp~Xl-lyFB4&)+o3o?Ka-2$ G,FC$WwG8(# ]UGzrD^g% bQ(UO?8To?-V/}ndoosu+G.w~ ~8.tOZHŷ \T,s|T3>U`.W id.=="cI[AR=fNBCV$е߂K AGփO5H0j$ҿhNewօnc0:pI!A\~S)?Rr4Wm,//oڧGfjNtp ]>[W7ڭ6]MfyЮPD9VSd]z>ˠ =ѻΕ$*Kb !":*sK1gp =)'k/nKU\@þx~6{iIeqp>o,ŏ^َ*F3v{XLQsԴQȨ߯ztiS|,xպgR&A20SM&!}TzFDp Q)J,)^D1&TܬVneL=X++dI~%ZcV 6TI ﺈua+[ow?R~_6Ô#=A\="ױICtzV$rMc w!6`vzfE#߶J #t"zm69'귯+ͭNuOڗ6ƚy~^qGm&PS!Wt`]^@N+?$YqWLv&bDlI ~ 42PLf8joPwr7]vߔ.&2k뱚Q"} ޷o} Ϯ ј ^BV# ٙ)SgJa9RD<œO5jЩje)r9 ԘPkbt,F7G{pԐ5y;\aŽ\n}y9uC.t" gEe9@xa/֗0d>\Yu{qn >u@|Ϙ0JhуJ3Y)'~'I@ j&B Mb۰l[2eUq^: G-BDb7qQ.sxw +7C8u1u.8~+%ɐ:2: [z zFwʙ8sk ZG#D`m>$a0uy5_ó6߲l$dҹT2SZ3[nsaTMz+Wm u|iOGa˥*i{Mw77ߜV*G0No*@xKn4;#M=ntVߞV _ڇ4);J1Qĝ,B^]~0Och%|)-R[ -yLMt?Z'A<%DRRg؄kmi c Gr%r!M0, Q.B6u,O4Qo+x99zIIrdIalҡZMڣl.o o;T?v*h|/8uX =Ȼ=Bjbtk^O7 MT+!&1Wmp%KpzG8;erՎSWp3=]z:/)+??Ɣc)ՈYE- wmRP?;>x/q7J]I.\N~.5Bi{'iw7JSghҶBF_Lɥ3@}z[[;A~UqOKssc\n{}>r -=-OfBۍOp$:` .quS{#HzI2D,\,_2w:'8^00}B=>&,|&'Ȋ\o%T^:n)x"Ly6b7x{z8C|ѭ4;։d2aʬ]}PHkCa4!}"$}NH"יW& MbS G*lO 'hX_>Cε mB*\Fͼa/Z[)&QӭkxBx"FO hav֣225;g:œ6dG;߯D͠)Λ1aĐ2;1O JHWXUrg9Ņٰ9ŭiq PG{v77<qsu ep RKKS* jG"\8L2cq_tmI:°tYR!rbN=9ц︻=Gg$EܺP%) %8lZqx|7^.&2s3NO}MBgI_ Kb5FtQ1] `TN=ch5li]3-~Sd+]ɔcQ0Y~#H|N)& crc!{G`BelT?6UI$J]T`//Jj>+Iduzf;]:izW-UIW,d"gKbXڅͼt+yv7͒4E`VjR()c[vrydmrnxa߱ ZrJ[b2}\&Hc̴<7ڂx+aq,$P9M *ږwwOhWQZByK ^goՐCs@kdNX*;(*7_/7Y2@-v<@T&Ho=/,`A 5+``R>8g}qk֠ dh|]))m stQĐ'yY 7Sj d<жAr2@n]#Q &?gr"6S fߞEI2(&%Z[<⩜FeEx+o%{)CgG٧:AZqM[:+rqz˔~9?3 kiuxzr|_ȥDk1%R\"QHyTaJ$^WcнHE\uEu B\$G5&O4mIg`& o((KXIzIvׇgi}Vʯ nk=xFvy:ۯov}zw3?{.! }G"UPW :DtYHwR~+OalUҧs.-oʇ]}v$ !_D?>ߖRKvHhѤ/(=E|xxrK Ilk4zhܵ2OG ܑi]\67>d`zv5Y* VKvMMWw׋So.55}&y-q5ZoYF'\6?D] UZӤ=4P鍜^]'[^>'w9(荸NN٥Y$ |w(!WR ,%14`ĶOV׶;yD2z2vH Jf>ˢ$=?Hcge(Fjd$G8iϦ@RkrN!MKm(#|:}F JG:Vs]dŽFFw+ "q.*42蜗!MN-g7ņ jOxA?OIbt'arY`l GΊ'4Ӹ屵- k׻5 ?<OǬēϙCO/N->dz{#ƐL*zҭڅ/8#‰:6+̯2 qy4ԭSM꿛j.UZmW}ۮG-ou~P)9|F}K t,vpCã|n}mX @1Z]%grV.e2Y\Fj MSYb/75Mis37rxn{)h,~A_$uIL;p5~jQ,2rK`zεfB?Q8[F$o i"KkuF4I>lot"BMvVS)W0䊴 'm)\@BHGn!`0F.@cc8 CRF,,Z;cortyJtxAJd> 7A!|u⻛嫎]q߬~1Oն笡 !/ίd?\>vb49CHmQʶZ&eؕ-g s`g?)6vḬtKmtߊtV)|K1iv9d,agg}dp|  ܋J,4ޏ _$SԸH';D^AP>A$o)]fk 2Ck9{!sԅːA $!?*!%tIl6HK;"vK{duC[\\b+WoڔKx/f;n$[Sv]I.IW؁`n=4[D$q+@01 񤻔AҽBR} ^. gߞ?jqǼ0g!}d'+J-|=ƜJkWJV.9shSv|*oh{^*>V>^]\'cD!#յAcW`HmBcgɁ]Tb "ͳ~[W?KP#s !Atvv:,)$ m/%(j{u[t;]30ml'Zջd^ZbQps ml2D?4ͼ^4XS9x7\T̐Ia :$}W5@R#Hz'nmDT ǥ. r; h&3LN3i3v:[.w)>c\ڦۄ$Qȭd7 ǺvH x]d[C!4$Q"|r>dTByVd&g<2j7j>]5.}@8BS;x+Ɖ-)~jP @;6U~סzs_>‹D32 fKI8ͤ!O?p}rWS{A’U54#Pm+\QDg oOBtzqgs縐]^XHli4\d!2֢Ik'T*9vt0_ Beν|׍қjZ7!I`A,>ks@)6) nx?"\tu:_p~$~\q/8V/4cM[jߐGjl@CptokTkD*ID>}*IF?&t*0"a5] Ѕj{1@}twmm+ N-nsy{ͭ?QMu;(auCJ΀M!s1,P}Ije$_X!Gg9z'KZ<[v&kuBe`U.$)L6 D]!lOUYv~5/F+ 3]Ǔg)5U9>@a6b 3ˆ٫ %IwQ.&8ReX?6ȣ )4R?6lNKҡ>~{cK"QDrh_'WOΥcL/L^Sb{yrtP $vwb:AsĄg7 ߝU$@t"M}3Ȩ% R_ A~S:.uK"M-u9!]!PL\Ճ-ȩA*;j'Ek2} n8i=FoN=?$ETYuQFt?NRC!Mtv/!NTElQz8鿚6Wc[[)\ N*H1ȊcPÑq ~u9V.7]2÷g 0KxB[ɽ\xY-ǭE|tVX@J68j/zzulX!XI'I wr-eKJ K>`5ƅ**x Qn󄧂|Oqड1Eq㙅 f.U`'K8PBiç xq?Mb;Qӡ强 Lu\eҥ4ZcBK)C>)1 'i}&QNv6w \TK rea!Di>N$<6ͥs;[1Tf޷͢Pd@"U|n1㻛[d:BLpK rUu0kreXTǯeb?<5@Nwy.~H|ߩyxQ (=H$ӧ< V..Aī؆gs#sb|CfB}H_EHa\H5 T#w'>$ f w Ы-OM-Qxv2{LIBltaAm`;"@xT ျ' Mo] xnHM)E٤6HnGj:SY d#APP2i]}H ta,ipINQug֓L>+Y ~!suCڄJ.N W  h3J/J({xF[=U/nԒ& |:" Υ~qˌ I#p=l1Su6’S:9؟tLCyN͡ jO&utI,LT`7)\_/F-Cg$)?"u.X8BE'G)OuM,O]:nlfy/|8K$ d!F3mo V9`ݦP2͸ӻT"}^*JNĒ3@U6٣B5r8q>n!s@y;r9F#1j"gHs ɢ ͒*)5!DXD|S= vWx/GQG>( +'f{<N۹J HfmWsPawL:+tzr9ЇAR 'K1o o[A$53spnH3M-F6WVc{=ypLduƙ^ du2gG&T;IDBR vgMl~NWuI 3wn/4Y.H|RK C IC$>8PI"p:s>Tb <3BDKkn\7jC%:x,Cpa4aaRK5Gx56jJOdR[ML9+v6zC?g6*_hPGg|.Kgg;̛5̔NJ05럌D͇dhт35Ń!*Ѡs ' A%ZB ɍLݲ`TV&F2tRaô$HpwY2sD9eET wg]OMdx qPhpv\/LLGF hJ- /V22=Q{b4@Xj TF SƏ, .H'N8OʬAaS댰I &B\||\5-=2\ H0)l2KÐڞJV jKיux[Hrdrw/a\n ={@Ubb9a/-^L؆^դLcjg"otAuvQ.TΊ5u%u|!sy[̒}'n/ rk6o`^QN`"IM a46 L!\\1B! gŔ!L A0ޜk'/5bImB#/[D. fxRW"m1g{+K璉~.T[^Ӥ=iۅZ&R $g(kiVuac@?|0gI$}|Z:xRRK!46d,F._Me}uhV$tRP؈T!cX4 !W69zt3~\x_mq 3n|]{,%=aZ9ETIz!"ur{ٜneku!m'.ϠUi RGKS~~_S>::;-[K4MCX!֠rć$F2Ta°+_:|mN׋۪5YI u sЇpBW T>epoprl uNZIˈTۯ]=J7{.sF|}qH@8tQ*.QV"*Ap'ULw~8;kpYY蜆Cü"<__`7Ζ[vwo;.XG`:Q=B7 n+FO Je!pĖ8JG֣3.3gsB&U_2O-CtzYΟ $QJ*9X5+mԴw sKfE!TnjjFT"-t%޾P6Mkrd|׮ ;roA~'2t%q8˘22{])y =#tQ[pXp[6KET`g;N*\}֗V>!\o۳jlkWr#OQh79<I>&JN@*/{Rԧ$S׀;;p}Gi(܎!{chN '_9zcds3~PQOȝ]} k%%ߙ VX]b6TF.9Iq5Ʃ;0^=\[\G,X) I44Ն:{pЛ?ā2v9Om%%цc!Ohe:)!#HHMJЫwߝfpZ*m#x}6xV%wg/,mRch 9>y].+XTW;5gz\m+&7j~lZVCbwgvHBrsrpxR@\^WD[QOdfLUG2*IYHL1%6F"L avzjkVtH L"q0΁3u51GGeU.2#o^sW?3'ݎ ,0\nx&UOxz>AH =[MPKU} R)t '8=oJ.` ߵ)LBRj7%UPxHSj{ ;Z]!:)1(Lj&[_-68 .{D{$3U#fXG9kd dn*5⤇$QʕH8!,ݚյŻkԔ`SRL0{$@ʹwt f3Bmil /*OK1AG*IuTg&P=S_5 yPŇidP9O:zZ\C6F#3+:$ "zZjx rߑpMGN (_5jS}߲/>nMVK\"~Q}TIٮǕc~t$j:Eൔ(I( =X3eb<*ai$?4R/{ö|)1}űaZ>PT B~iASI}zt"s-*xmRկ~wV=/P+-lb*Ry% aRSD8I[қga>4q}V+ ]!6!K_`~C NO5 Wt''q/ߙ|F!gfW1t-Qrgm1&WwQO']TӃ[gk`[G냞m7QǭkmT߭#xށŕݥXhvSg6h?gH*'Ip¯@ !ihIlI80a-@[ 7p }3'.2=gZz LComa7zlm=?(A 0xpЄjIo3IǢ AYA@ %= 9 OFZjQ=g8N10\\X{B[bQy*'w%G#s;;KtaU A&,u.PzBBÍjhLIMQb<C3n_͊fԩXI?h%4R-,w\FD}f+kحNg qpvߋ&vPw hx{$Dhp ^dW"?U>?==>2[==LC'`Ap] hlO4s3ĬC==ͥ],(zBJ gfZb# $Ck"tt"B'(' ェe$t_[>+]K&2C>'O!(CPITxnz0;+9݋}wqc܎_$!zocYhBz_m$'Q"@Uw$Q%$! QŸx3{vij|sux?o.^W+%Lh aؘxrVDPXz/C 7^.ߧ>g "ƷU#*k&`65'ǍjB.E:iWVGno]F$($ `L j ssD5P06*{>on%R5ID& xsU0[ң(Ǭv_|{u䗋KAEđ}rp  _>a" Y% d֔0= 3W"zRPHy7E&GhMlii )'ą}'d I>RmHgw7 ͳqjo 8Dji[CjK(ޱ_H{@%)Hnn3ٟOdVvQD?\sO@"O3wd[]&8MRr}SI7@%N:z!/|uﲐH:+~/s3mI2u0GLm'?X?ZmRLu;xC koUPϋ۸+kn!4yxrmvμ`4qG_ 3Fe}gXE&QH)"d0VXH$P]E$}TܸA' % oml.G B="FʇGlAd6xJM?a c ;Ԁ.8xK,tO]672DT^TnW2gVغu-vKb;4)R䠧(@k*ލD-fbbZ(,_#נ^1)Q.Ml  aF62ܦ=98HƳȲy&P w$Tۻ^s@I {J/ұXM/JEH0 VAM7khKcו'`wd_7dt !/[=&4B]z'e\W@P;lLD;>;-~LOfR*66<0#JSNڂsTEkLAqJ'#ٿDڅݓRSP$DӱQs+K>nB`*ӗ'o<H U GZb#=Vإnb{WNO7J(@>EJdeC&G1OY;\m큭nʵIeJ\:7h ',\B4Hp} <I4U(N#x`6!$+S1L'({=e蹲ɍYw>:{Zvb'Mp4֜k%H ߱x}}א6nM8`c_qwBˁvaQȤN_zNǷ.*UlAoK !Q*x̧RSMY) ʏE;AJm.u P#*d*/C, 0/0TK.w$]&h!oB^}|ۛ;4Y̻$fqsά)$T#Tn>Tǧ.HƗtYls+JR'B2N4^.&!@L]%Dt[ vI,2seuP3cm1l?xdXKHM˃AG\ųE NǫZ_A'mf?F::VB9MZx$}It0U!>"}2]g]HՈ0](Я T<]RF)/= W=> G9 ȇ'>=p!]cȝk#Vn3 D_%w~+wo|_%ѷ6C O9j96!)ݷ FNQOG 86ZP/5JOv0I,}(~GSH' ٜjkDo`p;0r+L- L`des3Y7gC!"jE9T~JGX+k i %_po4><x3mjk$$}{!4HMM`icK Bc8$"K3W,Mln#Ӌyjoo/TCH43y5ѢQÓժ_aNKg*Rdk4£3(6MP}H!}hNZ]0V'6 o'6WVұJkخb1U4q #{K 8;sqJy?W憍>K0C)Cg֐fwwHa]uT)I$!.Qa'hQqb:oZϯϊ ˩x_="0#HzU꽈\m~.] .ak4ಉȦRý1W(mߝUѨ ;ZS8wKC$1$S׻"3aOhB58կuWƅ}lj 삈I8E` QR:l yuzG殁[uX0@ҵ!@n:Ukóf}&4&"%!N*MvmѬn_ !5ɂΫfn}nsA\C *$ÍF2|505>ZEv5@+UBbVC w!X0B i퍜璩"Djw7r_:^ TvǷn-#T9zӎ87jnKbMb[jAڨ<ۗ&ݫ(]HyWc)T:nD9yϝn!!vM66~6qr}kmw0Y$6ioA({Ll7L3#OV.#dy$!$]<+Ib tr&f8\6QqZ3 4+ ס"v8@ IpV1aGp.w9mw盕$mSl֋=a0s]fiߔ+IW n$ɝ=JI7 ѳ+ hD&u7iczk/[/Xz¸}Q.UnHyϕT%S _p'8$IꟋtkv7@RSle@aiMEU~6ҭ I$]9F$5>H`  lLZ6\7&iWţ+[AU[}"s{)BxsyXas  U9[\zԼ K6b֣p0XiL3Ixc',byU'؟t@: XcX0)1kA|`?DFd™ ԇ*IYWN@TcuKlI,]s9_=+q@sbqSԏ_9 |A,ev{t53!z(D4!2*3hClf[ c!2PIUIS(BHl\]UMݪ猠T1H5V`Ň;3YKk b9C8yz5P>E]k=G@d#^qHSL1!mlS¯Dw(}G`_c%{#bQ.!WvJDixK$Bvoaq|_TJA400:Ly"4LAc]pV5~ٞ;& pk}'@]F0]72Gg6)WϥRN.i%JmsX($vvHA>~P\]fO?r7rdz/7eaSxzn~YM $Pu1nH #LOŠnD.+$؃x =YHw”`) f8+R^peG-m"#v5^":ݍm0Z7A ^ s?:,.C/Ǥ8%t'Þl|;Q=>VVZ P;~|X`S3Ec~qyYCHkMuҋcB|9<5 2˰9d`*=D[ڹwk[$NLL26X6m0ePݩ_Xۦ@hxN@dZPtR=1ވm[( ޗB`c~I 3m$w>KzEI8!|vk&BߵȜnΟ5S8h NNONNKȭ6ݭUo7{{vJ&eS<<! D, ae13Yc6wG - 4SLN +&. 9IILP60X9>~Jno tbZr<{z D|"IrgrxϧwUHѠ 9+kی>3]k.6V4?9I(*c8 .X]j{('2 l*#Rd[]}h̖ a^gL-jm. Q.uJz.+IX ]/ꕅecY` ٨ { m6`'0bF?t*;O^3n 5G^WA>8:saջ( V)E %4mqE-Ss2[5Lѥd aj̀Q 8{J$Wp1+^]s4~lhvkܹ F~ý%`d2Ŭg񝍍ʸI_>KF{yw (bs+xd,f6C>[;;$Db6ih، HvJu Fd@:I\IH]n__k{TZ6bHI?uxN˜ IaԆs Y}CfX<ƜK\I=ND׫]]if+XHRuU oNmD<w-{BZi=H &ϿJ$''|s˘GI_UL$=Hz?cr< v]8g4R;<07\!]YX:;]X%WvGze^Og6w?)+%WyvNs(~p)kYh9 ˡkA١4$Hjdk Z6@:J'_bZ,"GDPL"Xd{}='ׁ`U*v77/*{r>((2 Oana7p!6 >|HL BpF0 (58ɐ;5NWj5L)i\x&FKCb.< d45pȴ7nf6C'"0!Eչ8r'̡) ic#>+K>Ep;  I~4X}tw^dޥ&w)P& I2RdMa-q,,ylf*~])JrTjwѲIfrwPbtC ĝL<`}8Ӎy%j V$*b~"ed1\D8\Ko(>. :ML`||vr4luJl`2GB )]`#}v[< :<K{oOp>;NxW<.r'_ 8Z&ZG}q$2F䣮P09oȯ5FQ r*6o z琂׻J>t2WaH2]cL.Ca`hv+iaHps+݃wn7!cVѐ K: \fK593;`5ŐVmiG=kE#\_\_k { \($6FRnZ| Czˬl4[Wwn׸7#U@e"avK#H :,e̿G3nlazfj)^i;Ė1dMNfEq=I,_Kp$big[jg"c+Z6hZ6$Gb &7}URq`kyڭ0*'hKt<~ ~oDNs ýB*^6xg3.2igWYu+I7`VT‚,!eJF[#mB$d5[}UY~T3eA6_5Kb^%6M ! J|ᗳF vhON"!6SΤ X5%:ĻaAfur !jwjruŽN%L2 bk{=2:%h)waوdw-zlv\"=*DzTy !ش@o‿w0d9kL]dr>>H8f GJoP`lkKuk ڠ@ S @/>6 p".|\]SBPuikJI*I-u6k8xy$IAҕXj<rv>eZ8]2㏬2hEr" j'Nn쐈*QAP <绖@R#N1쾉,hsV]_://*CmY6TaV<)jduIԢݍln`fRPod9]l[$e:h7{T4Jo M8XF HH"Rt~k&@ o gp5'113"|@;F<]τO- <-fÕXi6rDwVPk*#5gn3[}Q|7H Y1x˃$4i $}JUw=n#GH:nԦYyaIdu;NJcL,y\SkK?tr-BS݃ @=o!MGhTM^ ĥK1/g'|d =?볟*_/N>?ݽ*'k]e +/tTYnLM9kp_*"D!$H#љ]w(;HB(rg30>GS˿:Yhf~H҆e 9|#n 7q[[S+ vڙJ/8QQBAľ1Gxx#uV2> ءEM Yg1=2\aX46b xojM 7b*I[xpҧ uAZq3ܼC"MsQY>1<;Zi x,~n~)fHGt*Ǧ͞eiF3vͫ Ԫ;}CA+k&Y`AĈ%ÑI:Ǩ( ??6'AAZyuV{IMɽr'^NͬՓt5P|mL[5@RIP 4݀K b#H68eR&؍G)'a胈_9G)&ҞJo%w1k$ .aJ{dg%ow9-4~wPK>?Hz&#~hvI@'wj8SWD26]b0q^);;]\XVثzá`\z]84|`e2gw myNzja?je~a&kLy|C,/5m5*zrzrB~Ō*4 L,^>܏D*s3wV< zp!cbA?) R$"BOcJb7qG^~R;~x`l 7qG:fxpM^o&Iޏ!_Pd{&4#ԞfXsV:ØxTckF;],&tV+W 1`pe REq6A8IDL}sm\t湎~dK>n'06#Lca.|vX$zd%hÀcYlf(=4q7^Ȥ8hbdty႙\ED~#Hヤ:V6'UK53CJ.QY_rFzW6=[Nv HSBPHbլI?TX\YZzNw C3KߴX9 ɜ;ՄIJvj$,RKK0+t@r'5LO@^ODЧRw.\o}ڭK}NCVwmJh60ח#$䨩`Ib$M @[cv ɯ>Y\AX.ZU rv4q{>^[^_ˤhhjW+gdrtp$`?|xK&O9NXprqD4QI+5ubo< sA,ޝi~>67vV7ٹt2UEÉd:2̕Щ|о`cIlj YchyRu^=}SE|aӗPA.w67w66`%ݍcQ)Ad6sCUav3 kژ%1MFzO-*q*FLa*Jys#K2lKJJOP GĶSA.C/HEVxuFrܹ0l̰Wv]foJk|'+ ZXϑn X0& TDXh0<20E]}IG&_ }|X+dN"S '27' Jmm*6@%x6UV]'\[<*71+Be_҃Gt!2TÁäTWoC5CLj=D)bPFZ[8&L:%l- ":|]6f) xt-'W`z@R<5ku/{_tM#<3d.E0mT$ fCskF_`۶zM}hwS?x혻_gSm%{7#+@g U-d" #sKێ&=_J8N[bg'=K 0S!ŃVu6dbe/$ ԽAוrtf%KW.E6gՈ@=@Qlp^]ܯV΀Vdֺ\BUpMusЄ.-x@upJ -rVyWE%̟O+K˻1t6w2YzS-SiY@Xz Vcm:BEgG-ZoRC>i,,.o24ºػhWvtdXK*`ZOC/zF]ѥ$_rP^؝ ?UR1qMafp'W~{֭?/4hg}dgx& ^% ]$]"~~O"%p|?^jeJkk;nLl}@AWp5/Ňsez^R[P'S66nmGlCI"ktLY<<|].yͼ'43v`]=AwrĸLY$N5QG7OnG s|>*p΍8ۻ.AGg p)6Ҥx~rVʐ )QH t~$p**#EOn+Wѹv $JD?hn Ka(DbC^t:tx%$+ 7G>2_bH?9>pM׺UEWX3»FVR6:V7NQS=,+]+IBT{ր6phڛxcrm/$I6-.lfđ=" lv~Slaȧ8Ĭ[`LtOQ҆㞓[Do刲*w`;JGL`Sa)=RT$`f"07 "+:ဃ+&=]::<8[&_ϧRw&@V|k+H x2n}|L"6۸=!!QD/ I;$D|k3xKx[TϠTÁRb| "?UC$[(*IYad&ބ@a[8i/l馞ҵ߶J_ЕjM$\tDz-ۅ=Jn߄j~dP`P59Ƞ0H"?ɖVVwJGIfUq:v@sX X!LM c&8\dEܸR+_}~MBl )aRnŮ-Ls7߁z,&*IDLӕ+5jc>BQplI7$njs}M~ܖ6,'֍x64e69GGI]}6 6|[gA{[ DmtNKݱq,"?Oao[9đV/ nX4PtڡBa+d!V~(ՄX`]c}Lyݰ\tFyc|w.uАdOON $]T*\@6m;;O{AJ rK"!װ 4飕$ld428[k7v)zt`x9˰RKzQ.{3uG߉=JR`{`(-]mD8%hpHS$ [5%ԸTn, ,wїꈂ5fk PmQ6L #l:N"s*?wICO(Oc][ꢼS*j+n]I,Q}CNҏ*&y78@*; |=}7bB{Ij7QiKvAatWFQEc4͉>okDY1,a+d2n0:jI9>=9֍hHM>/Ik^)ľ6z p)gAM`)DtȞVx.2>eT^@`㽽L"q_<[[,aHg?WOqYf|i$=˛[Ik ]z%hCdc6{^ ߬ pTVU~w;J\:&)WXz].VrjO&"&dY .d}mBKm{urmMt"'ʣyN zOJ>nbYJf40S'I6-[s,u jt"]HuH5/SQ02'4|!X#1g{͒GBCh~9 oPnt)dKBՀ!r$rwq;]愛XlZ.PG싹L]w"6lx2]HVbkLN:"a]L~ix8 CM""lm++Dxp(6 L\lV@1g5bwl/ޟՂr NF%u`lt~庆X;%V‰յ,#ˀwyr'l#a\t`_ṀE83KG x /qk4"z%)HGМ]zb6:H uD k ^b ]o;&{>/u|X8Ў$lQ\`x07H4#)P`mm;Y ,ll4'wv Fچx )*nlƕ#~<9.2'&G֓%wYr ^^^5 %ahk~s*j׬T?B .(HHj̯(|]>ɦ4]J5rH)l!e:./ w-&ݵ݆%d D'x-k3S<t/(lW%Q@VCᙵL*m=D}'nW sB+ť ZDLLNk·?|\ }%"r.cK(@Sbv `z[nKloew('vvb%tQ.T+,*xhd=k~iEF&=?_LbbCkmg` v}t°Oץt&Hj/K>KΈ5;anNDpy7uQ.‹|ď 8X}~+-]bzZ:<8H'3X2KR=!:k9V'{&G:y>R2/ħwlU{`[6Eu:nq:$5iR|mMwTܕtI" !|!M bG6$5WaB{ecwAaw0@iּ1HʁƑWjr&m S|x'.& IDATEc7F1n܁;/A3Ľ%&6+IC `T<4ͭ%Rѻf^/j-DEґIߝRg%ܐ)E#ij ژ&/'TE^!l'd{j%%]蚈٭H$ PXPX8%bمոj$6.NFFa=T`Bx"\:-r˞ݻ-Z=GVWv"3\خ>d ^Ddie{>ptxdk@ OۈL–ZV$HV?_6^_7:'%wI]RSY/\NR'pJCkh5Fw=M9{l(d. wy}i)]omcE Blh2}w'^c#oNB |ҭmLB&솾Ic~wÊϰCON-z#JUʜڅ">Env٘2{ ;8b!z@7fx h'!ra) Վx,iQ: э~[-ѿd CmљCg=OX#OXM|ضKtn+R#LȘurNˌ<<C t\thTupL:Z.tªnCڑk $RFGZRgݲ1޾ճ`9bjKզpۈ9Sәf6K<.o)ȑwIZ44rIsH] Pr-l:n !@ajTpPLhIWQu |hRʤ2|fvrp݅/jq*sd eQE #d!c@?t,Qf[jӤxB{ u\{fQJR6ZRB6 ՍUڶ [<#O6"U'YˆmnrŃx [Lc_?m~&_=hur-@H;ޱ CH"Vc\C܌#H180e , a]_tϤ]8 ז.rgt<˶ic~4 8ISn`y]-/a#7i洒%#ͼ1H ;f{k3ΔٞsPk_4GIH!6ݝ Bliԣsӣ&>+7-ťX![24UHX yC>@|=\sJ(VKDbꍈֻc-? R$H*ӥ@x̒so,N$K[C"66n^^Z_[^[,AX wcI~x/;ݻ Fh1YŌfff U%yY4əٹX#+iKZfb 9:"[kNvV6fa!0F@(c%,qhB*AwI ;NOH [|얞eл \c Յٝ;V)$.MNvϊ7 z]ر# {{bcu9!Efb[k!YzkfJ j{9_BԍiiI$;h A)J ےzkttIj?[#OUh ^$pگyދ]]M:&GHIr)Y^hNf$ؖAe)=KG\tz4= F9-\G3W*-@Q]leFC.tꚱ jC*3Дꐊ[(567MIKw_oՇ|p^eKRn1cGr-׻3dA&aMn,!õyM omtZ8|7G?4sȧÝ/jE"?[z\H8{[I^c_hI>j\iH$_$lFFd#uA\yHN-xZ\k{drj5C"TkI{1V&u/-.>=)埃j&N_,zև}+KkPVuLAdu*h[s*G\F#5 eu1ez4 8ll$9߈Y'2UݽOǹH*;Q?`<3Lj\CKnk`OwK$h$*6)dspX%i8ɻ4w&lpp%oO0$M אָ,oonn +/ hZnReѲ9=_̽ RO+@_gtU![6|!UMJ$J"Ef)1jvOl"3 8{W G/r{3#SS)Hpynnceř3N&ڐsKoXN/epqy3urI }T -mfS@-H2S̤g@dCDGf6V7 {k/\'_ť"+빷bbc|JG<%t󑴷-Un "XRkBh)mqSW^Oint+ $=/!MQكP=6>&韆do{wscKݚ9$7!HTظkIOdd{wiqMۚm6zp4됄ݪl5l Ú Y(]9]P,j¿Pb e$+Ԓy3I.>ӅKKC{Zx6_x>/f`+Y9;ޛHYZ=XiN} [QIci]S'$]E1IwcT5~टY掞ćG䓈WJMlq__>/#2ք/Zؐ8?]^\i^]e1"K%鸇}i%l)C٪+~>';9ܗ I*$9rT`8-^@Ustt,':Aޅ6p#X0[;~e[mp͓lQ#1"x&I 쵾~ci +ͽ}LL-DRO+(TF.=GgZlI oБ`خgQ7W#n۲ G !JT72KcTdz;bfWH@`A9 GJ{{pXKBR>Y I{Y\y).GV70y%FtH2)Gg$]HRPӋS e jC\2+/Ҋtm>^)xw U#*@v9 TN~tJR> $Y(?K&Skw$ҍ877A Vנm*IC1p MDlIRCRGXLIu2X dq/SD^_<)U;bcuumiiٯ[P pVs#$7z&@ݰkCND`M3@8( ƞ`|:?OهfEKgF!Zkfwh?t02IdcX־\09)4KD /IKlXыll7ė"Mѡ?}|LʏRȹ/-# #$gɖSx< R2/gn$;sw/H21U!Ɂ ~ֳأ3IGn*I3I++8W#cq(Ékl -76$Ut_pZ}Lm=Q*6RF&UkViv635y6=yxzGhddqI3Rk^=>ŞVׁ<<<"jgn[)➤wAA2[Fg^ᅰGp4T;TG$ݵNy_^r%GUM/Ba}84Ÿ$GF862_߿܆64XL(m/X^vcO6BWzpл"D RΤoX-"IbZ I)1qQ2zd{IޞOxwhHJ UyxGnRXJ&OnT CʤuF{/Hz?GJ?Q&Ԡ 1m4ЇiWx)%M9 Q?ܒCK\dW`ElP oQ*k3fE&jg[[# no5̎/.n,̯$cUb2k /O掌3-wdw܃R kHA%XGQh\iť:|=XD\)RR hGVOOlfmHeo}sr-//o*Iݽ퍭P^ks{+0 {+pu1~_e_&&]LSPaKl.=2@,=*18`T,'Q--Ꮧ~], [ʵ˙Wуzt[9~,A1*;b*z..\ɺ T)`Ko1*V\8n8Gؒ4D FM&+pZ88+>6,2q' ;;H nu}qqtdjPB5{@R%g8N!ED>I_Oz=O!?˸^yH?ߧ fossnj K.-ݿmn$DW `ܟcs\A+ JLrK1V^rT.\%$JڙШ זI%#-CRM UR)qC7j䩽B}B;xR<;A; EXJ&|!OOnN4QKr!8KqHRs0 HR6Y%$1xwX:@"ks`#{ųM~;XI"T)hmelPx;}M!6)\"_4(M.!"&z#\ٲFd- k=F9q]ԑG 0]X\y]yNSk/ P֖v3Pg@!\鸓Ql@oVCPI7oʽIUbaeZi{3pth@RAjYYXzF~^;ջ9&m*G1YIo6gHhl-Qؒ~J$zGp2Cn ~tp!|`"ւao\YLӓCv.tv^A yg2Ӈ|$/(]ነFJck IG&OTֈJ?~ӐtS95N*bXUFyP3'g}C#K H kH?񼰷NwQ%T/먗u+{FskDl5&t+yGei.EHf%Oؚ|J"n;u\bHrӐ>K3+y6lWG`fk:ɟrtf !L)܃v>:l,@RmMJN)Z5JSn*~?ȳ}{{yntTq{g}}qvxTmH< lR&Iz9H`H[ZXXXk K_ܺ^%Τ:i[3x|uEfH"8`emLB噠;:> IZ^{' &7 ~55s mz  I.HY)Q.ō5Rd+3Vق@";ΏLML,LLmovRH 9t} CG4uf|-7Ĭ`j#8kr>SG^ߖQؓ2Gؑ}mԎOT";#\C]zrGWVxo 3#ބ5lLOϟ-8>FyύZ:MzsrrbͼwݢP]r)g|],#'4%TxGؙY*WN_"GI*73b+Y,tV)J7Yդ4W:&\«l>'nOwNkYBB \f#1\B)o1a#ՓCR?jg3̐+/\нymm//ɾJ CG0ա*4nFFҁs Y|{L=UD</hCz,_okLv^ᅃ$DC$=P+,E8#8:@v|I1?0 ﬗ{p)!:݆O}x{W@EGa~WMB9"WI껳/oB\qF .Z#F^^~ų5J4vfm ;=Y3̎#k+P(>78eH78=zdl>l)=F$f~;MLό$sp _JPƎ$n}=vs_u&+^[?/ds#okV^DY]^;)~:=^_лl(́{D~Eoɒ9 1+4[q RNa#Ѩڳɾ!%: $z )0%M!9VEBADZธŨ<7NХ_8?iTxn).fJW\o ReqeV,;?>a 溏\s<0 $U/>adKtVT\{pF ?<)CR@tC 5Ӏ0aj #B7r{j$]ur/0A* JLa+p^0_DF=!>:d!&,')WQSGFbu4+g6ݖު:^|nBԤU=mo-4:v˻ɂ ߛ] s<( N8<2v&P#)CRԔ™3Aatat 3dD&sd,]}maͪFIy2Wr67d2 _b|wk343& ns _ IVi bߘLe&I8ߔđݙf(7Kk-Wp{pTDG$+O&0K I2$a7VaSO%B gfZ_[Zz^8a4qO 0`{kbd\4s_GjR8*&-= ^,[c5 :F"щm[kBJ-]n,QQ.HQ4fO9-83Qfrj6)=.$#}{5i,mwprlffy`dN#HЈ1X؜S )gLҥӥ~R)gAo*5DwY'm _9Iw )sK>*p t ZE흓Ã3.rdךa>< <ӷS6[ۓͦ^CO$ l8oNS#c[A%ʮX 9 C>ib HJOu%m&]L|E({7Cbβ lbrTqc2I>Q@KBѷE-,IƑwBW49p^,$X!JH{seeqvveai{mBgGG+x -7Ɔ2o\3llwe%*%Un{ $јw8( YUᱲX0>f>~RL7;Ks##2cwSI- _GO푮mOo?G!]At>jZxL]3gAl@;`{&׷yJ*01D=Ee9T$]Nl6Y0-6KRjM&uQDhxʤr{ace VVV>LT x *D#JElf&KKpCX!=LRmX+h8RJՠDF\-ΑUOe^o҆8&` J-sWWx=Ʀڕl҄Ef ,Ya2{x tEh[FtLj6$%[>-B4b;uiI#,6 i"@G[YSgf>ϖ+]'{F I  Pw(Q>M*%:4A&H$pRY6^Io+ uV~) C&. Q[|4OuγcX3kk[G;~&nIZ}H"X|z<<4g|/UĽLTRߛm(r5Gm..gf\I؝pFY_.[yq6?3+3z=x17QPyzRJ gR; z lԇb rq;~vtS b'ϐP$]xeHMeRV4F`mp5f21 ]Y\X??. եٱ -N2!ӠU[;k+I3*[^*8(.`~eI7,q:7bxV)">uJ&?P>hmԅ۠x B,j7")HjH-;24gCmOvKu4&2I)/`PI/3pKw"2!#xɻ~z|萴2?Lipk}Z^son=Rgn,5$Jp\|Prm-....Ζ['OGF&녦.R[>諌ZY7 ŖԕўǓ:bl e?/NF4'EL1$c lmuCҍ54T*۱Q#rpy GD3DEGҽP^xTdok;sTR|@玑w^}8*م@+0E7 37 >|+eu)7<[q;w}RI蚖eg7%V84Yٸ-QMnxe6*K<޽Znϯ 53hKKR#FV9j,GPI .!߸œ{t&CmlHb>N_= w|۫f{qkC=0!aOu)U$EŸzDV<&M^7y<ȻN \k˫ jI''+エ[ƉZҥ'W#XD3f}H hȻ&;H*@e۪I^v I<"mFbʺ`Q8#mF;IR)?.{5߉Ӗ^I)$F񜠕/2F؆5 4q}2U#nȹ?Zu}FB-#&;BkμYs=CJWƬ"r/.VH>Tπ"-\7zْٔM0[ih FGO.:٭mohUhMEseQ?z3?@QXؤ>lHzdA @70q^, %mŹٹ,o CZ$=»MGyqJDFe/XXC<]@e8S;[NehbNHLwIRw ^歗wOO_X3Vdr{mmwc] BϏOOFzI{)Q4jdWw ~:; 3-m︼FUp}s IDoNRi^$ƣ%@*1a꟞]m LI[W&B =2){ I,I(Io8_(>9iɾHf3Dr?Wz)A2R_[ik{}xOXvo+Vi!)9e4o,m2TtE6 v;Ia&Шsh&7?C8?(Um^UA0^_^6ɫKk"Aۤ"OJ?;L#:id[G*emwZ$0FIݎM#4s;gJA0 8[*]Y)Yl8RD|kXj),!Iϯ,-ң; ܤ6C CU:3>=Mza].RF_\uf zKJ$_rbWj@4YV{ݭd!VY֖H[Cr[*)=Ick4F}ǐ%Gh0D4AlPHM߸'tӓU+jynkysWJYۊK:Bk5N;"KgyPFI&VUp4=?4fF[iڕe'm>URc4fi#M !B@c2I/I Q2Ӗēa6ՠY_ w*;tIo'M0kk33b~ ,Q& 7Fk1ܨꁝ^E]r[҃5mYRDïCRy5/NtxԒVWv76,>!,܌3 }[MV֍}c*YIl%'ob41^쮗w(Ikntٚ]Oddd&?0~d@ I~չO8j7_VڽvLGgT&'N8}$ Lmql."!ߞ46orC֨*e Ȭ16؂Dߜhd)6C4HydfHH kf1dщxnF ?Br*[h刣s qbRC/ I:#{; ݽOC#Пĝ֮f27Mnn[N";O`"`'rSJgJH;{U `׀IOIʧ8)N:<у,~}bYjDj fg hIw\kAOK#$NQaZ& wvkp2ˬr>MOqxm}+l0Xkl<};x|I; 5c,&+n>a@c jSJ<-K]6?IqUH"Scc$TƲ ~ᇻ{I +tDHh G!ivbd8:MӋUՈ4G׻I7-#Y8;/6r;$eHk*Gf&l.\y. +Jf _XR2|s'嶛C\9D&fi<}'궜xIQ9$fԭ}x<8{M]){a8oFYڨȜ.0.%& qF*L&;8:iMի\Ghh`d~tbQfO7⍨dn@Ms;Ny.$}?53`{em`\_Z >$n$kvsq"VlUZn/&;{h)'e,7݆#lPn>"1ҽߋE\E\0.:;;xK VDCņH3`h4D) /OmZ8ynanQb譑tA|#K2R$]D"*mwGdfM%-D64x{+K +v^4Xm%i@dv^Q:Ve,-w8PϽMLGg.؞kqg Kt 4XZ6ȓpM^YV@%-_$* Ԟ p;pVؕHm4ϏT ~!L\di/>r>)]C^8E&0ք,хa6@lX2|%fRؑJ:^t3y8 g&U4Hzwș>`n׿Z56Cct-]ʗqmJ3 C ({#t]@/u!'@]*wS|tS@҃ IvX%Hh#+-d33OiPj=ur(+&?n,xUwFfy)XeiB4o$UUzMlԠ/IcPəîv ٘PF'BIl+?E$41> @-" IR&(GR2t4!Ԓԕ&:s[:$]7ꊜD.yxGpLM֌%!@ph .Ҡ&>_@<b>pS4al^[[Oc<0cm ^F/j_Zx6Okv8v">Hۄ3,y+p~{&H&@)`Qɞ{W؈y7pL0bB(:bP[u.oo[FWe"ֆeH- g;I@rjplIX3[f 鹞xIVtG>̋T [a/|&`jOY;]L^JÏGsff͗M.A <4-l~p儖d.1_l&/|曑i{}}y~4?t{cA⪑tq4A|Kb-%e >=ITd 6ɤ3Iw:'&f',^$=;$]GFg^VRz  5+N5+5a;F߇w? mmPxx 9> vONAȌ =7%Dnpvme3%eN&T%HJ™GlKxydU:䖈%Gk `σ<$NQ!c{ٚ2T](ߧ'RX(=%s`Vc)G+޺w{]()/;lWpkMVTÝӨo| 7eheE%y0 AeF+R'@(2YҾ '+4&JM[H{p8V<# %%]{ u ^C b{ $~{:<7E~C#CmQeJ=/TT0ETCg:wL 3n%VH 4%8X,[I5904  i/Czoз IeI@"mqy24bKJ}9TG.T@9J#cs Ls jcDU8AI9L SNwnR9/זW[l~BEFN "p-C\BsZӚd&xxGZrg"*q*J&(6zk(ctti/sG+-HKv. ۻJKB4:QV髹M"$͝mH` '' W9*׭-%9+TA̞銌G`sH` [1xzԖ3$)HW&6,2CدH_FjlnYR/n_^ -c-DP _6&M(902nhqt&o˨(]߬=]Q9Z$w6){`{#8H9D_KnǨp{qnnqvv' v,,--vw׊{{<$ 4P2_qanv<+D hIkka"{qG5<0(%mz@Ca /U`s~z&̴ ;dԭYNYQF.)+LQO}Ӑ8/ I}ˆV[u+]COOH u֖ل78;ZA:ȷȏ^99))]lD ekʶ9_oDmurG6/CR7I$U$PFtM-9I8Tչm7+]D2I')ZQn9hHW>W|߸&U/&&JmNƖkmb;2hևoD7I7XjQU+ 2Rަ%{ۮ ;/92Qrc}"-sfaCWrCcK5]J$aU//ใER tH|)N ::p5-`<͕%R_e,Jgitj'/> 8Cv%I_+Ʃ5"^88QUמoh;BICg?qY!eQ,+gDT*IAR^^phr:$QH; 74SU+OO {H`{{ea.mȍǤ1eqff N=k~>u܇t%[>El o'lu6*=8?Ox {J><IO(fRN홤B Jf{kQ*~^ZOZQ$)%T W7ZІݸBIeJ76\3>][?=ruCmv8 R6ΰ#AX-vHОSR]t7;jp4h/Q (^$GE~d7,iTU]'Ž$$8;tcu'kRt5(_+ )^*`}wc@ާBagK Fe/OlI_h}Iw w罤Qљ΍}A . {[[ , "QA޷V!-t'H}tDlKBjV@X1jM&gKWD&_aO] #HDY~k WXi-OEjmDћaOͬz[/({? Bk3N!A[Kߡr3@(3Ɛl>Յ!_M1ˆ^hȏ!,_Cl϶ "F/"V݀ -յ'(sakm=Fii{{}y`hsy^PCjm_v}+& B9u Ry#F7ђJ7I1r[tڒݶ_| /IGŽP4rDm ^\zHpk&H& Aږs'ŅtvDgԈ;JWHr[U=H$AduѪq7ϋUiz{H1r>p3-qiuaz}3I{VnI%kq-'bXZe,׬~&5&XIE_T߸+PdFtۯq߮ˉhn`4gJp&+iwMI>ے2H}HJA&A,j̒:zU,I*=::V {\ ɉ9lѕ@t12['coe8<$w' i]M*/ CE-MV` 鉙KR[Љ5UIsW,lOl;lNpN8$ `I*nX 0ZI[sKGo8gpߋĭ.61rQir*Ը@7I:I;WN f7Icc$OYq=EiT>'dާ'%#RYlwHv $ $=Ew%IzLX|# $ANQ w8&'2]bv{*$ɜ}r.pQ-Pl퀴+\%׽j" IbGVte_wRCpg`se<հS(SQqZ[b\`]?5YX*/?F qF7.ZmImKioow[ HBû2]% epuOߒ$HµS,I|[#\/BݤI_UIpM뺝]Q`o^Y.zffce ޴3dawkW=G@AUA\2I_L=1tzJ>T҇p֤QHG}rץqIJ}: "/={}/uUB!w2D ~N=7D$iku-_]__YX([R03s}G晜7VيxN_&$@6# $=$ڒ¨-IٝɎy~ZVqRت^@.  7Kg?WV+DtD{Zwd% Ys(M"iOzmH/I_Uq]a3hoޓ:+R$$]7|FH";aK\jDo%dnTMVqc ^% ni$+("4iZ I{<$Y$XHp-!Atl<2ą%췖I*! H*{ロm ݍ xCoWrvD : Y I_.͞)>R 5*u{>?ٷVVggpYapjS>}1?@W$\Q2Ї~jzT_&fzE/Zn#⌲ C#psF.0vI"\ w`L|>It1Ix# (D]O|aC.|S NmFKdN8EO/lupUM.1ean Ƴ!?ZCmHz.H+phɝK Ž]#R]% [OWAtTY]X"L$=1@WoFզ85h O 'U$R;yCxк|wv8xҸ]IrJgKf?,2OX, 5|-@GgJhrYg`6&^0@m[@@mo[C|m\n.,loѬ/҄x|om ~=FLFGu3,tuȔX'p-T#زGGAH'y~O ;ly9spHA2I~Xl5CzGpsmDP./8> pGVuM<1_lLjOM b;F5Hb E NHBkgJ%*W>'m_\,m,c\ɓJ$XdnQ .=|I/ I׋nB,a^eњ;6\ &$`+$dL@9T:t23h" rl6D+~H۵rV,>{^,><+糓OKK skk#=\[/lӯec(&ŦWBB!GJ =Q2H* $5M S>|{ZL$I;5Ŷ+_ӴGZ#-ؖpAu;b}\]\:}RqVݽ?/ΖYwvڏـ̗9'0TLB>am𭰍pЖA:U[k&w5Yl\Z%o[I?D $_4 =M3IGWS>%wԼ5(e斎YQ`˻ݍ O]D󜿲NK"p|TnDS,@ܛ{<$b!xw5({ck4n+C{ҸMv\2{M ,$AY y 'L _@ҿ$aȬЊM7I' FU/[ٕ燳ܳLAXsuq|tzgs~fY9? ]'0d)HK'qqEBFz]W,w).. ͪW|'lEȠM\&$~1<8`gh ֖zYq#@W$ 'XIꞚtzLj Rpj \O?mmoo,<[Q[W3"WU$/YM3CBM'تJEx qƊr" 'Gk˫Pq.7 ݍJoP CR߆/I"IؚPlZЧSXWgN.d#Tfxbb6slE3ݍ /d tPtz` ǃ$1rL{?Ύ?HXk+k=b]g퉻DsK[a+Knh<}>X{X~Ȑ -eMnFD90GyҾɺ2Ϛv$-=$f7 J&~ZgAH 9$WdM{r# @U~hog g^XpGH7m-kt'9j[$.=' 7Ky~vvovGNr?sl.P$*-k[$L$WE#,+W푙$^WIܱ2O# _K;Xj/`bhF 2]{"7@Is 4rDh0\N^#l}+p: 5TGSa5rȶ,9>UwGVH| ъ0ɥ3p^ ;F4Z޶Q I=8ĺ:yFD1V $E+> BߜP8[;vAeÝgFE1^Ar~!p5AapL܂;bc4TgHFϘI2 p+3ʗВ Z 8٫lL>I?TM`07dyk+VcpAIJae$$OI[uK/@ߥNd Dai,QF`JѠomlgmT|zՊ=<}躣͙GAy ٌjG' =ڐv>ShJ)%$iP)1=@ [Iu}z|=Kss$X I?^܎ct|{'$7/Aa-7 '?>nVn">]Xڢݨ)x)H>:1=鵑RqB+@R ")_t?`α4A4j I~'1@ҋ+~m(yhRmliɇ [kkKKѲ]~싸x7Q5({!e];$IwmIYS6V]jZ ;ssH%_@>?*A_Ӈ";?6Fފ;Q9e}k|xJ&r3%ب5>T Q:(4/t~)zT~9&$Hzt`JqX,y)"\[X(>v/U>'X|z2;5Ӭru9[;N۲2W$4XQTE[y9tCdƃ +tx}o?$]4ui"D[|o.mvjz~j/!j'J8ؤ8J3COO֖NDӖEsr A5([^{gI/)Ǖ/D.Jr@ZWl .餈u/uqٌX=Hb *$ !H*ۑFX{q'pwPޞ^_H|'FǓɼ7y*;Fεhŗau Iq;NSGʷ,ڷ ]` Iz=rRX?d{7Fk[jxd$>(7z~ckHxxns4)z"HdXIf5q+#{iKU@BQq{}ڞAsTg $څ no %Hayµsd'1\]\|$8;[^7jbD O(M$!vlҐ/M>7|Wƒ&[32Qn3LlfDEG2 $s3N#_@I $}t'\}xwo,!\5|ld *1VL |$I!Hb (&ƨT1քG{+j{wjٙEԙztO 5[z%qpz>ˏ$$!tN=[7WN O?:- [\%p(HYb@Rzn3CRX:eaa'6!TNb $HC% -LdЫK!T}+ʼd0'2D^2I&)0mө!EWjKtU$w6kbbc3:i$=dHv! #Hbilgo_>yqvqt ܳzH8Y_̿O>7v.x<]OR^HK-u 5IW>epCK>Hb $U!%)1oMV2?ǁBlMݟ0Iդ.~01ZK=98Hƍm +\+mG|ExڰNd $i>$]QaU wʹ03^^[XYbvqTܠez+pma;}Uj=W`\bd Zэ$X p3@I@ҍAOMblsxR<-ϋ> fC M| mTrHBHH:Q-.,"%&y 4 TN. m` $1!BIId)}Of[JwC?/NLv֨pvo/J:nUǐ T>T4r1@ҏI *s m,Sl3=4sopY*Vu~$<$U(s^J" &W6>E8<:[#jtw6({KAt3I $}5HY4~5RP\Teˤr&Uٰ."| O I0-G_ u҂TkUHb 黀EHA`z'N-#T" IԖyqH")m"kQG 6x^,0>1[/ky [ S%U N IF=IJ4? CiEH>\ڠ{ź.Ə C<.y! > ;_^&g1J.oL18MVm!1@I/I򒗙$6\v2ؽBv2=$[|+ =pwD"㑤e^×?? )sKBF%zNft9SeG{K)ilH:dK-hFGן{e/۰^8fIe/)' Ba!xюx0pQV#b $^H& יcA嫗uz֎N\ r=$c^-O_6k:W|fv)99^^,"]ok5R1@3@WC7"*[Qzd?o"pZۣ!o6#$#"fZWe' xprklΎt3n*vvE%zIWAR ._`ml yrcCKHb CU $1?[jA[wvz'67VϮU!GGۛV{! ` G#dSPXS~,233 ndHz $`"w$PCІ%A}mMeQ!  O//}>=:CHGݽO/l+r{rV0';.`BXN j+HzِTaw[Y-7M4 SgF$v??;f:w٨ŕ8ltGD^Hzy H)rjaRRQ`_VB_k.-Uʇ1A>LVZY ZӰyU _Q^ ~E1lM-')!yUvԈU(Ԗ*L93!Y '[sӷ "ѩ6o5bec'> $1Z"u CBk\q{$Iԧ>l ?uOuij!H2T6}٤Xv:qTPVYFV$d|qV,lmu{|gc%#ÛQEIb JguD5W!HVדHb 鋐$y7I $}$&I(0b4|aw. yzpH ?mDm6>D?K|k=W)7)nid $&"{ -[ŹۧI $IUu}h.@I?R& ۦa diE.Pϑǣ؇dkuumiX$vgkMFUONlJ qCj8ߜZm7Nۼ091@G$z2IՒ^~ \hx'5٪:IwQI/H %LackRfq7oPx8]i3I_~nZu#Hb ~W<.@IwBR6"0I $q) ۊfc Պ[kP0+L6o2-nɭҹeVNiPtgN=IB69EkTN4[oUzz& f%w]G\]H,)0@7IB $n[Q|s3'$εؒ0IXU22OuEOo0wu*O"uakAV>Y' Ԝnib(Z6=-s>!z&Ol$^ >r<Hb 鉐 *?Gh*AO@I_$tkɽ&~@jX[Fl<{f槧\Zf'pAT/%=$XN24"*I ${d*IUqu"'W?ՈxbKzskާӓik{mRКk7RPmIXN*@A@=ƲӭQ3'Uz3@ItIgzHb ߧ&[?Zy;IGfw g3H$%g6VW ;G;mޤ gVܑ"sz`_Bsv%ay44EDp``d?7d $1@IƐ$nؐ.>V%"1@ғ@[$ѓIPmR^5D:FbWN}C_OybjW` I#uCM"جV\<=bftj% D i3$H~!@!I!ɑ[R'I $}oL$RBrp['n}leI,lA(7fSnvu*zY0#9E ~UH >9 q"mS`.L/9Hb r)1@3I/"O ->{ KoPxj%u:75Jꆨqۚc͌_+1|Y^D،!IL3rF'$H $1@R=Wvi-W=CٍB%c EjC tFywbЄ M='j$t0$w̰ Hb $Hb >)%* p"K* M15ՇU=|S鵪CFU(N$$x@I $1@ILHb .KTBD J91E]V97I<B3Hb $Hb 'HB D )Q`#왘jCIPy` $HƦHb ܷh3eZ]O`J5!5#PҐT$Hb [$YH IoIf*kaKg $1D3Hjb kC)}q%t!fwBR~М !!)nWoDd&$#$O bkJ3$KޅؖƯ wΙ3!$E,dBR+ǐ)HhVkH8 U>"!HچjW("U-\]+۪XՌH8 t+ 8%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/IENDB`calamares-3.1.12/src/modules/locale/images/orig/000077500000000000000000000000001322271446000214325ustar00rootroot00000000000000calamares-3.1.12/src/modules/locale/images/orig/bg.png000066400000000000000000005322541322271446000225430ustar00rootroot00000000000000PNG  IHDR H«sRGB pHYs B(xtIME  8>2bKGD,IDATxwWϜNb;eI b@;}!bBXt̷ A qb::EQJ{?^LWwlӖ=Xpvx@vvҳ r:ƵbI-ː̉]tZaҳ_Wd|- O7*}6(N}"#_ UO:@= 2Gs g`Z{`L<0ﭵWJĊg`z[lA ]+|s>Ǵ]RH $X֝EG7pU*,Mf~WA -}  r4֧hzh{Z"E7,6Xu~'E3,9,X`" QkX7w]%$E,X`D~L#wLi']fvw~#,X`}ǾEoX~:*ȟr?WU+߻găU[ă;,^ `"EE O@/Uzg^Q;Bӕŧ=`X8f>`C=qZoVB݁ΑeSVx;I}bJFL2C2a l>WǡO ,r"E X4v;" 9@'u^"|d4f>'eŽay%5ÑCnPKtt7bCߘ\ϚXYG1mTeJM\5aȔ#1څqsט?۰54x@d ),X`"E,<sFo9VJ:CW_'LmL6jb#F&[pJk2gSɌ] IL`94Z|Q _FE`Q) `"Q 4!ucD%NU@M.? *"ڀPQmvL{EnDzEq+TLxbUp W-iU}1XSI5JJBC؂[4휜Uь#o 'Gxv#⧗7?\CίNOn//07?xN'NH8Ԛ:ڧ%0K3w)2,X-,X`jSv"(֗#w;GM]c*uDΝ Ny ;R:GM [׬&ySdz0ZQ!\5>~Ϟzbþ4UPLBR#fυba;㬂(sޡ)vI،K xBio( $QO͑%sX1](7dzgu-J%SWWg *^^zs}dNϢ].{.?Fkj v8|~_fL}QgӛcJKLjY\&vajT>VpgIX`"E/ Z* RS5RJ/ġU/1Bh-w )ÿa&rq1xڮbXN6RōL1Ͱ%ƙ%oikowx0Irx5])_8mvFVɥggN|pb`1EˀEM\};Uv% )b4!FZ +#̸rڕ`f{ŜSm9 0mZf5a:jc"EFj䪷>*0JVl+U&@0rq/ mVcӃ4*0I,=[) zuyqv|p0KnΩi#fNvKtn-&~{~y|B`kԄpU8hHFK0'N%b}x!jɑ[Lj#D3‰g@߉N|#KK\n;Ml!8՜hd2D%x 9.4<1oa@1( wvzs~]Z1:FbTUvW;:"+Ry !MAbܼTY[*K0 ăE,Xkyw=U +r -݊eł_9#Xmyšy2]vD[k)|gk8ROTU߅ 4Bx"(!y USTVĆqKǨo[/u{D1S 4uv7E>K-"pߏqFl.|ɼ?v~|@MZǯ.SYxnꏹ"kk O5o~5>R.kj} 2ndjXaE3}!֪e,Xg{aޑTE%jFXBaSYŒXQCrɇ,l,XZ X2o Z11:Q}=f~!Xyӵ}%sP;|TDV3#S-7pGө{8a#ׄo!y׷?W 4H=|:΍Hu9̼b +N9O ViZx=…}sH`peZ{7_6N,Bt*llmn݃w7)Ai+gZ[ " %ⱄ{mCʯFt',,yHbdM1.=/yoEϻ qhcWuy0$-`aGX'2"BVWգBf"k瘩M2$kVqsWoJm`![b?g@r_M&2YF Vuۄۗ?\_j7_x[nPhp1kF01HD8xU.ܧT*^ZiJ-*l\Ѓl*VS??mC#l dn895?^ѐt^^[4|_/pt~N1;Bta]N^x7G9seE$ J z[ iHBt[ꙮ} ڦޙ@0W(C kX,ŬF 7VSt$'(]@zHϙ/;ۻ@|V-*MPs+yp M>~Oy{G+y6қroT$..[vw[dPX ]1z'տ ` "}!< 0@g':<O_5 ^ָo*UK:M+oɍx/$ɵh|JirLStD530@>5W[oh?4Y3u)xYR< yl=/5UxVtX# !x`04.q=3n.Ž꺄ToG:8^_fSj͵UWU;"E{d9Qbn;ͩfq|w^*| aƒR3RU(&7ŒHӀ=kXwu8Ũj3m?pXʣڐh lF #_B 9jT,0PKBS[~3fYX`}rU5A M+YCƆ)0t`=\g80sL4h\!8ǖoo-e5JWjL׿jcF2HfQ<M"AZpV b2x>[-ttSpwITuw}&8SE>FXTK (H@D\a"m=J4mHW<_hЂ~Z,} y |W 'BZƟ% LH22!L_ Hʏ`2LQ77JlrɗB3_F8-Z"Qt%65o9qƁ2 Rj śT.WR{5:j:ݛ`*A7~,\ B(ˢwsd-7(28az{4EJUr\gI,} c5@?ЧԎ ,X >lr@h&qua@Ĩtީj{T)S"˕+"t~ Kz&`w/-Tɉqe1iM*u–4| Va2 R/|7[L(r9:?[y`"V}U ~4ڼ+7DVIm }CGPolQn J=}1v=6N[Cu6Z峛Ek0wy"a P\5kz+bO-ۂ MckӓH490c_@@sŮN~%xc)VX|yqz+[]/ds!=|I5Y=R?>GƝ M 7 TͬpU&U|\ 9QhECFƺo\.G+QD1dәZ6GwzM:I MbZ/-ǫ]സcǪ˿,esyFfƹ@yg؍&TZx._VO\-?MpЅbʆ$Q H%"![Sxh'1AΤ!MF5 'B@uhb@ QB+I%EGXW|V5͌61=}"fɇ|n g҅ƴ'!_k/lQrE;"+bCBf,gc~dp^7]I-!kbw XB&:,5\*cј$r捄ʙeֈQcUт&Kѻc:UՔ rj b0gLȲ.ND73]]]vml̾oZ  ЂІ@BZ}1m\^e>+-EQ= !Tf*=\`GJ(mok6Rg: ,ӑNi9KUhW.~-R&c9:Pc]> 7wGd3=8Cƅ $̊"=V>hЌ4(#mᦞR~LJij"LWGl}pπ2?&%2` ui}wPk s@>{qɀIʿZ7x`>'`V`}v0-RvO}O6&j#A+B$wk3O.BoiC"v"U8i)HfT[2M:|SRtVu]Uqomg?;C/w]Jv锜<HzƓm=?UIu@j =k pO݆ DB:u@];Gd_ʧ's3@-vR [*:BtJJ=c Ghמԙ‰"sSo"l!G@.(Nϟ}^ZR:kݚֈ~$"3i7HgWNO$)+ ^>Gb:=qdbPhY)֯ `ŋXЪ0F{!!4ygc˦i9)*U!?6؂cAk`J ֞u$^]iяu/7qǻ'G<j-7I2^N)R_:bD Ȥ}pZqA6Tv5z|!d;;b$STFnu;.juuSTdmOTbYfWR,I,kQ v>$fR`CḪPbj!\Y}r:__dK'IKMP?:=7}^,jLb+d8P#yo*7X9hR3>*rvvCo ?xYcRkӕ\"Nv<`je?aJUWW$rJAۈՙcuT c*B( TEG.'Q \dر|ŞÍz_CQ@sh㋙VG0xɆ.oƭKA47$7`,6)ܔ!3:GpN5UCEUXe~>l^?Xi;_ˮH|}_Tn,'fscש^ZZ\%WH턑gW qF+Lv^c#,ys=wOIA<{M<Ō/OӰh ܮ,RWm_auǚ!{g}IK]>2Y\럞C=k0Q7'WARAytEw,9SNyk1iwYRuXo6#c,=YEgcN 39"O+ݓGp[[8KUVqգ!/TD3#V>V`=`b1qԸH﷎ouVuu_h%VWP*=ϙ`F*/ H%Rկ " Eohrf~֥ͩ̒?j7egwY<H DqW^^wN5)Cqd!غ>R6έK+o@I$ǟEUX_N+XWDɑ[+ebV?&FV @8^0 |EBwCNlh+3ahB>_ux 4p>>>>:1 0:BLJSP$EeӰ̷aDoUZIy. Zu=Da09k]07^DWW~vr28lΉVu_={C\^7,` !u m4:$_ٵXr^7DH Ϳלhu2@ff9M¹JI8s;\~LfJ5EߦaP|Vl$W~W0P!&LϹ5Z!+U"0MF)xN6Tԍ1\ |J/7:4괧Gɥ*HE< 8`)'tĠ*wwC}C좨ɷ&9}t V%&OšN`y]ŭQ^ 2b?~ݝb~"*/ ZJ(T\)d%Mzox_%{稜4iPo־Z,pvaa}a~_޼>^ L(8vS&jyymc'}d",K7ʈqUnnlln߮Sۏ'W՛t)5o ܣ^:ox{kB]i7t=h2aa 35*NWJZp)) LJOOAEq]XX#f1IrU(eA_㲻c- :,BDMc\0|yKD!qxuY/UЧ~5`UH n)$Qҩ2ccIF$Aͯ#]bTR%\,egIC❤b݋G'2f7XT~xek4QH~٥ jIٲ5ˡq%(Nǜ,,i*:"*`6PFLAJxH{Sm7AUƚofIBH8|̕+O%]73:sFrw`dU㜫ъviA^vA5]3+gːpwkg,v8/ޤ7h x4<l@waXO cS6WR;B[{vIt) JF)A:\>l-eRեO<;}}4>"I._XLr2[cZ7A FcT2F / J|-hS)] O$sI.i !.ټɖQͤKl֚nՙȶ,I\HDE* cts1cʟ7X[@W4p)mOJZޚ$: u2D7g'׏BwuB|ՍN0XJoދ&@8'#^- KYej&uoKL!EY37`%rr3 㫗wwY =Bb] kW Gܿ>"JsdyV`}&juSSllj85<we;uE7>etkz!iڄ/R fER\ˋ(4CtkP޸“yYX'Si]GPvR2+!#2,lZ-N|RuqH뚠,m(1ux`d#gR)a A.Srsݻ ; M;MDg59@ ;\Ty @ =O^m+~!isLjMKܘb"*`]̧k8а4 jǻͮd 2NdBY'bq "E(VoH;0^AMS d6Kc# Ȏ9:+rWX8j:tyjкQ~0z@Lqu}U'Z ~qT(O^o[MFX5(EZ]ݬop LAIc탒F] EsBU埴QگTnxbk7XJքJ ŢA*l%3. ]Gz-铣AooC6+1oxgWe o ,!$}nM]Tp=AT|B+h*rt Jz^! (ti6EUX.神dC䖜Z}"/`F&;mHl; d2ӫy qHXDas51hZ8xe./GCx u2C7vR@t]ʽdF*m5uTѶn烦sUNgUkFk5j5C0.:pMP ?;$W`:dI>Qf;tDI z'nomEt;]yy@,Ӹ:䣛 q./>XKxN7yN@~D(6R ͚UB#@0U=h7Z|4"1К}s#i M?[uuܜKJX(YŞt:Q³F`+(s@hoW򩡶hvGFtZp^b+AˡvJZ*c`rS$˰d˃dσv98Qh)CO@\eѨ?T aozpo#LEUXB촒Mh)!I/{ W|Ϟon= y,1e}mHw[ e5eL,QBao$ެ+e*4vIO Mn˯R2Ո[@5<tk۝4eƥFy -,;l9۵滍C0[ym&?ƌN_UA}B &r7o_tXG(ZUɍ)Lbxֹ=wafnos;H=;>sPIQUWrARtgGu4)eҢd0dt*>'fcEtӫS&Up*Z[V4>[ZIRR.6kbj^(հwG-f| !/ E⪩OUKϿ`=?IPJVQ] z;@;3Q5m<ː ,9,QLYH(@6?/̧e$Cd@-&RgZZ)~N Franqwl1S:-#A HkX.o<_=F ]*2ۼ{R?OO$HQ^$ Z=m\̎SObXz?`XlhRFB12?~,oPhc WX3P itA{pey{5M| e,Ga +ޠj3S<,?y<_F{5>~B],#.3 R_y_E0X7/ɗ:\0un^~U.IwU~. "Aw/YrqZq~hz(wJzblrQ?6@bbsqq#`Sb576\7Xc"]5*#rJ~IkKծ*wIK=Ds;j;5Ac2rBR drpI>@\XpT-Îp$R*Toq!)2tc1=q1QSꜛ5{5]=&Yr(]PJ/OOI bEE' J. D)-~WyYFX@/( X[z[_=?"I<cpe0H#w}J3st @=Bb f@xx(ۤJV8$>X\/YJ롚.PDJTt҅ozN08~mLf Cv($ڦJo9)LP$cCx (c-[5VhZ;ZEq_\;׿{8ui<~rK@ 07@/-o3m=<o=0QXĘQHb:a7=$k gY,r6}7sM0_՚Z䥣ȩ5"O`P{x1JE18 O{B 6 H]٤Tekfs8#Vadd볅S~txjpm0_-"sl'Bt]Ȣf`ۊ>U8c[U3xj$w&(t柞]!0(GSNS݅(2$A'0VBi(wwi[_A?ZKcDP >Snyk;8\"F(NTjVW9|!x1s9!zk>`$`}mJWh=jajԚ"I%[* ;,Bzzr-9=?=+!wrS,WW6i:L< 7E}EQɖW lT _ [-zYد2ZkWV?j`uVa02tWMn&FZIvmo<VẎGjG9iwKv/Cn9Z٫/2FaU?ٽbBR zu3Bm82QM)tt-ߊ)BgeR1ẁt/tMFON0V9 ZI3EL#*_Ή[AcԎGOo`~R\ -ouZ%qT{*CY52{85U:lÁ'Ԛ=&G3þXhvvf,+z-tB^fSP#kK<έZXX0//k Sx493c8M.'֎:)+t˴M6sU\]==>.O`ӲEo.HsWTR^@yG-җ` y̔n`|mmArs-}y2: KXJʓ?q2 Qtߌ-5|P.e+R9NsoawZ2Abu5rj3p`nhḜߔŌeX귺\+U[5o@@8=v6SKD5<%O9Q|pd Ҵ6Sm YWχv_Zg6\m`uB_10iT} ޳VkkۥfxxF&c -.mb{بP\ - dI9XaE#*(1AWpKWCzS)*fמ?`I[ :oI:1qDg0GZclڎ˗ THYɭ/-E3#C> tNcQf(aLpHUzH`,%mz_eWB,3^|\p]"E)OTޮ6i0=h#r%|j} `N+&4raC p tN͛L/-/oQ |znC1$u!"}ۤ4k(E[TdT=k;ԟPeљGrr$ެleJ1jU=.JygK;Ii!`Hv<;63Fm#ޤm=o*\sڀG?mSYk{huRv?j!U;o+ qaϕQa'5 )P~\4Y Euq vJ|܁,8c1:S,ވ+ ū݇`Hxm "û1vzTȏ(wl'\*ͽ-9eQ-40OK+%އ * \aW}AX >;1=4&(5]{&4iL^+B-"RK߸h7+);ܑ+$|0ҁJU#cax{%XnXB #uloŒ (Lz'5xJ*i0J>Z0-. vWX=Rݮ(i/mMA |qω.aHf O w¾H"t|~;󷴲t{ssԘʜ'PQPQAAfy1s%TWAt*U>Y{뻾6RiGjhRwrz~ [ mVgsm٣"^.Xr̓$Z<\ 6(J?gKva CT1yB2XN`Ժ?zq,s2H` J!ftQ>h`-S*>Nt5 9l (uI#BP5^'! dbÆGVC>x,'𽬸{yvI2,e 3EÎ mn)giwN`bR_n-,miĐT"\B(5ICؕ+2 +՝*NoYj2]j뻜8O3ڝ|-,Iŧ1;[RMsX2Q@ெ燐'Zr[jtD R^GERRm 'ñnx(6]A ptϵ']D(b83ViOdž!@QY"NXS+ov EWgbB[|~K,o"FQ'1Y3KUF1eZG(صǧ@zfpwokg,ҫ]&$Jt(r/Q`Vq T,7l `BӦ5Bə_}U Xy?t}̗jLW99>Z6>`{4xaE#!R<3XRbpbssWgOpnXL/,cE<&Bnh-;Qc3Әc&1IyF6\-2"/RU@_&(K/$Ʈ5 T9p=p< '2z}CN!Gh`,y$|NtJd" *w(3%`ojh51~x.kۈԙ5vsW Em#$w<%cfNNb"yB`nw}MQ BiomN k K%,2R<k~+q/_f04w$Qx|xxdvn˰o1 Gi3[L.:l`gpIMUZ 6*0i(EXK9e`YHdWvEj\!%5W(5+gY.>nJ%>Nr1-.) (Е4U>?茳W"^} [9&tf-a2ew)J "EPTYwFӴ"_JZŞaF~n%Y# .k:6&WuXq.I^8?Zd{7MrOYb@ˉ[4ꨉށ1~ۺhll xb97K"Ex; h@6m}B8NX>EcK!Ml萬_neSo ;rdVZI|Y?f(@%ZX4 VR >X:(Otg|Dd|yU)?N+ 2mLwoWR˻+KYMZ4݋* m9mm1{3I@H4?0ϞGW@"iݩehrvwʝWK ʿ2L$Kj$bXU'L[w/S!'p}ICrmW1%|ȓVT矔 fe/w沃Ŵ, ֩0X.}i%>Q*HM䬲kqNﰙg! @PbI*rۙ.3C NdFۋ4\/~zmbUnJX,f;}U(:6R6O>WDћ*ZcE*=o)CHOGGWu[qo5[z&nqhp7\hꢬa: >BD Fv2ƊaZ vEb .R.RňCUS2#"݄4\R7w I(d2'vx-$$@Zb|L<W ,)H` [H+,o`(.8 -% ʓQk[^qUDG~_+GӠی"|ŦuU:9( ܕ,aq2[JX??Z_kBlV< P%pUIA'X|K"m)ȣ7Jѐ%a$̎Gw!>),DIB UFu͞a(,.N2JnIKoq{D^nu_\â !^'?3&<~wjne<ԛ6 {q,mKƦ`c,f7ٺJXL;zDl٤oAj&)GÈá0OqprG(LeȈQA6C )w6zz@4Ó$h]Ȱ*;o&kkۡ9CqtgkĽ݃HL͍=Zݿ{"8/kR){hEEdyUϟaU4+E'kʈ`Pq8WktZ9]! 7V2ܿ{GqՇtSj{Eâ ` n{ZgzЕY\th'gnN+o~xcc]F4|.U"LKtfU8`!f\:ŷ׏v;-6LXz"~͚wΰE*@JJ솙][,_VXud:MUYP@B(xbNe뷬Oi>K ZK L[to(6f>8-tP"f:.7lшo`>h U 7 MqO3 SN~*h)0ұ[F,/H7Ut=mnjŅ5+la&_, c-)pH^R"wtS hY0ZQQ__l*INC7PI?bH_PY=='ݔwziԐJB*Zmĕ'X}ՙhN:]@_E jlvdFi ٦9( k%,u7[jM3E[>Df"T1a+O M^mW[kLî܊dS򽤞|SU^H*Vq@ZAbO(Z`6zؼpJqi̛ݳLĚ{o::\&žIFW- XI(` {xU햋* U;XoXw>+Kn!W7311uc53mjsCF\ B%g GD)?xDnU#hbRe& )+nW&1E}f^sshF?G%'+p _:@kԣ` yPPlKf2f#:p^`XR(EU@TUȯ}we:/?~$QV჻((lY$?MzV ضkēs*-lku&qaHfKM=FX :K78ł|ju>ҋ1%x*54tgYkeG _H>z}Ȇ$<33n&G}ɉB 2G-=77w}R"e_nt:u64?_ZހDc|!X=> 9|i+mI4TGCr.OZ3Lfml<Ӭu Jꥬ\Xa(kA{b'wcLS\t@qbk?58 $lt,E%[+"YPEyrEUAwwZB7&'G?{#e<:[:%"~^|>C5Ͽ5T1tw,c3F;Z¸hIx=q0]3ۜG狾<]; ɯ)BeXz5ݒhowQMT/`b{j7Z>u<uxñ!4[NcVO$ #-fGE/ uƀ6j8-'#:7zi7qG`u` ΪwcL*Rxv4API1 sF#lDˬV >[٥5.SͮQqj:G?+ck1\R$plzNK8c2K-OghL' ml}mKџ:m jW/1g"yKب U=bBQ)kȵfpo[J =p+R2hdt*!Ѩ}&^qK*N EKD ;J?HH:,mSkifmO6i9}ADEKej/f%p}:2L(1X@A3w>3+kȆf<8{|YGAo7laiCKHF=_wz-$b캨|V~|"-[-b*UiLFPel453]XG TbSE[: D:Am5Xxr6|lcf*I EQl>_?Uf& BkFSviKs.g-2G˝_Y^Loo4ީ'ڊ>.6/p#+4|b+ JM;-|]ek:04J./J7Wa짫"5Lu0;3mdZ ԊorA?Ca:gnHBO'y~D2>[;8HV2 Ou UlXx~Jk:(B *- 6xr|X )sC2u3MސHeWօu{,lvtH)0qڕ v* Oh@!vX?wwUAV$=3|4X *(4#-x_g27vWh%$f6ߟŔx)KHk\ՠ|T:w[KR-ի,p\}09";[` pC0GM6#侷wpF"!9{*!{<gP#Wk ŹO,|vJMߥ*>{ѽc>S.Y"◀Y`݉#κBfA󔾰0Ƣxkcb},jۛ&{N@(&ɕZnpYS Ȋ1UqqZv3 o0% /H4EcIv"Beо%j!$: I 5RzKTu=9c($qb"w |}hk~Q+oOp&D=f :1IW`,ƿђAQczK ֙yJ}/3&渚q69wRөE:IRNO{l%*_E( `kVXXF/|KX<L ?s~gx7hRKSZ<'S:9#QB݉W/L#?Ѐh̬L݉=shn:J“',c͟s[Zfz3Y$vI&~JnXY&N4o:9; 5wm74IH&rr}H4Uh]JXwgJm[Qlhh<zp{m⧌8U*PY; \n@8C",A (\QO % Kx|!#։J82QxC3W8 +Xڭ]%e|%a>hTJ0glBLIKbGa>܁ûEAP/#rv8sOmꑅ(uQIeT(P8!cX3+ƙ'4yzY_>0ي\YYi$|@Sw۲&Mo_ak_Rכ<#|;+(xjBMȄHBj V G+seZAWRKdxbbڭEUz]Tr!t{@5eydUjY'_`T@Pk5f%JMSDi9KA$1&hv:s_p#v76PYxrqIʙB=g)!ZH;\f] Xd6J.i^ˡʊfbii*DA&zTp4waNdEk]5!? DE(wg'n!@UӰY-hEy40Wqrw|Pd:*I4Z7]\x8}*^Պ uXjPUR R*еqI yOK^P|5"3\ o9.Rz>U8NÃě%mgZE&j*f6gJh"Xm#\8 ~0g&)xK [w%E.jfŇfj:1 4W`I+luiFd\ %A I/B+)OM@|J~BGgwg'g c议 ^3WY]ݪJFL#@`EW|C=_TcExQy"F`8yhXJmمadF4R[i"=QyWes/oΥ_=}cg}ϯ,LX?>͆" @hjv6G$X_AWUhȍ %(C ]f9)Ҽ;bJ|Vp(u{=Y_m3$g6b'vyry~]1e; Swl~>G5#.KΡc,e  {>x Z L ,RrwPL~.egj {lЅl `v[ [NMͭlYqɴ=^zas^;e_}vgZm^I@*BT;bDouy+f }to2MGXvzaIhP D.y eV3-:뉒7J_8s UrAY]rbX٥357 J@ . mSy f;[Ô2`ȯ՛;:,7݈7@ƿ2m1bv40ۗ'P!?"(yys<äM G\׍xfa!${}r׮YGuw$%*N2A۰;'8 xhcm z@NLKN.VvGY\]YXJ;͗.WuiOBH4\"sXݓZ 9p}m1I6-F^G g, a1X'i. sw&nie>|owuUTeYA@T@FqFqcbLbƪwΖbU>c:ΰZ]RNm JY7I_F) 0^rAJ}ZLW}7R9KN x˷}Lcd)GŻI,Tq `MNԚVС &">Ɯ쵏>|7K3)> DkpJX\q (,4[=)+DoGu=i"@]ŌkM&؊H'싖Py>z~ǀM)qJr~?1ɐ9 g(fe K3Z"Rh&x&Vy&MJPùP&iNd 6 1^Z%1>yVC/$eXD#L9ok#rX4~BK;7Cl/RysQf]8xAfjl1_m)n0W=l]Jp&dzD4''ysyRwv"N/zcxc%xKl  _m8,=ө[%Z#X5ʈ} uŞ3s¢3`O@U?卭CNRCM3T)+C y&eS ?]k4Wra$}q~ K~9vנ*Vܗi0r5FpEZC|9(OEB{ƣPpv$>4itĨ$.\{4]XE'ws1Z6~B Fnƞ=1vwg֚ ~J>: )ͽ.H*{uQ곚4F8GF |2Xrgzȕ0٨!,! *}cN<5{ȷ1¢&T/ Pc_+(?nɸ;ИvWzq+3 eB_XZN BiF. Ƣ8RT܁~X3*!( c,x%Uᙙ]YD*u lTR/וpU167ѻRE]_ w\{̕KEXd q6 6j;=l냖ZN4.-,zBcTryO n:S:*-\,7|U>Tڂj JW'Z)TY^X%.U9c SJj64o Qo42pg=1'^ ۝ߍ PnU ,Rɳlm05|j6f#wDɝC36=W4Nа޿ 5{<Д"*4,Qv5ەs&щ19`,B4러p-V6_Z2NP$[gIQl{s)#7jsdd^dņ(xآ;?";g8n+$R1DX\Xp8O?qJ51h N/n.$VLe/k%CxR$ZҴ 5I5gNXsl4 T)VjD݈M QZJ<񚅱 `iC tqd _yo{X}ҏR\oYsBrщ Ƣke!rz2L dloWZffߝZdV+rgj,hl&:wbj[2 %JhtB¶mVX*H2~DS!@eqKUXA DŻd~*GM7 B!DO,1$ ҩ;þ(شyCAӣrus[OqAZAr]}nEwAF- 0 W&ɜBU/lW )XbQ-F?,hjaa wbj:٬uPZ'sy% io`@lQ=14v8%L6k<gzP^snDNGMv bQ9fc$6\hM< 69DϊVZk1I a֛%E)h@'HMzS\ A*=%Fv☣ /=]]:N\<(˱L)<̺Rd9y2b+et "&^+{1D :KAWFw'n1pq%ctU\M0r̟+ʹYs><#>'n𖩡@9 w`pn\z #[G*Twʴ*0FQR4%<&85].Yj8F[ein,~z\zquf:Y\Ǜ{㶺~*]#q(kHSwUfћ*7U?}2;aK#~!HSE~>ovznse>&=bu/9!Qqf1w'EHQrírTɨ*Fh\)3rql>R4;b[D^ટjCȔqc %$.R$<1`w;n J+mtD SfhD 9U T)?G1"x`)Cd@b^]4^W/@o_ Ano?9GZJqXT|^Lz~+W%4|@eXo9MZ57W@evA&^S$'(eƊ[5\(QCAЋP{;;/sf#D'S$H@LϤ+ZmxdlȺ\+ꤼ aB麾`?XYf$ Lꃼ%҂Ur4H*W;+[(OO͉quKR/3ddOv#ICQ;(l%uQj.97 -/.ƞMC7/i 0#RL>EDX/߀Ary5ШTmw+J;MotvYԂІ9Q,G#xT\TqfMCUw|kXgYzϧڍRV41#0c'>_x~v^or.%fimRB`[}mW_d;P*r)nvj D>)3d E:Xj ,胆6ko JrREM i12f'7cYQv|Xm^A^p`YT\|Ϡ3nީaޅR 4舸5K\)tUԏqzi}7:XbX @xc}y95;]ǹI]ة@*sJ&1/)\x` E:T] ^) y~ ?<:Ph.F4 dn$(>\KGj K l;e~2 MGvJmhY,h)}x:Z"\#b`RS8c3쒾/8i/V.ғ%2T| 5\Gƪ[m?tި5yBriVb]; 4L:(rnDW/ځI+xY{lpxW=lg8TU>lT_0rUӨ}/Cp73SbQT3btzz  ǥkd>?;T :\l*\IsJ1(`U;:x3]KM @ϞޒSdlaptpy#V{Cir7,lo'qa84^؊7U1* Jf;>R:{#S?EVo|#GGR*PL5bl13Fiݩ}P?`G}ə%?56┈~᷀:tw8WôR#KKw{Jm=@bKkĐ($-H4}/]&'yC,pp;@1-/3-1 T H=wv銧&a!%p|xrp8 r&j>)(jÙ:ų,\Y$ ´vZ^f)Nlnܢ?@30Te|vE`vXwIJX2.?'U-HN?w<@wrOuFa' 'ⷻCPDFK2Ɯ+MdnUotɄA"OfoxgT#A9pL_w[q1Э sv3b_*t{&bNKS;| #"i20Vy 8H쑑io"~XG~yg3+KٟrKJ9+t&'Ś6DKH!'Yόܞ4QBN-G:Kazb]g{-oQmxH}A+]Һ(70fMK5RƵJn FWΓ 6A[V™ l=EBBNqfiNTup+bx/1#^A(a{8" $hѣhC !vu{$K-҆7AdW_bah%KN>+އz59SГg?'TXTFFps7).!ێ-,ĵ3(.v$EpЕMm,Rfd*\I]HZt#=v=y%?1K,>2;ty<R%2YH xL4 \`5và<X"H^Nnۿ{zk Wأ~TzwyK Q{PmV[,ޑ{9=$JCP`8?N>hxXmNk[ϑsD`my\J$Ҥpvs"&3{"F3V&iow5:qKyc}W+:5ݣrX!wͿ?GLʼnyrе}j  :DqHX@u\N#]}.v90,l{Y2Yh3:%zl##Ltŝ'ϟ-lB;MoU{FQǍb=d@XQ*C+Vՙ-t,-gr jf(%$]F#56^l4 2<d0:eC|3D%4\ Dk:GT|C(ݭ쁄>|F сEj7a`''0 $ t8=Ro6x ;1 A'l(լsXU=x}I~zξ~U#Xrg (kAhH$}iAj8:C|ʊbZ;:b4@Dl3pz)X"9Ae=S{ ^k+XWdYI 9'ih nSmޱ;utPJo̓O<6fWR(8C ܪwҟGHxBrj3_ljnwl|axIMk?bWolP2 X!T61_(w:lAyFA=ߟfpgp}`-ШԭW7@LG"XrVn(Bw8G"и9:3DUHF/O")?XސTӇ[I?X@`[Q[W6E#XXBHߟW@< ġTҔ^8S߉!F AK=t^l@͖ X`2&1X[e{e ί12NsՈr{Ϡ`YR#q{_czR<>=L_q8t?G }-b =nJS^JLŝq-Eؐ*/#r#(Ty3qwx&wIە;p*ojս?G;j9UdQ"() uu0qv[,2 $X41>CU0^ӫ˛!'@F?)RmH$7ee-MĒX"ec'GBR/n'cK镝]xo b, 9@GazV[X*U(exJ'\3+*rH9 }P(zs}{[9: "fv57Z;oeOOE`va{ ^:%v: ՞O 238k,=n.VI_4#՝UڂFmI:q[e_|6ū=bR.0(Bu BP9]`uKw8zp D~6Q gey \Ϳ`vv"i0Eg3J,|V~Y1a8 3 (8G3Py!c0Z\2Eqccғe ei@7lPV5drRo`_TUN]ărE<03KČopwFPVDe \&ѳP!gtD&Wߢ5V#y}a3Μ U- U#].pJ=1d^ .2*[z^0+G_?$= 耠DB>ys E|@$"̯YKFa 3ˬ ˥?O-wAvy+觀Iҵ]F ! b|h\[S"MC]ϙ5?d9mf5V⍉Fnn f\TyTb<;3OXFR}i4WVp|ypl3ˣqDNЙ64u1(^FtOI"=ށe.MfT?N9h"+<*1M*.g,v6x3MsjiCtokhUyks-$L$ٔGż$!; v?~* :=䜂cS ;a)` xh*_dld5f׶/)PbNZ|pJSqaI=eRM^<'2;C5]!&cGE K^IZ5q>JC/}Q۟ZҤ**UAʣTOM(t*X<$odtdKA@)ˡ$~*IB XĥXMR@CnǷl`Uhll63b!!URS{pqҬ-HZJI.nM.nYH-%!|Hya4?>}JGʋ B_?6<2냬ꇹu,8ǼƲŒH&E HlL.Dñ\yL;ם(~H;v&g/]2|)!uRYJ $oЀ|@͠j KAa򤴢2Cm~iϞ 9f4:ɪ}-Oj{Z*q)cu~N|&&QȤu$ xKgn&䂺G9cl*!<#]H' !LrS6үCM:ڛڇɒ?4\/`X],5ڐIU =\)YZǷ8Fd%c icDa/NNY_BJuiiP^SrM V*Uv|kW7`uO*U+e]ӛ[C˫Q&g{izOic:O=t{8gJJl⠟prj8{kč _Z!^OvQ<#$xp$#{@N43AfQť"B vX'SId$Ѥ՚jZrtM;YQ9x 6G s`^^'/5a$E-J4|2 卬Pև+ͽTK. ΓJ(9*KT7^s#O>έ(Ǹ%񃝽/O0HAFfgT4o#X["9h5fDkdU%EAA)}u#˙4*٨CůoMcwOty,5М^jGT>9X_X3Xk`tL752-lmw)5h)605;=8BE $n4*+#dmuU)w( 4&Y],QoVЃ$͝cB=үXwSڻƋjM``x/+rw½d+Bq*keYe%M&r4XVC[As|1?VV}zMR >ƓzV䢎73K-Qo]Y:` cc'`372yVH:Xbw('<[3T""scqU75i-ݲI="uA9԰ћ˪kI:x66s쀙`Crx 'j.-_(KL,y yHC XIEŻթ:^XXմ\͏ ILANßZQEVKݝ=* {ƒ&`Jkxl!Cךܥ*-PXR3ͽKQj SVͣJ;@#׏H?[YeJ",\2,Й|^?=%!la#' sXaT>̬|iJ+kR슢܉KR8&QݓRu{R@xQFyKG/Wo`y|#**RW芤g +|ѣ_-.,99z3 8clb(DR1$wj5y[Wo҃W XK@\XfZT` _ꅣ8DHA?9M;jai2 ~ `zn7lx&Mʑ$BKX- TU]tmc@WdgX:\0TßOyO^b"-%i\1.E%9ΈqRWJrTc%ƐtSJ69 vj6yR'$Jk!ޭ᷼׼(0YuurãsH̫ٕ]J[y[ 4lPfu'Ƨ /G~`]w$%]1Mֽ{uv?,3=\3VdMRWڪ] ãskw3" Ytm`BVhq0;Z}gr8XQ)blw$UΪKM4?_8K)ΆE`+5^?ۻ2}Lh^C*Y sdQ lPhJPpX`aKahtqS[o)A__g'?-9g= RF2xF.U6wM*8{CZ+P#e۸# vcWlZH(;>3"49cP˔ץlI KزfZ8}1(Ǭs#}jeZ)¡ eHc#: ,dR >I§&)UxTLUtDUޗ}o+e' O=k ZH-u*z8U|.P1 D80[`K8C[vHAF* ,CC',6 8/ҴΧŎr'> C|>G؝RښkNRVyiHV!i%Nј^]`+?aS\_Ykwy|͙', aQ+vZm@SWIRK`}c_??BԨwwUKH *4zh921alPJ]3)IJ " T =8 ,˘Wo!k˨aO(8>P O)9Fd<*"#^ťLJFg!atS2 \T+[֥ʠ% 1N!w^F? cEj@Tݦ [YEu8&mol^yD7ku/|הTTR׽N m WS~jttQ>CȋvE/Ky9\. cĿFT톫9 R vjZ5&mNo^nvSfФcP3ZzdO)Vvjt` m!ȫbk{*ZZq>,(^_YOpY OZfDo@̖M4)O3wA'v` x EkHxKaD($?t}Sk^xN,:xttGUIk֮PrS\KE;m6/{tT"UHMM~Vo;ZY[? sV9I)K"aױ1'oYvD;I%gxs#3c;.h'eJrdvVIh¬e#mKCH+svv=չ xjDHV@ug\#HqGEc3g]$*}ׄ2`ѻ?<傲q3IB%At*Xp2vI2qEdNL VP[,/}^i:/,M7Ic.]λpkz|ue+K7{`~Y+>Z`$fhu=9n$' c1oš}RaƅEK~v폙$,sN›NM䭯m5m#Tc M9.n,Yf_y&Gjj;/QJ?|p$TOA7{Nptq) O*.ͯ) di2w(Az fk RGS?P0N?)M1^npL~X^ On{8䒖{`p?YRS)d<'Q$cD#ƎղDW]~a:e0mf,QLrf4C#3F'm6Jodua :+>^5!t KAƈb\X>̨RcMQzAB0]7,d&*=_Z}((J;a1~gu*D%栦{08x{g|_qW,ːsm)ՍNPpellGDПL<C:-UKk{Pr 4COi8t"ԨB֫wRum" sМepD_s!r*: =>%q*Ӫ`aYS<o >vdUxo|fy"2Υ9oo(Z֏czFKdbULuD&N(d⫶EqNX{!.jieh@BUOy y/(gP0{t{2re&-^Ž9ס!PVzҔwrG`VcvDX*˖Z]VǸ@ϧNUF T 3.i]=7k+S;ӢoHXVCGTB5 vǁ}:ax9 uN%Y_\PR?}46CL|8-JdXY Ep1ftX')SiJ q(]ɪ=e#sNWL, 4ZɅ}zWipϘ"%>bHqЉI ˇ.Q|"KkOݏD' Ne 8mA厮4vh$>sr_ZYGr3,W_p~ljug70o 7 {S]{S_ugrElE>YE,F:@c'h[9=)zdvt=՘kygpqC/3쏕ɤl`>Κl_Sm)EVXyo6ہbD?Hr{A5}/K-_`'+18r.SMs#K KeD+b7GB LIskkS ?_ÆsbOqcA\| ǜ/*Uvw;s:v`-}}'")Z'J!: ,sظd?YM]h:K䕳&'D!vIQl#lJPy%Tґe1A0GB9 'nI}Sd46V "r_>y+`_ꚺDk;v=}Nhk J;C[iz7&,k,UZ.66L^ ~D1R,$YwK.pFg;''/J`AH kWvwNX;1,YBnrxgezqHAaC ҺY R;'X&s 5~a@]$Vf{]cZ؛S.d!fUZBb$S^e1Z66u#I+1cXNs ?6ikmym`ŞDQjU~b_fY&7 }V5zۏY`PK5S *DŽe*#)ށM J֚RT 0v2U2f+/ eIynyTG=E_:qVҏ#(ݴpn,@LĽ|dR0A`1xGZXE(,Vhqv-?M69&ԠtM Qqr!h!gXZt[m(2X!,վDzҐyo,Ooo3 kJ !H@W$ &D0pFh-~( h^[!,5Kt¢2V2HNTsom9x=ጢF[ +PͿj;GrR |"dq<$[U2gklx|9/ήRP}=0Yj:X& s#( 鶱7zPVJZ.QW8 nW'?8qxp\ADZ *=ېIVT6vON-*?*`4,bƾPWlsL!O$12|o\U ).8YΈ9}90O+ۭ)#޼xJ8y{@)N& a?*hZ]](s$G ~熠7%,?Dx08PJ4N`85U(?TMxߕ/(kN9:&kU&W}0~xYFE=q{GJ9P?Ae)90 @.n|}*q7]}ݚZ?~P$T̿FO*N߁N|3];!AAh<,nH.4#AާA])6x`q֜ J&S)tgM(VgA :Wqj%ck-0v4uY$UJgtݾ/_c6Vǿ{`*]SH.|ΏD*E65-G6/bH+;M ri'+꡼ }4)x@L_ 2ܗW<4b}޽Z  '* |Ë Ug@~AqV mJ~X&Sk#58OTꎩC|7ᕯTv +;&Ǧߝ,)יo!#]i;t? 2)=p[;*Ǐ׶k[%tEdTs"2)7LK0K5Ñm#@1*1QлP+e,jCn:>ll)eWS<8@|a$}ŷ"yRa/x:& s|1d]* ysTm}Yd*J;Ƣ~2:!TӮXTm9\iJIkMQVx6-pez9\vX_0drWhn:D ӘY!!%_עS,K4%|א~ P__PT\Cfdy di$ 򙤸7d؜*(1ũF1G@"', {qjz *sMf =Foh;6 U2PIl~92\-k; jЌYa_I,BIr(|nlQ,r_d&c}ʟ#kmpoggHVb/TTu_.[/i?eZXxZEqX\g؂)"[v@W2"Еԅ?Q#fIuitB BF L|{Rx\ԒE$˞H<-^2T X\o笥!<~ccO hBbgD@=8$-BzrBV*B'I5JH}(."S 2q|u,:7|2* 7rqSqEs 0~QCj\rꆡښKjGGyX#-ok{gc&2\I߱8,y +_Tt4F{W`6Y}ZUv8qjC*qX;*91ɘa芩kQ8̺Txb&ϥNrxNP^<{>94蒃HfW*qFiH$+lIݦ8{ԏՌ*t2\CU[Wy Ӌ'Gx{Zw4]RT]#kU.i!9UE+vn8U`oYx~W*35SjA .G|RTZ!/؟UV;#~<{W!K &yͶz%=ωs`p ̋eSPS:dp\|27?yrDR3ni y}.NlJjiu+Nz3ܾ& Uoe~ZC"=P\L+Pi!@BaUj$Bx*%(l#Dj J?Miڶcfrjp`X V[\?lgkjJjpk^_]?cA :dAx<%O/3$cueM7J=ߥ%6ECض7%R@HxKw0)U)L,)b -6楚b3C;(=ߠF4͞7nZ  nuJIōGy*T/yH1[5E' e "c[QeK<5w܆QClt{y,&;‰\Q!k^X2kN*Wg6"7E\dO+wIreg*Ly>molr +V"V~̗@%S[I?V}ウq69' !$%9d0Nq[[~N7p@&.>~1HG(q!؈u \Քёу'BJrJYeOZcs\.n;\[/*e;f𱻩%-:޶7qOhL*qUm0\+~IJ5)p ݢ}<8s*Flhƪ#dVR@o FJhXسvzF [#ZGA0^`s9>B*X{|^nVf唹!T>he}fI~ aiK)'dZ-w TTBWi}ku7_"ƒd3ZhH4bqӪDy1F?1D,rЫ iPR{TR !™\_@4|KPxU|F={sE3$I$ ӊˆK]F̄GSh՝UܘQܘZ`oh"C+EgED*"7FDESA!0(RSUW^1tIP&uI&{?!>?]iDt]SBvWh//hU&[[4Pp|3`vya1<0F0>#pUE>ɢ7(*sEҀ,REV}&j+hB.OgS^H{mq'N+嵤 `ER)6 "q79 *`]_(mKG>xKSK[':1ZtKr/8e.}/C'-k~N]1jo Vv}giN{>Ԙ샾D3:=EXӟ%MVSHtUÜ5&緞|p:A  yЃV" 4a[aiBV{w{眎 *J)ˁAW! .vޡJyp޵ac,rˈHe=ɬO+n)l7a\ Ll=Uk`'$w$!hl| ` yea\'g>q>!9>.vZ_+I(x럓+KZ}jYB/@W?VZJ;;LhH|eF0@Yjb_`ivWyj&k!*Լ؃}ߋ7ZRK09(q ?W7+fxrKY_Ee\@(E}ҦK=rffA ϼMQ~^%쇷o3KCCwaf?!cRlUN2Ц!#A "?9KWdN+'LCI/#s%6}yDyEݬ}c 5"BBG@~J;/eJv=NU52wS8;St2bb1 j@U"}qXYK˯Zܯ9䬱9\B,,\O\ ":MV DU'Kdj0 &x;.92@x(}t}sq~~˅_䔯"_t,8O|f לK*YKOkQVE/CNu|ھZBO p3~ķ o>ά{e^/h'JB!-5Fh;$Y+aה"Ńl$zsC@X)cyGxoR:Xrn%mv''.OֳTƜ!T''^a$oDgVaG&oL|t{nB /tu|<Zyv<˶r^rI-C!&s$u%1zYE95}C #GʋtXd"En˪'쩭s:TU]Q x$^Q}P[Z}C+΂z_,:7Mh>m hiBVgNy-v=t^  .S+~E|  Z@E)64yfT7X;eOc[5ɉb.wUEWCQMۅo`ňV?c JVa,_`/$B-e:xf_ڠңu [m/Y{flj#J5ڲ3?mH^ `E5)#-0J=E"X2!f g4DZ}9RDuUqQ)|{JLeV9fVټM*Sr}8r-<9"^{LUG+f72 IfϦ!.|y?M2wA)] ["|3: cGASy Zkq foq 0LZ܈-0%lM;>Q0V}g9x?e[|=uGCWflJx H-غw'*9(6&Tj?< ۵bnqV.{j 2;jtj&ڑ*M""~8HK3`uZoXfo*鿗RTh?$XjbhUH,^=%_xV)1YÑƢWǙ-!a[Yb;W ʛ6xgy-%N%Gܓݱ)aPűJhT=yX QzQS<A /\y x5'GG6'&d `GNI,DZGq R nK4y~TrB f[9Q2]=XgKa)ձ ˁ/AT"͂;鵨Ʉ24p<۽L[ʱL2cBj^Mkp~o)Q vO|b2FMtLXR@A yЫxK4E2bg̊vyE =Ldq95/]:7הjIהۉaϩX?^]O/I1Cڏ#IidʊHeKY]2,s@^~V}g`{6<ݭgO4=_dnkcK׹d{0$ YZDfd.s@2<:ZCj|d!4Ḅ ݾW{1. 4vFvPLkp0:NjdBS#`)NjeRySv0< -~o#c #V)Q/r&Q^뙚~ˠ@eue#켛i&H:9oU QTF)ucLl[)*Ʊn|gkeu+R睚~L RO@>X7Q Qɺ@eVW8:z"N*Z 3F*g\Vv -gyNfv}Jsw2CddTm=݄xE0?`f%"STOn GR]W "=ztt U AW%!,}Y`^h%%e`DR+'IMOLP !yeuN'z:IVa2Ru2Do\WSu \LH+fm2 `1]֞"d茪!`8;*8vUੋU4K3A#Y, 7t \.yH;k;Bcf, H%CAfWJ;-M)͝<1[yF3( Yb ]}ʁ*;&݉wK"9N n+W߉N+ c B5N}scBLyvK?*ez A `V2EıNZB:CÉ6uaw6u ?Z4ĂNr۔J4] h,EzcAN8=4_zd gB̮e]En`Mn)ο8# syS7|(j Frgа$FfIc'r7aX@9R`Dᆨ.L];x̣:kiK-  ZB!cRĈVA%>T%ç@4wJ.8|C^ cWFM\Q(ptYZ&KJLlЕ1JHEcBcwsmeߥgMNnm.B? Qs:=NJ5OxsмK[Xe9,n\"~SEcv탴aӶ+t~+K=^bY~cmV􊉥BXWo_RWO)bξٹeF^xA,!B-$my]JoLj !P? LM]C8]76u Bnv# m! ]V/>^ZO*pJE}_(((ӢG)4aՇ$WbA,fׇE9+-ވQr($ǂ ERۨ_>箣S6 pSOAn1VZ=iA-V$(,ӯ9GeZPMoV{xI:O#Ӏ@$lG7κhp*%.~TdLPr d 2b'C kSE-øVoG̳dV4otyr _7sX =T$":/doooVKb@J_z*HyUE/@]sRO-,9}æRmaˮ 9UGikA0WJEdU62zeD% `aTIV#c ?3{AF1dm+uFZYb!ٶadIvE"s4vjGĺK$} Ad* )NOhYS\@NJ"0266X;, *6r=+d PynC-DnLk&d@ZY\%fE4~[9xpFk|A5Q&u ON8 er+2Ǚ~2ǩ#1'/F Ņ<ӋΆ 󥷋g8Mm*u%¤zEQYȭ*kDv$2VVmJ8y BZ11%K61842StiYĐQI%7SKE˵ d)>< G&C,!kYF&.f#ī|9=}!PR-#1dwa#7:Jט`]*|5*y& A2[7)])q=i)'0CM|c 'k.&`ڱA3҈|ÉD!L;U~ZҤ(zN+m/DX!W~cuXKI|5Oh;a-Y^T+We{i𷸞s]61 J*6" )KD`)A[d'Xb>S|7_dnj+@ d2h*u)BR/cMj͛>s]~8RosC YU[g?Q6hyXga,~=c{ ^x|IgK@dݭm|d9Vuw28Gdkna*xǝl;e-U$ziMZ6 LOL-|CuA{j 8ƒ"\TakCT}ae;崲&0welQ؊εJ(tt(T{mR)d5tkVtx,;EC'ś=ծ}R?BL:K)LX`YdE{CMzJ)n>0+tsI#7RhSUb ;5>z3,@R/= E! \Ƞڀ1mH~JsV|Zo 8oAט&ى t-)/M0~Hnt()l[Y^!zI Q-rtFFufQ=R-:0 _PERU}Tvc͝rZЄ:od_m0:i\(𱄖DmS7FO/m}e1igO4q/~58X82:I֮ᛤ,N cZ i HkDs;=̇Z]}K?AYExxzEBV4& ~hnD+,lg@cu"’_eo_ OM{ 3.GB80 ȶ_Rcmx|vBAqٵV/G&Ȓ7O+엇E0:RYLU1~HvW^WWp 4h6TxYճ,҂g39428h$`dt=0 >,RJAJx?&L. jt AeԩE!`kcCYpO2nԉVEO3TzfloWN<>142kkA[CʹiJϬNGk".h~Gr'pYWAH%* EKR y\Z=Zrz;bnl1BQ|>̞*Bމ_Ckba cηq>Fy勒ex,n:S>HU\_3=mUR_PWW4>b"X2yAK܏8e VV6̭YG?++//V2BòkNLU+oOO>]nͦFF813$;D;7M z)Ȅ}zmŝ\(i\};MY<+}UĜ͞۳S> M}O߲CyTH1qXOH&LNd̯gG.v9Ӄϟ-##3?=dLN ә,ţ1GcNqRZ^ypys/!Z֙Tkwvud}OX4R,ֵUcDCvogg;=G"b{v QDyfӊ CDg^մƮ[xU C{$RYAC -3d n 𴩲\kKZa^diU}0'*YEuEa:yu%OZp8P]o<͍m Yf<=V7Irs+T5f{ԣ{?}h j_Dr Xj8%so1x/j 3e pL堌2']Μ#cH.v Q#20R*vr˘_t7 =Ks޿~t$~q`vExQj"?\>u(nU QGO=i$ɶ4?05G## v(Pcwp!v@ibюV9M"Ws}Q%82J#[%T+[4Dr&(t ںGAί13ttM *Eҋ!H޼$wo's*;MN%@S 3C1~N3,v˝ ȿr+zCjT>m/Xz2&W)#' omly𤾩է;;D! ę葡i@`:'2ؙ@˨:x/7ʼ ]'5>;些p7vjzޯ|1D\ǥCDLGy @& S D2D?,7Й{SSC=[K?RDk+wais*CԖ+(!cc.qwv؇^0 L*Qq5-EhH:2tLҧ.5<Υ{ŤJTJ~]jAC}Sໃ}D}~ؑ`Ε*5ɯcmGKA^SyCZKQ%8R`,ʺmm*n|`5\ap+.XQRؙi8%iܨGT TY9->@"|KĢo#s@ϱz$Cm!BY` F3`Q$K|wUh:jo%`;e\9sLZ., fi`ӭᩧ ΄,vDrp34`y! $ @ @ GaCbc-dde"N(|uu}{W< q&ms.jZ9~1ՐSyGt4m1̺v^u7U^;v]GN#R;63E@`:>8_&$iLQdգCa@R QUWa㹘\MhIdF<%>X8Nwr̓ 8¡qosbEzsL"~򦂼$.;ZJ)u.8<^7N& 5W|N4Yfj5 k+[R)`ƿ;rvƦVVvitC=؏AoS+YXSScnSw'|j<'b$)^{Mrl|HݐSa,ō"s g1 :"Zt ;f-CI5+ndRC|ߐh]գG0# kj͊8Ph)4WD܉!=":xxڻG}lY`։k>[]Z`@I-my[{ v8!=܆⩟v"I  Coř=|BViˊsVX)R,VB4r] " "l:P %9!|4MKG{;v֖WKIpǨ:gwgU G&)w%X_̻{Ny$-Nrnv;9p3Rmऑ["N}w+B:8$MZĩ'fGNbMd6a'v Rtjߓ 'hv05,M65t--oqک7t֨Шh0O*q4 P?nfg<$erbw"؀HrT}:}S0X{}xwU (VC. ڑZZy?Yp +:9.a_d#,@@dv5#X nr1]=E%Sg`QA?T,Sk?DӾ N/h{&Z4\Eݓ㝜WJ%E-9Ŭfs~CpyFoV(" j5_}WFime>nsC~C4O:z܁-;ǒ5\JSW5;0הx3وƓ_Od2x*z͙9<Hb^&J)rwv$NQiN,09>瑙"Z8ۤW {i'W (Q4-4}dX#'k t{g-Ôw)<@c{LUxW2  &`C`V)ExpeRVtePMG 1VN1.6PL¤B<1V&q#D% sdi·yL+%[a]Ә$l_OZ%,%.n;w闗opW,݇{?*H]a_Y2XK)匎5)Io9ۗ8,5m8r{I"CZ4STd^T94!.gA]$WlNO%L'$1 `5VPbAVR̒V3DT4-. H?[2h_TF>w!ce\{tI #N b̑аvRYA֏b?YaOJ!XԼbP!]vݺ+[v5i&cG)bH;= "\"W8K|,lessA{yXPS;eP~ ܩhad;)!I;YFoBC_L.jqʚEoѕ]tY^"c8ZF[N(DX][H~l5D. PjEI} hl Lj^}L25oc%J%q>/̆KVWWcU6KXr;c@Agg@ݯxisuRWgqXb Mxʰ൥k)e"˸g.Ls nbED"I`ECEa|q9[فAjY{FEWfVd]qBJc4r9#N|K}C^mAc9߁eq-e?rhl}'o|p?~;i S }~V\P9,YY'G 82]ǡvĨscޏXa`__ y@WAu.( ~Vܑ\Y%&-=p|K$:R2#_qxpd9(FWvDoh͵řP;UsN߲ZjAI4%R*qΪî-Y5ZH=:z;\` h?[xP-nHWIEoZqKq=4!Ѐ;CǼj<'Bv%'*V`Xeԧ;R+^UtT)%UKi䰺UuwƧXpl_ Զ8?Q_lM73ίtO!CM=5K1b u%2ҿE'{ 嶡P^t5qcrL{Ët[ IN&%Ft~/+MH$뚧BFV [/8:;G,cVO++Ax⣃98 eҵ54wWaU5X/_^hrg6wZ]3 4{Hu"$r y :} t'DnDL@0̖:JSI Yd4*:t]]_]kLf#PY%pOOsvBDL_zÐuU02gCh&;*0!]%Fɨg~y2c 8-ID LT4,I*H.{'jaHt%5D|U,xY/Qh 4 ɭh;Tw&3n?ePA0Y,75,Uk*4Iw1̫rJoOwJΖf"/xhiTjW) 'UH0y^^4[l.&qrg~mtb]=9:&~YHCz68⽛UU, [՝Sh7ڀɤ6!,]QI\E1]ʒ_ ә]0۝YVpxPߡ&i-B3m`m}vnb0r1Vb52C - V1x 7#m1)q-Y9U} 07̖(Fa"VOb %왞= 'ms C`1rQ""[b5L+q~}||:>BWqx\_f`·3gT87J1D޵=kfXd4x@KrS(=|/;#Y+Y$C/RK z _US@moЛm&k ;*%%U=#+]cn!`޽ FHy*t)9{ֿmỴWomylWe#!wJ, OGW:֝*;z.1B-0 6/gB +[K5ߦTַmo]:s0H&~$HFév"eWʾ\ HPR:`e,NJD8ᩥ% 48sBQP;I4(oFs;697iE9OߧU'Y#~MSJ'&*#k0GCeU/ vi̬oɭ*w~ Ö\lX섂|`|v̚(06"X~RjȮqP|H5ʼnŷOuWy2RY6>]F)Ef_bX\_p@ (J¨~x_"NK]2Ы{t'Raư_kG'2oxd@'L1, l':5Mȫz~(Mq @_ءy&Jd¶rco,eMebhx,bğQY 7W2V!,Q1|'30"GkGr~J`~nU˾F%vsǜX*rcOqϿ|'wKM1|Y]1Sؙ/n!MJͷu?du'b#Z YS˚CKJ; Ju%BBdDӄ8hdTtg\Yծt}7vÎ8V9w;> ֻ)fomy/{ ?PM`ȉV*kE#AmṶ/-Ijuk03"!\l@lkS"J=)((kB:;=(zp숼`5%E)?Ypߒ *wz Q!x xuh`$E`coFUxeUiWy~xMnC`TF!!a /q,Ė]"#@y^>\jw7B~+htnBa n2rAu˪.nL/\HrR&\K>Q,"o|4tm7gbER%kִ3R''}??zx9k!Bi~[x~JjZ֩f&zF[ehnl,?yh˛KX lr(V"?a?\YYo-iLcha_^+f|gg;$ĐNKssO"6{ ֕Y8Nc0Wz'` Nb0B4Rx<)445$h9x+TJ5/R|8O"{lx%`ᾒ+'ڢ`)Y"\d%l3"𣃇ޙXӌ*T}\4h+wV9|zmrgŒ^HFQ12Ցza +fa)E7)A8S.!3D.VNwVKCaVI7$!'Kjr_Pr/63vwLON/ygWs%F_%UU50=vy2ˑlC)MAoVSʨ8$9oLL@!>/`B'YP"ZOJ<6:挟c/ T߫ N<&}ktB7fNz[5^,=þ;JL+m QOZh% N 쇬Xd BuTYԋ6*q>b]a/bcR^\\ZXuJ*my$$MZ@[y`jfդ+1[&)sbM | `7(\x;FzRyd?O6%_?xX_ gзI[kT% MJ)_ ɨqI_G4\^T,J`F^bq"ʠ@RVhh KRO Ij8~w X%Qє>'05#n?vn/.buqAz*ȥJvvs[xlR8t}n Mtȓx*ŵ__==:`au9=ؙ/&>c{y ~:k [?IjaX!ۅz8cMQ']S&HZ91(no2XQf3BcftFs㌨bpeRPE"Ԟ``2W _|HCb EJ)rҤ[Znū۴$RJmYx#,c1ĒQb!ω'wtiiLf O}ms ;k,=\ٹ:ȇ_g G,|CDX/.m315?_^[ Иca@ ݀`M8ΫћGW!]|r[QbXIM=b+3iǁSvΞ'qNgd ~SF7*Px=rOהZk>%kV kaДln2X,? 1ɬr%%7f[쎾Ŧk+S aەIJlڐƃKr{blt`wOџ#N#m@͑˨6{U y|섅3rx:idDbn&\M i)4v PVҩ`/?EȹI`z(qp>YH\7=gLm@W0.4ie>_a4]!Uv;B9P٪kRtX3qX3/LZVEEG[gT4 "4?s2:EH\ZhvM..mfWC@?j)a_%@<><-| S+dO#sUW[ֶ]3UT4O4wR!2]ݏ>SrY1Nf`j(kl컓-loAAI[UD)gbIbY,u瑛*ڼ-ʠ|W P6?̔[\mirlo ͅT!%x;=9➘=۟_ً^= 2`d&|}OA|zƯ/ϩy,QZJ#});һdQ߿RsrA*촔U2D;;ecQ']`v 6oe> X_"Rf]$Dk ofߌ YWS&\$zo,Tk[?m]v<3k!7*ˠ>:46 ozW꙳!WR# Zܕ2ܞ×o;\S-:nlǮ~;9]Kp9P,shW*K#МSaC짼l-J,l6HM0U1a#8E+~̱Zzv<)פPbUCl@Լ9 r" :OES6~@dddյ\IJb}ww1<ہ@&bC3)j{jqxB{޿ߨyRghV=`Ejj/olLW}nyg(_2ٟJI>|\XדU2y3f/z&PM5Y}'eRDC|83며Kړ]ffzJo׻I)L)SŹ丝g~6D̉P;W|5sP}xz:s0 M^fUыfVUxp )9_tճ'0vВ hEGYY.?u *^ f24\ x/.."f#B{ ؐ,I/I"ڭ SQuƃ)R 9I$ztV&| {w"I0uRZ {!tNsuaT]ZoeoZ>~dmɄ[gR!m:Wɚ+ILis2UGpYnV}Mc{7g_/~뗁͇ rh4KDZ3+C'B! 9nr˜J/Bm+hq9ip2q+3hFZX;$ka5ȳͭB'aU+;f((<1{W_&VROڜn|\;׶gdH,/bNɫ.H/ ni:'N+`_Xɽ5;=45黕X78Ŋ3TNd|<}>ZMe/*}DL$n q}"ZXH*q;J VJwf>Z {p,h δd`H2XBy̕SյKٙDWOLMh,m*MJ3ؑ* V+b[fmʻTh^//DVY@gO9ue/hZшgN\UμZWijHt5%kXaXA>Z7,JbC>Ca Xng1|J4@<~kIl)F orzaH"GkxC{GwZC@Zl3,5.̫̩ k0ux&D[ydj>&E:6^TR+e6MgʂPK1w8(6xv|t >;~Io5 ?+l]p{*II} (" (-*(v }5Vb2U{35Pb$${ cX",8[ʝ_O2 O lN榟>dKW.lif-h9gzxY3T:;YZ4jfo+n`emG{EoCO6<芭WP㋄B&xߞJDEDXe'`]c^D5F4lGӝ9ί<ȬYZYQ^{-*OZQC-e O,Q&tFo%-RB`+]iU._zamw'gͩ%^lifoɓf0Eo" ) \ډNkR Q=v|lm^88ݷv'\ɅI׃ʒV$gptZج k*$BٌܰNO݌`(~$^S6$<+PrQ˽Ԋvd?6Qrj6+tu@7/?+;iyeV7-kcCxCAx(5|[LFX-FR ؔf[.Еs @W̙2Tvϯ"<;#YKc 0D =:wÊDWqX (Q\n~ 裟NUX6{N4~j<&OSY8fwSs  cs_>5[5 =9EuYE M#kAYac霝B¤$/nVSς*Vf:Z{7U8zJ/=DT[s_miUM֗WGZZ=}`g6K+K i~P81(1T\ B fS%>3TC҅ @LwBD8ҽy_pin}~A=p4e,-]Ioʱ&+"(mu0c8IF9tO1zqv: e2OVfghw:! W6b io⅜U0AKluaBDX1Ǡp c>IK;x?Գ/I|~9;]X43oRM\V`] HXE `wXKlo>eT@9Q/1Ģ{rks'2z)`HuMN:;rӄ6oܵgJI"ip 9@*MO%hu|'3Xh\M̰@Ēɏsv}_m#!,!ÒfḺ??9L%s- K-.E·9uh!}Qͩ<*[P]ˣ#rSI !=2:ZB}EodX_*׹( UP?Adurn<ٵz 2D({>Ƅ) JZIGWQDR ?+6uD5Pypχ\yZ!m3Xh&ߛ(6f XZX[Zxi%]CVrSl}F{_QT(?5M[C\E8[,n # ˵E`č,϶ ߄qsvZ%+t# }K&` S=d챔ݡ8©uOgYzܾQd|['Е di)V.Vq\X- hX $}ź[339MIgF0^YAk(">dO0 ~5 ZōSd90=05IT0^zVZPքMvQW{&Bvr'Bj| 44>HCe'ť%~mM%hxߟ|liV?  ]#ة$Y) Gmγ.7C80$.bƦ6,g۽⫍յ{tJPB@[ǂ-dt|xE9gM2t>ӗ{%Vඇ9<+m x 'AH=8>GB`uL aFʽh) 俒Ӣq0Ep:H( ǯ֘K ґGH$lg{&N`-J 3]PaRu &EYd.FW)hؕ0= ƚ]JH3!~Zكo2lSU Tp"bҒ[-'BAQtnϷ%♡hNEo{tQS齲 pWDDp؊".3pܮO`xs"-<` -~z\)Jdc8aJJc + \?e+"%Ljgn RWɱzseNa7 `7[kxppv~>Wޙm rG\CW'5ԧ8CY2xqrtp_{~XiƏ%k~Vt?k%nR \ j*q^/Ζss+b֜բ+M{sHYwvE{Pm%҂'S*0MSGa(4[%,pV(0432:k`m%  4bno\&~FW)enr6Bwܧ3ЕVhhIS;Mtc}I#n/B}PwZ5WG02_~vMRw{yFxL0zJ[{%fWo.&8 1:ŞfJ6ELڼ!m: w]v4rfKFG -vЅi_ML2hH!EW‰8bZ8,s*3bO*9:3CATdaa+& ր&iYBV"1D05"0bhsÞFX5J%-u8&cr_lԃҧ+gw{lM^}EgAUwi|#KlvOCPԉMdT4D" +fY_H̫t' 6$.TXdC5izƦBWi~n?|CL1 Fa,5̅Xޑ 3@@Y_ۂF? *n2CVq#iqL1K-Oʯuw r=kcghht|t_FVul@VKB2Eqи4,a1ׄ}e63N##=$IoӉ+ `џ$*>8&)7Y0"²`qft3832kcv@&)2ёe+ШN{,)4.lWOr+TCE=jbX# W̊U$d ZZ:zZW@[:b/Stst *[áQCGWޝ_)9=X)%=ӀrBe. NI)i<}JX`GyY%-խuiy @I9O&&egڞ] Smvvyog ?D(mqnNX I4OȳéփTQ `AhF1jl11X+%3 1I+p-9&ɩzURaNqm[E]U<X%d{h"œ](.Ks2_E-V8a8X&af.H'CYcy!QWXl @ً` kfܥ>90>{^25@fd tk*jv`>U 2058GZR?NF X1$eoA-X=^`aKxr|n%~jvɋπ/f- `D/SJXsTn wƁXyө~[Up>( -(ڛsQ+) JJowܧ\ww`R0@pp?h+Ռq7Z+~oPBfCW&w~qV٩|v(:-g^X]gZ;N$|Oj/̯]`u/{X84<!;8fW' *TTE/L@.+LXD] 82x ':,U G'++ɚ.ؑnj^*raВ>BBJA!<بyS 7$rT*RsXp- #!Ugi xskd3); 2 gW].-iJK0I߸MO&/4- 3\[+XxF,ë`@-!&<)]7AQc7{B{?*:$cdS00 WK1@T>ȍmmC4'kU(m,Yb+ {)vz|:QA L\& S؇h''i 77koS-sf&J=YA3&# 'b8>ʩN.z~Ȃ)D-l ^FW0>=y*.s(Y hqX1XaUM!U^X\CyKÍ問p&AoU?cnoA536)T0)%* ,BD M5$1TMYߟ,-oyrI't 赺xX]v.R+呣60Wc]ߓ.{vf\ՒV䆻ѹG;ȇ^DB5N4aiJ/` U$⍲[R;ԒL-ͮdRa+K,cX[::cmݓSuFdeq_kzf)VC>aR ΟZ c$oSY3>`I͢'y[;(r$46H5r@i qmNMP%EK*K]&[˟JNJԹ#aD*m''~O Q;0#~0+@,.=^m {ҀVg/gfVή$FM]NQ`VL5XY>\_TI4^P"D7ek sM#~Sp`x94V4VXbᘠ+u= `A鮄43e-5=v:#Ly-щE,'ݻPkq$}7Yog1DXd+@0ˑr3[Xg'uv0=0(0}C숖Ŝ\qFvb!n$U$0ET mgs1;kIb nB{W2Q¨LȤZk|sH_wy…],"WkVi[AEҒU؎tlfQ&ypaG'G/ IРr,e?42?-h;@xarf;{!$Gh!q_ZSe:V$YV뙟ǡ^ SMhઋ*۝}mﳒI^?y+}k}NfW߼.  \E^ cg1I+Q7k<̭KkxQwW {`9"k.uqL6>chܒW]C ]Ev{ڈK%E<+h|LU-/T?g'dY؞U%ٓtOu䐣+` ō  w s .f4eњHxIj- ?wA(*`z'*2;#y 4(`g|5d:Iܒ\sӓ<Y㗟CIǹ6]i=Nt!P{S!Ev*\5)˚˨ HUaH$qmu}phwhnv96c 2 & ZiE)a"slb'BY/InM*]ngq7^ˁ'4 HD,Q!P;"7bjFq JA]2TȈAΦ+dΐ[0jk+KP"ZR{z[7jS;ܪ~Iiw\ih 5C9.^},JM=DdlZh{\' ";!%!veX/l׃it%.LeS Bn6(qUy#_p 2c  oʓ(U-^]pn#0s,.y}s] kʊA`A$d`5<J_NiKx =%q􁁩6O wV`}D%R[ҍ YD7Nm*L=,+G FkXўej.ޕv2n,\D6ՄuG-]>7c=ъ\K;9c/,nK9>Ȫ:z϶*6$Iԕ(濄YJOɋI׃#K˛ [kσ#+uͣ:Bt7Jkx3t7E+08X М5%~|u** \tuS"0 ց_?u'׿8?3çeb#Z9a7J-x\k"+6N |:==ζWb1%Y(6"σO!?<{^~w~bF,|ksS}=zyɹ9+b0Rk-/K׹o, I/, _[1s-I'J[Y7);臨|߿꾪& BB rsY`16۷{:B$Aڧj t^]߿nͤ m,^3؞+cyH, p6\ L ޞTkcD%Ǧs/x`<%w_ETC^ %l+w6|a*/ͪF'RZ70jZ~#BSm0M G_T)aJo4ܕr'( )H-Haĥ)ķ,Z_OLDQ+2$ y!iG-yR?5VQhȬeHXbc50Ii2\$ >sԸ67(˓`C0$̴ X^X&#XwEW)9Zl++L,6,0 (X twp"ˢ{{ר $UmkהVYA$P?/ 0X>"U$DCW'%HE%M'Uos(㑦Djմw;|`鑤sCȈ?E%^ީS7(gd| A-T~YjFB\ X2 , *-99ƶ-Rh2/-1R\Ǟ\53>\moXdaq\԰K)Vg(5~pCa &3f K){˘rmDLi5;A 25o̦]ƚClaluyK UR:<$[.ӣFQo@U.S芊C]6r |-x`uޮjt畵EQYX;)stv:FeIj%}DR %́-Q:{M z #w[ 꼒.bGϹ&;zJl [[\ojGKj HX2FVIZ+ ]N>J$,Xv=RtX*ȊQ,^n?NtQc -V\8i;ۻ)MEKT))%=SB#EebU);q U ~RrYN\2LL<>3sl,`SP>zV-yz6Gd.盳,<%Pg;Fjc7̩%VXakXѫPWX*ʓ&F00"&Ȭʯ`9wg/LyJ%n:H|ں(utȡ֘J&L 9 leeh0K"~-S4=niŝ4DZ>XqE )DRKI:JF#pbtCwllpq]щLT_"-2D)D!3~ hٷL鍒駿)"ԱHr;J#DOG_5F o5-C]R*Mզb~\EƢ9OO6 `X^d]tTV1%Slմm~-9&rK\[N{68Q%̤ԇvƏ:ub孾U[ c+0b,tNܢ{{{0Q[cG=*V`91B@+xYETR5y>`{5WgѸHhjx&eήم7:t|jk7=159Kn{BHK`T=* )iZs{`"~Ȥ \7F]z&κj,^W5% wtx'~;<2Q),`VjII2"᷹LdӉ9R﹥{jʶҋjX4N&6#$$u KX6b,u-)oWKeF ¦x|\vS~)Oh, " 5 T`Kv,.=xj⎄4Q`y&:|~[K>;\f(6((-:Ɨ*5XKGe)՝ ?ۺFtr ./6"q11~ʼn=1qv~+wwz3Bʹ稹cQ8]i*OCWg$+hCWX\dP4[=BXXBVŖ@M~eW8Iy+$XPa\^(Zf~QF?SRX,E$*Ϫ'͵  ؂K+huXݙ]l-Ҥĝ0b2YvZ{2;#-{tд>.o22&yyPo}-ER,BaCE 26/cRrT7.ļ9=D#򢲰[T^y ]ҭJ1.2D&,2/BWergYU`(;HV;ZV2ߣZ/qMyVM%s! GhHМQJyccwpaeul(_^XX#.ß޾R \ cP?rQLy7Ǣ3*7"V,J kF@H =LU,#Q* GND&x&$Ɋ6LgpS48V,e4KL֟߉{;{2' q\QLz=XX9@b .3c%c7`ս=?2>1[_ej:>¢ϱ%C_Q'N`)ŀҶ6 ~',_6~f*Fskߝ*qQ7.,=J fԺ')R#L%[[]:OO*e57/' ,wܔOM-,⟣3ʟ%UCLKs+ ˕m}|#p=ƥV./,}F)N gTb@g)?֥ cf6Ҕ',UR?y>d~58<=<6_˗Cˍ]=-֛ZҫLFB+u`0Xcƴlbo>4/~ipZW'E4'm,]P4(DQ4vs}^m I%eދ:ͺtX {`pc0֐kkjl,g|H#Cʰa|Z7]."&$<4ŞS\l0sGggBqu hRs"`yJ=,LaʹtRA9 Kѫ|p@:GL$OU搔ʊS/qV&Ema5ILc7n'6s>@_%anH+lih)seIeWX=$`me 2g3`ġKۧE])xtO1Ei=f/h+ttpR]Z8IJIeԱ I. klqIw sb K?ayQPVl0RĎ^Jn}i<@Xhn#-!UV{< AW4QeroxE`k¾"9t-@vK42΂5 "#0xbߞ[l.4X>&O}8"U/JgSR؁ԽU/T647+WevnjPCJUvEYZeTS'%? 4۶ZI;c-ڻۘXA"Y&=@@P%J`nzVlED%lMt -b? :B~yeeUC@Tz9LgdQhs-)RY HN 3H ؼF{{csDg7BY#n A`dRQ[G'67w_VfT v \pRId-͝X8Y>A0 ;w`ރ^CmSwYu,>vTCȰ`P< ڱ7[ZV(%ҺL6[/Ih6A~ba8^m&(C;槧=cE1l>ޝh>ĕ,DD?`X(abOz?=R3^@8LG&d`]-;H) #GD[Q$4$deՍ(dlb#Yu;[;0[*Gr ,8!tjNeryJYXfӄ$Z+4HNVV@ Lɡb7Y E$׉̪yP喡 1N'r?  ,moyޝ[t45ƾlo%~Yu(R]:>%&!:tyaA)AQEv`/XdOͬyG$^nE;m-65vO-!7(A Y(uñ{m)](J(rvҁb[E-OZXY|ak[! 1f>\衧Kv$)N/_Y^|+ݒ2RKZ`{W(IB/1啍) l>4mC=yZw2s~vE0ghFKCA]&Kow=B}P %l  Ąd' ȓނw%ɚ0{%ţ@OUw$Wd@Ǥ/Bz%5>A` T,;ZzVò!>Q326ߴ?`{W뜝Y#&m-R76mJS!?v&(V-H"߈(:k)i r)n4W V** 4X? d`U+ciH |slqYU+ JLd ,J)|/R6@ҖGOm#CcA iwaXJktk0:X=K. OʷW4:2k>0eT` O*sDNadP; affĔ0UЙ0RPh2hHGL>Ak%cR8 &X'T'[hVgGDA9]%RCP3X}$H|RߑGg9ۇٸ9:T UDj3 [[&"QY#|Zz*_/{(1O&,2Ԓ,T`,`'ce~h!:V&r}z Y4<+ =,+(k$jQ?FHq(˓j-Z?AX2- Kw4k_~'EաM(Ql4{DJѻOp P:\4%xI^zo'&GG,** ` Vٰ I,˨!5L6b_d%h"HR>Z%'U``fDXմ<]<҈QBm֡GeG SKeְc,N}l|Tқ8锒e.K|wǟ?S"EFywnl3<%u u?F*+`i;9: yo0"/ꬻXko쭚K\Z%i|aum$w~{s+9TI>l&Dg7BhLzRNϫ{WP[|:#/BB-r$FTf  6eUgYBwN!50d$K{*Io#S* vnC_ՏC wlzu')SI;9Ǎ/7׷r`vCrsKc|o6` TD__&eRuguUP4&./`q x ;Ueqqx2,+->^ ġBdj8&~xhEef;70V897)cUOK}Qi-iZ_ǣóco^OMMOZ[\hliɤ"Y{@Zcbnً*R[c>N \s+eqw`)Ȩ!y0e[|~>]+;yo=ݔjY!15 ^9[FީpDD/)wmiIghx ~7v {!M*ɹ9vwVѲV7joe`,b~3' `Ka,YLb,O=Hsy}EZٲ P敪g|7mO؋?dnIt6 cUS,!VqWeDsk{UH#:a!pxt_7{S^" Kž̆RҖcdw/qeL}e)(cxa9߽Cȗc&&m]퉲y3;BF|C539I?Q;L^dާs^6GAvg'M,EjU ;d\2,`}4݃)Uh(la&4'&7e5lOO5줉 $t`O% ֎m&X.=m잝[ϯs"=aX֮Vu޾%@ Ƈp v! hnIgZpwW̱\ۊ3WA~[@F!I_ML-zAZq6v ?Ipl<:j[<0xZ/+$Geq߁0O̭-,GTUDW r!+\Ѽf;ϧm}x^>169GDQdD9g1>ݷ UJ-#is1g֪ƈ|tsw|v15٨,Ryksf`V`0X ?ц/.siIqy,M I'\jMB-LQx,ڨŹb;}S6Rk'aHCR)oS*!Z$ly])YeЕ|vhω@U8k*VL2Eя#m( {3I ҥ9` O[)w`)tM| Mj6m5EW!>\tV#;p]Bjq|çd!bcn#EQXw`)+-vG!V~(_똃b,LxacqeM`w`sc礪&ɓ4FeWϯj͕/xw_%E?WH"&B*Z#OYҫ&iyt2w=35<3z]lv7%c%~y|D7*ua7OL1_T}}-2@5@HXY|\$ \nn ,`]SUX׊%Wb,MXژltq:zJ=DU6 Q=Xڕ #2jȲ>=`}yxU:^^K!Q]@W/ls3,y@v@f0KX4R-`_g+|o&Ph<0Ur %}Tڍ%[˃;p$Jں10 18Jn)~vv fi;MERrG'bHP[Mƃ/´׾8Fq=ASٲ|Mzy(hb"*%3(⏐0'mzC@Bt% H痽WG8?3í:!ɥ7,BaVH;/F_ :9CZeQef$zKC&wY{0^X܌LټBefٹ6R4$ {)! pi` ﵊1'Ze2(x}buDHizY$62ꟙYhhzF-ܶ)2m籒Wmuy}l|feiHn|˂Txn^c<+ jG.lh;$3tVx6(* f5߁UsD0Wp\,=mt@X`_3ZT7n?x 62b,}S Bq:q!WO(ch¤&0V eKNS`Vw?ɨ3,>/'V]/촑)Y{ً#cKGe*^I]ׇuα|=dC9FrU_VƛX7`ѤrsU|~c{ UH,^Zh#Z20KWޡ65踥{"'xC~cfc!p`QZeQˏR0Ƣ/N; Fe>kl߰:[F#M95_a%.ycm}{G!sj898|ytDTŕRǣn;\;OjG7^ee}P.W?XY][X#8=1$\,> &*@,a#n謭'6,}lfIB_} eV/R,r|vu1u&KntI_+R\?pN!ɱӼ4@1|+xzO@+vL#I%bFcS| > asMҲ\Ƞip-V֟. Y!yn+K[tKW23EIٵ]l)H [zL. fQdb@UB$0<&@)sy} 3X!Xzy;:k}ϥ>!XJ26… QAMX4YhYwvL86S:RzI>Vp*6ZZyϦojh!TKcrJ_s Ý10#8ꚽ#cԷYrO MUqvfQ:x0bygUD<7v7mJP +%0*9GES_id/eVG9쓆I}nb($}gd46ܗfi&Xqyy1 T mk~(}}95= 3XT{A#(D4 î࠯תr=1pkXvJIL0y`m|\`)d wӤ9U9Un[hUhՃ$s_-%A1V8>垛Y[]~IJśYJ*6g{m+$K_:'g+3o<˯?I^`BXS 5搖?L(n$j.zNEwBQLՆU?ϒ!ԋQݻſ=LoWO3'Ʀ꛺JH/z_\SǸ],"WdI9cu~~MT-T7R;ʭɉ遡ʚře΍==.d/CFʊ[GЊ ՄƎZnk5_:qKATb|TxGkaRSN2abwuԌ;FF-Mj4bo `߸] 50IZWPYXQʫa.bI*i!}|4tyD:559Ů]SΎ*Hl*= ?]2"82bΈGHG-щ\0 6ɨMPQK?Kx>0bf'"ubt dI0Z`ݱǣZJ%B/am j@/wtS0-2sw{PrA|ȫmmۺs[Fajhe{I{0zCXf4yy.#ko^!yKF.3' @i6yma^ҳ zV OLLqſkU49GߟE$YG=z~aIaf12@>B*2Ek1GkZIq$[ 4}X |Zlm?}]Uvx>7=1q͉"$ZqwLDh@y/Q6:iJ+~qU83O1OqaMW$d2qz,=Y$xeN֔2҂-{ `܌aww=YafluztCCh[nIϠiz`h67KM!Ty~FݣڎtO4&[]^TN3̘&V:xTX_L$TW4]k& .Db+4Yȳ`/Ӹ%6{h EaEd֥5`  9ꤺH*9SbREqRWk䕓<"mP#c,rٞdPAx.2Abm~qtR?؈D)UZ8 A}v0ҵzˬ9vv(5&83ڠ9k>ƌFdzÄ2d#k>\byӤҴ_Uv "? <*ޱ $$%Ū-ԫc=j9<:8v8',H;+V=V6Db῭Mi*uD̈ Kg&5mNlqNUqw~̶/`vjL̦+jtzй"]%GiuT<˪8G硚xl-3"NUsMdkswho)+r`x|c`aseTɴ9| |1υe7-88MpDXKNJ@HGڼEJ?gmKwJDxٮQx1HNP#@vXbs~eƝ ⳯^ y|%?}>4z br[ TpO+pz1eyJ )\((G4ړ\4PC&;͓U%'vԉyc810ɪGEBy<ߌ5-8[>7[:&ӫp=yi+e̫VDRDg]|"67C $Vi\/wܖ–5YdNOZLʝ-ЊH#H#iZ(1,3cTNSdvcLf[F*%U&js03x^g l§õtFjXJe6oӷI ٬JlC'ck]o\!H'kk="/@ 0%W]G{V'm̳Z_\0NA "sQcPcaj`b+*KH|EHm3fsiO -uz:$aLNL={Q(L%#n"/c%a,viAu];_R^)jIX@`K'G?Ś) !`Waols{;9?*qCW }nOț |L'WX{`"wu ]OK6QлTt*Qe`1їņ/X\aQB4 0 `o6/ugδ7\c] 6VYݜ9S4gdv˓Rr@y:l|콱yy^\sْ0ĒdKCXFp03#93er;ǜV{LI[A&*œxhP,ΐAtvXuthe壑?RiUۗ/.@TD6d] ''%=j0V jeZ5C ;`&KAt{f*x,A b.GEXL^⽭7u`ӷH*~IºQ63]}ʣԉ˴k5VLJIȄ;i@.^M0䞌HR3^xl]K2 PGQ8pRmy,u$nͯL,B{dSjEQcrfcye;W#(:C/ ZGqrhx e+?VNj!`1JH,}[ڣҪ|N#UHK no-.o#qvF'{l}(醏,/wy<pT?(ǘ#яI x2a򅿗2ɉ m#/ζV9B,y'WЪeo{i_Q/HB' i3h?emlYo4Hgd<9nnfs5z0DB ê4|utro 71sMm99g0e *KbJ^]R~#.DO `L^rlH5ILjyl>q?Q snąٔnLEdS9#GT*CV|GY {6"5|Cʪp##%', {]qiy^b}>18c,, Sʦԧrzwbe~iklz5#5:Û%,?5м7-)7}P{Dە*ţ£X|t^t_eSP4DrraK8%xbrBWe@Zi'ta/yD)JE`+=4q}}o:#EVK(`yepxgMvVU30X7"xHd˛4|KQ*3cXNftdzt[TZejuqn_~0ߍ UK)uRUKhzf& .&DHz:%f0J9eKť!ƺg*]l J,aSȅ@1X\;k@Py6n ,E DVSSEUOԮ7`KcX uã=6 ַE4^eY_SfȊZr׮n\ExSj{s79ߑ_cfQ'n;-=H7dD:ᱳkD\*J X}Ecr6ף+5( yLG42㽃OW+%m]&+oXf-i`W,2#6LNE.F?wnس>, 1i#혘Y^ϱ iL`_`8KzTZ;-7eO'}b6 `IAvGG$dDf=JƦW6t`g_wvhGax(BDTqUJGOC^vARJE./b7դA#0o[X\t"uriusp!BQTC?.|[ DؒQҴƪvkeZĤѿ{ejff@P7ܬbsm^lo?; _yUhˁV%1,2'%"3^fqy}:DN%ei'#CUf;Tr7UN PZq%k̬\C_|`kI'(&gE6 e<$b~?gXM XLʘׅ>ϲDA!^Z?R `;7A *I,г̺'iUIҚ鳓ύA&}jׂ ҌD+hMxc]s]R%I( ]Ɛ :{-^eL7 Dwc,3߾%s`hfn3-'>z(Zި㷷,-$_JcMRw:9kzas{/Not-Q"fyi7&ӖQ,K \ `C Mؗj*yu -kv[:'YAܤAU5^v2|J;Ͷ6{F w1o Z8+Qz^i ]~I-׍GQ=[]['*^R(Vpݷ+P=<7h4>l<%@ힲqLFsE(/4 v~ i?*,d[abO1嶦Eᡦsl|=޼=66Ѥ%vH$U'ŷfgKe0\gegYU/a2XEGFn% US7 Il~p}joHr!ˑWѯ=4%D;{XŎ\p|5έek"IbEe@W2[և#OL& DWHk = i,uH){q<X#(66:YL,2O(jKS3FgV`?:srlK<83JdzQٯ{LOh0'3S31Tmj`Oh qpw\l)fWq:<nSS`XJe c1{32呡sGLiØ"e 0$21э0KZϣPJ*y"E?ޝ{Pslq67[c禎ȏͭK.lFv]8^kTYbf6ScqW7EZi‘+.=)O>0]\[rU%= [v+LLgrbKF*Ӳ'~L<.E-^FMwktFs_Ӏi- ~!1 )B9B D:a\X7pX\X!*/"5zG\k.aXF7! 3[ +PYѦ:9+K`6T>SǸg9 bfZzW}]+;'4 ]YGeDAQ3q-2*L(QBlp}4jQ6*]}jz!زٕJx,QVcA\F$WKr;+͊SA+J҈B`ObfN(/z#HCLZMnH0|z> YGZ7f5,Xگ0vhK0M;7 /քVa!B愢va%[~ZDa0XKxlAgcDE`tO0 }$_|(,l}䪥ZiZW4e_eB!m,/ Gi p%wI^u ~?\ZIT}W)huz|^y/I?%=Ia$$2,Ϭ%$.2/sgqRaAf$?V#YQo:R}&/(.15J&@b7fwbt67vbaM»A} *7bX5B/[fYG2+z\׷g4 bB c@,Qz^uP'6w:>dbF8~E[߰= ?g9^rA)?'U:=ɥBd~s1R}r+gXj~,3J-E\}~HnVhzm?ĕ>kbb6:*(/R;`ͮݫQMtI4&˃} %6gBi*M*5H)l&>@ FkUK o9)o@sǘ4ڹGF"[ar('(F2z!?UVXW.",芮uK ؋ۡp zzq<j'#ϊ{EJ )$[ rA?)fL.`'hNVܦM2X'bF)n̯ZXlvf1)Q5Z 4锛5HWCiL*"r5tB8}MF79?n檅n<LVvEאgvksm][^\ffXw2Zk6ꧯl:WPIDT ک +x%CK EKQ\BM➨P+J֟ ۺ=kd#OM/lnl}.}).^,P ;j}p|@$<%1KGe_EX(w1}~J);\NIk?' i݇($*K@_[!gKϏ;UfL;FBu6].eEQ `䮚9caJql}6OCE6 Ld tK̬q +?ST>P%NhɓPs#$$bK7Bч;DlMu?SH/lN%aN`NmF[޴fǷ43C۫HMEg;V8?55X09?E}*}SߥT}37sHJ,nO]&2 Jej0n]o8N `jF1X:*mgVhG&8W.:GF1u<+L>:6\wBwҭmc喵Vu v<>οז)'3+3移h765Q>`\V 5wGF K0^(4W]! 1T%X`-Rp*dHS4ĂfS%`ݦo2?q,Yn#t)ϒ>u;陥;DEvʟӼX1 WЄϾ88qEtE 蓒AVDXQ)AJhS$ˌt0& f c͡5I1}KPKo9.\x?ׂVςxYm7f3ymh#n43q0dm+TJi%QzzZbi1nX[xNϞV 빓e禀X" 3q Vؼ`=EW0D>p}xyZ~7N2cme-Ë+{62+5e_u[ѓ ֬mFA k.F{{ 'qّ`)s΄i.`~X ;/kiy,ru=3 ZqktNb2X:yTGY:Ғ*xْԺھUT/; \eܒ jRӴF:gnHSZUc)F'2[g}m3PɩbX:+#W U4"eyaN >bb@ה(?g5^aZnqF8Znnt\+W|}~knzݬ&\ `=)1Q =Yy6?T{$M]XXdqE`:Iv0 0|O?Uϼ41dNY^*pw :_Ե iO.昃kZ򨲱AϝD^4vA}s«X|g0X`_ZB/|yFj sǞT Y6Y`֟|Յn"3xO̞9{ӄ"Xkw=$:`Җ11MQ7TWwEPn)[myzV"f5TVXŭPg^nS $äj1:U3kڼ3+Kdv6VV-Uv?&m3>sJi֋ 2#?p(IKļZLhmL3x!h1~NiRR\3-=;8Uז{MM]@^Eݼ~~pI[mkͨ \=G,6 fМWޘ8UuD-i%}7]Xo,e2 [QdJ%>?ХL|!E={tp\='"DN7W[-z%+ %b=M絵ma0&Y=m# QՈkl%'S'a?D')7@+̥ƪQo7vH*yT˓>xsŕ[=HMw\,S un:?nNȎ?Z2&tsl%<+])Fmok bր ܻ/z [;ʻЬ;0 rSׯo9uX^|UEp9&5 K)l. GOj;eb[7+SX˹0XjCW.lgLkX !s,+ЌhX)Wp o WN?`v7`G;u$Ї`8ER|uhdla{k)@$z~JE#S>fiM;mR)! KYqa>LS,_X)t ɪLaj|CJ}zq[aUWWߊo04}7NF~+J92RFʦL_誺3C lus9_X{8\8(mrb = si"epjvas3?/k5j>KfKɳPe&X0\!1Edhl/`+Zw 꽙.$,H-5]dXXgi)7C Rn ;#Gʙxڗ&23 YMΑQ9%Tno>;<ҧ 3;#I_'脆ӱy?z <^ ýCo T,7(CcIvx}{33ߚ2K_j.>k/1XcNɤBV@jXP79.^M̻Qm̚7:00&wW{V"fק`gU*؅#j X:A :FS-G{r [OwL~ZiHӭ{;{p{;M;FhJ $%r?Xڱ2WG]/VӪ,'Y¢z} QdS/V֏0J%VÅy4o䇼sxsrtpۛ._:ƒυYGe[YcЊl:jV04T*I+g,-Xξ'Um(wR$ű YYXp' z?)LiMͮoBOˌ55>`{{vb]Ky[Nq?޽;G+{Q𭽚67?zk*! z,Kfdե67H,0%\±RZRĿ>jHQQ3N KClAQ[jd,pq.LrUvgJ Y*ft'/N2a`8{~c` UxbG%j6S JbRAwce{kӕV. L9[AUC7ĺS@<OR=Qw'-9ewؾdx4J:}Mɖ{l~,MM"TޣQ-"0mfWVJ&2 |VU'0ktaJbw n֕,z+n$ݜ!VLH"K#[d: 㹓Viwnn?y/1‘ ?߿|u /5,muHi ]c572c, M3uWW,Iy!R-. OѕLva,nmW="ur0BY"DeEXacW9)ESٹ5dkr`-{t4*iI.]^WoìoLoM.tн@W:=c(_ >3zi{'85n1Vx`)hTsm3}Kÿ<0/TAUI79l0mgx2k8ץPpbu}c7+Br`- .T4`T_00_0KqQ؟zukftu1[uEעMc4 n_h6šnff h<ۛx׷fЕjJ{q|dNxnqne<_̮L*ge" =]#H Xi=c2-% {ι"ܟ `?H~9>VrTiY`x}( 3v[$t~6.0ӳ[((l9Q~ǃA}x%[(\eMHQz007 95`x3l_aB;:IHlfU w"jpw tu!܀KPRz0^Lmhp:Fc{ʋDNı_@+wyX]O%F٪KH@Ym!ތF#ML{6$ gQ:l5c,?+B9Γ]*9+y3@}} Y!GE[u c j%#bD^bx\ԛ_3΂*s3sL@ȸXFS :L?eD,+T4Vu6Rb,MΫ xԉTPio{N>_+S 3eX†BhkqͶKL[ l^z1RRÅJBf(!D8K؆E#K;W /HETa4 cˁYW\Nb&&q `>u:̯.o n"i1KU_2g1R*+  q.tzB߿u#R TGKPyWՋ^D0b%XRgJnƥ;anSXQ[tOdym־1vŽw[F<,P!旗ɩat# f$PUaOx)<`"uv\D#x9j5f70."x"?ۛWљ o[4}w:G\LNw*P}׈1"td?!ؠ탓uB;HM{k?;oXfРT&rv 'Lo5v(|v|&$ 2.]&:-Ju_.|8jP+KV~ }Td+ܤλy5y iF^^}K<#f_^vH/7c TO]<% 7k/ %d':>&k '-LE36YohQwC12n$9-&{PҵԚWGǧWF20UVB_ߜ@8=\sFfχ9{M9R=͡T0/n#H.(4+Fx麛ݜ&a^Tf& V\z%^RH[jb24Β r?))m>-1&)`Nv !H0.|o\ $dq?7$eUG_߾xeJ * %a",qml-.~K"3th eI"' 0EΤ+`TVȶ#x R:P$N8=T<"Ts"N  O,e Pe[ك`(W@UJ{[*n2\ƥMnP`A3Е5V-H#q; Wڪ%z6U̧0TJ/wMFňrUR[͔6#ͧc &ȈGf`rqHG,3׍FZWB4 VJRsoxR)ic!B:žk芈k<-{1ZҮ ٛI޲T=-S !+C[oNO7UX"'t7 mm*˂YL Q#$3B;jw5t0R`,Ǻyq*>2rGG/9,W7I\iA," 0BzR Ý\+lci dvyϡAazq!._ʄI;%Pa ܽ27\p iU!(A‘^5U1qe`,)vU<4#n{B0?1UvS;=hvEtf9.g~<'xƅ#LhCN5W59z2 B Hх,P8Wx%8AdNf*4͖Kbs}" "*SJ5ǒFDΞ*Xgm$x7ȯ\; ;V[o-o 7'NNb4`1q67e/ T3i]f:E`qF=/$fU)B3JuBy6`VGpPFr}Ty'Eёd鸓sU֞W1Xk]u)/0B|5~nkni9tS-푵oȇUX";AgSM.{"yui Lr~-tq|!b ('o ԥbk7i'3Ӫy"$PHᑜS/W0N$1oj2ɗ[mJE;śp̫zja$=uS(+9  '/~̫ƇYvMw]0bnh,UPbiY(=kAJj3֧/F2%3r.0r9]uUZSMuvq7$35pQ~QBW< VN*%?z}U&FsOr0R_il='-X* bW7g*__뢳 )B&K,4 pg}iw2h(hMXgc,=](G';YMy`9>$w5W<|"lS $!aN WSFÝS~LՐSWKs"]^]x2Ȝr9 ȶ0+&whTnO+x,ZJsygןWn/`iTC$¸B.QTK*S _ffWAN@S{RMm8MN=7)9cuB;8J^c錛˜>_Ұb/qfNvdV-qAwǧ˹ZdG+I1%@TIFh}`F0̓ _2UW*R/G}*Y =`ѧw`պ-ƴJ|=cYb$en4$4cׄqC% . cv77b&B&?$'#MZ:$f2uCyxUB~Y]/ M jt=E:!xp)1&g@eB w[jU=nш3|WCZv0X_tA.̐Ћ' .vvSsG\SkJۮ$$}!xj?`Y:u]ZoA!\X0G]Z# d%(.AGU9䊦!BH,q닏zT5"{*]BfI+toZYXcjQB1Vs<m4  3|6R2!:5|'"vVBL=>k0DtsѨׯ`1 'UXS%\\-`uJ`Hz;q#%Ѻȼ\fKBl-x4/.|F" {s7`3 *Yn 6LHJU41 qRkڀYʾyPYYg biz|oX^Sm\DIJO28z#rr ${Ho4U`%a@[KKA&@Z^㬚UtF('=a p @ed (Wh{qxFqi"ܤN^(*%s F[O]eFWN.L,$*b)[j) p,[Km9ǧ5];H^MXB>*afPʋ:#/*ekb>^Xe#`)Jbդ!aʜIq)|_afQf 7,| gXȂJ&3A2 {ģY. W0.*ʴB J:`RT/mlJ{8b\ uΆ'Ocvkxt%ܦo"/#FEČT&6:WV6K y3G ( %%- 1d[ȑi_ j1ΈXJp'$u6EF{gֱ}?wyI<6,QIČЄ@`&3Kon(XdZgiɲ[k}pW^2fS ( 8h ̶]irG…x:abU~mpWbƃPҫp,ݩ9]ɪv*DlcaXnĀl SFƼN8F6ֶ8d3!6kZxÒ]<_|޾^_۲ƨx<ʾ`s[zH *+ovN`Dc J - S b|@G 2IC5l.`%/4 XQmX=@`/164ntLqh0u2$XX))x"nQs8r5u &m40لH`,^4 w;5ńi}+9Nt:~J c.҄u dJljb <؝ȧ ͵ <#,fTX`'XJEG%F)$L4BXf˨O*w k՜Up=#-NF,zicLJuc?Y䒬10> M=px7XoEOgOޙ[ם:wanQ0ڼ*W89uxS&Xq]ܬlA/y~]I ,O=?ܭq%9QK16k%b$E9CVjwQ{^Cc L()2++˼Ι#ubV~tǕcLF/KF#s9:0YRz"Lc݅yfu{HzqKFpI{Wh$Sr]fRo}P(ځ,6@RTcUꯧY0H:[7]1d3O kyDXs.F3`]U ݫ‹/a4Y,l^howkU쉌;5TP*{yԎAq ~1~cwyy'[P;ۻ7q2 )h}мނf*94->=kvNwOX9{A͕ Y3M]c3ycq@$\RRYӺo~oKGpDN3H`=+[(W'.X%<&*O\h 7 0 j|v֧b4xJtQ )ѱ.:Ga]Qi/s,,c|AEbU87#-=%,Z_i9()Bmz4٨GϹC}cwх.4e6(+,Y;{zy}$S3h~a;MdXcإO$,dpd{{MI`<2c,yۢFGz׋~=z)Rj<6--uc}n3nDUngOfku6є<31i 5(sޠKW{Gхa@W}%O3W+r.}25hd<Ճ} [B1XPnڬ |Kxx:J54:&xT3o,!!ĵr/`ߨRd' XsX+jUWwEOo`ݡJ(W6qBh<;0&2N}I04'A3B/}zYaF]{ary?sW U $XwU3(IW7|ct *:y3襅լk9-~2 Mu0`);hp(C~J7<2J P<uQ|CnyJsZ4\z:?oo#vev5Hj)|s̈$퀺B7/_d޼ 8cyop%#fVdr͛l&X@`x'ErN^[ i)%UP#lC)>`$Ҙqvzc,{*LtRR9kC3KɶP#W7U5Z"Gt?i%`V)y+2} Zw 7(Tm/rt \`Dtm2Y%g6+/, jn_Awx]ۿkJX7s3Y-bugH@CIeJ+[x]u~ *By9No[ E #6.fU Z3s*0 %$=6aqbZg2'n8(v~W^9xr(ɹSGQP2ؐgp4!?G ;:]9҈<Uqb: ī,Cct6,|*@]ț.P䮞0_T{o?ΒłU=),륈gGk;&&|#(a51&gDx+y3zsk6s2SVݶXP5l?!iZHF$ OaI<խ )ʂX[۪hk whnQI}Nd`5g#CB*vp}}747m%}e%L)MMo4>)̸],c`2tѕ&AWGPfPufQ%:6mS1X'ܧ60YU*{|fWtxt6NYWA`+e$+AyJs``gko~qVeU&Y2!M;B\,3M Z֞ ,3:F7Xq̑A%Sr@"JBVJD/E^fkVݷo*aIp(F1 kKt5D5Urtɫ )"FaQ?,PXQnXvJN $ (zڶQAQ~xZX\_y0[t/F~M=J,n* "pMgr@Cw\.k}wh=u^L"c@=l43(s +g,KO*f r9xyu"W;Zi҃;[9 ՝xy@SuC^\e 'ig$yOL-5{)Ub,˃+ITA&!l X:έ*JYB`e&V4x!>Oyhl陈kݷby\o](#S{S/7Hr窲m,_orD|6mEi#Ŗj!yy/Sns睿yeZ}6V K׷>:)J+ņjT?/ETW>˦`yelQqom}hPNss] f_\_՗eh@֪ -t'$Xŵ=ײ[`g~Fߏ^PsG:ܶ._eBpq E0ҔA66/&S,'j;w+@nJt^ԭ}mQ~ŝwByd{ÓRT`-ث-KfOJX34yld=&rk, S$5`GO5KڎhxBq&JȰf@E=;?6V͟z>%ߗ"dgkxrBe2WiW|…,ul $5oL^1X'L80$P>4hyY27givmnbR[[)qig3mn2f05&۪C 8O{́DA0 :m uEk:έH5v CTC#OQv̀ytye~{ V7qYck;\olߝʡ{.Qi1Tl %pwf8\m|["vET1@E(Ct0#c1ZD44ګTw$NC$Z$Fcc8I U2qD14>Vd-/0O V™#%;oPK s|) $jʈKQ_kXmEòWsJ{'˭}? gS9rƕaJk;e'3k^xD'DVୢ4uU4jTu--QR R^7hϯʫhDgߤV*ngM?prsW3X$VZ]7d`%Ob+Sˁq?n0G3 ^_bqeCnцWlZ}WtvaZMrVUX9sD"ᅑV Jו"8PUmha2[UF>X'zåbؐttc襃xX`ds&c@-N_ԍ#gvh ȢC61>ďCRV`JKi/P.{ Aa*xy 9XTz~pP|F^"${{{4N9*q"qGCWY+$6}LU4JgBLˆႺgYCCPȟ5r*ɼ*e$\E6PT JmqqMs2g׋RRi,'ř\ i6aNzꏌ>7\O~&r!w[n[ESTS97L!!l,%^kjRkǘdܢ2oy'3f[̚W &YȳT} tŗn@H^4 C7Jz9K5Ś2aO SCb*dI)28 >J1"S w7ѫj͓dUy#'UYӅkLwa`KCd`i~@vkZ<>ʇ>FBI%][EwK;FǺ݁͵ 押^҂NH W_~}zxhXd Xb|dȲcsps12{0=KsK]t {޲nP#e:-c-ٹthej<|5RkovR$$dĩU!|e!3;3,S74T͵fgs(Efmgh$0?5V5$2,Ff  VzfGu]DWstN:u1,*Peop# -WvL1&g\L2XO(1g W=Nk5'=KΟ |EXoSf~5A'n:6AWNc}F'iMԹ gWv"QO ݷgO%ÞbB^>}:!jT?ihwQ6!DfLZ `%٢wjkm`H !2K5\(`P#YisvzWG_[͇LY.t&&}qp_GǏ \O;Vif) .\N3XS?Xξ_ﵔ5T|"gFXranq S--~}\4{= ٓslJ"(oGï^ZHZnX'qltf.`1,C }A9Hl^7v+̰@@:"OsťX4Tc+C9fIQtS]!!t S+,yCSpcO/{+]80jSV蟠Le4W)ɢ>q&9Bz%DJv|f 9ӜG6Nհ9O˜Qv>itY E6͟]~VKi"n.-`lyz|˶":9,9 ! .`a,;9ülsƔ)RVCӇsɾ%4cJ0KX`zG>AMΈX{$*jŦ{Cw*C5mo?UnC'G"ITn|O`Efp돾 ^v 2ō}cU_̈_bv`덆bKNw|c}H&2dQ Zz2Ms7f`MV6@bkiT-S: $JS鿄)__ |O+ƶ~=p/QuYcI"8u:Tԑ(!L5X[A30hCsZݷ)騰--^i,;-}C/?B=ʀfjW2ƒ|FCB;s x6PD^?H"x?1έwE-T )ӭ ]d'G@q@a*~ZуAV׶a~>TMOnc3K1+Z =Ӈx~yܞY̩"w]m&A ^9!. `(@Eb"Tx x>JpTVN[rɂϿX eO3$hU=r24J̐XכnjC@Ģ3upd.dt+/)Y0p=}67aga@?n8h!Hm3v*Bݏ*| Um=rshaBXta]csN)[ᱰ[#9(A/:9F@!QC̢fMNZfF%3J*t0 SB.ͰkR/~ZNkw]B,t䩨.ăf8lr :TFd{‹K+۵\-U,0Lh>ts}6N7Q| Sar} !ޝr'n8tsLGHf,!A5InzWRbjZvkAu7dgp$>cBIf56/X+ՕyDcR=ڙ!r^T$b۞ ,CbF,@o3I!mE03N,KM[Ee`)tr%+r-վX'ZeJ'-DKK/CCC5"0hڜaKo7j;S(kvz&JDÖr!?bg\DK L&)B֜d hI'BCT}R$A@AKsh2"ҁXp*`5>&?̓\e(270:]gMEi$;YDC!bL`*#ɲ@#"0US56Sbr<7%gMpf` y+:VO!ȃ ݎ}~$#clJEHALZ//ܹ70ˋ4SGd.DW= j7\]g 5`ĕbtn `0ahJ[ԜX#Va NQa`Y~.y's},HiA'z0}s'?J1GaWp*, ; ꊓM\\XW/?u駸ֹXv77yrF, ]77,MHA>w]-ZhXIclc}~DdavV[b~ Ϸojڶý*44ɑ&X:Ya6dUӫNDiZ??ǕJ?E#+o7Qj`%/Uߧ8pQ|7MN[a݀w|vqi6k7wq(xrp@ހ'60Uކ4=k"u-1K8 j&xC#Z1ÖV04OyZ*({ʛ]CGu,PE+WʯhrڏʒGwc!wda@µ K[^nݲ=oȜޫ2+zB-'<U=\:mpLr<-^,=%lڇ }).cw:!@Cmx< DE, x]q2 rLZj{+pr~w,)-چ*7DV4bxT N޳taab5XXUC fg+(`3"Q,!fLndKZlt|b} (? [G aWb L KK1CZyX/H`SZPWtKEz)" 5Yځ*g7YR5_wO[;tSy:zmm /װfgkwum^lM݁zXu Sc@x4+}Lid>@і:3d5[jíš 6뿽~AEM4QQd^dGBWP_ ɐw %$'04{F*߭PYGE#- Ʈ%EyaKX`H G֨`8#%8X?8#CW⩷-2WFzGMQkGK[Zv?^yب2$P׹ *6Zyy8m}}޽U'9s<&G!D@BDy̙{ϭ뽥mƞR*U޽ַjY4R~ȹ^\zkk۫࿍ݥo q’9&Au'Oj $K@$s•!`"1͙dp72>I4w1N~ЈM6qne߳rtA~lr_%:`kp ł(Ʋ 0$o0 o1wgl,Epx|"i,9 ioz@doF2G`͒zIP9qsyP3K)P5eT`,,}ñ`viװ\!QU̦AE̩\ʰ&X`X_`--]`)m^ A֓?|rp>H6vZvtEaifR$kWt_\!j Om-nwWޯɭ .cz.׶^3+ EEUCVPZ =9)%?VUvAK[LtvS2!~$7c1woot pcm#XQr_=G'Nu$(/I,Bv "t*=,5]$.Kbn 0"'芜OYzf:F24@ UtrsXҹ34P b ssdi4e"}- Oi -ZUlWSǓQO~̀n71X\a4BhƈaTg,˂YVDV|fL`` cdrq2b?*h-Z7 lK2L-^ <{@Y"ㄏPJ,17#FD t'Qfe| do-j0|uH47*Sܳ eRqR֟Q>Xl+62UlL3wW͞uzV);+:$}kBi,I,rNNM,u%͙c6fXfk$uˎK\"\Ӣ"Xb,2t $dQ.v,8M,W4P`UV{I W³m \dd64W}ύ3%1Ú{,D;YBr':q{Fl@dsk[ex4l#j X^jkGɝ~$.?txKQ]Ԋ*~CGZf0Nm yC,E\vq;dX\e]Y⪮쪁ќq9fb;4|]~bǦc,ޜ]=Z6 eEZs0fbÕQylvEz,&8Xj TQxae)fa<vO38|90 7`,~LaXXbz5  ¸C8G[^2cU`}KQXwJm]돶i^ !2XS'L>E7VWYM+v.8%)BuOg`t+o$zТzwWMm/<P%%} f,@1?5Aزz!pIVC=M,S}S@S*{`ʼnuuwu(5}6lr1=8Eca$p]*Tv*Lmάꁝ/M^kyk7ۍw*aC R(F^Xm]{C+PBIKACUYIMi(ᵕfA>mRXJGi]_Mx%dB[ . cLCM3em)u5$ $ا$*yCHqj x'o$V$׹=CO&m`F2,i/ؑ~76i2 BYj."/U\ Fcާ]%=grj -6 Vʭ8ɐN_]A?.*.` ?}I5~*(/ 4JuhX ;,u{?%GBzE7pO=)&}~+G1fi!G@Wiئb)^]{1bʪz kȶa%:TS5.k2L۠/_#k%MH^rV){p(dnTĵ\V҈0AI1t~~)b> Z%|Y=؋bѨ+z: zQaFrN1N"چ"4"X7 C*o.hJQ.iUbQ{!ΡQ+LhmtQW"1D(Е_U}C5-A|[_J}P*Y ++-=RDUP(6q"gd.$23z׷+;ӣ8oCOylaMQ,՚W5R΍C&6ڣZ]AMtH,+ *󐡫j~sKw.*m_޼ uzoٍ_eVeK$uRĵsh'q+Uu%q;O迼"BiG. nӲ-|G߽~Q-:h '-ciA(@z]`/ɼ)-J%ѕJ+0 :}0p^-{7p<鳽ݣyrJ>%V!w}"l3X* w?~g"'kiުwp(7#eAY>YVywAE]k6]WXRX2C͘Jx2ayw069`|PۥnW>>yAN(O0$4L?A 7Wa{r  ktd"{i(i> ]J1tŁ 8X@$13k)5XfKS9 :7;Hxpkda^l̻eop%:Kh>(A1Y%|"rx= R ]9UVcp9deiX4xN +$1+31XjoiQ{YIgAx$>)7&J|=;^>ʅL,5˴ s,>wVq'| 'RnѮ; t 9#D橢8Gv8\>yhFn ϟM-jͰt=pD \Y|zijOύ^ąn<O)$5HR=w7B# E qWRN`PK4%ЁpH`%j t,l4UHD 'Ʋ\Lk(4vz}A ._]۫t Gwv}"!D9ki2 ևJ 3l6uvsqkkcci2w_Lzjuq1Jp%4_ⶅ+m6Y]K:ժ)$\{IQ*A{ui/2+]3 >={<Xk9 ?(GTR̮kww)ev'˛7>{%ėnjy$0.Yŏ7`*iXM)BBOȂCMPC6' ajt'N$؀ցa bamBZfB1b|u^4XŪUdYFCa{qy@| ,Ó{l-n/y`y$X҅Ghm#%bX)]Nz'** 7 !Q|wsvxHݟa 0X+kGKAyJ/`ˏjX\:) _Um)kZ[;=<EWIU\acbF~|o& _$=RN \Po>/pڍ,c13;[> >'w]~tWȨk~PXjÒ)۾AOAI:@ۻ0cERD:7kӠj'b;Q6=KKa ir*| קKF5]S,8K?]ZXiUba +HJ\Ա#˽c*jZ7e2c1dy5K[k;SXZX,jp.lwʪvδG(3l]rIa1(4"2K`5g:'~T=*9F;Pho7e= ,vwYYa5Ke-.!A%|ʁq@ X,67#rgP-\ƝE4X஀V;`z)~(D3VNÛ.uWE?nł!nW}a8LJGA"4z( R^9t!TX;^X/,H *ིnF,0c`ON_Rt*~+]dhEͩvأ(VثH= x |u!şfF VMsdcH@77ǛUK.㜄Ky43쓹ޜ:%1S=UE -(qF N_V(+۽ X`%4~tpq@j': R P3SY^FV#+u+Rjy4@b֒4$ɩ!wB'3l|K]J.0X|js JGWX @+(I#-k?y+ۂ 82ՋH<+ʇ/0 I8ֵ(q17v%.2}qcV , J=gQʁ5<u .ΪWesl}0cS6P[%~L`2R(nmGzA0Xɍ? xż x%A ,S"  wءB!%#%B5_ɩuR'Wn|U[eUp=doICiL0 j%Jƃao_+i,B5hd{ؽ*w3hmDk,4XXfeVe5԰(,pb"WE;@JFsbQӌ`)8cq/37^&Q`xqH_Tҥo$e ms{kOA:xSZkR2X?8# wM,QDȏ_ub$&pF^fRJ*i*[dЪ΍9?w9/>yߟR^OA}hⱦ $eU|96[v! H(k nm#XM)?*V4/O2ü!1$cƂmZ״wꑽgVs)e]DlA=ZX1zvF$5hۇyhRmczq͗;#V9,!7ym)kwUQ4;bP9N ኸ#== e\M1х;5 o ک-P.DFtض&1Hqb4J BBp@Qa Lma{Ex,հV||zJš/_Os'ʗX,ii03az2]}3:sA"OᅆR-D:l͢I.ذPQc5]ncv&bOC4KU K2+ڃT^Pظgע &wyv2FXL2*eVVrEcN6cqe[G;Rz=w{g ݒ/,̿KE4YBIb5)wx3XʮӽL3"MQ%'FݞɘՋ -k JLnʷCX!49](W{Fm|ߚ6&'69$d"cE66]}]%j,$4jdYjv>ϟZqC;n+.ҤXk^ Ď?}'3KfDB6, `JaߚH{~Q<"h)Xa6BXa)hcpz3n҂ Kb`9XFwh^IuNoI /:='i\l2sGir`@Y[[ڪw`;WnX,ym"4g7s ~/پs`~R*2?e(ޕ&Ѝ E{'GOpj@ 3 `r=埵b1aIfBD#Ɲ^\]^ApF-iDDn~; #9P[Y 5fY6:1s;KX'ԍ4jj3H*!`kSS3`uT $i &OTux^ zX+ˬ]ή0dy>^_a4e}K||S}jS(O8 `Mo3zqdVMOii`nc,4KɻuJ)n8ABgzX,\&^Xf?IZ>wtS$3zPB=)y,?̒Q ?= yZ{r|)BQ+SōP,&:UH(㬎gFh,K,{WݹOY_=ZDmSnnllp "|(/nʳLI_lI'X/(BYWPP"@>~RЋ72OLEگ*T=fH?AC}Idu !B,b/ ` R-jW=`u ̀7dD Qp0ɟ,q`iG@߸&e6Eᅒ2Sҵ+lhY˦!Kg%ʼcc_5-@ݓX{AkzZS彔wV]&=Ŋ*o29 Vh SF Gt GOM0zQr~)X,}½>JIFr#U>[f|%$Xʫ)[]w̡70 MLX߿]اi4V4GAՈAh` "j,Y ) -kChwWɘ1r87D`A?AJgE;}x޿K*t$ڙae3E3/`H,]ĀJ,nHmSy%>5_ž޵<f*Z_g5mC6#\Y~P,]W h,=(7Z$|7?>8~zo7O9 t7c Q[#>B t*TEsdՌJ'R`eVD ^/'TyN2΃С"iDҖkpY=v<;lwYZr/6(pH̓["I]^ \ iqc+E3;Z=.Q}S uiqUo>W@Auѹw^_[{&2Ms+wY%-٥ #DW"#TbX+!Nl:P)`vv$qy뗜$nl=tH5n+AUlTz NYe55ro9n; Kt׉kn? `E$euOIaE0A)BzAߐϳ IKgnCX͞/`E 1;T/F&I,Z}F!:fQǡuёl,רY23KTdK}rAgzq ,N`oeA;Ac܃'ȠEe>)N)K Swcq\tyu;/5643]FgjI'_k'isPu(bnb|x5]m=[ Je3W$:sqJ ,ZF޶w`p6Nσ>L:ɹs{``t oϪ `/۸Tu]4ʄh,d0a~pss1yuWzNT0nNf>Ah 6#thmKx@4!,̊^341.JVaiyfՠ7BiFh6nQyN*vcp! ƒBq”?Yϭ32"Esm%^k{ (iAUGd Sxż#M<aZ5KKm)Eu%JB\!FWV50Nf{ndO!>$G 2E7"ͦ3cq rڳUwwgD yS%heX Z9tsIS+tō63Ecrᴬ."TC\6`qL.c|x4{sPE BG`}iCQI: `<0P_(/inǤB֟3g,/R&Ae_:KXFۺT. Szlt1XQ).˜>VEV NH(N9`ff` ̦FJ ghniZ~/S@@_ Wl+"$Dl4X+7#jpؿr9aq@޶D0RᇝG# (*@jK:~Q+ʍ:z4hrx'^ͯf؛L:Ŋ.VС \zs jk/k#@'7 ]||;=hrQCz;P@jr~lceL_֛Tv|3RSЭ">E_AskxdSQG3jS:9]Ht%zr+WJ]|QAYaI)Z0k-kp=="wb`ljzSK?`5^遹D1}F3aP֣o-j,p]𔯵w!6ow(iJ<zp",c a`y\u!:_}CF=_S`tt1V9F]#8~ig<`,~fPfte1Xj4`jzU hdcm-Fau0= h",ɣ~5V=> WlB5/c5Lu<>UQ_o`r,ԽWǁy§Jf" /J"D%X]UҮsE=@c}e_7[?fEݯ=emЯe,K_N,(t.T* ,BEߢ:Z`X`Rf"i+ ?yFA|ֵ(6T22We<_X:c97aЄB^90ؠkPjc$Nm,poYX #N^ Ć#<.]rla`3X,»V7!KgV% 9hgCPGj[ޗj"XG"_V6{v%]Zңo$vX_4؎`$%a4%yVXBx=*OX*V+)I$lf]`q!t?͍mWSE3CfI,G VXmǴg53X{"ҭ,ib-Xf׎ `}=KeW4{%2b~1Wt$/D韼gͭ~ZM5k V*o,8.?g7Tcu&̱mBk9IE(Em0+-u,BaU̯*YٟsZ/`1oQYއ $suRC "7\.H_M/0h잫tՍ[XCa_Ɲ`1 u0ǯb$9?7,|ۥu= ف b'`CdSRޅO0/F%5]IFX3R>]y-o0-3Z}C,\=%XU-7  UEhX/秦 7'8U`HeR檤|hUx(9w\>gM'>[Aa",m0,)5jNjtxt4 8ӡ*qU<Ȥa+ m Ep _=r])ks}'ĕRFv5,pEri׌r#_bS@ЕWvy ;?8-gV_<}VP?&X_+A$2R5([$i W$FM_/^q9TeE`%eNMkYՒl7s>11vV+Na4XWR+r=X1׌nqz YK^`=|KsY?z/%;ĘXbAE&V*={v:d«{s]sq!!07sldm'h'Sj֊ clZFw:Wx:[[&T@8XB.k%,IK^KD J_lmL"Tw4WD x^g 1p 싳a[R?kJxHnZ&$"w hI`JH+tyc.?./.Y͙EU -ĊV\_޾ťK3oYcKx:9;U ]UGip]E҈o'!J8Em12wDWc+[h~D, X]? HmXԴLGX:E@ ,FO#G4k +Gt""1ql_qt(+yKĢ 1x(ԵOOKp0Dӡ5'OESN7Ծ$ rUʝO|W4`aLc=1r/OB8Bhp{X)](,VslJ [Lؓ!;!y c_ 9׫al J:!R35ei7^$.jZQ(RQG脰se(jn38ںtpÇ2l'v `1SI<`x4X#b`G>B#æaeaf gjc386X󩉩YAi;|MVr?KRwhLեgg՗fyPw`d*GWk`tE Fѕ` ,*{ 5UO^C ~,}#툵c/"c·HC)kf+-NO+Ҭ6+~sl"dEjG^WKQ0OM2PX՘YBXQEr  X y XN-(]u/D&(؇맰X-?2JW ^~yb-DP֏,y7e:uUm $$>~,got2͑'jYF0W;X,! b)[h>o<}zs*fS5% kTuنfTC1U]k(clog=WA+_OO~˭NQZS) l k; ͕ЪS%!K1BG#}P tIA\ZohJbzHYJ۸^ė"DmQJP?V’Ru(- mC!Bf ׉NjEH8W .Nȣ cE!<҅!Yh}ZHxZwF!~|G1JXp w tkRr/PT7fwPE¾ [$oŕ5*~AF;]zUYsqx1&535 bU,|u\#%6JKM,=RXp8-iW{ u`E@ipPDH߉F"UҴSBTФkj)և;~2a mWQU,_GRW !LA6?z79`F2N]% n8׊ y ueeydx"KUDGhKnOlg5Arm"Ş5l}bfbLgr^ GL[sȞOzuhX|7 Z9TEqU+KV|V<JR6Dpc=_c> 5h/`M (^0Ax G2W :? nXԟ`.9fVq,J-,"u-#iXb yf1,1ܐF:]B`,`"_MYÄ;]F~d,c'ְ`u)ueL,Xo,bY*V'DEn:Bki klUhTwɺJ/^ds`I BtkxoZc/skUYx%.*+: /WhsuU:u1Y^4P2i=,VqƧ݈` eݸ] ` nbKY݅[ z%1!"@H5|MFXjF*`+7ZezsAuLՖó3sk}#_1 TI/DPV\EԞёid|J FL>o0_cE>VV_ lܵnK<`ŏY d P%K-"X)cn;cIvq |,z* %g@t6E)jzQ+ _%osgmgWAܣ陚Yws}XPSKUW+\5So^} W[GG_?s=,%KVPTAv]$y4v_~*]X/7g==%u3&3`6 Xcg t]PR,X+x;Dt%oBșN{VTlf nڡP:{wלM(铮ȘZz>դdge܄D ˾u,3 >hwv(bjzIg 7` F3&+`Q;\Rr>EB,..Eil8;̵^zrJ[J5>Xŗ,X`-y1GAkl5;2ĭj{@]i:I-w6*ZBݎl Q_ h#t%M$Ê_Š+YHtn'C:K'l46Xn XIXk?3Lovw(] XhQbo)U0A<ۓW>edGX)BXHJ8,` uK.bECc!LM]5alZ+ f`IOM^ٻZc3[K- /mJ~kmDM_`b.~m5vpK,j(JJugaZ[Z:9< uЎ٥.@!ZK)\~N%֊Ůqi~wJ\HK` @mYu{'e6P^󐮚*놥3Ƀ u]g]넾U} U>[\O?ޘt\^ÿM}|e5mD+l`I908Z_^nϑg|c]^W^/)HCX` J6Hg]}*R%ZgoaEm4̠բU W7HI˨{&t\QUSէkZVmMKV_*&`e~7`Y%4[R1EY| $eM.^otdְd+uU!攷{/Nmu[\+oNFGdz4BWH"jŕ*LE "zCL7` Xwd*6OOTvKM 66^πT2*p[|h~󧎜ΖɟXr>NKw }2=C fN[{Fxs]XeNF~$y f*V@QD^8`A Ti~ezZPh81&/窨`?{gFxNwcQQv7(qCTTdqI4h[\h=|=x]$CAisOJ!K|ٯ9FW ```oV{yV% 3CmHCW'fUC tpNۻЎ:;898g05PR OpBWא߼M,V/VtMxtEEU%~%`U7:i}AxЈHO#uWދLLm6뻒  Xgf$>%``"R3䀅is1H3[GW,Eڜ8fxz2Ԭtk띡%k%$rO+%(DHUd,y74 p^ikuy"%FoTGjV'"SFP rƂqQi "}'1XXnjf"#1Hm^;:CF-n,t)]3IjH$f}Z{aA8)Dy%KXXeX\A6<9Qۤ1<9F:r ")>>2v<]]`ĭRjG/m` ```vC 3o Ϟ,vWk" yRW #j|.%*iIL05Ahz*J5tO} EV =TfIrYB[\$V9&FEnQqzxT tJUԺ+L{wy6bbb}VY}Һ#h`]|%ֵ(4,"?fs;<0$GUs1˓Y̮Ix>2ģ9XhJu 2DbRJpPOZ;h5O@ ךKʁ#B]aisAE |F!ngL3aKUһF+1 JEU:Mnc*s?0 = & %,13@]Ҏ{thp%WP(\^ %RV;䂮{j%u7CHj5F#"*' EC{+g`H?bh8>ep<."*C]oeXX_ t-Yɛ.0Is4 &xk^`)M{|/ Į{pl9V? 66=T9j[Po([WtFNXXe!4 5-ʚ7Qۧ#FLon';[[4,rv|~J=kv5^앆s_ݼXX7Xڳ\tdo( oܻXKae6L갆Fl `D cScGٓ,,{1 K#܇d'U^;blY9 EG=r*}Gu뫫 ]e!!3 db^]ihlٮ8\8[_{]_۴yEb;o+,XQF-Fwd,Kycc$`m* 셃G{{AtomCL7GJ83OG<ͧF,5I| Wt=!"mx`M{~T5 B ȇ|q퍍A4R j:P5;fXX*J]?_&Nޤx~'R(DHu=@KM&,Fdi~ Dgnn ]:Z٤ "sYKK$"V9^XXs+y':/wczBc``]`uYa,[X܃Uk $bT23R*#N~̥M,/K@4q,,`MXHKe<_)ODxtNw$Po뎿#Fq3Lj QБD[A=b%Yu@rٟUo*d3{|]ԝqMK.XuJ`)Rt,#jN`!=XnVr K[moX}Z)8k͛;aϚ3]qK$O=^]9HOxEfWX"ӟET6"$N`Xg%Ȁe|.C_;\BW?lml`S!bCWlۄ|X4I*ʓy`)+?m.ַϟN׭5RNfE`cf;7#E`ҏmK ,X`w-P8/RO$K+bRLgL=۱'Dq*X#,s-L%TơYgs ,K?" S1!.-G%E=k^# e=yh/:88bu+kZU?]5,ucFrK~AKr:>uq`ћnrXEL`XFK9Õ:"bHQyx=XX΄ԉeB(f+[[]{/~x[*͛\v~ss=vs տ!nR6:zʹXEL ,bJ ,2`,YW`X-XWuKNH4L),.Կ3y:Bh0+8xRE/v?;?b9!}p߸tu6RyMSt".::`!,&,j,bIg?ckK)at2Q1dzQ_X[?~{P,FJRXGcC`Imc}M֖;G{,",5?Xu]C85 h pu]Q4]Js֘]=}ݏ?~xȎbQ fj8'-=+5Exs "GNey˕$,r=\a0F-,}됱 2,xˑKD|B87L]rKd\"$K,uB`V"8X"{.d,`"nҊ=XE`XʄB,UZOf bGF9,5pXY/",",˨=Fk)/LfBXE`qE`]\`yaAa ',mBQXE`Xs;E`]``-\ ME`X{B ⣡e pyxUVTWx`{ 򼆊_E a8YCL-4`kP`!, `y"bݐ.p7Li$FYW+< /W>xFIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-1.0.png000066400000000000000000000175141322271446000244350ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<IDATx tY% I@X#H , [ @@ fA@qaOZ]ĥvZgn{=sӹj)}ݪVs>9=yGTΝz[~Ss H @ @ @@@  @@  >#fqg"@?';`Ձf nze8v7 l ~Ga3&"@@QǮ 93.[Wp>F 908=peEʠI}sKfdMZNJK>7@CfMZ_mZbhX[zwӹy%)}rD^4gvptbXuFD*/h⁈M @NM38+g_=5)9sy)/GS@ohqns҆IL=$yjB Ue׬ ^2$*4lζuD<q-_‼ Aؽ#v?fᬞGG?OxvFQMh qÓ2v욘K,H>{،c @N*H/[Rۣ6F_^y}zͣ|sCq=\ @Pb!]uyrؕ\2IuܭGڸ%A7TgMZ0g V׽ylGpӹ{ +ty0+ @Z6C_4k6"akN  @Z-<23d֖av#c7 @Z#>XTRχ jDE?nȸ"h3⢺>ȑ7b: 93|랍 mӈ{ZU%gNWqWsQ `]Zx@k^5)zisG.(ZU32tO"!#u} 4yIi=S_=qa.N((#aGnX%@@Ltm@?;i@=vnӍ:~W @^?Z(Z5-;nC H-X i&E?{#Y%@@WG\>aEqN IY%#K01Eξ"3,}B @N*@[?pJ!3_^Ҽ;t3fд 5E/~kuiKgZ|89qa3;1)&WL8na,F^Fhm6?sރ:2q!JW23krh6wcx@JĎuN,>>ؕ.e7g|+@ztѷGYy!}!1CO㞐#@DHحX)&3uYFQn}(\`ζ|{V ?(@@n{,УYFlXo#J4)nm;^^}S/p2W@:$2am_A͛(ޢlǭXpfFcRs:عo_gNFM,X_QT*29I @\4::]|Ax翽u _r79m[>frrְ)mO[B:ë")Y[pcS@Ek/=z˾#k}{[.*qCl Idx=?}~^,u9wN8͵־{?ld^?Z^;*ֽy|.)vѽFߍ5n @r=fW_:qT!X.[ocYnbozO/s>C;(G?_y׊#~ȁ)>)v{ղ7>XswW_{ݜm^uw3+mpszۑb!|k? 랍ߵ[ʷysߴg~<,@@|;\/?.{k/QKwW[}|/oWm:e/._k]z<0(@@g`UaY4<>wwBŻgeGdގ7 Pusg}l{-_Շw\5t>PWܼK87@}%%|`O>\ةV_Ͼ\n]ߘk_10.={vzsKގ=`/==Wr=7տ @ɜ.K?\/^-QwSx3A>+vJVӓKa Mj|."@@|E{gpĞjۘ鹅'6>CWboNE|^ >ѠC忎}1ku{{C.{1y;iӓ_ϙqYc3#e7ib>{~񉊟nz~wY>(uõg_}Ѽ7C" e [ ?vpY7:6#.*(aҺ"Gjsflot٪U Flx.& mu2V@  @ @nh &F i  @μ^ @HH@6 } @pHn@M7 "@@yr5b= $2_ @pH@6 @pH mcxɞ@[ui˖D@WP9ۖ]{ zY @Z]QK }F) Y @H|O|ND k=厈GG ~GSdz{GRTbT; n;{ ?XrV^9S[Ӏemc*iWnM+NCOԡ%@U#}F̞f U-R:DŽDU:'vޮu@Fv%\}/;pcr1 槗t[\t;` o<{  @ 8o<˿7iNOˮuKSg]uS'Gk86fӁ]ڃ\r6ZY* /˯q6#~Q=y᱕_uww$>‡&] pȟ7m~?8k'ׯ3z;7tg_}Gd_д줴  1R@U-uRX# $mܒl O&>_sG> @3+h{_kt] iy c2ddYf [~S$) @5@F-5U4@5@|g 2Ɣ @\d\!ӂ 5qmYh~Y @ @@  @@@ h N(>.')#?'1-op~ ԠsӽЬ^2R2+Ưy)`͓YDʫ֦7W ' bduLڙ+HQ }F><@=@Q'Hf  p&%H#xO 6RgE ŷG⡃ @ ++@d\椌 2a3A~{ ]A m uMNfv @ ȥWVu<;)@}zq+,m~ @ 1KHA㍉c̞8ЬYzHQK 3VȭU*g@ ެ@=@F-% f  h0k ]7]ZvݞCu~vr  ּ& d巚NGhKDz6_o;*`^:M 5ٜ@ILj|!RomK=o=Rm7vMOU{?wl @tH0ry!2鉖mGB-?9>oG$t6g aڢ3kk#_z}WyW@'X sR7-^}7;,5?,;S6<~ w=綿Q^_쭷<(\l85点 s,+|Sy 5 Vh>SyoSރƥJ1g ݢRJeǻ$x~:޼@㕒ʹ #}ϪOH4SBϼٽ#HTQvLإCbG#Hqe  pHh؅@`Ձt;09hBb~f  .SÇ*ْ2(K=@gۘU N-%1-/<@=@bFV'ge)Hk3'+HL- @{{63{\{LMRT, ast5|@=@4ܜ2pk|t+֑%{"FNf 1NJ_n,ꖚǼ $sw1| -!܂%`{!}J+@6l8T3sKma3&FCu@_ }aȬ+Λ,i75G$z @7G*@@  @"@ D @ @@@ @ @@@  @@ i EFi^;r2NoHW _* ]3GIl- +$נLs @@ {&\2ke'#-r@ 1 @"@@ D @ @@@  @@  "@@ D @ @@ D @ @@  @@ @ ǘ @Y@ @ @@@  @@  "@@ D @@@  @@ CuWOȲZ@S|0eФU86 @|EZ+gJY @"@@ D @"@@ D @` @@@8mgvpr r:[ 9&#nhq5 '*{J)!]@]nMI"@@ D @@@  @@  @"@ D @ @@1@  @@X @"@@ D @ @@@  @@  "@@8’߻IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-10.0.png000066400000000000000000000171471322271446000245170ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<IDATxwu6#$ɩI d&M}dDrDQ0&P&;\NTl^^,>00 骏G[bΜ9SQe$V9XZfz \DD "@"@@@D  @ @DD  @DD @ @D "@DD @  "@@@  "@"@@@   @ @@ 7 sZMyRΠ{ko@giy.Brs_zn)9XNF}zQz)oԵA#G?W^;Y :=;9AH4OtWeWo׺8 MzW֞?{֥~鑹4.`I4q9JlT* ukqԚ^Y#WEA2:iշpZ [ R# .". %T{߉/Ov;퇯\Vu!@H0n~ݪ=֠e۴L;69U͆* {NJl;.]]Ǵk?b y ٤{G궪yёM~v :줂!.vcH3UY s>xi|fܞ3- v{uZ68z]vr`56CF?~ǡk6ީW{.rCiQ+j{Ae=3wwŏ7ֲaQ]kon=}JLBrS 8,W{vDN6KRUr'cǍl܂]@ܰi~Ċ`EXyUPA{އ* M2zLUVQq!@@|'@ne|A$ab "@NcbEUCS5:KEݧu!Gy1{M~Vg_3 ;,>%원w;rv8b嫫o09" (]V MzMI>Ne;1LGSrV-xϊglW̟ C=ڠC'H;qD?Wt\9=6`?dɛ/~>}W6|;̒cgo pgӠ.]o9Uд,bN|qgEs~:mW;SE$}W*|ۚhl,<36Fcy?Iׁ ,ޒ#Źo?]GToLEA$]x-ϯyڙG6A]2n㆗R"_^ڜIコ0%rpsL߶pOMjI*^-:Z339$)[9bkyM$cmz׎Yy?#z?tF˲h8w<9sǼ}dSn+@jLjnسӓ "@2FCk{Zb JQYmϛ^YE9[vξ@~ WzV΁`i :!D=v!?TzZ^i @"DD "@"@@@D  @ @DD  @DD @ @D "@DD @  7 lT"@@@ i[2us\׿E~ۧyRNjYbv93J4>3񜌄 ˣ"&澆]Gwi==jbzxVG;:@N}=>Yx5>е @  "@"@@@ "@"@@ D] xƎH$]Mw  ~ U/mxzKoi,@*SQ٠/5tJdR! .2>Q$@@T9=IeȒ U_n6L; @*T掲}_ZFJXXK" @wL۰iKo.{s*4@ z/Ɵz}Th ^wWWi pHۡgu~fE2~K>@n?bE(v򎢫 i @JDȃפbdF.JE~x$TN$f ryRN*'@sSP)"ev*)@r$uN_TJ_o"@j5cg]  @wW @%Ȁ!iyD)׫p]z@ɰ[H`*%@ [:N 퇯 @J L @HN;41ybbjٷ oT)ᓅs򻤿݈z$vvR\x,Ԩ{zlylH~E#ȤWΞ|Z{nvCj5ݨw΁ri

@r? n7$1-"@@\&@^p1 Tp4$@@|7@&9@O})Q:4K$@_8O ],qfJylP)Se$iƜU{ǻO @ȃHbG/zj`CL(:yȹ{4ze ?֨Kr~O+2?k=oٷ`HylX㞓z%/ @ ]'<7xFA욾uЕ$9tI)cZ"@@D+a`n\mnX@UWٟм<6͐xtVԠycch?M"nTZ+pƏd{;^7SJTaܾ屑M3S' TUsY_ պMnȕ% =mlVB ?ݰg'o լW#^<}k j5ݠ.ÊdU0@zLYtк؆]Gw . @(@\U w)W@ ]|[ܔ¦ ͓r P䭢8z]VnpC_eX)@?8]G{d\_$4D&:kTEzHfqHL7虹;HV5   @*>@1/&&$XQ x*y^i?|Ŵ[pXuvf>^TQANFp$O:T/}1/߾")f_W+*@b^xGy(ZzTGjF?`٨nmk?^] }D/߶&%uaEHJةO}wzdNW{Žf+4.@i\%>,qqœÑK w$n?|#VNVMzMup`ɸwu|VܯgDN˜`I&O8@Nܲb{jo=,6xa /a }A>fo}3缛w"Adybu!7&&> 2p6z=LMzqk%gj▅o/;1f}jC48/,ٹr}fTn'|N;T\ !}m7Pk%&m);O YC^Y$L̿xߦF>~HyeG:H,z_\z`_z/'_3hpYy?~ˉmoyykZ넗 bbbt>dĪ냹eR7#Wh> ]G]Yvh߬?=soZ;mk{Rᗡ'@r='J?pG6gWk s9mش%t |I5l c֮ض۴3 >ŧ/>9t,to^7tJ}OۧMp@9H瞦3&"tFF ΎrgOL#mW] >6bF_Ҵmto|9HLJ,ٽ,3z طò_?M}KλO~VG,Pi{ZJBޡBrG00z֍yV5/j˵ߤ1#qk^A|-;?D'n?m\#);`c))X7 .16o~e_J9;=%|i\F9@GH^g}3Dp"?y*u ȩ~6)t8<3tZFbR"G)#98S_^/}J?*(Lrs_hۊS+rp/o?bEFr;.Si _ n{%.-7<;/fWdڭ.{cŢ/.ߡ+owKȇ3*?޸[} TPM;{U'1o0#q;HήGv{<;u? &?#/_D.ԫEJ  T`ncSC'}rxVGeNMmps}R _jɇίnسz) <~p);n*έD~GJp ޴^d kzq +\~rxJNQPuS46q[_JY>r>6w)$X;%gv-@6wM:'?e[~޾J>2wyq~e}*}󚗃r5:naJn9댐Y|-w&l^}÷ϔ~9@ @[&>iƼ `{朘eJRe(>58Pv "n]nس_>ÈU:ãqnq 7ЌfyRP+gvjƵjٷ`U*M9Xpul "@"@@  "@@D @ @D  @ @DD  @ @"@@@   @ @;"@"@@@ MHul "@"@@  "@@@   @D  DD  @DD @ @D "@" ,޶IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-11.0.png000066400000000000000000000163561322271446000245210ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<kIDATxipqy ,fG@@! -HE @Іj1 xqxKb5$^bs|L3w:~δ;vZ8$Y:=~y-vC[oȮ:__אӝi@@Ą 2X    @ @"@D   @ @"@D   @ @"@@D7  @"@@D   @ @"@D   @-gSDaKfɋ,ń) ޞ I;L ڧ>Zy3g͏ZJ5`Шisʣ]ܑPHYɋT6dluч|}#d@Gh/9;6kd |ۈ#rGEKXJb3Oʯd[1w&5HYPq`Cج%zmf> _5@woL*k_X7kG$Gn \CܕsmY\2r p;0smW 5?4aZU0"pڟ-X%udxaRYnny߹=c[e/K pb*2f}cxgM,X_d^kCjN5!F)m}{ڲV<=enhgpl &cRE_<8`C费9c,HZ12( [_kO_zh]BIC7ayo Ww+!qSoJ_r)h  \SL}vgz U~9X1i榕5'*L$ i{j笘phPnHWwniE{Mv?"$$74!/ ˉ30@ȒYO _ޓStMRԉAnT0}UM?z)zs5@iJ-66W,Bϩ9;$X 3*4)e^Vi 0uE{7'^ /dU>yՉvUdVݘhpLim ߉> o6 yc'eziv5ح/ޘ⊙Vlh#nƚ/WS\S|[igp{$5-)jzj qRNgq뇑u :ܶ1 |Nc3>\?uWv^sj]Gd:߂9ʬ<Y11} :ܞM>$}顺/C<퉥;APu)SRw,ˮ:Up㲗7>+}JŁUF%1p{R6*kWZl~#[g.ɬ0*—LYHv'i|_T嶫 JRl~3uH֊ {o4 jk mwս;tdžQeK'T>s[ŭF**k{}myl08@]Y9>  ]9,>gEM+̫;Ή wvE@72`GdRᆚkk>=_۵V -RgM~V+H^/BU ,ZUv2W@wfޟ]x'. i"9kO vc@/z?fdrI-`ZQ{3yѾ=[_hK[Z[.-\ ߍWm95?ڛUudWAë{=>z.` ȯu.@Hq{ّs!-X׹ @ :@@W}edOvqNͩ=3es!̊Ƕu|Րsv.-vX}b|Ί)Sj(!SΏT7 @_ܒ7&gƦw O/}x"@bB@@D  @ @"@@@   @ @@   @DĤ "@"@@@D  @ @"@@ uKM_zh]҇g,{x7G=1cyG6e.?)cux[y|K[q!ivK w?oϩyejSW3pxz7TsU  7 % ,D    @ @"@@@D   @"@@   ȟduŽaUL(|ȘcS&`˫]7a%V j8 +] 'P } &HȊu&HȣM(> n2 @&@*m4 @(@  } ˏ7 @ 召3 @&@^kB@{ K^cB@I/=TmB@\SL]dsf-*xk rMPPjb@@D M[٫qASg'n+e^xcLL̝&(m=6kIƄUSg> ?쮆?;rW~dlzyrɼ?=&&O5?gcבHZo$i8 SM,m?;U[?Fӗ{H^鎡3G:@\b8 CƦ ˫ L4bʚʝ @ c @Z8S-111 @. '_8ѓ%7|_FWaNo"ݽ7cMȥȬ s,N<37z`{Y~ 1%;{^8)o<@Ƥ/LH(i(+tfdDB8'*U/]I/b;2~M?k_?@6?=lgl;$'Ϸ tb _UN!<yz<@L]_bTjY|Q㻑~$oФN 9|+৵^|^i8`/$ Ę2sZ˃Y~tٝ_&[~1t\H'Yxs}V ۫?;~~xs,c=#c A4oy5zsA]٭NY#FL_|kwv\ĢO6" dy BS:x燯`qKp[ziUEvܔ;|pM, {,h_4eqi2@L/ /9Տ_|Db\ o݂􉄒9BA՝ &@W= 4@HHƲCƦ 2@ȟ#$h}5@ȟe8m &r~MHc;F$4@H`'F&6@H isX$0m3-`p^g[LYo^@ۢh^/b* 4и9!uM]m@z>>rAr>B^o?* V{)s%n]X87nƚ<GJN6   "@@   "@@@   I"@@   "@@   "@@@   "@@   "@@    @"@@   "@^2{sIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-2.0.png000066400000000000000000000103551322271446000244320ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<jIDATxi}yٙﮏ| 8B@H 5葠*iըRͫVjwiR_T %-%i(*jM[ #]gxjS"Ggޑ+v݅po]}cs}@XtTh]r#\w{*+fvܿOU?,m]1h @k0xcTTӣ?YH7Vœd*ߞ`O$f0q_NY畍 2.dg^5]:{]1j,߶*:8'Ruqi|,53ߚ= JX8Wqڏػiݙן~9Z~йoajd#m;7qtd 닦Cq0 M{ECG̤:ڃt5VWUۇnk:A< kreajf7ޖV&J4u:;D2sHΞ=21.dSipӛL :)\j%Ѻjg^&t{C&[Z1OeoX.OaZ=e @1ӥ-=khK$3t~< gx88ӯ}jyzK zΡRyz,s?GMOI2ũxע{?,}4uCw|u}'^sӣ?7U س]:~Ŷ{oog'sϼo8{(^.7 ?oȫO폂cg93ܽӦY;7sc7ݹ{?w-0;Ze+/·ža( @_׆;d቉ύ< k_?Xg;` @ @ @@@@@@       @ @ @ @!\&!{63R߶]{ 3 ˮ{]WsxM-[Y?oT@,7vZm(mM)oJ+6vo?OekVT@, ђЖշ~dU3 W9ggaX<4.u ߶2Sj϶?]khɖzkTn)+Բ^)'NN1a aN_r)ܝcǪݏuۻ2Z:׶d ]_lqŖR}u-̈ ˧ʬK]tSBݙ j] ˯g7:AX_qsgMу'6    a>a8gb @>[n'~JMSMrJ%+      @ @ @ @ @@ @ @ @|U&+ђ1  w-X,%3MMAM?-?x;[m)oZpף#Q;ts@<:w+߿7ڿh @jn(@LA|hB׺TU5  6{]_|h >g+;[W @7m[?3Ok&QlggnO>1W|Mwur-@t ջގD*mW @gC$@@@@@       @ @ @ @ @@@@@@@      @ @ @ @ @ @@@@@@   XVA,=zons҅ Zj$RxSںI +=Rl9y۱XB, (Ϸvnx [{xb/0l) *^~;[nmxO +?r՜ӺjRٗ{\x)x_Nh9z5l% ҵqS @ @Z5IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-3.0.png000066400000000000000000000324571322271446000244420ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<4IDATxw\q, XYG4 Ld7{ EQAaڌ&Mbfh]qڟ1~){u~WN:PՒcM @ @@ @!@  򧪗޺T{J74 0߭_wOUT={Уt~u?rKcsq\AN6uuEXIHAh|7 @4C-}gk{UF?n\44ዺ>0g?nwZ}}?&<"D<^Ӳ,7F6OߓRUwy cz1]C刲v#J||2(I+N2y'K睖{͏\[,tT+7lPGWLPFZʅ 4q3 JG#z._0>uvly&/^P|CϡCrf/SCVR)]yjx97^[gY&-L;?"qa<%F" Nxmu:[lCC~#צ[5 ߓxD{)kk=KSQu~X<,pW+R yn l3,c3H|{?@} @\D0WzgxyrpQ~u|xA;COaypg6^]t',I q~[Y)J5~L)H\w2llB^ )ۿn) yxO=WˈrylTT mqUԄ #_nꩺ:mcw\"&^cL}vk?77[E98C]QEGY# @;ZQ!"|&y_DE~k,zz7]WY8V^[2*pO|\6ml"pAwt{q!#ץWW:Gu?3 ";$W~_u8K.)|dW, -Rܮ4ޚLX5mծ[MOg., @ @61jf3z1UoՃcRY2 )\"n(獤U[.h/:αJ~AnkJ\Ÿ> DLYo½ }]j3 - GRbJ?,nr[+V>.Ka(Eew7"}<}iv~Zw|3Vhv& RJk%Fd&hINzvH嘃>[<ۇ{h6$*`ͻ8%WH* +X:)%OܡLN_eDadje^zMrE>y@Z'N<W,^~QU[r(\ɴWd7 }_w\fn{h,"Ld,tFӋ-~-~V(+Aru*&Ms?@ިɣ Ȗu@:_*n݇ݺ|}P{h9ʴ75]N }Y,plӜKMhbǿ1hg蹗 @\c U:*ݰ‰cᶯ_x=0Q~;>%Z@Zj%2_VΔS-ڙhT=Uxo+#L<;f< @Ywnk )dqO>٦YFL[,,BX3}$8G~1𮡗JG$TtǮnCi)ܳ @^lG5p[',uרZWݍ @vkqrt6;j\@˴ڍ|omӯZM'<1f@}|o=sOL3h,#M]ҫ|oVFQܗ @]Wyzhy>[jZ} k/k?sHhɅRyϿ= #! 澜2R+  @C[sTD4鋮vPF8W,L4W{ @df^#?[:$uuL\`xD:wXt?tT=#K_w&JcycҷcfuEF17"lP*#&2V-e ﻯJL*Ϲvq@&nRHa$1qSk'ߡaic#p@Aoa2ZBT4tDM*)[{lq?@ lo|x=em_"]VW _ygM3eTc3r`Vq/{J튩 &XYG:;-ym BK5ƱrypdKWօ$p /YY踹KJ:z|$'',#o~u՝}y{=VQ'xp_@n/Lϖ'KL&Xp?@hX:LdJFuc½:;SfzMsX=uժ -vWK;J|Ky@ mejNeZRGY\=^KuA냣 K*w3>L 5\ͬ404?T{HcZ^z/ߘT0r2BrTb;4qV*Eiewp=o34 ZSFTF@[4oZokr϶.\G Z&pGlxr~IyҀ>YiY]uvueڥlj=-T]V߹otxm㛩B?wTЊ2zZWG: 8-w9թ&>ck 1~%|miDMFt"qov.m9@.Լu tTmRC+=J=IT=p Skm5@^JZ@h/XH)[[$gJs/Ԫ u~oc7\W.˭l,_ Tj =jʅ'U ;^YǢ >d]] YF=#DNrB\%8S+O9*^J.ߴeAw亮69-26pm̽FԜU_]}@vYN\bDž^ ~?wUIc?;/1~ w̽N0, ɓ?~(!T3mޘC)7̶OL^_gvdW\YHD쓿iH*g;R5sO¸Vzng," ߭7@{cdN& {sǮ'Gj\82j;kGH!lO) C|F:|s5z%  w;|D^/7M/,i)YANtX}sx  :XKK.)Y7X.6ЁdKeNgҪF9o{+]&y]?#  @% y0pNY؋ѕ+x$@)Kw}rTܘSJ9vZ&-N#@o@\ ="lۏco!.Ύ2 $zui %_zUXVfl rC\c1*lWwv_V'W/ȄQ]mmwR>(4NȭMɘ;mbuoH͗+ ЈRWȈ\sH8;e[Ai37  /6fDTooM @ @B!@ B @  @  @ @@ @  @ @ @  @ @   @ @@ @Y>?@':uԙ&\`7/0  @4)%ڍf1Ky~ҳ @4)N:us/,B'@ @  @ @ @B@ @@ @!@@ @B @ @ @BB @   @ @ @  @ @  B @  @ @B @ @ @B!@ B @   @ @@ @  @ @ @ @  @ @   @ @@ @!@ @  @ @ @B@ @@ @!@fQuW;QU/Ճu%@Q٤ZDNlu@&@wD,ЉuaҍE:8MV˴ҫ+ (T +rFU%ez @hY4ibm}:]VEl&@$sߌ"\>o؀ EkxDZI-O"@@tTym44@v bW  !FiUe%* Gija{Ogv"@Acx B^/[Z%aĕ''FH @AM `=sK/Z ;s)EHlVf pL9=!f (CE?Fkc @h4Sj<َfyfN~aGfq+@krEW09LUy,'37/pRaz> @4؋/+}i+ǗqZO֌ 3*Ҫg8~&0{l`n v_zBiͶԅǩRE%4TчlӤ>$tzPtJ3WFE:ueӪyW;m?ngOdJ]\޻?r}GXuAr wC6Dd:,^;>dGQ=p3=rTKgA['Fy#ieŮX@@ =ƽjm֐9T?iUp~g7?n78|COww*Fv2C@ ̷ӜqB/"D  :RNKȵ)Y6?Z)[rqM @S>/- WOb/zo;̱J2Of3iZWݙ#jU@ 7K.;p @#!F5bmk54 /(G5H^e2g{Qrk :@h'$s9K92؍&F5 :@h'KZkTF6}1@srvf8ֶDYa7*8qǹkS+ګk !zm}ق@뙇a?e#q&vx3Oֶ;@ ;|p/P: }Z%^r@gt :>T.Ӯ}ݸ :AƃO}+!2@G[T&o /_x @t5 ㊥H(Ϛ/O?v?wI6˴kʼؙc$WHM=|r~?%>y1*T:3o?˒+%@ȧG251O Ŷ  : #C bsmT.`'}IyGzXk*ЁhPV7F  :UOUubNsC;|_M@ X%׈WZ"@^@CjPxmʤ oD#ߔk?|\offa1p3:{z5uqЫ#uMv閱M9| @-HJ߅Ka7|V2x>BzU]ۨWYg_"TrT}gq( @ sc^CXU> yO;ufMS@\!^}LJ?ƒЌif[,j,)XmQknv^Jm#3# @va iK4k9qfŻ?ף.33DoOh 7hut_7?,45e~btX~Yrc zTUΕΛ8;m8;vߞ@H:Y<>罶H)Z^o!2_H>瑗{"pnaaZ=Rﻍ@3sѷ^$tt&".Ds[Eeڏ|MbV7fx  V)UB$h~v]-f6VJwO~@NPS nCfy3GB" m @ @4!⎦B-_Q eVQSw )T2eUg$;]!@A{4&Q?>bI߿8[=y}htN~Ok zIRx)F?| w_/pZk`hi346|} [,Ҕ o<,0ZM3? Sϯ؇FQ fkhl 6qQF%Z|$g& ڐ+ m->bٝ0]A@hD*UCOm)>EKS#> =U>nq+> T6Ⴭw]dqG#@AN4K3O[9 @ @4PHQkJeRdoR!I˘o:e@#?# [sY|@#,hcFwKǚ'&j6ӫZi-F4nf8<\ ɓ>@h'TTj-bYoS2Qߟ'}k@INͦ|᫺R: }3v_{ҏЎ"XDf-s<)*>jZ)mPFAB m @kC-&F76@#+ @uJCh]c @eC\AT|D쓾|fӽ@Ĵ²# ^Y8APNoH/:/^[Hh'1zrBXUVMcdN @)iPFR昭"lO]`anl'w׵N @;㈑iBv8-* @A[ӭ\Wkw GԪ\ƌe $@7h<[$5ү~& &Awrj]H_*@` a7N'g{/V3ۦY٩5k%@qz_{ND03 ڸ'"_ 0x7^ԺjuHɝfiOsV @ dka> @4$@ ;>A@Z/jG]eJGuй @ԛy$"GAYḖ| @6P_"j]ELKn @O>q͇ywO|$Z_ڥw<ޛ!@ @4" MC&8uMhJC_))Ψ6iU•qǷMhkAtT^~6p[ҜVQ?L  S+\|^#֚; Fa7$D:/rYB@h4F[l(8G~/B[$2t:,/p@h8 @ @@ @!@  @ @@ @@?Yw2=IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-3.5.png000066400000000000000000000013441322271446000244360ustar00rootroot00000000000000PNG  IHDR FsBITO pHYsE1tEXtSoftwarewww.inkscape.org<lPLTEU@3+UoDdF`EbAvHtHuJxJzL}LzJ~M}LNNO~LQOQQQRQSTUUݔ!tRNS !%'cgk AIDATx7EA䜣{;A`#fI?Ζw%CsxRVTJG@@#"5:K@@ ~$ˡ2yi>nhe4igO/nu).%IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-4.0.png000066400000000000000000000353541322271446000244420ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<:iIDATxTgI\ƒ ADc:JGi E)RרX[kܽߖٛٞd7eSo^b2ǿa9'4YKK gUp>4!ycL&x'  @  @@  @ @ ='93Hq?--cOY5bHA.)Sfy 8)ѥQVUC|5Y @<6a_m}#SV8>М `7Lֹ!Tz$50cr2vGFI앓ܥU;"hذb?]tw1/YW{P(!>j { iG={۹9= Z5{~Dxu doF9ht[zg @ ~pIB ;:-9y0 @<1Qcj -8$opEgmpUy#jVH Y5FEK/ftUy);*$^!EoY˺h=e=s^fBZOj8qa\{3ctY!{9rȠ%eeG?5](^/ɫfx-d9տ UhYkש]Qݔn6ݟg } c4Ǯ)xhyU뫥 ߋ㔕##ٸM Ч#pMy~ q9+.ٺgY;'B  ߉Ddr~}Zl"9gPo[L  笽:{}!B")1|   sq4/,E3 S6k- )}fDx)ч 1j9-pV1 1j6t.=: F=uH˚@?@FE5 (d2 bCʵ\SKfox?= @$XwLJۦ䒢֥{k= @h\Z,2Avn=@HsW ץF 5ȏ 1.g j\FX?&ĆY. @8NY~>C6 1ur~C쒼1E @g!@rÞd|#>x /H3LİY<qP iY'NMuOedx0q*vO;yRT]_WrI1GZՕ1`¦.Tl9+~b Qy؎7;|ń @朦鞿yśVmj=)| @7啈/*Zfa'd& A~܆9%G.j^Rq>=V] cx1IY?%w8k"4l(}9,1nyCt:`0q+"vǾۤ\#C?CT|xϪ͜i=)>S /5;ed/& ZҠljZlўV۸ft!݈Θ0|MhyH|⣒fO[u4vqzI]R8,hfV/[g}횯в䵶c3><41SzX94]Z;UJkPO  {ݽD`xDRw^zp1¼S rNZ m"=pqd3 HUeKE3iH5vxv`I!x]YsVeyVk3)uk̂f2zZw7s @"M)YV7UoBCe+K˰ΊԞ>(^?qp?{MI}}w`05W_?sw_^vC'n}Bno.fIÊDWp4Cc_[.C@&.Thޢy+neW2N'"hYՇ1[wLAekjk##3~=`bmژwĻm vA嚲#ے|=U~+Pٞ񎌪/vJ3c%//E%;Fw[NTW|$HxNr!\zCteLxH!r0kemZ}iδ+ƺ ]2!yc!@1&uyYv{Y}j: -@$rKs4fp #DhI[8 @""~$w @. ~/@. 7{TW6m$@]xdM(/+}k 7[В~ڹ=F;~lR͏p׌}ikVR}xUyk$mgi53 .2*Ϲ ~d4_ kX-man' \wk5vϴ^3Nh ZS;eIVab+²#SxEySqk{>5G E/['5+sݚ~CXR2blvek iχ.~YلjsA0l؄F'@ d$ricx ڍs[!kAke=S'rNRs @z|]{O>v6X4vUU%@TO <?_W '+4o9@ @gX@wRޖUW|T_몘͂XȻƿܭ=ƹبV3~U}FSq ^#@(bf蚮 7-ی}me_\|Mh"͒SН ^ڿpC 7_vY H«6 n@ۄQQlaU,m @ݘulWGY^ͳ@he\ƫ]ŏ[pwBgϛ_@@-+RO WlY1y  vGdoiGHeg @< |JsVDח9b]x .6@/6\VHU׼ |]5w4:sm-1WOϋ-[Ȼnߺ=>n]Lx]⳺ gO=qy٦躙fh`ﴷ. _iqysg+Uz aAILƝ"C⍻EȜۄ",3  KXpSU'sʕ!JbëtWuWŖ%[@  [9/|W-Cw>)8RyRY܂ҍ,[,F3Z}Nᚴ 7}uu? OLݢЖk!@~8xH-} (ms9 eG盟Sf>ے 3&±XI`!FTAH+Ouw2֦ pt}xC郆GګuҏL23Eq.QU%ʂcFD_[ ߑuɓy+>@Mׄ+W7od~]hNz[ڕw EΈ pG1fe ?WsF.B$~uwCx,h` H1}e2Y'D+HũWl.| |̈́./UB}uֿኢN h,mm[%;fzNhܵǴ[?-?^z!϶a=@r; cx}e.+nq5%aYq~~=*K7K!K2ݞ[r](ݤN;%qK ҍ1`o<+Ysw K'UKr^euKJ1ӷhC˲VR~!Nɺ  @%z]: Kkb쓱lIXt ]iᲲE+RVkΨUt0Wꝉ?KZJ2iF <N)ؐ}4mM.7gL]TeښGg<֙)VʏƿdDY|dm<Ҕn]ER \9ԟIG޺'pC˪o2sֳ:r՜'o:~Z+^+l @<|ZC`[iLW @g<@Lm)5/~Ax;Ϸm H-~RAx@ @@ @!@{ @ B@_g7  @ @ @@& ӽ@ @!@ @ ,[LO  @@ @ )  AmeG7}c[ @5@,pYyp_=g @-@xڻP3 `a: @ @ @ @bN@  @| i @ @ @ BW @ B@ @ @ J@@o~=?NlBsā%YK4gQ^0Fl#,Ⱥ㔕 @< H҃w-4_Zf%6 @ڛRmRjlJYS څWs'|]l=/~pIxUْ9xkWV^!|}-=٪g %~;uIU;ua h 7pYRwQђ%,D&O[h~_$x斊ɥ< k @xh#«W$xϪ v pGC'w@&=0sUMm @|cCXv?n7q^`[DC$a| }c~|k:,*VN@y~rtcHLC膹@ƈDcħd, 1,8?XUo o{|vc^/!@emx9-&@x9`[C7Z1/kRV5F_eGkޣ/B&ٕǦ9na* "xC٧}[l4\]0g#{㹬uAk[DߛcO]T  @ܓP?if{䛵 qy8u @< -meX7+ONkšnj tdS{ZMK_n&ܼ=@:Po[I'6jq ;qsǴpI_\{z@v5ɨ!l Ilpq$|y{x4_Z9A^s] < n v;|>)y`gf4CS 'W&/q b暐՞S~r%;yGR/5g,2|~1AgA~T~Tk&H_97TNC L i^璘 8DH̥֓t;iĉѕ!y-; (yqغ>{͂L[9^u%mĔʎ fEj(#0qqM׋; [&\wAT3j]9ȃmbU:ѭү_nM`LM±ߏ' Џ6<zG}~? §bv. @P.?=biV yH?KZv.0>LҝO*,T9߁Z?? -, ̿ڌ7'/h^@& ˬê?ti"~)ԆV~n @%^hR}Fw]F0FLe[q/-@_Sea 7:ZHfzH]'@&"bVpJ ! @D1#Gqڝ1[ @U<:T  @؀n!NG ˌ @3 Y @3mrC/k2ظ ]vDSG By @Sm&Hb?q @ی_I]QքΔ[ȟg<9O;2,O\l,@&(uyV-/2.LMҷwI[\Θ0qQ! W?tL_'d<.=dyc?t9/~3;tc,S.˰f!+1@U% sr AΖ9 b{@n֞>}J҃;/J10~r1:ҥ2*w0F+7* p*/ZZC=hr,c)f친ʷ -/:̇Qc3@ON!-/@& yq -C0VL@OxU"}o^ @ަ:ёg@$Ռ @\2nՕgS:1^L @t:@t.3VLБ(z>cP˯&}+@&@QZ|cGIC3NLD Qǻ\PG.0A9:-a :/|aY-@*=1`B uĻ? -ׅ^j5 LB&͎|1^jk.֌ @X‚99@ڊmd<աOC|HK+Br3@OE1 => -D.0373fbSTu)9 Vn!xxEEwп X0ʚH!7nߓxEpYyccH}f @Z^&R8YTTjc#k $,Z2N9ǹq[ƘE)= .P80‘~xɦ_ʻivW+<ٖM'Ywg4?ucpN_'4*41'TkI]e#@&$X?9xyӻ@R‡y=)mN>rog01XX]T~y:-|6a_ܬkҢW voW?|⚸ Im..yuL!NS' l.J >H_T7ڂ@?#[:*&UPrm8zy{ BmxW_+]@?Q)jcq?='~6V(Wg6y<$nI|qՐUp>XWn}ԹQF{C~eUyk w@& i= o -pY ! bhdo6")X?~ꮗ]P~1^7q`r.`/o½¯N>QQwQϝ'emK )Kۄ n)Σ5^ܭۥXyR{iCxYScC y¦kh=I\ff/_0Y@@lQv2me>fxv?.=uXYW9 @x @=@o乛fdYp" ax-HʪCE<& ˤϥI[\dz @{:fyCJ0"m\:WЋGn!7{?O^3%X]WZO9dA{~5}GdQ4Hoᕖb%.Zi쟥0/CLC)ׄEUh{C"zRsnN;.Y{.Ե!@<Ų*-IC|,#@<7<.mH+CZ&3sP-#@0EUhvxCG'ظMt[ȟorHaC|5ÂJcFFIq[㔾SV0&@ @d_`o9#|ljD:g3 LYNiˢ7]~8.=u_= F7^U~taNxQ{;^j.-"@<΋i;QI#¬ǣt8Y9g1Mbնw| = >57է,i1ny1b`>h_OtS¤  ] 4cZ#xiG>}r۵נ֓zL:Z17@toryAI ǸE'NFC,Y|]l)ޯOϣ.zr:>a= pGf̞+-T:sin:9tlB;`=Ln!w?i =fvH##/ }R&t@O)DEw7} ΉR< L~  @bu`ߡ!#8%L {gʓ? -gba^ pGiN1C&F'Euqc둕?&@N 9M m8 SʏGrYq5O4<@Oyyqx,P_~G:&kBKH~wd-"<@Oҫin%Qv4˫*?ih"|]kyAx L!4n_RPoMej 6iړ̀M'=[K_[KMׄTQ}\89hV>%@?,r>f$nN _ ½¯p#{'qwnXL hTh˜ Qo7='~|pǔ!.+oo-3@h @#^Qo|D'Bmhu겘@B @aBwUcmEJ`5_[\>mo{  @<i.NmmCK}5]Z. _Ԝ>yѦg@'UV2wr٫AU/-]``BYOrsv8>:SّS.g~ OivƤ+u7Wj۞v@_}ϯxL qNVgsxqtj^.-1?<[a][SFa~{_gepEyS i.B@x$#B_ .\n՞S~JnS_n|=)@t~ @wtfDLմ:[;qcEYSYf{ @x`6.S'B:\+ag5+׫/g @;12 ً!EIZL\!ӫ-=}㍒GEL[ `t  @ @ @@LW_!IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-4.5.png000066400000000000000000000035541322271446000244440ustar00rootroot00000000000000PNG  IHDR FsBITO pHYsE1tEXtSoftwarewww.inkscape.org<PLTE88888886g%8'UAs+J0L1I~/,[7h&[9W7Y8T6U6X8Z9[:]:T6`=\:^;];\:b>f@iAa=f@`b=e?`v5I[X18 64ɺ )@@ @@ @ @@ @@ @@ @@ @@@ @@@ @@ @@ @@ @@ q @@ @ @@ @ @@ @@ @@ @@ ºҐ{IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-5.0.png000066400000000000000000000453361322271446000244440ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<J[IDATxTqҾV흚6-M^p~/{ow~Y"[Qq "KEmܖսnfeʟ^ @ yY@3tF18{7  @ @j { @ @j$; @dzR-Ԩ 7'.HJK\h,Iv^܊ a o) |jJs̔#'Gƚdd8=zPL71U6_KԅMG7OiNZ3ZV՞uA[7:냡ۜ>nXw\J 2-R~[LvUh82_1Oi딓'79.mB]VnxJUW8,ofVErpL +m_?xݧi©s> ܗ!$6A%{[T_[CK)/@i\?׷5W_vߝ4 'ڂDğϊ*q|v_Il"8W.w3yar7ļJ)#=ٔOgppyƬʰI/1iń) /sZK~dtM.K3WJ۳_@WV2,[[XUYƬ<צ fT\Q\7?x3j#&[%^h&"9|Y!L:Yaeu?7]1"bwq<RYV֩ %_ }Iu۱VlH ~k2<|`٤Q&6Gb"wr̛̂'Έ4u'LC@(@wqNbJ.5>%p-#Ow,)*[BmyvYafV>G l-TWlğFS)~ I7?!s@2O¶[]eWA[>MCWl{{W}|ǵމSb85 d72g-X^^'4l/\^&Fn{ߣY~ Ϗ\Ȍ_n'ckWk}PZE"B}u{H[6x׻. (J:Ua&H|2]t]WX) /uo  @4Y'$rw3Q8ٶ,c /K7gϏ9,q~glF%* @>,vq~="(U=E[Td n^غEƺ @qʼL; HǕ)NB!tAeU{l jj-tKV9-_͢G^Cڸ 1˝lu]Y7Zc_vǏs<䝟Z{N)7ڽ.6F?ݙ,]gQ]LxU|Jto}w2?!tv*FbȽ{SwZj~FD %ʭFw}Kuym|zӦVxF?72/(B!Fåj. jOM~3S=^5dz~zՇo{nۙ{6tǣIR$5&\Y&ny{NsCUf\S{T6)};mp㵼^r0RUF(3njVF\f @dicerJڰv>)e;;{\ڦ%OO˾E="EÅ9csC]iqM|֊9Ї8ΝhM+?5t]{ flSntxokm|bf .ucojek[|YX3S|ۢ}8o֣F^C&ϸeГ @>DzU 9}cݿ44%M- -XcGXL7008} rjl->' zЬ<=①w/'@$#7<ޡSF1?ELf䌹6s/w]l_rˋ `鐹<#~I8~<˒-:yr-=<·^b]胞f&n pUf"K9jVX%vndn7ru[ҭWE!&AtP[m @>1b@밲'*7ڽ79jU\wH 99Ї<1}tZRwg)w64D}@1O3{jFq![L7(=iq @>eռv+H- (po"ÃWUx) @Kfc+L'oMY+߶})M‰]vEU}i??juo @A|&1!,?H]>}B36hSXi˕L[ @!@LPZ)eJ͙W*eɞ+uʍ>~U,u~Kכ'.JJ=Whbڨ<*4\8bݬ<>JPIɋH'c-YҵCʜkc]@]J &~]+JU>Uv_tNHRp[Ĭ%@Kfn8bmRp]ᕫcR6[U)`ÓE )3 녣{ = kb(]؅)3xU-5$@ K-]DG<ƫVz D,)4;"7:nۊ^Y7`oe\΀D[g'-q\-mT]e^~ތ&6G;4_Jj p Ht.`V+Zg%6ʏ6'#n=~,J#NH]))ϕub7'iK{h[LK~ޥF~I<.}[NZ9@}Dt Bݦ)Q)Y6O]vs]{UQn Gsiv[,f,4ЎQo Tmtm޻[!"Z1m/ckΤ/W1?,i;U\p8DrBȂ2MjFRle\m54ruj1-~^!#a fyk1OǷL @~pDZPnmϚ3> q.2en2Uoffn,6+yqX^LחsetEoL)BlŹ @>CP',9%*;ϡ(f . 3eǮmqx/A8YaեHtPP։ @>FH$JmU{cMM2mc΍1\uÁbp<_4.xu +*u;^D[m' @~{S8+ϯBV"e:/ >&}~ ƣbW@v ǃszM{Q>|B,1qQ3@}-@W+g2R*dFҼ ?&Tw]R, (Uc='lʹII)bf}{G.6DW Ye}u @ mRv W9g~xVmxaNZg-,q*]I[.5@XI["w_2!  @ IHBB;&G ;܈r&G %3)bC' 0h=񥧘/@}8@N?Xe,|"Ӗ&~Dl^O\KY91UYe\[mQ'4,_ѧAZˎϑ΄ty_̭X @zhC7?t' @<3?ߵ9I<~npH_tX;!uۿ~p?bm _7-H5+Z[[n`~\+ INoV|sݎfUͩ1q3jߎ~YnUqSQtT:]\`ngx x׽FQ&}Vcϗ^d~\Mq]437ex,^]fiq R:;q9c??fUbf.he٥UorxCXO,0ߏmyXBnf ?2mzI\ԈVi) &m 5{V>=һ8Mz=]WF`/WtڤNO'?W+NsY-X2%3cv2ưvվ*濝pQ$'Fs~^}rأ! @k__?zVo[Â|*y~MᗳqLbe1/Uzb!Cp~82+lǧo_Oȵ2mepZ^z5BFiqKGUErgJTzx51c;5Qg_,yIh@-'xS.~5Jo.%8z Qs $6(~/iSMn-6ssd dbx^Tg[R 'v(_^wLSfew%JZpYh+$bB9|hTw!;Q6_wJzo^]ye?@S阘,)+OowJNZhWv-Kٮwj𼙩Y2mJ1rJ-m)L:B A@F'+ U>jfS|,eyHӇ+T[-W;2.Ŝ*>R] }=O{UBMwB~maoQiuVҒ^/_)ؗ Ui]Tt!3A2=qq[NPZ})yIDgfk/G+wY(0w?=35ʮ#uo+h9NAMg,l1S%:.Xk>a?ՖϏΝ"aJ̚X N*'.Jr_*AK!]nfjVf@9ǟs5'Dwkf< @κ:Wˉi$I~*YK#M7KD4yesm=na~(2W^9$6 G+m .uPt}K/9TJSeUj+}@*˽G dS-x[jo >jF\j X|T=q s }j4>N?RO<{+u#ʉMy,s HCj][ZܳfnIyQd:祚b^DN7 F9zYn8s IPI݌n!CM[KJx\~6Džl m13yqp6`z$Wk@a R핫ږԨ8۰%6ʏjl>4'Sc_h>@4 f3 @~t]b[c+ Zބz1UVHS%熔2YH٩ ҚSW ɻcizت 3dx3s L[ iwnź_y! @ ݮ~g7$\p0+ tC'MV}9\7aE5 @?ـ{ܢ =}Eh tPRm$-oy9gHn`qoŇt`]:'I3?dsRF]Ԣ)y*>-fਁ_ / 8=l0as@xh7{4w⹺У9y* @?FؠN4 X/i Ŗ @ )MV$\[8+ qA4-XG$A"9=+W[b37q@o%~!YxO}| sFvt~;l>7ON  izoĎG7^09! C3iU2McX7{:@RVXvNtFĩ9 @> 9|=& 4 ,kmT O~iތ#Ge|IxA\2S>Ŝ~Utfq+OvvJ̊x|ߚވsB5ף+ޚ79F:(?lȳ9 @ \i(ߵrz;@~ۖO8K2m:-Td7 'B+ a@~i"J -B: @ۂuH&WR6(js@H7HOZ*D.dΟnϚ3%xVu; @%CrK[p w@eX%5 ,G!¼VZpC U )ik指Oy1m:! Vk=ZB9 ä000`  I#+=f$O^)[_ӫ5>WheZYdu^5>WSy[/'@\.g;/2XWqؠ- CvpCl>JZQz6.NִS]<р|Wi w@x3mȮO&6$ԋ?ٷ\%4=V]G-FNEHl /w[Z*pzs+ey`=܀Ck`psV] cԻ4f5C?e6 'k 0s#5ƛ  U3 (W ^Su"jУOC ?Iid s p)ό%fnrwڍSVw*`#*e | k >2/X雄bf ab& إ*nBX/yUk[ f>\ 6=mjDŌHSuVԶiɩ1<&u;>V&?4O_gl͒ۃs g .߉gj<=-v^ 2eA&Җ,#MH]6 , V-`H[(>pl}bg@q֘F,KՒ޻Wh^iop60H cMD6*Z}LJoȪWZωȕVDEayފyypȍ,^v|qNPxRu\0EY7y5KOV\|sʙ7@רNzX&R:_:0;utVlnooD6W1ypr#pl(bxM @k0i+W]_+m3?efJfA*o9[cm6ŗ\Y'- *r#yp<^ϥ7E{#m _Ȍ_&O/0֕k  @krM-oT%۹-Sr&Ge4\hKC # pζ\[7#yzSe<Wɴ嚮 a7䶸ZތI|Q ]4'@dx[lxW£ElMm>Hȵї @k;@n{|ULwU)rt I?|ˠ±rڧ*dݿ&El '@;z Hbկ"7:w]g$p-zIxiKw;>ţ[m-f9}`k @cV Տ\M"+_I|  0|fҳCj3@[i7ztikfi4i⿺#>+?i6[jhJ+ @4t`a_wufL[jCh'4tVjAc]a(@ =P]슷aZCʬ?wYX$ @?6ELS)MָZ/FjȌ$ @_1lȝiSn}w/Ye[- ;y-s#:7hcq[$,+xb'+>  @>"zWU]Fw<:H =~ĥzʍ^-Ii+5= @>pQ◗ R|Ԫ}P)7]i ZL#7Dt| d @_b7JoA*{-q% sIAI9 @>ssmW#v|  HLf @+6E7I.UA,x'@-t*}:)I81=a^:@sqj-S 2&u܆ކE^QbN:~p4bmtH+p׀}cW pEF69cnw<fq˒mט6g\pIp%_xnf$8Rf8@(~~.;@Lt;noH`IP!r|HQ(@ R452ky 2(V}\G":gFڎ0%zeW'-L&@+ ׆,pbbo [j쐵2M'4֕ pmnJ_=.&HNoIv"bR p3S^qveovjvzHS{ Ue:EIW WXY=/ rcWIWT'Р9`p۬R\L< d١5T.t @ 5;S¯KC6L_3sv G;بfnIƅPD jYyL_ʪHC>%;tKL#Wʴ[3[8b][6z5!"JD[\&rtFA4UK[IsgiK-SUV'J7Y%U)sGpm!W<+vzg|HnLN!~SU# {t#^nۛrƮ;!lS١gnߊE Y^D6:ێ%cW๶!@U^0T rk^՚"+ru[4/@ϚYsbW9'zгF?b :i @? Z}'/JiZř3p J-̇^)W \P/J/N3ue`iSbr.K2Rv9N"ֹ.ݠ*5|Y;_F9< @ 3fTK+q¡YycK:~bNbM뛞tų|j|(wx6g8 %B6qQI3Sdʴv_~q @K Iz%@a8 @Ό3JPd200 @W\ivz<@F~lC5x4u^^bDwc @ O`Wdy=c @ >1 .]vޙQmr @R~Z8ϻq!@U45*!?oO 1n nd W Fj}vtݼ5ѕ_EW|"=Gg[dbXQnS孱56f!J#Fa|.;.=::R+[8 ۇLujkB-*@Wl,@\Μ Y|s|xHۣB:Hn05tӇu"}+ 'o6YKl87>*oG Y4 xvX&+aY[x,uV2U{szSmİ()>sw;[H/&4ȏ=5crytsVGǀe K̿,NS\gg&6G:ߴ^9VE o^_( Hʌ6A LoB;W6_VtG<&&Ż.voR8"@efjjv~J#}Er: raW=a;*A?V'nό5c1 , Miwk_zn@߯)#v_'p׀{@0g@D}IS; yxUҳ+ w?sm? @~ B7) Қœ=!mr )M‰g/W@:@[[b ^EdBhahB⧞ )y?dfjXOFHT&O b.xVmXˬr @#@ "E뛄_{2@ @[ԅ{i ggiU;>HoZ U @ks#8¶ f!ُ|@HS qwzx,Zo8Sz9@t8ưFHdS rT=v*z>@yk#>Ѕo 9@ĥWz }|0m2lǕHwʶLg aKPbpJqE&(4%)S<@E1 ܡ[?*}p'T5@\Y^7BAxp ? @ȴuJDžѹ5](>  u^VG@e1 ڦYڞP8tMqDž9+# nb "en9AQv_o%dv 1+&Uh}RC:/2p0g@ ݪ!`z}$^~5{@0bw9sHaaĆ3gCr\ @QWZ`ĸ @zܣ{sHӦ!sH.9W9@${K[sH0 c@Ib  Cq;Ԥ`sf#,0V+s0 Soȫ:͘ @z<@^_nc , xjoOyzr͌9$ݍ @ @B @ @ ) @ @@ @ @@ @;@F\cc`]5Wdݞ"@= gmSܴ_.100 @ #en[ij[300 c @= # o! @b]2w=Ƹ @ș=d+J<<ʅ @ N1C-@nflGDv+x`(z<@':3mxd1c @3q t 4w>Ґ'ƩzR0wq=OY׫}5z$@F o2F1S_87@\'@G^rX| @ &Yz#h,)mr= @= yC)+ius"yyMJHq-hHFoP7|k7>3 2ʧD02B z'Ʃ#n/pף1 mR+3;uqߐ\ꯡ-`b. }y~y!c @= ң2MR2Btɘ @; GXXȘ y$rCZxͫH;9N*=jUG]-̽-t?C @* e׬{z\|en4M-n{#a.^rL#;} RX/,WkU6]lջ#Ayg~APT'z%)O @*ַmQbc}NkzS4Ƙ ƺRǼ+O7 @HwlT~}{6^2MASnֽdW9~{Tgg(`tƧ B,AC> I`>/  @@ 0,2`2 @@ @B '-<  @@ 0drT@WfY_ӴYOZL @KKWVM{&,|O;Qq7=8N@"3ý7**wJ=_T{ @@\qlL ) Y.ӕy\OWx̉],p}>kE ZMrzzŵ].ޣ+uyssbgԃ©V;iUra*A*ػCWR|8$tNG),yN:IҔV]"n/lQ:^cV2]8I EZ.v|+=n~-+3-5T?(XdQ{[>KXon;wfx-2W7[XGfMEf:(=uPiEdVэW5N+]ޔTgF+Nz2&qO-]s/6)ax\Im‰sW3 A~gnPNPTh}k?k4}Yqtߪ"]Vk>Rd: 9Jwv4Ǖ&GmP?jCoTI+!b;?j^ђ6G}_8:t{FD, @NYQ/c?5<^馯t}S36m ѬjD. >Ӫlύ.+0#<@,4u*5b][1w?ju8_aedvB}h;檺ӛmR}sћ&x+U)mє;Խ۬MqkV(vo]q G%?>U!I#q|=B @`"\9\(&9}YkJwS^K< ;*iu)+ g9$tkggHwDU/= F a(}[ĥ..K]]oir+@Ӗ"FHR91eiQ GvMO*-s?$](]]!"H' {?M< ;ឩ(kzD.b>4+&dU;CQӤ-uI:ruOgkH:eRG{=2&~ RCjUVcvv7]^ .w:^cQLޏӛ[G\oR|Ǧ_\5W+|!^Uj{R a?^\=7.e_{fY H˒\r}9j'\ׅofȋm%&%j Y 宯_.ẗV9 t,LN[y&.Z{(m}N5-*]!1CS.v|X+|%o697}.˒D9|dvV7zZH.LJ]vM=jWIQ9+*3Aڔ~TE^S>{uE_i9 {cԕyh͍2vG Z·ҟoe>Lt 6+^)BVEgxzdύ>ZozXu{:27R{鑬FqijFuyzZs>(-V]dyPK]WzwX9Y +XD8/x@8Y]cThj4kCw6H{ATE ./VUӠ2=3l{!oNDˮϰIIZJ|v"V,]J'5IK?QYyPtEJ7+*;61v_Fu D+N۴ƂĕKl/ԩ{~&u>}$e" ~= @``]SzmaUe_KH˪",9wj:IZ?Yܸ =r[+M6ᄰ$l,r@ }6{5Kupn\fb'Tlcvtȩ3օNU)XFzLVk%)|sU>% WM )|{N]>5 e'\WIჸ3GJHn>cB+wN_hKx~f͜B^٪2䴕n6GD AY-ʞ+k C*_n!.EE\mh?>VJ}%)!^Y]ԔU~[}B*r["k ߕ9wu 5暚.3Q^| \߆sHgMeXGm|U;#fs)V<"{5#վyyOq$Kb )H !Id'helr# -?UR_niùґ&'gHc!EF@XhZ MZڧqRFEaیۂjb$]8 Im&iC iPJA"'~3.R'jO=( Fr:jKܸ neR?7~u}[4nRtg(eMض91Ku/F9|h9*9%Vr 2;zcڟVJVƜNꋴ*b>%ژ;/>#uv̺$%+͍[<ͰS/ @0D i1Y}E Ϋ=6\ 1#M+r%g]lp3{>Jң,UZu]!WڿJ]454K'vk?:w/j#j#a{Ֆzv^c2-tst_!5ԔL)0LTVk|hLTUlsoO< !E~T:+pwM$,iFB̈3uL0@5%ov; Hj d.K\9RWU!F>1sNȒb1@DW@{e溷V3 ȏyl )n9{?tՅC]񼅦V3>fEo /(;=6JJW2&Jc-݂. qW=V>j h\N_aDtG^U\xV؜؍nZ~onO^GmrX&`>LMԬB&MӪle!iǏDOw5tET}AڰU/20ϷYXR]X}sb%% ?=Uo əvJnn,_rSOJ.QǑ.?kǣv[z=7Ho-=~%4+U @`{@3Cw*v5ŵ.! -7scW>:W]{c1|w{Xcln\|&3wqT֥65I(px#lÇ6++/t+Mq}}ۍB @`rt&džQӏ]u'H=(RyK߽a>W:>7vu$65me%?!ĭw,# @ &H|sZ]F$/_ֽ1'vuq6 2g0 .k[.tlu}HSA @`akv5)=_s^)x^_ֹQ4CQho9;zsا]`YR쇤nFouɐ3#$@'bإg#^ˣ3c',IW:tTW=v}בN}z6r376ɿJ/~  $]3˷8mώmNzlPJ\9B Ϋ;}.x^>K Y @`F uؤ_,)(ten!3a]pûTSC#]]3IWP㘡Ws\|)vqⱄⷾ"1#jfmI=Zwg=F1]y@Lv[oϋޒϬHK,4͊a^},%!RV snL ) pz[ڣZ91+WFe#6ۯygԧu _<8seI+vҒWM~s9dDgq:4m$]^4Ca79eD$z\(Ph5&jr-T M7׻1#<\|; W,O/~}{-yhFHicN̺D},i*_$@Yz-f8 =fr&~?(ꖻoB]ry-rݧ +:R!;Yv{R;ē׺>ιb9f- 01O;Ξ-OO\E sOou;)q{P|18T6:I/ q31ntyud+u 8ɹM,m+)eI3cCܨ/чT~{Ab"7:U|5nw7Ka8?qMT}!q= VSU/~vdRpPĕi+7( >ń#j7,ڬ)Օz.4 9fdn\|]+U.oό-KɔDu`j* hvy)~Eӯq:#݄v± ]:zh]^ }VBwKN BJ3EH=$\R8H\޴K% 'dD Ae~ @0[nOjhK$?k|&@9ja-~r%_,iE@y`^|F̈ >mw3Ȁoq^~sϟ~| nj—]+uzsw7g\Fel W$p[@LE9Im?ze mHBW|\\ \ԕ.l*jv9i, g dbD8-9ϸh٨Q~L *pOz|?絿7!g#2Q~x٘\YChxdVl@LjND,J'dY'-Og7"׽3\@Tt}A]FxNI׃:dIWDmR0Pi csbmJ8b3u*+:e"#"zk>W*j59~9ǎ; @~#]oPk٧f}3_I+"sb% G-3# w]!NUo2fJ+aܧg~F[F/=6hvYG\7ۥ\:@`{I/;Bݠ->$2 @0y_.FfYjU}@`Y?D:WW올@`g;+cݧZՅ @0=)챔~yi'iR[#@&?tꐼUtJgIZR:di vh~Qyn"s @0ej?{'fgb]GBmZZ5QՁF plZ)GƇqsbWZs. @Q7YatLH:O":u]5ϏG_:~FjtEAd@nDO=(ti?W1~Fg]'<Z!='c%w'R 3mw"@`a7!=etDEꏓ]]&YW"6ٻѦ+@̕w? s @0R64a"[9abԨQc 7P%3+ E3#4M3 A -@_yƷD' 0fݔ*|;X(G]>a] '` alfx͍oі>j& @0x]7w|[gw/DH<(o~D\!ȵ;f`HBxq縐)̽&,>mR  zZl@47|(⣛omŘ;\,K Ex;;s 32#,aPؗz|f@`g<. kt @0vr.)Ci9a @0,& E$۞7 ;Cb5Y@`0q-±&ۅI2 #$@[&ϒVc l&6PHa3Uv|3cǏe6Lxga e|"U F#D+1+Ȁ?L`V!nɜ .`muw]w s @@ 8U @EcK@D8&IjN;޻alt1P+G@D]9uN_ʜ B_!VkO raaߛav!̮\gS.?@*O~w#m8LJD'e!ǥ "v{;z%>UԴ=SA0gF_k߶\U=&اTzwokp[*ܸxk}HowV8 @`ЗbgL>_wobG[ģ)e<*"3|yPgܞeCbvJ ʰ @ϽPxa $U20ӳJ: |= @ȓ憤sonH {An56`?g?3NOc;+4YOgl @0i B #0Ў-]&0WÔMqAM`mϝ?9 .q[ͮ )޹W9)?"BӤfaꏻ@R \ׅos/OO!@ ccǏr?D")b~ixC_vI@. F W( Z.iJ*~g5L LqX#[Y'VA~U kh}}}VRpbzؙ&)G#ʯxOHW|t{scH$]JGB][,]Us@XPg^Е:]: @`M(K3։&w::b74}.6ٴ~PϽO5I8@*57scUGbiK<ӴWǎZi[|OZ ܱ @0rWDf*V' ^YESN `Ed-rpk7N-Cvn"]8)f~)*[g\Lm4+#wUdT S uNH\"߷ʘkg<:XQSRS6i!/bZc* vXiufamS-М9a @07jԍO{ϋ[5EKČ*׷.&BRĤNJ< On?{E jLnnS'@.> MFYstEȩJg E%oúȧH,4u*ͪ~_D[@9[Wmt^cܢt{r,LZ @@]H&9}O$|qMun/y6OTUj eH\We. Q9qNȚ+ %@ W&%==YU_bvz\]"@ bfDnT|ho"]xE~%,I[dŹL @uw=+KWL @n6``үd'"?Kqz M @@ njMutfZxOg~%]Z85,ma{\#z-2Ȁ%J鐝ٸp7 @@ qnWfd1 Ƞxhw1y @~_Q ޓdPp / @ A @ @@& OaA @B @\B `HK*eRG XEOYrɌW"= >94xeiwYh&T}^f`:  @+ved@!@ @B @  @  IB @  @ @@  @@  @ @@`Z2@  @@  @ @@!@  @@ pȽ, @`!. F^ϣkŸءlF@`pX @  <@ۍB% h ߺ9S˻ )!U:LCެB @ Ӄfm_f&*jU o?_C @ @@!@!;_N @ y~ @@ pRF &׿ @@ @B @ 0b̙ @~ R 0![  @@!@ @n)!@ @y<3Yωn 08r @@ @ v 0Λ  @@!@ @"@ 1rx B Wn @.?@| @@7 0RD @ cךۧ  @@!@ @@ w3n2@\m5Ʈ !@ @  @ @@!@ @% *=znIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-7.0.png000066400000000000000000000273111322271446000244370ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<.FIDATxw|q:vںUkU[:[[8P6sNHXaf HHHR7{ɒiV۫Z[7|X$W$?:ùzl3T^upn2D @ @ @  @ @A "@ D @ "@ D @ ξ.s}/@#!vx1 @ )@1A @ @ @ et75ؕ<-UCf N^4Xo{C(}ۍ*c'idG}Sux0sAtq)]5= @8ԉ^6g3[S @ϙ黾zձݹ F72O#$wUrnGG_~ӥW7{:?7uAWuMwQ <5uDH%vQU~yX~n)<=}a{voM_6aϷ(~xݹ "@ gKk׷(N#:(wuӇЪ)e.MeA4)>0ua}%[Y9X.<1g~≥''r+7\3C>/ vxhT f}wn퇖FH&ڤpV(kΊ4):hS?߫G?86vt]玦'T_^(@ g+԰){o^apcF&˞_7v.Wo Y[5omߓ :cK߽|u'h3>~u? &Oߐ~Cl{@ gԒ_Ѽp#E:vŽZ?vw Xѵ& i>#g^O*{,wH9rzf<`|kfutrl6&%TfvqlVv{}d+:>Q?csZqy??hJ&*z¯~& `YsxP*+[g߳;Zp7HkV:5kq_Cj6h;DDoOߑ4ߢIWpz՟7x-8ji3d̰煇U鿪o'E#erF~w=ewK[[?cM4޺li 7sЁToJ zn.!l:٠e-J.`ր!cf.˪>E3|㺦Gָ3{~^ ''GR+eVBoMxӏ" V88;#A@!.gU48۔O4< gN tU-#rE([?c˧>O\\.X}*V U1ިSt٠-bV92>Z/Mng 9 ]sgz{A 3qȁA[۾cF%rV&6lFWkӡ]*}a.Kn > >0wgӑ+Kސ>s{l]yƳ@˯3uJ ('@ !e?^(鷴/ŽxiE^{`Є?=si*[̈T%j[ӏvqKV&| k?2r"Ǽd{ۗ$<>lt?<,jθWNdVOUF`Vƌ|וgAJ 9S_5Jm sczlWc OM_QO؂+oMv(3= 3c'>1K_qO܂>nNXN|Я*lW09R/t1->h[sȶlb9}\y{#?ؘ{vGE#xhs܋w,9tJԄ3;<;+yj lWݜ-G`z?߲? }ؒóg!>/FF &ޯٔ?f6Cj>hȄ Rw]'}5u9ݖ__.lQ<Ϝ _vӦ8^An{mm HMǑMMYUE @NC^+n,z<&E9xU ̆fu]zxio_f+un~{G6u5zm93muʼ>{J[<-4nD#͋Ǖuxhj02WQ'#B)K:8iBՍ )Ru{wG+.J}OQ֊!Hஜy|n;t\leE 3{~^IɛV}d͆T+Z؎K={H->fޗ6/[]a%b5:͟Y?:wVY'-KkKO #bD 5u|o3'sLc.7N:; @f7^}m:d>iȟJGqtm˛N n2&T|oA[#/VH;f|PA[C6-5k;Rڎ(4>vG̼ 2?8@ gmnB =N'm~ߒ;Jz5rn/g{Om)[г}nMzօGT}h~Q78zR?}czΪggw =e؊!{");2DCD\T }ʻѫ.mA=y®U_->U}fW wsjтK hG5_U_-ұ|/JKǽ,.=M^1#}e&54cp{vʺ:=Q 1wMǧeYAP| 7b~~[l_[~D:?AwzxpSBhx=rc.T&ɃwD^~:m`]pQOۍ=ݡ t%"/'Mș̴*=:=;'Xfv,DƸ}}f޿z 眄F/ݪqy󽦷wpw.Mzk2S%`_IZ aM\ )=YfM"'wVGeYk晌]WNNxxCA$ϝl~[߉9]yLJO_OKKѺ;*9+[\vk21tHϦ-3i|PeVF6/WVeHQœL:1kQN/| wuUIZAL):bߡK ?L[vnKc. Ulr&/êި,W B#0nA;'y{f68`|?=3dO쁘Kc.91ǜ_13=@;V"%}QO;==?LQ @j'@>mB#S6!41ybhF񶸗j3 9`CIkk rWw|28~Wb+OkQR8.wugJ_]Jmn}tO܂-iW21{A#{Ž+3Kq~_SwY S#:Q#>" yIᤒ.eR5%^.~=. 54]k"GQ+@B-If(Neyk⟉:`bێ0Ĝ)wJ;މz3ꥭ=AƖ*+D @j-q7}A6i.(7Conj‘Gwx]'g-j":@eXoiNMi{t.@ 5Y=[ii:3&S%ϝ0siVƣ]/tx[ߣK/p7_4˓}qyvŽZ-&uwݑO#|FbrYI `cyۏ.زykYpe᤼u ? sqLLkN`iWθrV%Ͳ3`φ@ntmerWd- Lņ'-9E'f/VɎ|{GDwy 6gY]tm[Ϟp}+撘K<HmoHKF~q*f4R$۔Mːݡ7V3{|qk!7?+b9%:nPٮAvd,a撬;[gGzž@cǽS-k?K z2~fUb T,_u; f3龣aΔMcM /ۤhzd̪9?r >yvެIk;>պl* ]g#5(:pm_ @N]veq= x䯋-)>h%ܞ[&<]-5>rIy콛o}e2/G̟Q?}qv00sGJu-JƖ{y|Kb. M~X!퇵خeA;҆; G3k]q߷r; 6; roV8&3&W[ @Ns ׻d{_.0 am}*@.< g\nk[ͮlw荚Pq7'~yc%>pitc A @ @@ @@A @%l+Z7Iަ(~X뢸qeK NL \ #V|@rVF @ jE;Zqty~'@ Ԋx[eVKZ *@ Ԋw]?@P^Tnm ۭҝ mk @ G$G]y } ~S @Q]2 ZqG5Bh۸UB%o'c ǤEu;+e~\/\6BH!@ Ԋ&T 5/3G~*@ Ԋ;~ې=7äU;eXƥqC.7sX¦}Nd Ъh:.=&s9PzO,4sXO$gfd1@b.X]R) y~VfoKb.{seVQӤ⭑F ~s_[%ïA_, 爦Y5)yG 2q9kEܓ #9|cz ԹqO,H,IC,ն#w_KTHbez.TY~\yQyJ9@i՞ ,Tu?ho)zeP*>y#\qr'Q >NeplWո! =YyνVMd,wG&HY,sqE%;zhۧ[7K gO||߈+o^siL] "@j\Ёﵿ廞K1>=wfdC n g|ޚ [/N6/3@} Z8$gE䷞,8[#G`]Z݀'f e _si"@j\ֲȯ;DԊ~K"?5R+Rƭ7R=#V"@j];j=Q7wS3;DԊ6ER;DԸf  7] vq@U3cd £pcZ l_r@%1s5s\}^T9/5 YK~b iwx~uW\9dwM}麋.3@P+:R~tzdUº]yƗ`-@͸}5;.e ƕ"B,@:m3_mW\wVxs'?u-*~>`FW7R սg6Fa ɓBӌ IƎ0V>z]IE"/oTIlqc#ke~W"X @x__1[$Vn$?zG:u>yΆ;S0|O#tgjwabS:?;-yrdFٷ%dT'iB;dLs  @物+sՁ&᩻rTq⊽wd+ bL W4nO3prH]Atkj{Nhބnh1ˌ+cw[0njՙK~DF[]&EM1LIWsq̧- jM ge.`cw-8[V7vu4ͺw/@prhզ"#~tє.yZƲO b}e1ٔ( 1u٨ 2_)Qe06fɶ#`mb.1@93u׻L^~ۮ җ4nK=yѮYKc3 F :F=@v7`Lŀ #}Q򮣽/2|lcW*"ۄع @xו?z=~8Cgkyz8}Qzn%>lbGFHұ?W;Zovc Ng/g.%]zݥ|ۗ_|«/]S/}u{RgC[+jvnߑ8^A fKF0{ڍ*<-}іc5-TR3U_6N8@D7'OM](kEm\:f+"EJ[5N(@UGf҃Irt16 @삊䯋<c Fat{j; fBϘ @Ҧ|`d+[4j,@=cA{:j9}eBd\&7GdG5w2je ]թB H{e]$3ݘ @vknhqq@Pr0B:NqNjz}:u>[BHz)o<+z]웟3j,@1zs-u9ߘ @HJM) )ܙ/k cif0+Rԅ[ @ Y-i7'L~au9 n  A "@A @ @A "@ D @@ @ A @ @ @ A @ @ @< "@ D@ @ A @ "@A "@ D @ @A @ @ @A @ @ @A "@ D`@ @ A @ "@A "@ D @ @ @ D @ @ @ @ @Ai Soﱴ_m9aR cG~ W^\۪\ f@ @    ?*zM6i^(yU<P*$Ȭ O{"@ D @ HʭI3@ @A9<@>y@ @ A @ U2+S@ @ A @ "@A @ Y g "@ D @ @A @ @ @m  @ @ @?@ "@ D @H\ @ @ @A YUr @ @ @AT< @ @ @A ]e  QAgS "@ D @ A:)X"@ D @ ;m  /x"@ B.uIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-8.0.png000066400000000000000000000152211322271446000244350ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<IDATxyphOQ JbEyXk"@  D @ @"@  D @ @@A "@D "@ D @ @@ @@ b "@  N{ri- $nnTn>sG4y`@vo:O];76<"@b}tn˾Ӿjv @HO; rmҔ>N; %@n1eN; -@n9YAN; -@n+E#4zy @K$̺9bRV%HQk8; '=۬{Kt @[~  Ʈ˪Ӡe!Ҵkf?@i7fmVw!w8iש} B5ߺE=s@;ymҔ>f!f䣙߼f!w(Γ{HՙԿ[!!f!)koNd6 G#hQƗ @ Qe告}&?.C Cuug}|VkO o#6Him6D\DrAdٱ;vI@=@NF*b{,? S;{SYSN+['HLr* q@\-Vam  q Ssv.3wM$nYvE~j$= V2&99t"H= 9z>R$PaVl. qc\ @ QSE^ס $Rr"rzXIr $1r]5 5 l4 qօw5nS$ʃiOF\ӱ鵵׺ئ@ qq96D\cC?ŵ.(M7il# @I}R/7w vnt_L)o@3ޔJYy䯏E *99uITeC)mF? {{-c& QŇZ[ 5 ]v. @: K'# QybKG߳`_Zj~M We:MyfkO*`O΀ٽG&6Lw)[Shz @ . #Gܓ\Z>y=y)NI+BV2`qPsFߞ3+B֫=emx[Yr!NI {.rAtإcչ1re  a(1ȁxƲSwwԟz{.Ƶ^iWV^GcSzL 5 %1ϙͱRz [2[_ vʢSgDXDH|@wPy}2ff F\Rf ᜆ&ϟ+HӑW#K'VnWSŇzNL |~ wm+Z4H'xxٱX\FRfכ1}U6i?k:ftl&r5u9r],9cъϏx3Yp x佃 6H ']:푙sd,/]m[g$归e̮3^ȤDӏYOE.Ez䄻4wgoN=dU5.995m㘟$hnMu@ .mTK'L^7m=~;E#לEsrΡzf.IȘOlh 5Hk;\y[39錓I+#d؊EXOAя,}5qZ~2Rlڐ2/OZ @jƭ|+Goka6CJ'bD XÒkYp X)z9!סu@԰Zͺ }/Hܝy'<b Q%#PƵ|R"䢫ڦk7v]#dm~zyތI>#~N߹qpIFR_.[qߤӷ ֆks{,{낗Rku RZӺ4H< 5:u`ǻv}n/ޟeO?=6e}/׹wczމE0{H ~$q6mG?>5gów| Xe'#Eߠ9kVfyu?X8og[Cf.'wޝ;ؘs/+y`Ƌcߘb/˪q>iHBAK2 o߉ +zqiz/[:sۄ5G_{PntHMwCrqފ/gZjԲcGѯG^*)@v^!k+B C7D}ռIy;.Z~|g"oҤܭ3 9;—RrUL;g7<<㙞s6޹Bdk cԛ3^Y/Xqw!U C Cބ g{Fʈ(z98{ e告1or!sWe@o~i{ Sܞ"@ +\p0c4 x{ٱԿT磄  K:[x0Չ/*,g{ zb!6{[||UiچŇ>2{9kT#C['n}"@+Y󍏲bԽK$֫{%Y;0T 䬗З>uR?xҦu3sH畜W9< +Ǭ| @J%_hyk޴ @J2ҪȲ)+Bd۫@P霳/gaW5@J+귨l |}9pw +zLeRGvjm#X|^rzH3r3@dʅkgo~y60n37ωN=A<@W⪾W @8`ڲ@ @dmP`^bo=D|e=fmUoU e§ױw"@$U OZ A+@*I)E7f!OF^NlhR5yz- V0"GR?8W>hp @H$Ȏ~kCKwKYV~|HQ;"@b")oN3-@E~ߨe"@bFOȩkC3spsRTLX=tsa(dS+Zz4_q2R1pvoٛ'1d<{U[44!!_DLr˖M2B&=Sޜ_Ѽ׌ȕ7ob $f2@o5: @Hi^?Gd+윳7w7 Z k 1¸hD_%?}܆-{63CKW޳aFȂ.ݹ5#?b- $ܒq@eÓ)x|ɋZ 9_i$d7|n@j))4gݐdlR  {?!N<~}tk rtL2iM|)Oۚv6Z @H "@  "@ MHHuϨe- Z:޵#ߒ3ߒ!瞑nO}1"@.j @@ @@A "@D "@  D @ @@ @@ D @ @@ @@ D @ @@ @@ "@D "@  D @@ @@A "@"@  D @ @"@  D @ @@A "@D "@ D @ @@ @@ "@D"@D"@D "@  D @ @@A "@D "@ =g7M?ۧ 7脄Kθ\n4C @ n\.@  D @ @DgפCz Rϥ5Sj!8-^a!@   "@  D @@ @@A "@D "@  D @ @@ @@ D @ @@ @@ D @ @@ @@ "@D "@  D @@ @@A "@"@D"@D"@  D @ @@A "@D "@ D @ A "@D "@_8mJVIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_-9.0.png000066400000000000000000000173441322271446000244460ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<aIDATxwxUeqsPD" "J% PB(ihB XQQA o9uv34288:Py>!$q{NT:}ԈfJɻ&OMs{5| @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @ "@D "@D "@D "@D "@D "@D  @D  @h۸ƈ[S;:R.E6$Xj@ѺSf.vcmo{XS9| cc-wgIc}7ma=5ۢX;Q/%E].wUt'2PWG>>BuC1鳓f^>`=OǑr8աz*viҸMv}:kxaӎMi'[trV ]eL/r'wӵga3J{8s+ צȁ }GXt`w/G>Z'|`΋?<=n"%& T%pH\wXx_R߀@Y|TnV-Mh-xL&?}=sAiM6߽ox^rqlܽKgV_Rޕ,ab3\?5.K\?ޥf @ɝwR5Gtɢ6FKELx͏4ge\e#ЯдoxA MkY>4~\NĂqmK 궉oj~FO8@_ >pYS^crR䙃of0U|$LyMz4{oҌJ;O\ؤSvʹ:_Te.tra1/J,XQT9U٨9E+YJÓ5@%WYDn\:g iiU᳓>[3̬?=g2s\Һi.kSHhlPQHp2 \4;?-U]tIץ2?ZsRe7lao\+yz5j 1 4@FܚzoѺ̽S6D((NBՠM_5=Sixp¸*W_3QњhhQH0Q)S%6&@$HbBY*:=I@򗫇\5`S B`5krJ<}TZz%@ބ Y:w(9urOeH rXKF>]O  ycsօ&@c *  4/>p#Dq 肾7T$@BBUf}gUf) 7/yHV-ݗoɫHky8Q1{GOnP+oop E6veµ{ Fwޟq57.(1+RMXT:1!ROz(u=&uo}G#__ύr:392zŀ;nNmR꼝?J!@ kV"S1>,,@ g{)ҫY',"f@T ZUV1`wvFZ)˒g3ޛ\>~^=:'N;WZ;} znzX}$榕tk7O|(E~9OlxkKH-ds?G/ZڬM{*'񳶖ҬE{" ^2{Jf6E{ _ǏݹS;vnw2*9N^WW$88nU52f'g|ٍlP>éOd~?64yGc ÿ]?ٽU}6򻌹I7'MN3[gT>piƦ+=:~mۢEvk_Z~YDQrWό{愗^>!* y`medzjê,{}Ieoh_i׬-wix3JGtMթf,9偤Cg(>N+SR#L:yפ@|ю§n}pϖ?Fk|]rq!3ho,p$`9W+h{>{rWZܐ0XV rL~J6 `e:^Q.z{lGK 9Yf'ls_w͝Wl:ibޮȇ 7x8^|q?H#ї/0'T/Ty|KLI\:wtXvNJ_.D @ƒE[=bGy=c+x|Zޣ6gݖvA1@ G %F~9SۃϩRJLِ1ʪU=\Hf~y;#w eV>cːwfor *8@bjT);O]|0T/ (QV%nX8V6uԩ4gqGZ;q+6qf<,)3nE뢯 f=?}'ezqz(>T>jr?o nY=q5wo~č¨wd~wCs_|Pl!KS\xI !@B B㜘15K6E/'iڴ궮wBZR^EJVu  QSȹ'u'ͺƮ;Eb]mN%H6@vM>)I3n[8{GϣVڑpEyoW*x,M;3($hCڷϺ}S~^hS.oH0Gn9O9JHN07g̶ۣtsڔޛxm`6# :]pt]rWcbcV>Isէc yrZ1[Zf%v甙K'<'~)e?t 0@F-O^jbjDŽ6nZ=+O?9p2䆔;Fߕ- NO?_b^e4vvWFj>ߔ</2քg'd9ӠR=B^kd\.4@L(haX;'n.gm~AtY;[ijk .oI e 1 B4i @"@@D "@@D "@@D "@@D "@@D "@ : @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@ D @"@@"@D  @D  @D  @D  @D  @b @"@@D "@@D "@@D "@@D HEnvՈՓW  T;m2 @*"@@D @ @"@@ D @ mj,B4ݽkNYq S>Z& @*W W=_Y ]'@@THߪO.+ @*bVћs Ѽ[^R!j]xu9O   rEHhyTE;wֹM΍PeXZ& @*Db  1 rfw  H-=<\oݷER^بл'~`5锝|f j5=@|Kn֥噷wBqcO:ƍ}@| lԶZci|R=TjoֈE;'  U.]<0þU9wdM” |K$haXE=&G>e4w2ݦnUe}#L)SoZpgccw%?8#pg/y-rh׿bd^ɦoe-a Gǯ-Sf|ю)4쭬ŏ~s =x)OEwUrJcV(w3bepBǕH@CO/)C?m=,p^d8:p>e^\=qC_Jd3y75f6PQ}=з;eo%@@',yn75_v [X'8z"V}-z4oCݲ; @ӞGF<׃{g$@@=~pWGۓ0yso3kj|RH9{E`VϴwMio~=sOspy]@\1rylثJ\[9]?qOp "@  D @ "@  D @ @@ @xD @@ @@@  @@ "@  D @ @@ @  M/&;:$Y^00>sG@ar_d_k\Bx>t/|lΤͩ?L^\MdoFׂ'g _ VLZ9E7'rkֲ(~s3 =s_y݂w3vmaNY,,|`[⇅%f/*?>[0#^yuw m)5e,,E1y[S~:lsX8щM~6}G^yo?zk?qK=yuđH( Y{C'*ud~KfL @it[3ҙzƉi {phVD*6N%22@/g-](@@ތ_8:+Eg+Vw,xRPOٙC`ǼCf _zH)/l;m|D߲dY6v蜂~}f{>y[S:py>.C @J9@~jXs>[NGNؓS$Dvg ićDLdk8hފSX"[(WG%d -X'Ko wČNy.m݄Եbt@)HܦCd_h ]IOj6l]&8? Q[%uGB-x[˛(*֊uH|֮IOTmJ+T< @>>}UqU[LtgnT]BMpH ̙Wu}{W[k6 [:N~lW pGBomQkV)gK,@:?Y՜xlvͺ}n*]]ZMo-wuך&'l@jջ%T5Z^ҧRU @Ȯv9N=LXU$>j~?~\ar G=9jO4@%/˹X~m@z#+sĪZgm:= t:Z^յ5Uj @OOO8} }鷷ϚXд+s)E%R 7*xU3Wrl9ڕY}G5   '^,|Gc͑q#-bbb.3% tCS[IY\<^F}]pIƉI =8ṡﶉB~?dwBGG^~oD_U]zJw, Ht|ޤדX8oy4@+Z EnWD(MBK^ЯjPU6zӵ}-^<{5{/jc:={ߜGi(r{:Mz`a NMySs { #}۱ v[ EZiڛl,7;kG֠ w8{'Gt_ז^uSǮtd욡omW% w?f܎ :@2E6|ꛁ/x糓 >,&!+S @82}Ss}vUG$Dpx'f g _tSy(\>تۺ,]0{_/ۈ^+^"@ ]0eM`?5ʈw:=13c9,>G:1BKVA>YN=."v|ֶuCߙzꏲ7 NSNg'̓|ގ.@ ePlˣ;gə)^5soK>&{sNBdSNtoȠYtҩXECG^}Ϝ/HY}č{*F_>:s;2VBdWfB䭬1O6sO{fN]ɯL N\:8z[ӟKO9~Gf)HI+&gY2 )W\qO}'+AB;%%dПҟzMdG֙DG#͆=i<̚q#T~5(C:e2C_OŗȜ:N~ 2;SHq?;UDO ?oGEc*T+&&kYrq%_fF2|1Ö]]t(pBph՟^2=w Liof+|?m{BZY-alkս< e\6xϏ* %D=k,@磞e(t|LLf(~ yΓaۡ?l̗FNZPp%sV c(>IZ#npCp 92qc/K88}]ҡvc:LK{#|b,$.x+i=j'(ܙ~}ڦ-ph;:.u؊6{:j}c+^Q6~!@"{3}/ \6okOϜr'>s-Ӱ3wd5/Z#Uf%˧=5q;F?5zcaH=G?5!'9~S@oU7ֿ)&&&3@\pٗ>ṱ{x?<`}&mJQߝGl/|<.pVz\[^ |N;:a_ }TVoM_5S޺<}U$O ώ})x$@}.@ l֬ףp՜y7u`d_zc^EvZ#r?q<#3!+T| G"37fa 7) @8gnm=:PAfw'?4鐧%/VZu=O$@ڞq46|UjU.g \ #_ 7HtnCnm=kIxD;ܪ{ @8/rnEmZ5j4㕞3 ;ORŐ%q༨R 7$.[׬ntu[$~nڧ ŨW \u}BU@1%U<;gz]iH\5ZM81g ](@Z۔YMoUgT$^3@pF:Řj zuV,]M;kk\zgD @.QҴ`{7ik 8ИՁ D }L7DU۩ZAr e{㎄G|E5Ͽnoѭ~[pFw@RF _ndUvڝsG酆PD⸫ϼHpĹGB3;:Zgl KnLLlݞD~y/<<`qg՛Jh rkSʈRmz?o @ٍrwvcpgoc1PC~Z?׸7ոMٕv~mj4Bvt3 @ىo41;8 =]8qDŽccuҸjQ/ENȱi1f}A1 =@Y_0g&mN%;*uYV{g8= f|SE@BdwƐٯ?j1nzn|֖&;NhL_Bfk->sg@\ZS6Ҷ==g>2o.x'X<{_/w٧RvRV͆:02wdFGHҬV6%':mu͆ͼiJ&D7]W^SF(tN\ږ)+$?N=$.=AҢ՛jw[[W0K&ZYu>U #أzT}h1ꕉ-F29͆=-W_<>kgVL#]jwS㤆OJ:@\JwQ/=XLx3|{ڌIx!zԸ\ eЍԿws->RI[u{LOjxNl`&2Zw66|GI/Ms GBř/|[ꙉ/N^ ÖrU`nݢÁcf ~xM+Cg4:LzyJs7 aBd9mBo'L#ܞ3P<i7q;Sޟ%Duz3pgb+^oF2 :f8!3V?-{`q {G >9ЫVy$@ʙ9ْ=:X=b^i&rZR~W> g@Kg:ՏWCw~Y @=j%\rW@v7N?n,8ɤM_@/ٕ9f0ffϳ_ y]қ&(rU &mz)$.¯ o:?[e&uy ~{BL}OQލybހ^߯;2Nܘ@M{b)3{_îO7gOx~G?ccmG' @8N)o 90۳%01{-^zV427 v4*RW=1>:L~!/w}~| |N>Bx0燼<́ٓ+ï:e꺂S^2fMWG3gSm8 #k2لƜ6ٯ_~d9|~Cw: _p[fn5恼&h2&j:t5Sg.Yn.YNmZx 3&%:'2):::6 @TL~=w5?zMY @.q׫>K+> y;++y7=wJikv|w$T<ѱt.n΁9B zrŚ1 _u|ސ`qл Sw~u13$>e~ѷ  Xom WC  'и @ʘ祃g[99 @ʈyEC$*F ie5P4Kn7#$jbX @ bz1y S<xK]ʱ"7jSt8t4rH}&"U  LE*z y KL+$* fȄf /cЯ Jfޮk͚xMT*z6W:RGtf,m@ڪ=I[N k$X}3PoY>kvi%_\82m{ڶ3'@ o}ќ/vo>Y3@ikD=ijR=0> U@z&k?Nۑ_h^:$1/Ejj7 ]{7o b΁XBc^af\]8]#uh mXCGE= PF$>qʖ/Ӱf]GV.Zf(c⇷j;{_OB 8L e\꒾ fN;@&nK۱m1@srפ7#$}]hy @.}uOuȤג[5y @ʸr]y9_= ;f2klȲS,>Sy @.&$>Hp +/ٮ_ )>, -tz1¯xSzzM: *?܃?eK.~|AJ>^]2s@q}uZ9EW?lo=GgސI4 .IgMRWg1-m* 쯆\9~M&c̨Veٝ&{4H?-GFP#jl%'(( |4ɶ9o{@@@  @@ "@  D @ @@ @  D @ @@ @ @@ @ @@ xD @@ @@@  @@ sYVZ*@ V|!kTҴЄ  uǃ@@@ Ny/6 7|ѮO  /}ڴm6 ׶9 $7 6  "@ "{3⳶e  ֦m'Y@ @(Ia޹It߂ޕn+ Mf   @HEiӷe t$Jε5٪ZG [@X+f\ږ@ @@@ @ @@@ @ @ @@ "@  D @ @ "@  D @@ @@@  @@ @ "@ DPw<.sf03ng8K4TEc R慯}"Mźɉif STg2f;dϘ_yNʱc8`TRh  @m,@t%Z궻v-/*fͨ~NR,NO_{"FyniU䝔>NTnFxׯPWd-oD+r㗉kOJ\F0 !Ei\-rBث>NW W_=b{"Š\]-ϙ>K Eٹ BQἲs!˴7Z2GkqPН%7R(<?nY @m4@y)S+KR$d~xGPh3;J<#[RQaIW %.y,mĸun};]>>ؘUcSR @G_S*Ir(Pmz-JyVz?X8bjc@UǤV*ȨՅEYK/Q҆I) V{,[27@ Bƕ|R;x]h"7w*nTifC2j$C6 c8JYj(c$un2'Do6@U&%g%.¿:~-m\ol W"Gm2IoHS  Ckrbav?9IK߯^Q>KDŽo YS[܈ uaq]2( +z6}Nmz€b~] ՞ĥ?8cK= 4Ea[+ _ 6ǖ8&uAQoY&{^!mBnU5R+?t{TS>!zm|$@a-HM[do>{Iզj᜴ټˮM!_9*h1鶽ҭ|S+~4,@ /js̏)jc}Xe\'ڭ^_uVAf3ݟW6ElC.t\6/q8@NJX2;.#w<'zEn%9J?<+ĥ8)ֺϏ_f/\y꺭~$@ fC*6Ϸb;rx7rGҥXD_avs}ɟnk&^MASWhwz/ #_e֌  @ !/wvZp6;^\_ca9)u @d)I'GuP͸RϥqNw*& @m0@w5[^8/\dHA0|PA_zWLyMr;݉q3ʹ g4I*Tc#6Űis @!@@dӂ秤8IώVH;^@x3 @ @ =cRE @=@gNJ\F @ @ @ @!@ @@ @ @a@D֞!@4oxtm7ig]#@ @w+#F}\ ^@FsX, MήpQ=a99s2 @H8=v˜B1_az[ 1KR} ;~X, mB8ym.Wo+ ,U- X}$RC~w1 @-گu:e^Ǣb2kE.v8Wz 4Viγ ?E_j[UI<8#EGb=y'`X2o]Ƭ馚;橷ŕ:ʕzq%,U{?fpb*q7@;#vM]S/rX9=z㌤En*E%'چ$P(ԌpOwnŸCWۏw51# @eaх>"v{T8tPRR,C_2v?I Qޣ2# @wyw!;n2rg:d'.0-xaEoY#WWT˺:2 @lӳg[%O]0ZWV(Ѝ':IV]|ݘ  ꇾ(2./=y9$n)@.mNOLd0 @H;͊Z]jxԋ aCY͔ԴmNx- …qrݘ]ၫoo{Qo|]  pkf{!tSEǕvLdj4?+X*bIV̰Jd.@q˒76WzRxv] b~슄_4ut~NP~qD%T^ =>W]zG3TڡoE>]b9}f\⻦ԅrq9 !@̴jsHفkk.S4 =?%## @PӅ;]>lYDŽ.s J] U"er A}cwF\}uU}'Fs, @wMTڤΘqDkZpV…Ccw\CI  6 l獋\*lzϓŮnSӫsBM[pe|(̘E FFF0 @m<@,g8m z.v;}hn">2k+BvGi#t#wf{v <#s{#dYj3J]?.LWrc&mQS:?= |h1}ծbK?s8ݔ&`;E#w9~w"7o͞ @mT130^5jzbiL]} ݠݙ  6B3mee:JlsŇeNҲpG$`Ј ?e(~67W|$trlXh3vKwJ3B8yD~$|[u@}۔?lrx7x&㽿鶼=:d6@ڠz> ?ndT6qmZ׿ cbO"BŠ!{SuzӂЧFx,܅b;A!iS~+WklLR˓*j324 ##] UsVSwyTqAؕmHb8=*iVۥ+ fE.Lb@1ܻyzkr)&7_kqcu#$prt啓J\3fASa@\>jۿ 2kğ-q<`epɕ0.rcLbӗ Ձ]D;_ih7] K#6dο.cV\Zz-}ݰ6V/hu~ Pa<@dQT#I aγ鴵I??unʛ9JϚLpMꢌbH>_vkB^¨=KkVfT ?Ǖ|2'~ŭǥ=  D Y ˥I<<'0~9sE7y0nk)]UU\Ѻ]cCژ>q^| 6KD2p1B<:'dǘ%)C{ʯmvE캸?tw2ۧDnR̭ݗk3扗O|] F]I qΟZ/Dh;/sbqQ[,T ۯ ZRTҊJӗVN;C]f`e݌;wDvt43p7Ș]1n߈uTq1DĂTEn~OVX&_ ݞ0Y鋧 -)vJXu1㊺$~H,S~U˔Ӫ<8, BQ2qiC=kjI~\.J۽UaR+N^tvXݙ  6¸q!Z8Z!{4W⏙5  'ڤr7ҟMԅc֔lI*>:*ܩ~E#DmPK ob'yu5ϭ!4G]|0`q}K+kkwmb' ¶oU=%> |C jp{IG[{Hj/2qIn3-V*BH}Ѧ3xvX7ҁiU¹Vrpe?Y0zHzp.h0q2cyhd&V g 5<ŗ _QLRFt2rH 8Һ]ZHq}3S @@/=1IƝuɳMoȪ1|P-3ǜS#|bnbí~2ˮ*.>?Of :|pfpAUqEmQCIB 393p,WLֹʹZ/ 3Wd&c 'Ŕn}= VUl?=釅).Jw23=#Lf.p8Xn6yxWM!:eOIb@ZSc3#~ &{he^~s6ͶY5/6@+ ˂̣¯q|:ʺ˸. lM16)nWc]% Ԉ9+DŽ_c>rX萕P:~?=*3f@Zv+q!J%$nөaڤ:Hr[YEmO 6Lbcl3k-r>sL)@tT7ڦ',^-'oHuLd- V>a8%=t\'Dž/J:L-6DOJ[-Fͅ]Vؽc@Z9f3Vɋt*>'sN\"'ZViy-ܗqDV~𶬛 ׍8)qLja2YgI{w1uhwfzO;,Ize*4nD|*ʏ 5ӖjWgg|97U#/JL~fRN_IYP(l ]+p̲^ _Q#ܘ_곏¶YELpöbc)HKG5}oӃ\&JNP6~Ǜ*TSRg, ,rf$\?H [^#@H'TԦq|pstʶ}乇[*i.. ¸5 ؈Iw|ؽ*G]f:Є:%{|ncS}n5cؤ/J.wjƄ sTvYHkR+ų'bں@5)MI~krfuYwY=OZ券V%1;Z g"2Y{^#@rbҫ~IM,vv)4>S [nf.cFt%Fҡ$KR*kר6V*rs4"]Ⱥ뭄H9~ @Mȷ` F4}Ҟ:<ޡM Sʌ)m}i*324fa5Be7")3_zrI DŽ {ܡkr^#@wcLyYu7qW ? \lGf F*UncPu.[8#mqtۇ|vWgf,kH-5i+C^k@3SSVʌI.t^) lh_MŠL?,m(,;޲IU^K"6Z\]o| 4_öor"LEO| M>!kf_?R\ya9+wz#\if"cf%--oaNÞ5eo5@7x_ЌUw6ŏo jnϫ0T\.1r9B<ŬNH>?`zw, >F2BriK݄)@ 5ؕdW\NQ=u+~݇zzS*?2Ӹ}JKc$똢vLH=iz VeqR2TLo me}px/pX!ḕI?,gܳ_c]d&v^>.ORKwj%XU1?M>UȆUҪ9q.IMeꑆ>T]~eI'py hAd렜[+xP:\Zݘ6V6tׯgPΘyrjMnwSecXk6k@ ]++Q~:Q;ZZP CZϗqF;2xe庞GO/uoً ffk%>.Zj6cq?<)lRL (L]&PfDtt0Vufшw՛QnVRMcY1mԊqQcfo(Z}A[ ~6ѪGz+샼i5A:G.N8Ld~eކ6}񔨉NuZ@xR?y\.|݈ @M$7ioFsG!oGD| @Z)ȉqǫ?m@AKżfb @.4yY[2_j+["wNX;-=P;T;1J}6ir}z֘ioB3mjϺ6i  e}Lb"ffq#vwziiFN"|֫=kto_f ^ VBP(RDޛ:fqROԘC}@k yKt[s[`}ޘ݇n/.UK qn''R_!/??%cCSuy%X۵g/ Vĸ}ʔ_܉ۦ=!['Oߍn-f@Z <ԝ '"ßx?tyj+]Z}z)3pW<1=&dj;! \./l}Ĭܹ='{fE~XNz\)pv@@1d1ͰOgNl۸  5 @@.ٚC@>Y @ZDq/ @ @@kV%ncǬx V.M- @@""O I/~ޚ#b~#_`Fڠ~=T>F5H\?=laqV ^(4s ЦWC&>%p=xNHraf @V&)S{Bui*¹c:3mPǡOԝrOu߻6"*h㌻w̶Ld%LMj7sO w&BN{ŏBֈRFyr5ss : 8Y7L;}#N96)O|rKL-Pl(е POnxR bHAr 21s`@oaZߐV@R+3R! >._!EjPa.{JQlh@b)?<7s`&-&Hg7@)3K @@QYegDR7i@+:.9J?^6Lvr3 Ldc".&X@Z HWJR.귋oM`nKSjS+r "į^Ŝ"S'ͰK'[il,}:cÜj'ݜ.:dLdAĉE@~w{9qVY<0O @\,s~h+y'ڴ*L4zq1ŴJ9H ' Y朸'D^ZUȭ{?טbOs8Tt gT+~ *̲pγKm!\b"k?mؐ{uhwf 06c?_EٓVLԘ{%O[83}ĸ^oމ)?1y[v @b;::*&mARMQalKH~ EUj$ %-vj~آ 'ڐ5 (w+dr3!زZSK  6Y;T/úL9D?6a.@#{e] jI *~qW㇘  6+DOP|%w{ݯ%[ Kt۲ [6{OO8pWHO}X,I&l`9fZG2 @wY8ώ^^-kMa׌˘  j1BKH V̰Nb@zg_ ѫҫşZ:>$G_ +d&  qmKY>Wx }߉[<% q >.Ɩ~bzg&+|Hm]63`zs|cAջt)L[_kCB55-I:fs^ b$= LxvMYhî ]F~~ZLGxfӐ!p̘9rMr<VsrF¬˄<@?q_.B~m=)֦U ry )T +3@4LWASDs]"; 5*kUbCU s@4sQܓB\s\5e Ϝ{|%XڤN_6Ft&Df, ^.ʬ, ho<+V gY$3u7|n +"@Dg݊}R+3S)~uud6@oiV@xPD @\b8#p9$5!gƌ.7G|H(?` $t|2/28¶o,/H>_̴d.@PMP9 @b-Spn羋K *c7GgS\l[(d@8L_{7/ @t7] ˙ wV'U9na9)K܏&"7gnsHZxzj8f_)h$ToRD )Ԝ"I>$~HR i:߅s9 ym~Š ܓBmůS)™Bm|E:u3ph].˦ ՊC> s&{26~bGeȺ1 @wcԱIqDiV=ZyU`CӈN +ջ;@dLΈ 4{HDn f3ް*@=@$!+h9&[@=@$ cJlxdf  @MU4[LH!&'{Th: @!;ovID(; 䦹M\~+ &n<@83}1 @- HL[uT@@B@=@$B "R  iN 26bGD!hlFtr{Rǿ0l; @- ˜_ <@83ca笣¯~Kvdt@am9.ed rOGjx}݌ @DLo##{_)xKO|$vq\x M BK s @ ><"2q^{=T]~ry~< f@圠s  fJUj##{xYDaX#_K j*<>wC5 <=<2eoDPK]ugی@ӑ/ 9q-6yїSx@-;"oSn;/ 1Ѡ}GlC>QF]?zȔ={|gWyh$~Cg!<9[Y "@Ζ7abl56ڗȠS"Tnm: \o/VMGU_!2]d~naɻ.-Rf:7;ZD?>KFC"掎 ]EDPWucޚiR%@ucK3S>mrnȕ, @ ir%] fNJV3[ N  -3g$4ܽ1o  q;LZ~Ϭ{2,I"S6O:o=Pu '7g S%r(a[*+:}Uœ ߚ?O?S~b0ic™S̚KDPdI×&?)3lXE_;rJyyǼ>12'YЭp/ޞW|hWׯÏc@ J݋MoD Gm8yc{>7ve̴y]?:~ikq2tlپgDʖPtԧ7?ye1>^xGy>6byVe g>@4ڍ_Y/sA'oOn5yҖAoړڛXS @-9(p޳阻`r֖~?O[) Fy)kx)lk5&mMܹs'<9vIx P`M 2JNj؟v+zz j %s{Nx!kK_ ?yKފ?{DPK_R-3 ) klBÞO]j䮴 ~6 ~w.V)? yZ~6w HgAv'zq~4hUѥSf0/*u}z)gz@] تHYSz̛gV΢Vk?JKʋEO. ;^9vK7Ls wo݉z /Q;nmrծH V3;Κz>S|wYyMou YZ47~t/i+Ǒ>ӺM+BV=tVѐũ;>sƄŃ,qs5cs-^Ͽ.@b:u pKm3MhX{D\{]_>kຂ*τy-ȸ][gt_#mn pf U e?QO%>mb'2_ Y]@JG-Pnp}|lcꊏ_׸:5 qwŽcL:y  } _k-@ ftYe|ܳKt ׇ }Τ]?N6&!@~荧T^zbԵ9{owv rt9K3~{ k c!@>ڬpt v"@l,uSimzVȉKǂ˂x>vSM`n1: >dJG5oyܓ)C7ruT]E{>xk.@ú*:8,Hjrk/@Z 3ނ? Xyo [c}C ]@h٤}FSm:tU);aE`oMDHص & QQx0~Mۺ>Vw^?hng'"d̦7>|UӊkکHt5-FKn 81ccEwTR\ 8'[uDUdV 8p8 cUdΞ6} pNA׀5<)@k7R_+_25 "@଺Nx*HD#ek|5 pZ_?kJoʚ﹦~ H|1=xos=^]ȵ >R 1Qy٢PxU~\}7ΩCzAye#gwYO71t]ĕ}U]^r4P^z,X>߷ ݿQ o[/V~ ꠶IO|5;cUc{!}}W^W:gSy|֖%>]@ś/^/>둦oޫjjo?}w6 Ե D,>o_;@$vFWdm 륊J5#ug uw7FnjsߺQFIu juĐ;X](<x&m%@CBK}U8xB/rmZ57ھWeo 祎O=?zvnLX㘇$ Ur$Gѡ.<8Qt(p.DP}Wg@JKKz?7?t6cWfw}.gZ$i%)"FL̩W@-|5KWg|y;8hNT3+=献WCP<۠+>&Ws=>Fu mem zmVkǞo|5=Jjz?PŠ?/ ϯ"C;/$>> Y1 rJ;-Q:}ƅ9RjꕭFE S_ EPko7GhU@OsG%^l|}ǔaDP]_#xQ'}ӪH!CPEoE]nWG槾\v_DP ]En~8p|W`JSb䊡e/9[4¸j!E/{b76`?cq?|1o~1~ϸm=Ͽ䲞o;оĖ:O1uV8lrcMkd{/0t~6-W>WWNͅަFX(cMI!eQg802eOxx7|=r:Ny3KΞ[<"yim6zkʵw/@czv6zEp{i]c =3wV>DN:]4ߐoM_PWf>mP?:cJܳ^ُJr3x4nujzf?gLԝ.{{awUdhGʇqQj43nw4&Z쁮\3|Q%Gǫ3@6 No?}~5Snc"@ ЯkP?qe`uH?>9.|pxyŧO6: n/Ug"Ձy_wj6sMoz({46Oݟ[\% DG$؉跷LxF>@׫[ŵz|+Go%Pޘ+>J+" WED}1o#naʆ=g,0ifR-j >:5y俾 |ZztP|$Zw*:86kʰQR:h@VkV>&kQndhGonܫiuۮ;(2o SjdT,;va_#Rv%U~oJfߧm,II74@uy_yfw5,x#"gOF- awu-99.3s)@z-t͝-n[ܸÏ \t Oeů.<1u]mGhrk:;oXͩ9{c~sFg LJknok>m gz#2uBw\Q|8~9C1/f./[];tydЊ__MzLg"@̍\pُc!û[io~myY/5]X _ ^.q}g"@5ۃ>Wz&2=Lce/+:x?S_}fMZtkg+.gx׼Q "@5ЬI4?㥳}e)2}]f+O}}݊^b^=:Ť"@Lտ~Ձ75#)?7n?>Qp或9U~{qm7)BC.S=r:d9Gچ=tZ88| y߸#ꖛ[&}݊?džI<\_+zrL!H!Di[np?[|y--36C~KnsbԿ[Q{o|oov]VPYć \s;$߶ԍ>Qz,'oc֌=yI7<ynņ \&ZlUr$p^'NMFlLq&^HfƭNj|e /O:۶Ve}Qoy_T1>0jdR!@G\Wx0/gCL/w6ko4]E$J @kmҮNGΞ77{>Їwj5cu5w= bs"@<:i?Z2)nQҦ Ө#w=>;ۭR_ grC.=oa \zOvziC'oJ N&2մ >h' Ө5$ ]\S!@6OF&m:;ZO eB[n0jdO|XۚmykAQ>ˣ~tk6zkƇ q_=_Ä{k:>6)C@'^UЇz>&[=>K̀4eu#>|UrtO#>G{:L޾ӊ"@;reK> "@D  "@@ @ Dg-@"0"@" @"@@ "@D PP"@ jdxK!@ D .D@H|!j"@t.Nw[}!@D D @@0"@ D .D @@\b #0"@" @.HDIQͩD@HdWc2iW\;|b ,mM K ?@B{71m>|b auÁEs +2eWRdh[šE%rEږKsp"@2_I`yg =J't֖̀^4}Z{ Tk@H9%{c"蕣^?X['oO[G,] k&+m}7>]FƷ2: '* 2vsO;c 5 -^MK^^OOXbD@H`j#u 5 '-//L{Yi)m蒤M݋fN j4@z=0 oƁ? j,@bR^<~wtD@HُEkj:>HӒ;!gI Pcz6Y'\ 3  K #ZG q D @K W/_̼1 ^h6zkJmG@--}w /9(ɗ2@nk>շ7L{fLn?qQn&c#"egrTh_ɏ>$@dAǬj=fݘOBYt|={蕣^`CO&,O<;ŋn)ΓKApr@- nEK;1waq3`^@yE|ڗä DPL.@(K^mZ@-tÁz #C{L)w^o=vn3V-@ @m=+au.K>9q"Sw&w+:ΎHٕ$@|S,/9(ᅫz1a{pZќ[BUlHy :>Wp`06Z9Y`]~w%',ɩҌHhobILqCȌG*BdrYϷΙboj?i~~ǜyM];xa ͇F@-;GJoÖ.4@6 Q',ayH!FP JfT gZ\"մоVݽ~zȊׇwЪ|]WӣBBDPGHچ?9#p|<9~QnT6cW  suQ+[Z7liƒ㙛SpjќOʦ33_Jݞr[vHtȇ bȢ'>~Ңܘni+_?e:b'/yv BV^H,{G_FTy@aO\֊~s'.y"1ZD˙{f v<>tmʷHʸj6^hx.lKݱ>\qJ󟉛g5w7^=Z)st 6B=7fUU*l6zkMUtU}#V iMܑwçW>^;w*΀HFLH'@3Ez c>pк?0pbgJNT~rYϷ;.?u᝭"SVeo<:Gz=j£^è;\]0>ڧw>agw^F'2uGB!q7(BtQ;[Y;rG_-x(]g&d`?u$@nґM7^ݰ}g31p?8}/Gv'|if+q2O 3:).|yɯ|%|Y'pLcco|;۱&4o/@;ni5%-S#Wܕ/Nѡv|؞Ц6Y L~1kBnma\ƽy|+w-@M!ࡾ F,%4OޖZѽxڌkV&E|,)En߿(@5Nh~lƼhz=[inDFx}HHq,jcYUO7?жГ& @wS?s޾o\9fd_bׂi³$DP c.$b k@|/\1.;pK -D@F/';~ 5i\T@;y C ]Q-G89@Wp[ݽD@=򎆅Oe1o^6aUܡ"@Z|ᗯRX|~o$GF]>y .-%@TY? Pefu\R| pN k3n~[7}\!sحoF.I4"@uz)KN~.)h\6a{sHDD/~龎xOaye1L%C8?C7>ŠGx","@b  P:~ pI`C?:+2'Q9y=ȐʼnEv& 5 aǂ9"@&m cQ+G M RVr$p[ᔧ@x% K nEE^61"$"@ 5$wO}1o  rI ] K"kk/xQ|hq  ZOz(x&*/QH+>8e"@ }~&kevd[CD @jTMD @jxXqR܂%@!x~ X6轗*B6 5 :ۄ³"@R^v@% ,4n8DH VT<%gIk%K"C;j54fSgz;Z Ϭc@g͏ Kjp@RpnQ:>FZ^P1g䎹3Kżc6YYS;<.}W&EJj|©a6kո6Tu+"@9k -WDP$<({챰=KR"@/Gq쳅BdhOb'mM x2{餶^  Ǿ0~C]&.p ԒYCMX5@Dʮ$"@"mcZ?(:x?kkz y K@5݂?!۲wWKU%*0H$  r.9ٝ4$B0TDL-/^w?n9Pˁpd0Zp @X`e!@X`Hoi2 ,C 2 ,CL&{!@X`e!@X`e F  ,C 2 ,C 2 ,C 2d)tT+!loqLF <￑UXf#+.0fؙ@F9sb"!EpfYC 2nʌiR f $/õ56 a׍`dq+ceX@&Ս%Wf>9ՇG7+ HKE9_QQ-V^?hpz.{,EIy ;%GK.]%HZ)Zphw'sĐs/g gS{9 +_+ݸ+N%kEnAh{o}-{Y -< X9۹~4 [WZZ%ɫfͮntIe._pǰp2ݝ-+;fwԡ!ްtugrTޕ,z3)'l+iQ+q!stMR6!(*=~kz~!eJ!΂_iNh& aآFmp({ӳM*~SKozR)a;C(!"asI!2?K7ؾb }&ǹzRY7ȅM3uM7uwV,(f.BXLjn[߻C)CfW'dWv7_nXVy:uh=!` m|%\ɞZLC=u'ّN!3 ;.ݧn\lD?>^ƇBhxٝ]ɞJ6w~v&9A ib6{>f5E#sGkL3䵕4m\~}[.11;44P=1V6"d~T(SJf&Rjb b{oYi.XSdjJ+łdt-#9}BlBĮL)!Mǘ+/K4}1 }nAp-<[w˯+eȒ _m܉UBaBJZ>@^ك=lpe 4 g73w6D9kZ7gS39@Zq9_/v%]?+%Ę^OOY1ZXP-s86=45f!S"Nx hlos00R*j{dN*l*32}x`ޮZʋJn&𶨎C?k{ .bݩۖOyE,3H}s7f刜|/:{t퍟:YY);<9[{ojRs(aĕ] gYJ[B`x_0z{C߹S}K:fz|G3+^gMD$,'۫]<ԔR}=}fbLSJu''2D/hx#} o //]}1sLi*i3˥xL-nӕW_2zGL )stӾ@G}pg|X#.{Ov+@ZpV8?{>_J9/d|fzz<2w}Dױ^~@Zx=.xfc+Ps]gչl׺;/cx&"^ɄIr{ՆǕlH][ê=^Ϧ6))+,]>)eR*N %\]Oޱn1+WV{f*#&BV_]6ꡁMk :clM RІ-ؕWDd4)J+C9G|(5w;c%r0 .gqv*HrޱoFH7n!](sJU RΑ}Ţ<M;}y6\qyhIҏNӡ۲'&ƳZ<%op:tՓ ~gS M QS8=m;*=Y١56<4)Đ0M#5ys Rc{ڃoǓ=KSB2M͏o/+QKqItM[_U^ eT[@?i9ɞ%Rܳ]m5'XWx|>+snD}_Wvo98*Y@j?gϦ8q{7^,*X08}mY.9|@J;^۱&{LknWȍ5,|ψ"3Р۟ p'nWSp\5OK}Ѿ֋k]oQ#R,>ݴdϒFjxₔjo~hozxb\JM)5ڴe3s]ҬbU|}Ⱦ@(ShM0"u"6P.TL)'R${tfJĢ"9y*{ !.#ߗ>#eQSUWYݰZ])41۰{k;F/fB)Q>?R57ٳhX[/pe="VS;z/V u쿻fn)ðx.1"1sGvԴ_l,8q_?PJůΠsF1Hiw"j#q)Iq3F4~C)/1qYg$R*lw>L /k_޹f!@l Wi8\rF(㓤&E~*+V*6& h^G3R֮g>?عsۗ?7P}5r)ɞk&: v.;9--Zֲ9"NMgbLw7bn˲"MaЄ?4c*hP}_SVtf)XHyrKxO?Ƿ?]KB(m,RB^k ʉxȽm|#@^7NXdrD_z])"a1|ёevhN{/v|D]8WPBӤdĥ%h_0EŒV !5ӈju7Jh"I SM7y@j-:X걷?qɕ1MrvV [̳XW_۵-8y`?'}ҏ #Ͻ6=>&@ƹ~;۾QPm^(Lj:sפ/~ߝ>OGH~wݩޖe!RavŮ-Ee%ٹ*24K+&ĕl)%?b{}}[.&gX(z|בSQj-X}>'OM1jkx=Rn!{[/?',}X>7,c9g#y#rǟ/U֋?i2zOXɗF+Y1rzK7:<+G(D1;yy=wL+㣨%+wEע4 )aG_sw C7 =~7[-blT !˿ӯ39ؿi66wޓ;9!^J + `Ǿ\XE%D($'l6;FWJ4qt_9om7vЇ,7/[X y7W۷*Zu]Yҙ{[bsQ{w}+ X2?ƈBHiv4<so]ybo˭i(u|cE˫7# ;fm(SSVӉYg"}*{;|-dq 2֜[Vv.>7:nop|㛚>Gqȉ7?y1rHjW|ܝ-MS!1(\|Ml w|jbMG%YHaGf租ltE c\m,C!/,x_^G9k_y,PQyx=M|X,(=V)S_+>Xw*pz/͍YGWC3`pd,ui㍛~My\!Fg[Tli<v{Gh`7)sb=z"6Py|C)e %r{dq>^Ǫy|7ܙ#_zUJk]m5S&È? N%5M )gKJ[XS]sK~Qzfdb9Xtss6|$z"@L.Ba欹/绲̛3py6ig) $|='_>{ꗇ$I_Rv4Z͏M&>BӤ1 : G=Zױ|%!+ `RmvέF)|mK$Q<UWdy@ƒ믔ws)|esZVc%Du=S|%XXnyKBJⲋ5隔C-"}5CL[1stcli:=3n 'r)Ӑk;g|y,dĮ(7>w2 N빻ۿ^= f'Ȃa4B7NpC=G}g<-SY@NW"7+nSxʸpGNs)m*_2tώy.S;pὔ`p KDowQaܸ)-͏ͧ]7b{Ň2m ,vTBw`Hxω{E #I)5L= Bhˈ_Wu 3<+g:ODzN۴o6o@ )m*t+|}k?q/G뻄"-Dp3  2Mwd%ܻ[1ͫoE.ǬRYE[)eZ.&lnwل]Zv3YύvQR{-)V@9%9-"BIS!|GVNyDpUsJIƹ@Fٺ͙˯t#`_əӇ~0p H6gKnǡT\ik\u24tPjYa`; iF+^^czX@FȢoݫIMx=[ԯ~/&@F΄H[Kn^kaDCh\U4e #i#!̘VPxxKiHoӞ/d`"q+!@nw%@jddyBѠދ;š 9-K4648̂hdܫ{6ߪdEnq@{[JXG 8 s5sJ_I9pg5meX({njRS= (G'ZBBzω;G 52iIDAT(J)׼oi;zNvryj,dytY7vȗy[2R%{..`e!@RGkMLL`e!@X`e!@X`e`R! tI 2 ,C 2 ,C 2 ,CӥJ`e!@X`e!@X`e!@  ,C 2 ,CӥJ`e!@X`.)=A!@XƖLw~nwǬ8_<<`")XGnivgI74LA5?/o34y + $H)5wmҪdϔXnBJ\||n4{:ZPcJBɞ/܄R*2>p 4c !Sz3*UE۷(o&c-/:v?DXFGF5׾tAyB!7+3" :Zdh|tEOw !gr8 !Ē=뽹ɝ8 Z v|kF.^~OJ]&bط5Iޤk)sWlsd}וo~5l8wM+柝36/V@iX(rkR g.bb|SX`7Y3"V@  v,'%/ygX~/*S ) FL*V@Y#@SyUJ>e͕\bd @JRBp&\sP^7?4.%.bHVZ*!dOXHJx\HU LW?*`T!@XRDElKR"o2!@a 힇^iu8ΎdϔhbqgXJM)S* UXK_䚦n&{D#@"ev<*7&:`)sy!L,qEdL{(c­Q \M2 Ƅے=G @ @߶ɞ#Q Ig̝`1ºRL{d ͯu2'~'ϴ^],&>jiogJ_Zy2M&~}}+\!wml.(:1_}=~ ]CF>6lgߟ,Z}BBʬ!f~$0A['V:#}qompRʜs%P<26ܲ| ,([> 뾦}'Z?s%Of.jV.!Y)|`yf+ n/Y|6!lYݭ|צ}"fHj>+f<6s.Pۡ?99f@hK6@)O,3A)4b:od2S;dϑ^۰CT,ٳ$(e`ɞ%Q Eۏ:dϑH£۸{R*YR2 m(Z\һnn]T3k  Դ]SvGIh"3@!778!Da!ɖZzyDzjfZqkeqMŭ+Ig@`KoJoZt̳BOs%; 0uڵ{yQqXK]Z֙Lc6.m;s-=wo.nۛi* gkze3_8tIk\Wұsw%I4M)@`jxkU3^厧$Hд3!<=5izU?w`-w_ךο.[Z9ֺ5M 7wM; 0M;;g`_f!d!SU4xnŌδuw_gz^v\!כ?VIσ$I&mY|G繁U!-Wrπ,[V=ֲ^ \ʦsϝI\ 5]W5}9yFekk7}~p{]dҖ%wtϺ#+.M37aޗҗ\4*ER. @yK}+;4鹓Ni:u<T% MOwgjfZ6rO.~$|, ibъi_ٿeb; 0Mlrn3G]3)v&FNzwB @`9XU;Z]w;oó {4I/@`IthpBG`!ֶ-> nXuӖ??˝Np gδ;52D#@$ec/[Бh辔>}_!O,=ohKl:Q $I6u<D#@h @4F CV ]t wzf-@?1\[eц|;1yTH乧~ض'%I>n$IJg.YֿؾίkcN/>$4_~)c66tPUnnm8ڑ{,筟3}$)r4;vɁ>z&; 0$IRܲ[!Y zcT 0Y s󞃧O {>G` ikeJBysdz)"Iloh蘐HA1Ϭ}S]S@C֦E]ɖN.D 0%IRԲd핍st| @`қkgpscgb3&5MM o^UT\>vkڻ~r]&[s+%@`J$Ӽ۫u݁mY{_\,.魎5ߕ 0I_576_$)=v~{[7lK I$T߱iT^;ݥ幚u!cNyL2IdݶueU W<Ե[9>K'l+$@`i[uZ/N\xxhr&$h~edzfZUt|lzD_%!WTMB_ﺝJI"IykfŹ3ͽmgꩮ>sLqɾڐ 3b&]8Ӭ~id|(MCH$yڵ '[Kk<<~L53Vk!P]{9Pտffk\ppBG`@%I,ssm5y9U7؜?dP̈́0FsXJޞf$G{c744'+cxT]ٽ+} p&΍CjO]!$<H$u6ξ(۵Χyt_?R; ~ɌeLq..1(es$fIM۹Go~!k~5kJybwCI鮆߳(=urơ7}`;_q-'57>766:2MGֆ¹3 OoN՛<STU͡\E}ɹoߟ;K]뛻th۱u?;1PY$@` mڶldɄY !}(8UlBV4|#u3gё0rx_pLg±Bx!)rgcmÙη~˥|ĊIq>SH&WG>-N*_޽s3!%#X0%%V?9XҖ'>$)DBaogf!y{Tm_q!@`+X|÷u.8|s(y=3ș=i]BݕW$U\[5k K{^zUCG6m)LsEIR6VQ/It_[RMh˻}G^~Ҵ\R`))}{s+[oyJ$|~qx΅:628s._x3*s_E:\4gg4wKFӱm[nn9-nWlG`<^9XH#IS]ѻꅭe,$ݼ7LnŸ옿!IB[{c bsI"IҢ4KFΔ=Ui`YQɹ]ǒ$7I&l:R:3F{>.F$36: ^B @4F D#@hIថ殒_Iؑ{BI =D 0 $IB @4&4z| 0!ۯ)htC^ $S۴<4H!=ԍM oY&UL~F D#@h @4F D#@hoWws{9'$'74jY;kszYiqqqP D @  @@ @ @ @  @@ @ @ @ @ "@D  p"v :lԠ7).Rl     @ @ @ @ @GΔ[V/ѹtm͞ *@wC>wV  @ @@ @ @@ "@D @  @@` @ @bH9jg-R;sUV=S&<^;skjm 3/sE@@}A k2LvB C z\R \u_a& ZmoBiKݟ{쌗zX^+}UVB4 @cxe->kka/weqX/N3 %'NX\'zhrqM)Zm Hܒ*@WӜQmg,;ǎ [÷%Stbߋ?nsۿ{h_b)oGNo, m \c=w}AɈ~{{th6nS?ㅎH]gG~ۚ}r{ENHې&@|DتVK1p5ns$wo}m' @q=AIKMnzs뮾3vCNX!@C<".td~s%3O]yKWW77۵f9 g Z O @8nUo :L{ O%>XgNw}M}ᚻsW^(IK3Tt+  *R%PwEHƒ֯6:{%'ڀ>ywp͸&.qى]s]yKO%'@PQWB5X-ViP{p`Z)( [7'Wz3@PWCE.-t~(تGY67n=R%rq P&WWj[rFȤ]ۙKk!2iۨSޠ̛чLy~un1NZ]w.k3W!v]ͯVj2qz&@@7x&XsQ/,iWr pJd#d`CiT2v䒫.8{Y<Ȱ=2j6+&)"Rc @Lq,**HIM:?eߌ^5N[ِ Q7i8eI :DZRیS8nVM.|\ ~.yg_ @`UDzjz2嶿Lߢ P&#hdHm ZL5~N>>.Ӄ,[-ajh @b7zyAqx3ywn0` @ZM['}2>_ժFDBӉ}a)?k8c3O^?ak8Iwm@M:LS^qch_j[6T1 ۂ3>Fbh/ׯ%_^1r]:}knlSG[?W1j}džjS5h~t#weZ_5+vWGގS `їOr @"U#\˩G_IW):c @sK5oO&UaS~}wXwK{tֲ^Ogdho3~=@1ݨG~_ܮ%iϷyAqppOP2q[f xrFIx5vGө74LQNg* @}\[/oӾ'&TpOZ>$1ss걢#ui;>~ٝ_sjlYX74jyd`y17ZTpߖw=di N;d鰻N~*_2HfXx]6㷤/=!dz %ipO5vΠDuylȒe<臍ݘ& ;ev^~jtQ&~2g$mQf @.lqV/ܾ=cH wSrXtvUl#uqm37w`yO/@F lH@IWpX"ϼԗ MJ_/@%щͳ!6czׇ2NvG/Dq"·Me,|Kܕ)jLtٚj$|խ7S'8e)L=0j}7h~2iTN@]<ӧ  ;Mc76l3IZa^L @ Vkf淹_XhI50C  GwG%BJ7*7<~mnFdo2Q}ԅU;Bb1ewTژ8V#On/HXҾWݸ8jw|kOȘ 뵺׼8ECWb7F_>ˍ+cjWjHo~2r|$R%r1 p(x`N7@^ ~_/OcqHk N7@oIG5fM)n 6|M:}7߄~.K caߋTT2jtI;w͍44$}dτ=0snĖvTLh1q`تD ar"=k3EnΑ*K_V.ǯF*uyñՉ31E{RV)]6ew|!xU쾎x4g#>hVqxpz"yquD85 @P|/^#ιc㱤5@PXQ;$v)bg#@qi)ίxM?nwg+ @ "oG1;7J5O enpڔ9h_PRP=bh@PA\AN $oh>Q湍;Fě'@,Z8 t!! &H+f @sMH5訨r֠E}uƎDKS3Vg7hd~˳TD:Mo]8q[<dТd+YѢ™/{f:|ܦ[uS:wE@P1#ә/$ jȨ|i3 <.}/\ws7&1smF~/e]Чii@EuCD'4&6ypOp2xa3(>b]2,kY?p}bƦc;:<, eREe$gL8Y.ϧu#VsǕ_X \Z m|̆l| {nQV@z{ >|#V] @޳Z{22ywp0-0}c%@/~sI]l?U՝~ytTK15_/w~ֲWӏC"@yO v5dIU zC ?кI.@"U"'kѷm:͌WWUs @<_?ufO@}G Goh؊ư5ec=c#nH?٘%eqƀŭG7ͼ*WӬnՈ&]3{,qWM23XixT71{Vd/ΏEr M~$geoy~m~BƆ#XKvQSoe$oG]?}$>s @8y-& 9K؍m'n\],8?#1k}zܹcz-uI}=|q{.se*s @8W>F.7Vl_GohY/g69mJ 47L9c}.C㸏pmMg ){ -cynz>c"okgnM=r3yG<`˝~=q[{DCUKgyڷpIx9ӟ.<CKch2h~9s @85ˮ3n̆#/3sznm6fs Bd5H~ֲN??d-p4}vTZwkAqx vwn~Ӭf~QS?ez05фW2[8VҜn7y!7Z8-@z=f Ǻ}$,Gn@OܜZ?w~́ z<^ύKRvd/ 4|Mniz5@pj;eNߧ[#W?>:r7iY ;b+wF?t :dEm{Zָm^'zhrqp0ge,1ywnV⯈tqG]W~+)VFƁ/UrV N>ɬb?YͺY-2^. /JfḄ;zwEm975X@p6JS^ |wd_=Vڌz9/涝x޻388zLLs @8G+ Y%@CR~6~k>8Av[o.S:[R|zqvÃv&n ۞If?y-FYfC&|_e1'sQ"ݲk m = wh`Y^i-ᛅ{?~I/pύ E5ո#v xy~V Ew/G!OV;?6dɘ oMqqqN >9DK&L.${gLb7oM@p]V㲸)?>Karqܾ_n?Lܒz{{-Iיs9n"=Nskޗ|K9i?%ix୊ 1Zvd$flI.GJҨ]"5 =?sW|֗=D ߎoˑ6E @8G0vyE Iw=IHߔv]mk{9tQ?h2แ r}b@pWH U$v+z<2Bnoุxs @8ǚi *JH f @8VC_ hzԺߜ{Aiy @Q[;c T uվk G-BR*@P> z6X| [5zM%@t#{u. u J 6E*HsE^[X,@Hΰ@p!HH|rWb\DHҸ K;Lm5t~ @4lجpE@·OEwlp 0Pc @Ln3yWΙ}*߾Ճ=in3k<kWW2⮼7Tz"q z3 l=8xOqRwD߉P~&#@{"U"J]8=!/?H_nk5Y88:D>__BQ?n|L[x @/:SJ_?~kFyWnse@1}}}m_?ݕXtH%@q5l3|#$(3;y@hOH${EpI{}q p\iI&OB6 mJ G1ڽx6c5fߨ>j韌5yw5:w \xqquXk&2^ ۂb@& H=Aɤ]%j%&iTCy;cNLtmz-kU;殔Wen0gytV7bV;oOڙ|ߜأ]@ppS48㛍l8^֣k9qg++NjpUSIN{syqPhی)J|И ))(|ȞÎxH{k['|qqqSǔس7:NKt+8Gn@Gx3qUlȸM?f5lhl|DFC;8pڗ .hǸ8K+R~v: -FED.5>VlHlǩ-ʷTj^*Oe/ ~r* \g ۓyM-*k}:|(c-|yFFi6NZF 2 ˂f {YcWnhfkLn9hopZ_-ec @u$7a[VS=zXڌm<)r|1 OFWt}/G1 ϥ)3ۂf9 _TT=\8Sb{K3JV'V?b:=FΩK1#)?*i;=ﱛ \<$oNW@̆l Z2p;>^ 5X(G |Cch;հ'n WnOȨy\[l jRJ=k8mIʦE) !wt}|s75meӗ;JH.?ftj 7ֿ-򺔰|u-K.&MyۏN0Ô1nE !??~sV)itKRv2W [Iߺzֺmծ+#`OH^*W}!R%򩫪WبmۤUǓg]4lu½h=\*Y [F$ㅞ{36-nÑkߏ#"xm3qÿu} 57 Iffg"@buK.:l,@EJ;S{@/-Zحey] 05)/}qRҗl"gg:.)ie H]n<GLؚŸiSoi; @PdA nOd/UkWW2_O ug3@&l ^׌Z5fY{6TLhQ |:$vgHjR @Hy {C㛧+@0py{C}g'\*=nsnGqpKKWyN;g,Iٙ[1q{f xFo۸]>TDiخǣɳF ~VNZk?!...bNLid\ufҗl6&  Jߜ5{UގV0+M*fTrscv<\;k` @ g̐]TwȊX|9#o Yr@ @ΈIbƦ#C1ο6SYw^J @ gE拽Ts oJ_!@;@4q{IKeG+(<1 @2yw\_@g^* @ g rV>a 3.$eڸ'@SR7;{ 3f¶%D{@.W;ku!@ ^oK̍  @ "Gv3'\|)/u "}i@ @Ί./@ofG5]0R*;︪׬6+nmqG\} c6KBƆ4 @I^['(iUG|KV52g%> %=dC>:NMI#ׅR^ [)ov9zNbT @+lG}> OcXOKUdثvֶ@ph5Io4bƇ |ED"CWȾ@ 4i ak:>].Ujύ8[x‘@P\UZ [7d| ykg<  "祔/ Yu!@@l Z0sYrHyć T]g&-\;/uMb @iwWlHKyx JF?m M??>@H O 8~\%;w& =q[fហpoph^ɅӦ'Ny(!ccZy@RO=m8oG=0ϥufohسC^>YyI$flJ6LE T@ո,.er;ED>Uӱ و  @DFKџ  @@ @ @@ @ @@ @ @@ @ @@ "@D @  @@ @ @@ "@qfŗ\| 3A֐*O9hXEE {@D   @@ @ @ @@ "@D  @  @@  @  @@ @ @@@ "@NoQvrIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_3.0.png000066400000000000000000000421031322271446000243520ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org< IDATxg\}wWZ^I  cpvb1/''޻cc MHHHB]ڕާ{@X vgwvg߯9@Ϟ(5sn{Y!t:>Q ތD` 40mX+ @=$IC`b@"4E[ @LIC0i LUZ+$G  RZk;E^ LQoFt滷hUk9 8v7"ҜZL/( ˮ&D)L}0i g)j.qžޢޮ5 NG Ihm+br}C%gQjeִWVfdX{}2%zH>9;mۘ;'8on[4SbM4 5Uc;쐡!Q74d]ūu/ԓ ' å-b-ՇԲuJ,02[i<)-en0 LyۖXz:7:W}9-%ͳOwSX9m;b)Zv;EhI8TTPZ3 ^[zV6]R#ymy/D\`B@D=EÏsp""nwkziCCNyο;>}=1{s72})ڶLJko8[]}+ 7;oEc)7fd v8,Oj'śbLr7eR33z 22fy|-s ۗo[gn-Y8<`FEN;F#Cf:>S q8VƢ=k"̊Ss=pŜu[Qv80;PաKq8ch50/W~}má\tZHD*h[c֪WvzG>eGϲ=1N)C2tWhVH8tt U [z;,[sԴH8k(1!sk{0Ue%mq-yەT[us.wWʬVw,#?pҚe)5sn{M2^_RѲ#}KmG -rO+>ves}]m]o4:+~)}Hǹ0h_[J u{;:.l*^@pIC0i & !4`@LIC0i & q$0ui{Е_|xmeiH%&֖g,hYy<^;ED$|iX#5oڞL_-άܗ\iG.S$ś2$3#mG ዝ "nvM/e %ib_e"]G6=3H&ՔW$3 LCJ/zKj %SE# 1N-xjdּЫ3xE. v8vqt? բ N0 D*Ge>PmŴ=4j_7#б*.3 L55 Vp~hĶm[Y۟\5yG,4h?Ȯ&j ɋ=Z*(m]3<`vw{z DжFkܳc L*#Ҷ cш,0hm}l;dY,֚%Ƅ%XLq.O{܅m3! CшkmTqDW;ZO8)̶#Fjz%^xl˲j ?eR :c9G`Rk6C9# x ;Ҏ ϭv|O7N8f0E)e#\P48ng}7ݹn"kA[A`1+S7G#9_k[uyqϷ@ )FS)¡%J7,#&v!5Y L19yG* K;>DDRÅZJybQ`AzO;&X_3Kb: ުWS4"Qmq TJ5{SOfCOs9#03|{][&^!J[R{/*7CB~Ѫx @ cszNx:pđՏt ^[Od\1Sm\Ӽw; J#g0S! k[eZK_{O,]sϭ  9{kwy` )N)j@gF^Q՜o8=H۶8NGģu*SiB)S}5/tuȱKI=沧j㍵>IZ,\+5L_joFZ좪;Vo})]  i\U=ջ^? G;D7Q֝bGytnJMpß2=]Mh 2d/4@Ivf/u|-.0#{2r +/"QkK9HN0ۯ tőFhm>}Gt8uh[Zb#04m=T@ o n59($Mߴr-PWzStY=i;6ܯ^:R;;DqpHD$5sn{MFn ]y# !sl뉣7?/f9--VYJ_9]reh.C_~c-Q 3 _󖮾쫳ȕ"o{i*'E2|;1}^Qd-okn}`֪)zN!T3'=hҶY)-VvGc9]|@CWngߐn(#Gv E$|_^WTavNr9rN2˲[lwEkn ։\ ќ:z;}Uaz2Ow"7K̩\܂U,wh`~z7tqqٜ+ _u1Cܾsz%sp_w_؏ D$Y9م*.7e蜵;@ߒJv_zD1Ψ/q[*j=Dfi]ᔼ%kbQmyJZbks:1O4f\K""}fg[ʓ Wy󜅭9o>DtYT!kJ\+{;{/?{@INo> o(Fz|uՇ<׳|ڎsyӢMzQC}+MS>wɾRR#9)VtaR_.;jXfNǬۯ}:nOa3cy{;p᩽0o@Ҹ=)IJKx ci#xoGvuћUq/]ӗ<*wG4R4tz[myrME/2Mu΄s+[k-ojRi3w{oSb.^L"j{ ""ڍ? Zr@rc: d/LO7;{-K۝=/ s%gϫ<5-X:G E%Z_]ȾS:X`zrND#PC͆}iMٗ^2''EGw3p03@I/K}\!¶͞nc6> #;,8D#:XwuI'>V=5٘$p@u<=|mRtnIn:R-sOszO\;eIAIGZ==s3v7$&`: ǿwӾJ!z߻NUKyija(QXT[]j(H$3<(?y{Z] B$>yuٜ߯.v̬Ltm~i.75`[ꍷg3_^E"z ,KKÉ'|̖Ytv( [u~L{̀>] K'nhm"&ILkyRnD1 Cq;FLk@t 5Lax3=Ƌt>qa()} ux@Zw>s:u~:`,@D~?$ȍN쮫_/y6;_6MC$N{ETYར~Fi]Y{~x {@NB@ IDATYܱm-uIyQԽjw#HS,ͭwC.oFa44ء>ZJ);-_C!p-r.δ#VWD̲`_ǹ%"kɂ^(WDs3wF>5';2*"3?g:εD 6g JT)"bzM+-+_k-ZșmC}Ʉ$Zk-;dG[WJV.QJrG ARp[ߪzd~}ė] =6 Y+W( Nt-0Y Avw6D `& 0Nge^KtwG ;<# 6tխjtfD&qXvkzㅳdWY1mzl_Ml01zs|z!c8Mkɖec4kN.~SV_O~ˑXj2j Ό,Ypv$#(Զ NF]0@ -.[RR/( :G `q繍>zՇ}):]N}~]rbCI*4`Ǯ7߼se:}H8,;&6QW,Ty[F}Ȁn}O~&>. i}"?2nݚ=9`a:qcϻ\){ #ݪka(¸l߮\؄[p̊UF%v~n)_H {@8;+]Tz?Xϱf;]F~i$Ǿ;vΰpER[*D{r`Pj f*pױぶ JD_P.oܵ`#pxcI.\oFR*E)Ŋ3{@8Ê[WV,~ךkRw׶Wm.##5'}u,To\8͖ݷüy;ފeIl/QvmQEKD[RZ[32$0ܞM[EЈsɍ۽>1VV`0ܯoDWC/4+4ؾVD^  m WZ LiW4nlm蘖;+YvRjK$+6f9 c3#;yO0Eñ]_ʢ  8On|VΜeU\R2'& ~l\t2ǵ,[=w+e 9uo;=5/vNf]0x dkZݬ3\tUӛ=5D# ";~Ȏmkr8\}╿E=AA5_m=RJʺ/2tѶ0HwzOFdd\t˯.wKdi{mO!-pYnag٬y'WaHJןFO:9c*|^f;i:LMb@R"pTVpHNnrGtzO0 !_suUY/bzRBy|ʗD 9X$6D#p-G;ng.n4,ۛjg\v[k&slhIIO纓;&{RYWA$'%̙-gezgnqMf R{D?2k lۿ}%(H=z .nI[OK JMPRT(bܨCl'7|$:k9@< Q07+t)OF^jYȚ`, B4Ht Ӷ}m]S& 04>vuz[CK E`jm1'b4<,,͝Go"#g ߄-RJ$0,}_> @8'{ 4CW\m=Q5W7)?$spf;eUlv;wνD&b4n"D!pWWV߶ʿlEnOm[*;egɂg'D**^]1@"@8ÖOml-,a8,}hښ.>Yzf_ںd@H{cxHz~~x B4tq:yjpmG ?vF$ x\yfOD!py/.>yzf`V5h2<%m(gcE'L\Di23.qcw,XqcvGv`w\{@ =sN^׎h1n`!p9tJIКW5e8m hy"eK4j\ζKϹ*(xliGFCB4iٮm_<+~C8T2R7#DkHHB5f=ZWvo,Q?|gUn+7}zZȏG['L%^wo0Jp:vǏ!mBcH=24joZqRTFDDD(OFag#]5S qenhKZ.8cr Vo{EUAOGAo4<l+h[05@;2̱%YC+MևoY9ݝD|QL=֚RmkN/{?khwه6tygIbPOWaCQ2+;*4 {?0_[_rStEttnoI_[}K5L<{-XkPfMcrC5|deV]3y4QZk[D%ohɽuMw~qWT:Uɨ'V};.i`x^dS nr  ɠęej@L&XT_ZKj&u`B ,Wܒ.W"jEmotxGHZ++H.;XT^k^I\05p  i#~NQ9Ҷ"|$HW$cWԺ<) !%6]vD)]k +Jf-)U7E|9vons74.}0@Iǝ|'7?W, d}h{_ M0mtzE9z;>NѶPP|jضŎ縭i~_>ܘ$94oLCڪʭ5vv'LgGKƻT9_z  x%Zj*n8ynGrh3=ќ{< ]mZR tԊ Ȑ"]:lu-O9]ҳKIн-'XԎDLG ϚEcZW{Zq 3tH,_7~^H{˒zy9jҫMy:L7@Һ΍-VzFuaNA[iwGymHo$vMoך:\ ) 'sߛp(qtYvnp:(癧dc~--w0 ma/k[?񦚮*\1/wí_1,[8|Ѷu3tn\ӌlɋg]tijOi /ooRuS< G<.f "K}Y60"No{x޾;t]%Ѿq㚅:9`!V3l]Wm_/Kӗm)+6.`>C`WM SW>75Yw.q{l_K\8̀ޞ{ȇnt[gB!,MPRVYA-0@3F#{Dw5gw޽`_jd@QJ y 0#;Ñ#lѾTs'4Hj̀fѫNkTj+رԂ%7Tցã>y :`Fll+0ԖMah-pЇbQ;^|_?C /CjlV3W~;]8tEqZ㿭 ui`1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1:߮NIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_3.5.png000066400000000000000000000041361322271446000243630ustar00rootroot00000000000000PNG  IHDR FsBITO pHYsE1tEXtSoftwarewww.inkscape.org<PLTE88888/^!8?q*8i&9j&8.] ;m(G$RJ0S5Au+Cw,M1H|/Y8];Y8^;`=X8\:];d?[9g@`<`a=e?g@jBa=hAe?jBiBkCiAkCiAmDnDmDmDnDoEnDqFnDnDqFqFtGiBsGtHuHrFwIuHwIwIsGuHvIvIuHtGxJwIzKyJxJ{KxJzK{KuHxJyJ|LzK{LwI|LzK|L}M}MwI{L~MzK}L~M{K|L~M~MNNzK}L}M~M~MNOO~MNNO~MONOPOONPPPPQQPPQQQQQQQQQRQQRQRRRRRRSRSSSRSSTSSTTSTTTTUUUatRNS  !""#&&''**,,1155778@ACDEHMNQRRUXY^bcdfgghikmoptuv}&IDATxӁ`r(.A@A@A@@A@A@               chD   pOA@A@A@A@&            ;wFQXnڦ̐2333L)337epVjlu?7繅|]@ @ @@ @ JRӅcĝRvD أ}m%A-[`^<@e|<7yslMq)+#mf_Y0@ 2* B gJ$蕖zcL r~^ݵ揔o^ߝ,bVb@\MziEY?X+qw8ajw+,P]s)8=w]ݪ,Rz@ zef^Ga@ NNYmEZ -(g N-B0F ɴq\6퇬PU=AlY|.9}D hdZ%@ /Xa>MYύA-A HN9DlyCm~ib /Z3 : 6fE [Qo ?sk.Kq @ @ @ @ @ @> K?A@A@A@     A@A@A@A@AA@A@AA@A@A@@A@!a_A     =A@A@A@@A@A@           OA@@A@A@@A@A@A@L"KIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_4.0.png000066400000000000000000000115321322271446000243550ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org<IDATx{e}9l^沉d  H@QD:tjG+:u:V+xE * Qn!lvv? H9|>3\;<{r)%'yًj[᮫>ry+gfJ?FaF@ʭ`   v@EaFa0Z={㣃c[[z.͆/,IK)x9ܻJGKWAGw >~[+gf  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ;Z=0s &Z=0sRJg'aFaFaFaFa8/zߜ'{snH-!@`/^y?\8Ps/=}9[?~Nx\9"RJg!pk>teK+ѷSnݜںqegT;S}ǃi%J櫫K) $TwT]_Y='͕UV/螓;Rg@:֫_3?Wz!@`u,ݓJN[{?㺓q⛧j.vQk0{O ޸tUtei}K Z5 0x~>w~Zcewr%ח^RRI?_χV ,|uݽ~C;ӣܞÑ~|K胿}7 )}]~ԝ77ol{ORJR>v׮qgb @omrgVEal            hS9ԻϡZ=d оf-y_z99{~  ,hCf?_]]X[ՓtuYͮc [ T?vl]iЁ[#x6TM)ԛ}Ջ.X͹h!{ogwsα|]w;?WaC< @)e,c[^7[]t_0:T O`jݕZy/lnCk5B4tq\QG߷OZwڊi&\_V=+%z4W?{f)uW6;se9hK94s[N8EzxÕ]w;JiЮ_zy {|W=G+ښ6s^%?TpkHV=7) ІJ)%m_/ͅõ@{s,hSygD))5͉o_T zLV@M}Ww!O}M=s?ٱm]<܊ + ЦJ)׉_),aNC|Ӎhc߼˖vλfno ;Wz>?xQgx&Um6GpoF&Yc Z=gJ>ӿuW[~Z=fr*R)J%RiXLV@`}\KjTV'LG9 .                            h_;~w=[̭`hS+Gm,EaFaF@9w`=b=\:_2!ɐG.+$XVIF6kU~k-#q`qOis2!tZ}Zd,Q:bvכL#y7@HR!o #$x9i$~+gk{ ۬"L{^'[E 6LONn?}mPG s1OXW]_ KهmlЦkq@@ @@ @@ @@ @@ @@ @@  @@  @@  @@ @ @@ @ @@ @@ @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@ ? q\VIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_5.0.png000066400000000000000000000343131322271446000243600ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org< IDATxwx՝\.K b0%@@`C:lvͦ&l_6 ilBBt-l˲nu9?Yc\$j~=<ޙ σ9sZNfy_`%%о}l_KkMdgHt# L P@؆6!}6 m( `(N@`G䦭nq `TP@)oy/qX=og%*NiW{L)cs@g5 iM F@-u[0SaU,kyuڊ:kXPDD8 `PDMSH<ր m( lCL+1^ @D( lD` P@Ҭp P@؆6AE[lD P@؆6 m( lC` P@؆6  .E[1m( lC` P@؆6q$:z c_樬}۴@xRs˿t]vo u5z$?r;?Suo2H^~SJcV|1|"'N ?8p w3%A( _R2+&]P gNoطה2OZH:Jjm*1k\$ (fFXY9qN d6z4ϱ!06k#dU8]ypmc&U~篼9c?c)151JŢmUoC}J"tp'xzRȮo<N<*3'4J9;<б;]Q@)?uߥ:ڔ(q8x/rS@rj8rַV>Dihz`ϻO)F +Zne\DIIMrOpRuy>+q{jE ~ᐄy#|]O ۤT(hib ˊeED&zX9ڹ曞G^3 Q@ ['Cޘ۝ՅOtu9'1zt4^ju揮5w; 1DD`ZI?9CQDI,p`Ɔ"_iXZY""pZ=& ""uoҝ.uBOԅiۻ񁜒kn]oCV( @*N)zmJsw|y; ii8~ yE3 SɊHӤC4*}-pMo:X~~oOvvѥ3r{*Ml K\y")4$ԧf_o|VChGs}]niZt[;jyMyiѰoxfyo(iU/L+<4!-k/%5{cwx͗b._$o#ʌTgĤ߯( }S,-C\L^(¢Q-Ck_e8Peosn-u{_ 5+;DS/A2i]pӮF%r`-J9t_Ϙ;˞=;ZkTarTKwo_՗޾oO P@3);t׈% ~ŌZ(Moo썄u$; HCmlX U1,#WU?z"NcjGZs3 %fD̾F߮vd)h.YsyIɇ]|GJ ܶfWݖ7}""Y9FMYsqV2z'J)TQ`cH1eS{!9oвXǬX!-{oytsOV>B)9+Snu}@V}i2>]H~AD[V:6upx֢WOt> $9W+mʒoޢlj@bP@HrZ0ac'޽|u)NtA =?Y H){r&: Ģ0^KhsO[ZNWb=wWٮ\!`MNtתukj㧇Y>RN:}PbH" ! _}YՉreiٽG-z^BJaxӲ\{:-uOi̞ަ6J B`hk۬dyȷP,oi:( ݛ;ZաD8J)y}\ ItC!@)%Ӗ(3O%:˱.eh#}y( Zk}]%Yӡ7l?Е`h0sݮ9.%:˱,|D0tP@fYT4ƽ푤* u;gD0tP@?@4$-Cb1KDDzP, %K@r9MyG eiS{qsM~lih0P@Hr9ӽW܇'q?miZ$'=FmwݸvOڽvd0|:Iʝ6EK^O'8*Ċrزk}D[_o+:;‡GnA=@5Kʽg]{:lgŴ%J$.Aix_ѹG^ó#|$(Ui7:Δlz}a}]> p(~( $s>mqqy̴Κ6y kxHB*'^SJɨ ޹3-y_Z ^b$E揲ʹcuwH旺cEuerQ8KMKcp9 J;k L T*ؗRu`7Yf<&)F@H"W}oͭ ϣ۱.蟾B!v+p@8+/8)Z͇dW;}nm߽Q@P@H,[9'ֲ % r3P@HwۨZ3˳QvݷCwǻn˦vb:6r帼KnYXD[yg?ogI`=( 6?_U~oÏjۧ"(d sbނMο}Ņ /+|^1|˥֤݉v"M7M+WyS$UDğ&4կw301 ZWd$i*U0:mq*(F 6pkJRIgَ3*RRȒ 0:VrXr;ߜ<F 65ߍV4(DR3${|w7&y lj wEv~;K ~}OэCzS^{ șˬW,&V,bŶ|ro˜vo_~`  sW=<,-ZFszXa(u&Z^k]=q~$k 5""G PgKPBx> N QԺټqm-Mެa^<3~ho~/>O s;^*ZDl P IH{|'PZAy8 LFVX \ɾS\QG®`-,jO^1s{w{~.;ijo;Yh i6I/ʙ`G}]fyeYy1%36-7eN)l,6\9%ƭ'kn3OG&yV_Y}OL޲SOz:Ue܂H?5y{hKNS_7f[z Gi?O׼5Y}"8``ܯ\Z0}XR1aӲZD"M[xc-78:X#o??u{go-(urǞw©T^=ON8q?+0k.Zv^o>uaO{1qQJ)k[ۛR悫f_QuZ{P@QjqexdI_;aWN>tF"u#~[;-Ke޿f^y*_b܆u lNO;i[FݰG/lthl|-º|?Pݽ)PwvqU7}!=*9Tc<_Mo[ :ҳ<D±`Oлmnkm 5N@fs?tލ3L?l+JI*.4rrr;To>m w^IΏvv=]{h} ]wsZIJT'o=M{gPE؈սW.9Z:'{}G~H0 `Cnkx:vh㟟ly%, w;Rmx5߮ߟѮ~^t>XVQt.~| qp8ߧ^߻.0|1@t5gϺ.`D1؁ݞM+l)(6ÎQ ]4\y.ٍߙu/x+j}{)h3G/">[𮌙vM+DrzJ+5iWr 㧧K7/9\*3zo]s7ƑdYF;;MD$+m{|q I1@-)c[khQQ}%n:8c՚cTDDz@$Y#Ѽ o?||D#iGJo<%ܸG9UFF@H0oFqZZ rƟ5z~+\;>+"i1 % FA[z"YoXLGK'^rhw'%dqsB~pڥK ]VpmF_!@iq :@-]u˽{龗~Ѻ?2C o R>R/<b[>(s""͕w'^Z1=péu=]omXہPS{;ּR\!y-p(q[CnnşM[;>åƵuwui~H% #;\,,\{Cߝ~7&W9c}q q8>p8*Bs1בst"]^=oUw#,FF9ueSn%P\:-y/_j*3"TH ,`0,=ўrYg)E` uewgczq8 dyu4 vG± ]یtl}U3!dBVu;7οCCNqimu{} C[|"ݡ?_:0x$ X_W_l҂U]+0 eZZ4zz޺k:@r9n'+Z$*1ñGCXK{"!;+yN81 pB29SK08wCLÐֈ,mtwּӶ+Į݇ii{Qr8Ԣ?]1= D` KJidi*^NnM";DD~wwV4i مi׻}fi/Ma}@|wW=Z>IV^S}w~ox+R岉/wk^k֊R%?jGoOps't+fW_;q8>tiҵt`WQbtpP( CƯX/Oy8#Gu:K} `裀;tY *ӭ4?9/k^Ko1!0\W SfK`t{7W"tFM)z筘Qo˦, ,6QeIZ+Ci֨n7z큯?x0^FچHX:?C}'oޮnP(9 ?F eB0s+kŴtW V>ancwZ.=!"bYr-8`q=߱ފra3T5ȝZ!"_{H# ܲq38gV>2 %ph FʔbŴUC~e Uw,:Zo'ָ>ߗ"G`iC͖ݛ ұH,o\6$oߖ1$$ZbP_BϿ'ySa*UPgϿ~yG0D8!wsWλc ''][Z6z U 59r?nPJuvҌhKGso ``[oݛ7eߦw}cK3=S/t4o6U߱qCkK\:C KzTkʿ6֨EkthzID AT:k(\ENOK<H0 ;Oza?{tJO˞2&]8duSJn7Xͱ ~wiTKȣ=x5f^ˌ 3񧔤IԼݩyt0 Q@H+b̹* R$IR([(yV,L1 4pv咩9'7Xy$ e:/sԀF@==`/) TԼ\T L_Zg:cᾖcXؓ;Ԃf+'Ȧ\˝9U=(A$Pg=/cJffW.-wdҋgTyRswN#bAqrE$2$  PW*Z듎n+Q>a5 `)á3˫F2Ge{V/jEC| cl GrƯ<+yCMMV4dڕ Z,e1ePJ SJ4s7YZ+'إ?g}`WsVyjUEdݩ9|cNt%-WJQpcH 8kNoz[Fwl5Y$@XVNWjsΨo^hUgL7&"`R0y&;u /ր2ecVV}okJt&Ʌ7=nG,$:CqS[s_YY ~b{щ P@@\,_8Qp+2 sq13}ߔӧj~vKtɇHeXTE,N>)X n2cVf1j9_`,q{9] B.{F5쾵kj'%X@r܂vO+],H)bwoMȩW_ 7|ОGvG rhmQtvx[\7>VКu#7~uO f؝)W_ ݴb]eER- #Nv٣tEW!߿F=|کgN,KibںG\ք thl:Z0?z-Vh4cõ_#[Vj[˥l~ ^tk,vV+7|^kS%kfzw;mzq\>B>VL4Ro_1WǞzƩ N @iuϞfVQꙟR.uyo_1 WH䊑w hor;?L-Rj_~{ӳSK7-e\.l6f|P{Ց ^M`;hYuxhO[-?fW. f{G^10u{]ν/kdc_艜'@)k49^=VW? &@) /߫ty}zB1?}ܾw˞|;tT.>}ӻzDiUw^ru::;,mU=[ڷp{gkn'@8>s~]y$jceyCۯ_qOϸw#S,>xɡۥc]][){z>>sv܄T @[Jin3?[y9lf'~?pOmJR,o{-Ů_99^eb(-Zr:K˃e_ S=}( O W9GJ)*ͥf~_JimViT| = NsdJ)5T({nRg΀mKsk+nNRX99V+m.kgsq{?d޿wUX56Zxdråg߾ęxat >y^.y^_Am,+}WX[|Q}]^>l˹J sfz*㣵/>>'+ 6{}^7B!?-˲B{29^h\lSWԪY=wǭr/ Ygk(l/Ϟbqɲj]7=ue-! MJ^OoqA+?H)iӻ=rM'~ JzO>˥yt[yX{jf=21ZcţCoY1s֎vt΀M'[i_A|ne)MU7=b䢻nzGXWO)5SJ8չ ?X4U4ݽ׷S|)r;?-7=vѪ U]ky)K;~ `J>{Ȣ{=ճRF5jeÍZR^oMկh;?t9%X6+f6j8S;Y=osxZrCyjs|k˥|= :|_|xOeO/U&]z=F뿖RmnH\zw z92ճ<ɉ.ʃڝ7|oQO<>OI4EL ?OB@)RZ;_]xTϳiyw\S,RԥRJWv{i?s|hT+k6m/>.BJiT8ᴃ+έVtw(+U3mQoMnxj|?M-ơK̝vB.KfVכ|>Wz޵M̰#pآ_t_~M7c Ů,M_/ ?]݅C}]4湧|\{v ް^m^S/gt~~E&/7֪*_H)KDc٭wU}]/dc#'Fkw_3zvڜ#g(e=v/U&f,l|%T1a"@R,?΃ǬG{u8۳,Kjs՜fVZY*]o}tyo[Åb趻5 VW^3svg>jr쾥_;_CeYqhCeI>nNG˕]L[mɷmxϹ}λM6z5jf)_=1:ʲڒF+V*r?r+7#O䲏ܼ^}{GCSJh5&?(w4RJo\h9xf?m1Ck'^z~/M'/>uoO\\A@۔J'?sxfYc#?6`]?ZͬQ4ך˗?2KS}r~sOo#>lxhruݷ  / ڦCmUI Vuˆ޵ě˝$VF뉎m ѯwCko</K[OҴ58t ^Y]\iǼ7g/dww8z{|__ `_GCp[7>tou;0ݿ-c/pm!\KaښN~KÛ>vpm8,0p]0ZfJ^nxִz'o?vGc1g쓏ܲ%@d @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd @Fd}kxXxIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_6.0.png000066400000000000000000000203711322271446000243600ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org< IDATx{]e}gs朙df2L! $T[&jj+Z/UVmEjmmmURW/rI[ _fΜ9g$@Hf=sY V̙#k;I4 fcn.8Zjʮ[W/[ PrY jZ3BH>D#@A/q4d{B$/P0   zj_?~"@ @h0%`؅j}*ZP'Iv/C А*@!$I)e38ξIP+ۄI*I}ͣl؟GVq, #hIcdC23_.Mk@i-I0 kk]^yewd=M@4F D#@h @4F D#@h @JB ` zs}ƥYy׮KӴ<PWzί;VuiY= @ؾtŝ\&>`pr fUlxdg^֗lx[V˷~`{LCVwW~<|ɿ^i%yW'@!wdzϽ4e=wlB>q%@Wٖ޲ao޻mkVWذ|@ė $IF|N͡~  h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F B썅I&\8Tـ8,8tqg훒7=}Gx40!1aƉ><&0ϊcs:l+4{Yi}igw^W,a ~g|aKcKʕB(v4$4wꇾrw&W;>ihLFԇ0TxOJ]O~G[ϮI~]kÔQcBj ŴyDK2sin?zŇ<@p7IPm(^~ܷvm3 P&ŋ3bcBOOuOwŏ>wײGw.Y2wsF\8b^ֳ ]{ K{V4MC[gnnZIg܆[>?Tl Y26oHl}e}LM0,vӔe=G۸.<ճ3YskGx\ro3/&@`Z&y 9m\RK4{՗xyR?:'}L:)yU+<}YӛL 0̝}i8#/.B1Y_~ח!]`8ɫ޾ҸRC!ƕJio_i+>`pܬSf:ߝx`8:MӰ|Yt{פtV2DTi_`pTi\p x%+ po.u!P^_{@/j̘_QK}ח{ =sF'~kCeoǫٹ=񺋖\ Pg<|YhHY_6[ju/^ ۼxZmmVkaaɽ\{j? i[--ɩp=O!kn3;{܏/Լ/(CiϗҴ/ 51.YP,6n9E0R^W.!}y w93*)qk44\~NJ9G:= >9)|jέBRޑnh:rP*ҖRcڜ璐iذΦ+M/jox@z޼߱zvVvL=ԮɅS+}}5j!Z svmm\DwCy]RS'!P\x摇8߽yC>#7?cۀELDyivnKnsםm;\^n Y0P}϶7ZJNҰec-گrBD`u7Bs$L:G'3+`rK ;w>>ұrږ|>ihi-f=' 7K㦏9︷y߹$ͷJ:Z:;IP[ʷ/jzD܆K' 8֑m(b'-oߔ[P\/l^*+}Y Å%X@i_I;f\27RiB:7_iXZyV,Ζ۶_^Iwck*]ݖ۶5ԥ;/]Ԕozkj-ji뺭?xYÕoV۽VK_Zid :>7d=# 7[k7咐K\_96g*yDk:UjxLVPwf Sf=/ 'n ԍΙ'q33m]Mwp#F ];sI!;'6{:MWBC9a8 @{țNt74VC/u6L[[.߼n׭',n[sǫN޺7Jć$I mo{ZǟR= yO'>Id!u\c9&KW笓h8|˧}sh5$I~im0:>qވiI㷒$M_nj4/=B^,`H0ܹ=]I-cŖ΃c6 `}ʴuBiؽpFxQZ `H$M^3[kF_׬Sϳ$O='.xBid^xtiSBι4M=x`8rLo&Jӗܡg>0!@AqQ|ٺfo$I2jSFM?r<+%X)o_WܶRCSۄmkm4z!0yB<1aH I|u-h:xfgVO:SL !TC}+ s-c瞽VuoZlMc$ þwG!$i!OCI7t^<;9`( {aĨjcۄIYC= Խeen= :nR^Z:$ɍivP0,U;K|C=/|}>ėo;2p@,y[\%B:cIFKcc/o(5G>ҽyG !t?ΫHiBe7/OثHZwA 2ڞ-+yx϶}x[ߋ; ! oYG B(ruw7c iZ&[Uy#?i<7&%XX(W]5,wHzwm[y-ǿf+ 'M|~g\kB˛CH{_KnNӴ/)W@ׯ~uZKîxʗD.zl׮ԪiYY~_|ĹGL=do%Xrec']Ж۶Tzz'X0}[Bw =Jlq>?8_QcwoY[q%׭Yvud 05Owɝ38!Y`8 7rdܡg:~Ȭgzg@c}=[ߒ$ɥiVxN̓*L4MkYH<'q1g$@ //wamCd=~G:ay7YF)y.vtgֳ@= /u¡ zNKAYWqg'I4M:J$t:ҳ$II x|Ck)3~`J灡7|Coa?  D#@h @4F D#@hM!}Q{^ޝ!iyMH %@vQ~g|5I!3 ߊaJ.Bo!yK"BH-^۪G߭B]M-YO Vo_yO܆F D#@h T; !%Bi'@^/@G箃*P[z+(\+xZZU- +3. rw!]^z+-O!lk!2'Kh @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h @4F D#@h UzjIDAT@4F D#@h @4F D#@h @4=aM]IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_6.5.png000066400000000000000000000031111322271446000243560ustar00rootroot00000000000000PNG  IHDR FsBITO pHYsE1tEXtSoftwarewww.inkscape.org<PLTEU@33f++U$I@ ` @ U9M3Ft.@+;v'7m$Im7Dw3U3K-Gq9U=Ft.Q:Y7U5\=\=bE/h^9jFrFfDU>ZlFnEmDkCoFmEjCpFoFrFqFlCmDd?oDjCpEiBvJsFvHrFqEd@vGvIxIvIwJxIuIvIzK{K{K{J{LwIwIzIyKwH|K{JzK{KwIxIxIzJ}LN~MM}M~N|L{LNNwH|LOM~MPOO{JOzK}LOONOOPQOOQQQQRQQQQQQRSRSPSRSQSSRSQSRSRSRSTRSSSTTTTUUk[tRNS !""$%&(+5:=?BBCDEEFHILLMPRYZ[]dhjjnoppww{|}A1zIDATuZJn侏PI(ɑtJDDf_lgf31J6Tve]5 jHw +ݑ7#ҏ*>#_ܾ1t6x5i{Zݼz9fj ǀ}cȳ{(|pk9|@Ymҭmxr<}zD9}><?+s$]nO\jG +m/粬mvIENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_7.0.png000066400000000000000000000341141322271446000243610ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org< IDATxw\w}Lݝ}WҮzd˒,W6`0B$@Bnȅ\:W ql޵ծzFU}=[3gCz<=ߦSJy_LɞId;Q_Id h.A"SGQ" e Ʉ ,CF0d` ,CH&AG# e CЁQ"  hV#@X2QЁQ#=qo4hۙw?)Fð9 ԼYӲ:;7}+J)wF0(4lΦu;ZL}jYAi"Mo<&fw@/V"cPK/ZGiLAaG$#"n7o` `J1㦬ѯFPtQyȚ.ٳkaSͦ3[{-;oϩ Nܔ58)c_v/h쮔XJvy@ `JQFZd[m,(^ώvkV/ؽpú xg$:5RJDR4wi1A9Ix۝ּPJ|ڼUnqS Cls.Z翡Tmu\(eYlKk>@ShSϙskUM[vSy?_+ K$0`Ӥs'Ao4͸QTֱϴ6^wl<ÓQlϞPDjǣ}` rr"V 4Mڽ췁~eo0N팄\].O)"ͨq Eg/jЮ\[V*c8hddhjic&`F@es.ZumO.Cΐ˘6/ %"Z)V-o!%noO@_u#^:$Rj;f{+gNfnEzښyA\]kq# `RRJ٦-E="2.mzWGKSR2*zS[kV_>zTEd`č"I'5ow߼3wM99.Rs13{\swJm͙ǎ{ AL)0dN_]3wfh1uFi-u5oY=.S#Jٮ8OJQcR1&&#E<D鼪ͰK\w$4 ~lnI+Zdlٶθ^W3f9+\a*ö%kHIyUA zVZΔed7G`_O^koUw~DŽ$HzJ))^+ƛYfs=XS- 7DޜXyһbJCZkKS@BPRvg;}17#b؝:6aErJzflR"}Ɠ0c%MK@}̮D # ̈Û9Z<g^?ED3M9|iCޞԾJFƒ2xp|̜݃S2r:gyS"9*"2Ч'7*f9& He3W:#/z⧗yC]XZKձKf-Ml(UrRDv_]ᒟr]smh;$̜Դ`?d`0Ob"a3.h]-ٔ6u諄L&ro(e""=AHIDW7.VP{f/s|?3= ʙ?-㞿[%5WU3yןSrbuD3јîT '`X&?~>gDבhDzUM_y̑|7_ ]0#+e[w|rMG~c[ҳ܅Nl=X c]Kf|GgF̙cOzE~Q|LL,X{O쁃8}|'|DsRf.s}*X{L=XvfC # `Bk7nZpmw dakB((4Ы;C[*whJt]x# c'xS\sa_4j̘Z]pkMu1@_`Ĥo]W^snHt]c4>%Lt- `[pۼ;<gnhRUe,L㚵?Nt@"@@rbF#X/D^czB-?9)Ͱ;%U%j4"^2ɿt\xÂ$~lX e(K3\$p[Fu<ѵ֢3oZj-rlG>p:H:Ѵ 7eZWR]PuIs>0q!HzGLʼncZ=}bwRԸ;u ijQJIoji:^hГڀ"t_:vk.P#=ӣK4 cc$[~GQIma{㷻\pk8z+0V뙞=)u6ԛ""L%=]%lQ3?Mt imn-UW'pyuVnYnzFIi񝋊ݐTMt-#7~v]`5H:lm㽳%e:֣ǿ:@@҉tDM39wĬ}l}k6 )eLڻ>["K]n&tS/j $-WXy[7}q{. ;k5ѵBIǕ?5c zݡlJ"al{/6ѵt23֧|p,O!".U/=CH4H:-;}ƙD1i2}mKֺ\~0.`$zu"ƲD1Tnxrk(tD$# )=ݟ:[)[i9k4,>6HJuX'ю: U‘D$ $ CDq1r yKg%7$$! & iĎo?7Wut4~D"?۞8Rpk8/=/NޫH$vI-<? $3"a [=\'DL;^kQ;woj:7ijM| n+ K϶goف㹻j] Uj 1 $5|/o^%2@j~[/=QdTOG".\J?]Olwqb5ԡ[kdz`c HjVx[]}WO($-W˙](kKJEmEdEIK: qGkimp[x|$ VwS"푁 I+03ÛǻЀj%|cVџ0u@@R"QƱ}-2xxzHZQ8yx۩O49}jXk\}jc7ERƴmro+_ 5̱l8 $5\=oݥOgJXkZC7CD#Ia_ݴ _dJXkZK|O]0A!4>[:ߧ sFtl;{xx{/==L\W>y{ǫ<ُ"UiƳ/`a,0tr[ƫHX*J]n "U_?)y0 Wcc.00&7/(xO+| H[su[X LÌJO4=s{%unU?3mjJNo@Kf7αj73'|#>VDdejf3Rv{UͮTɴv6Rᱏh 0 /6ɵ< JY;{@D/^ȶ9$gj.q]]<}U=I0Z!YuP?V۫;.y[~*"*piZW{MS(Cȹ?Wb]`N:vk?vz<OԆ_E3WR۵?$cfZ{N4m'|ti>@/=;z] ,6,C`@X2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e ,C|oKgӞZDQZD0pi%;(5;?j[oGdWc IDAT?'^J1tn'3߳*':@^^=#yV=+_|{U+ a_}od?[nQKԋMWlQƉnk+1ufXXhcmt|cHo" x 7s@10J srN }ZD2-MU2ƱD` u\c8kRV_@߼fm2 0qӗnS߿;5 ̸g27yj&"0.(~;7*RdSBjſXzvI0X+9S R|0%:{,j `_u@ivrdAhO4Ar s^}J;}*6~Ҽh("_'ic^GzͿŊluNfGXL$ 2ޱj.;?T}ӓR(.`aƯ=릿H֌Kb-` RJ|vԼ>[""Q`7]nr\? ɀ)Xðkܳ;ƵȉCOUkomVƼo" CwXL"Ҹ/nYu}CԜXMYi K߀E ð7o97CA GiPtL_Ar# ٟ2V R[2Ǥ1`"@ɮ)ݎ}%OEJxR/}# HnPbhE"FJLЦ}>n iL*v?}۲>vD4Ԯ8םXd朂ܑlkZ la$D"9c0Ų]+,'ȞGFC:8uGQ6pL_5o^x])oԭۚ{f 0WߊHb+e׽u=gZZ|GyZc[-0q`YNGyVxawMHn9QBMM0/;S tgox_.;y"會]wxǜًmgEEDpm7jWS""j(sSX$,!RJI֌5%g}2vuN\=vm.i񪣳oƵDf,4zciWl,Oz{_?mܢ̬ ui HWydѣ]Kw^@ EϝyK;S|no,f3Ԫ G>W[}eXLg}U'6cBG…rSJ)Y1降[/Mg($;sW=80J՜XFoy2|/}>DDeˋ~IˈY0vz5iIW@2`<3eκ+i @E##-_{`mV23Y]/lSRp.^nP^{r_Z c׾bƶNx}Ƕh$5%@ JpE䒋#NGf0:x7 o^uk,?voʖc.{Թ_޹fjEU?\"ԡ3cGX$u̗S_xo֌k\ g*V]]hR &t͇͘j?Ν2Dɾx? LTU~Mn?Vݵfu8%"sٖߺlh oo5"0g ipeoU{^Ze(> 7o{|~mj9}I--7TV>p/o#;^ #e=vwz.1Ƴu.sxStZ~Q›Rz8^Vg ᴐOkDM"J<^wc9/dUbV̑ l)\:~歟0`fPִo`@_=/MOl}KC7o$4New8ma(=꒯D At'&J9Q 8~pUƹъ3ofF(1uW+lJé0̥i7r]+ $`ySRr4@cm[֢S7Ϙ5xQXJUnlsN]9zG5 `fa6 vǢnן)Y ߼^DfYZ.yy]ͦ]mM<6u CI>+XuLha\RwКiSjs/9 ""=\)Kݫ RC@z` _tE8c`zu{:Rl撓y)oJm,|9Rc4#+)Nմ{lߩQ<` E"}Ni7l'?3MSyl d=승_'"R:%a]?CIowJC_=h_tmG,ÿ~zN`,q:(K}y)=Y]מfX[.#ґ;Ce='s Oͮ>~Vﶯ vwB![O~CĈUSsږ9.[`H \.Omޒ'n9K>/  u;W?- 0r+lzu1۰3 ""JtLKcXgFcf}?>S%Mr:cZG]n$etlkm; @nkW(0`u%?# !B1fקk5Dt9c{m=Q/ tZIEC0E藒kzwgYHx?/;-#v́X,;86[NƁSՍ;6J!m-zm7f뎜wVξi`IĨ fOڷ~Uk=EE.`*q8g:.1 1|f/=y,3uZxC༥2 \m:[Ϻ<>3ްϰԂy˛='%|zOWmiOCP4Zsh.MjJZ,P6Phߌ9-;҂9gvT(}͗V]W)6ca#!BH` Mӌ"e啫aBG)T_YZF0{ZZtex}QSp)XHp"H{˚5U翦u\e^Z^қsiD=̌.q;]>UkMsAζU5mjDD5hq8:=J)eg[;U .@PT"t`stYD[SE $hZFX2! e ,C`@XD( e ,C`@X2! e DDW e ,C`@X2! e Dq:e ,C`@X2! e ,C`@X2!$%J%`4 ,C`@X2! e ,C`@2QJ%`4 ,C`@X2! e ,C`@RQ*A`@X2! e ,C`@X2! e ID)]0! e ,C`@X2!$NBG# e ,C`@X2! e IEDWe ,C`@X2! e ,C`@X2!$Jt h@X2!$[@-IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_8.0.png000066400000000000000000000405251322271446000243650ustar00rootroot00000000000000PNG  IHDR q*UsBIT|d pHYsE1tEXtSoftwarewww.inkscape.org< IDATxwx\՝S5j^fY+n1)H%!mlʦnvSv7$l @ )\e[mVר{~K4ޯK~LjGia?%shV9{6YbC1C1C1C1Xv !! " b 1WuC! ]p6 1A!Mv{CZo]0XZ]0Xov `@bLOs`_-uA1-u]0;ۢpcmݲYkmF.jlH/mz*_;ּoKu#u_><uϰ:CyMY#Rګ;,Z0@bڼ1'=͖n_WS߰c = 1Hk>mT[f?:o%|`(1]M"k:,WߵZP^!ĬC5@4=@ph9ښ}/P>7#:!m6Z*_]k Fi}=?x*txߣUoܻH` E$i4T-m97a( 8-@ m9\\9].С{4z*^}<dbRO<"J "&tC1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C&(|\ѮnJkƤ˾~эY/&=S*vmpFH)%[Jgkȶ5޿{\n A{ݑc- RJDDYK\}M7D7ѭD_{ϔf'=>[䏻]"0,NOo+!]o54N7E3 Ê(X /0_=ݾI tM@$0\~ye7~eiZv+LGtmpb ¦\<-uޕ9c)k S}trJǻ~5rUC.=S[eJƕ:o͙=.%rA]T2ci] ԟ܏~VG5ܵDiqKV"`7х`D@]ErI2>dۺڥ}U>{kS\ois=w^4eCNi]0ҩS|qe_~/?3]Ӟa0͸bh_~w,ɞY7 HSڙWrԬ;'PWYrJT\u8CR80 R0%+?zsn3ޞnؒ7k3+O7P~?kr8sg)XC̽-\qsU;#aޔW,s?*w̓/ٿ~߾{V.[Jv|SZjz^<煓dəj9dˋ跟}D` C̑kͼJFΟo\s_s7f,v|3]Q}ҝUgƻC&pCjʱX6'noBTugtIRJ JeqvAy>Yh=g ""2W^1Β3ܙ)LLS:!2ﶅ eڶ4ᆪi9e sڋ-M]6F@0 ~SD^q[fFWR3`UfLv"{?j{OtE$ATG觋bV]'=BcJy;δGtJOn|( tEdQT#WO,(e I:])IZL2)CDĕݗ~O) 0s匙Y;ę;ޘ/6ߙbX,ʢX# = ks..XS:˸8ڵ"ojl\owﭸ8okNF@KwO|՜a8ѦD$.ٞ>y{v|?:)XgvnUߝ>DDDe[ϱGhq3 }f΅%$H/W6k@KN%b *3OEj4a;zծų 90b ! NΈkԸ{2zaXo͟MJEC^[|F~_ Ҽ=9j3ęƵ_xP ނpn`w'^FǡK7fKH fnj w'T(p w>+)_fF {Z|8:߳'}O~-^6[f`0 o K_t.x)X/Xo"5\%1ioNQ龥N>ްժOQ [QZ30FMJy쥹%)L:xhcGR6t?lsw[*w7Wozs{5sg%g&N9,\sZտ7{{]@i⢼eQDE6Htݺ ᐘ*\V)Gx3KƗ >1ܯv=xۣ۫r_K̟DY "9|TYڷޭZ1O ` wv/3RA&m'z97ZmbZӿwr[~qf-jSo>u˪~n N!ܽhs2@@{iJ>s~c7CuG?{v?iP92?ǻT┅ɿzٔ- n{@(2v \z[e*-]oG8$桊-|˦Uys~|]s,^{:6g7{RJ;/.S|Jt"J 3/u0v. |zgWܖ%/'âİ(I͔<=9o;uqj|{nO:2װ-lFN'4͍v~?wH/ן+ݼqw/pKάlGm@9$+gX/>rVܾ-2GNCs0C>.L^ij<X[b2=WY,C@zs_tGɚ\)=QGwwc)Uٻ;<:Gw/nu%b=_@wwJ볿=p0@tݿ]uWfs%E9EzզF̏nirwtmhh|hd!%˦fO^XpaJs;6+-Sd]/ֺͨ3c2ă6%]p8zwmڻ`4"Q]~wrZWQS$Kox mj1P@:یcfH>iNˑ9D2Sij5p6z0@`O[|5ejkz<}hׂbڸɗ=S,d3'&#zko]gOǯVe}/>}Ĵ7|\JizZVwKreOkMЅG'ZB1ͰYyva3t7{5Nq~% - {rONn&1&Ͻ;9HMN+E {? LSK]eSѮ5I[bmJ)]_]ѮE#ނ.OJ1]Ok-w8Z]0:/e#yn^@FG#i'pnF}E_O6|sĉ3B!>|&)Rjxgڢ]`_^+.E؈Q- r|Cw׽o""nGzgsGvm>Q}WJv-nx]Ѯ#= `d7e`q:isʢ]F&Q@_cji-v]cD#NLi0xѮ#(l-#y!ĐpX2M-mͺf]F&QE_6~2X#7굏T]㵞'gUvD&LFowMq;7Z͏l-O'0r^uJ)Yt¹fg}h#I)p*E}t)G8e3]of/!6@@T-̒IӖz\,;zeܸfW>oFBl!/S"fBjܤ?'1) ?Tgh7_^("t:u-$#a]vE+?&e(<:! W.x+ٝX8qj%8?F0C5+;}eGT20lv_^97i O&raZ2rpO3^FD$u0c}fWk6֭7Tц߼K+-GRwDЦ}US6/<]GRg/xciY "I8$upP5`ȹ\1N&=F? ~Y\7!TGXiX_o 0伇qEӜE1Ox:d_оk2ޙ#XJٽuC=]SEDV%p hFC. }7MNӹQil|cm5a?#9e{ՕeͿ 3ѨcTg/=|7v-cVv!">@@$фߐqWbu<ܷ甲mVG7ݿzß00Kzmu/h1V%sƗ,+,4HRry 䙏^Ji$!""Ƒ\S8qF,2\,|xIN.(yz6E{tC Ív+j+mORMI)*-5U IW]Q"'i-< %|  `<<("fX5-K]XeX ^4OJrC m~tE=y|3-M | wƔZMt9aO$t-G+{mVMkDk7ίμ`y Xax{U׆5WWZ0v@@}~^3X3]XphoыD= j:6u<=wx{[]XP6] .__smv%)W,X9Q8z#'9%!#* Ꚏ=ѮcP DvB@@=h1dk=G)+u`!Z/˞Qfk aSX2y+˕آ]C&dϏv-cA[XwjoXƗ5\4'gv]; }GMsHzdd \fr||@͍ң]jUDGզ gN8}IN~ݴ¶hׄ?xloUzƒ8/51HFav"">%_[l9NK]#J[RS#L6{CƯ9ray"Fi#5ɪfu&ȹF!amLG}Y.ӽ'9F4qB]!-"y{{}-߿lקHqJF[XHI1ms;v{f4F. /<'/5˫wxԱO($暖9]j W&aebaČmeWWξ0I):0~x4x{T|p%)ݙ:e٤7}léF݂}jonX\Z0v0bΪ=W}uIS($;^Z:ۤ9SͰOo蛠g܄8 ç]u_;B1\boODtb#ӑ"JB"ee{/|#EDv# y}ygC'8od~ȅ_Xk{\jiƅ"͓Ӹr5c#Qo?㟮L~\߾粯)EI4t[[XݞwO=8{0jUm6TyM3Ib-hȁm'n(ow~Ҧc`OcCD^ pSZ"_ނ0nK2Q1@:ۥȁykOtD Y7,ΏE5$ωSfUhj\B"Sg'!5C:-֑=DZ7%۽S]Im7>nsۣZ')VcF4#I}eד7\k=}}wpOo8IPH]EBU "TW_]#2 Y6t pXk_obsUɩ-RG[YB3_U1צ1?KDĕZ]_UmF|,AvSEӢl˫6cSS9YwkuX""kX>4hSciax\LX'*!h"PjhUGS 533CA)o_zy֨v%UAoGO;-vu=5gjݚP[ǝ֞U&bSC٦%KcҾ [z]ꕲF!j#1p֯ח\Km%=7"Keۗ-zVMUHae'59T>ٕJR|v{lD,=ժoxSʪ-VkKh;V_lR``s88<$EYNl TU2N0UmnfgL\]0wB|Fɐ3f-"|pOs=es0ujgrf._Ο3!!Tmgzѩ&Ϯ0omJ-;z"0u՗sYe+/,O/t\ :z ɩ>˕?3yȊ>M1`ubORV]UQZueVoJj{NL 1D G_#g&%$)k/Ċg>+c0 `X&4NV9mon2gv$*;ZVjf;o}0fB%'- 8XpVo~e=]G*y o{x^w F@\ƺ[eo׭1M9f}qѮ# ,G@h3h6ͮn87&ƹ*3Dj WOY ȴ_g~1da)gׄn;%O^ [_]rK(` WpxVj'zl:T10𪈈dRӔ`_>_ymsN7y>sFl"1"- iWʢOޮ,V3k\Ԃ#[ Oِp֧/t헎Jf%Ff>2)XZҳ2rwxm'q8;jw4է/^ /{*ʞ =_P@b`z@LX& w+WpԾNWoZBbCk@rʺRg_@0e[?j&9=DQ*1P2E]3SstݡPȁ+ׇq}IKT>F@,BZ*#덲eՕ .,X_3sOwKnj[{w}yA%JvMNAC1  ,D0J>8%lۆOQI\ÎnyQ UP8qגPjRiv.T oob瑊uʧlkI=n/>4-+P$"o-K!JnSU?&k-n?xW/ueo~W*NP^TPzOvuw9=.CNNS'NjKJzEC3E2JDfMsmX%˰ąo.,m^M1J+ኇOw`  16bsx`jq`\aӒ?2YjPOY)5(*U,""0y1o{UŊZ'wjUNs}V^xwD)C~3ՇlI?gڃܞ4gѮ f(o)Nl<'N=jڣI۷ɇ2?pi-]O=FkEjJyֆ>4;mgaGۼ#6 G[&'w '00Z@k_:.M̞ld39yAHnAZέ9~t3#s"WZчOyҦM6{ >1Ly!|[S@jKkj1ntC`  TGK>3kR;ή;~qTjF}~[Th3gR*>o t\N{ӥ])ouzS*UDhfp%M] JˡuIdLZQ4cSQY?5k9(|t;궭?oख!Y>D)%x|, xGb}Wf'wcP Z>4k;o;ܡ: kiH\ZP)zE>,hJ烾Ϙ>}^5'X\ 4+ΝWQ5vFj](ؗ_;<Yz{ pR3Sf(,Zi8z[>ЫǹG?/X.ym+k.6{2t os"5Nͥ""@~u+rb_N4ם7!"bXi4 a۽s(0<5k9]N^0ϢT==ksɉPhڭl"J)%w_0e\ MU::Uo/K`}=ڟb7Tݿ,q^Y̻:Zz/Jd|JkʷwV|65n̗.j8V ʰ';uI3={[g[ڡ7$ZKӾ*^?֡`# #uDkWV\~g_yh3;k>q@O}''hSˑk{ /?6'+wZ8d֢{{}N i;Zl㣏r۫ zc FMxRQk]kذX۝{^08KwRw);'xm)S۲;Z띮`Ц)mބ.\ f4T5[y,@[bED._w$g{{N""=4զeMuR.":^IC9xwqϳ>0ThBq/i -ZmS6fϒޓiҸu;sb`X?/pշ+ZtY*罧=U?vR A/~ւGoMgrJOqa@ ӸRaմźM(}*FQ~sjvm㚿i=$I$,3t켞kgںܩmE7oȳZk `8%/=`P\!"bY$)%=Z| ޲fc҆nڼπw/@ +vWvq=uJx oݗIN M|mJ)1QJ)9mzmBAn߫$R{w^~xV[KubQP~grN"I0ЄVgPźc3wۜ#iH` GtfoVCޝoX0X_ɔ&>xsNlOȐe"r(  Fŧ';+f%+i+-g khWٖ DD+(G bR4o=>-S3'һ:%.$"oU/'޳lƎ>r';3SreĨ %ʰZ鳊(ljVðE:q-MS'[2JNr$dY pE!);;;UOkS)epݸ_xjYC)X1s#"rD)e͚zxwyieZI8-˰ą)/N""L{rT1V@b:$"JCt7w&e4+n?um@bVi@0qJ)R*^DEJ˙faڙˊR0}ҥD|Ƅxܦՙx^eM{L\) )@ ~ ]1>!sa32ezm\\EFaɞsZuwz6Ċ l߬/r|̜Wf2 itwetnPRsRl fT5o>Rt?9boaq7tϼKo=w, -Ԍ񢔮=.0qy8^j9 7ms#x( 9ZyC/ѫRJTBbUnna4+bw{l-oIG.̸C/y'02t_^UQ`j~(U$/EWj wqBl@oOo=,bS7NԒwuE>n1ݔѶ2`@@D @@D  Ϗ8+ gdz\qF-=},ǟM`B!)JIɯ)+*bR8QrE#qv-|ϙ:цq|%g7£w?pcWkMG[)bspZiJӳj*0{Eצ\;aܐ_{) p8!""!yF6f7-zX/ʝiizᐄ, # CG*V~'IᰄEHZ1N밚-{L^0:@8!!ua1dҌWG&^1.k˕`z֮64iZ &lfAbft # cXF+jUhׂ1JAdޕD# ci݅%SwH9"0iV; '^*ZԮWB80h@@F6k#LҬ \Fs0Jh3hL’ ΐ[kel85 Bm΢'n1kqw$:%MqE ] :15gBQ&pׄuDl 9]e;E;|hͻ#0/ h-"bWoGA^0T=>ї:"Ġ’sѮ(@ JLʌv `@b)aڿ{ 1cJCkS|Ecwz>cZ]Y=h  }%-ί1c趖Cvv=@@b6L{V kT@2uu8uAQa7wmYPPѮ/@ ҔX:"0,r&OI_'za E? 1.j;: 8 ]]YV:; q @m=-h `Pʪ;#u?E;TK@SgKgvq`PJ6,!GW4y̮vȝqWVQ°Cy=3uS}=>M=Os|o(0Jhkqo>T>Ω 1d 1NkSF+1cP\'[.}:5WEqkcE|}Y Y}VG\oJm[yxpV1B4oK{gf^TMl;4ʿq͊޽ΰZ+Ŕ+ #@3 }O:~⍟s{{η6{3/8 γR;6i(0'bIfr#H)V)24sx k 'u<b}*nz.ϟ?1sOz k&ɼr6Mk:+2g􊑻&o1+Gi:vc߾ߗݕ!@ պ&Ó[rtsi9~ )(Aɿ V>F,lL[9zwz.ɯ&fNOl$Fgyj <;`΢NMl$Dw VG&:xiFxoF:rĞ @ Fyбy Eaw˟M==w_s$| +8|,ܬ=)g f<{60q OyK׆|. H[9l_ڪ MA@v%J\|ڮ9Nnw nڗl솱/ ns?Vp83N~|б0uѤgZ]i8(@ vYs~yd|9CMg5bONs)-.4}հ5 >~OZ䬜(@ 1 myޯ' N t%vU[¿I*AĀg XUhԊLz.i4zSw ۴ǿiq w(f 3 F$ j\(B~V$m&,$mcBtgAĐ5)SC_M2d em\ %Ttuʁbd '7] @bHҌNǮ EȜᏺ?@ @bD\fJ IXو&mֆ3ko%1@áϢ7⥔Lxl gVtŸlbb +N0x+)=1R=:.pn٬vJ^qÖOc):NyB֞K.k1{\K`ݟ{46ՏjKLo\F۱C:Fx!83G\bu{ծSp(šПo${mʷƭKemS&mI列_O}ȪV;ėҌ iy&x7VW+ܙ䬀LۙЬm&G@wֽ _!!@JGCj= So+j2HD=j¦_ŗ %U߸Y2'IGN׸2qW#G-^裒xG z(1]Qdv[\ÕXREnl ԰%kKi6OϜ)?VMECw_:h 3Sqz9PI/;{_X 㧥 }"~z5P\Bi+ߛ{4YESw$Ⱥɬ \_z+; f 9%DF\bqF/K7h) ;ÿ{C9:cr|УL PyMo`0sOwfK =L]0ЊȪ=+Cb-@G Y- LZ- }K2as_nP6[yw?ՏKo/#@mYqWoR xs(z2'ntS(fQx865sO&V,ob]_ dҖЯZ7gb!鈄GB1q V?k7߉۴vю9{7Hm Smցcsb$:xH+i;S~fÖ$/k֢ kn.[O} GǺNm7\ u#z, .Qp(_Lk`bøtH֛ fqR~4sO _ m/"@Cg{ IkPn5L_=gCs^}7A ĺ(Siڮ ~ЧÖ$/tD/&D5O@17K>oy^îSZ,ݠ_#aPZօ~fS|ݛg(n6O@1ףS^Al}+5#鯅w۲O?7Ow[eIqE!W:n>}6ڼo-qf(ƂpHgA9e| ܭ3/}9M_mXnQUp=K)}i fqN5)>ֵVUӹ &6 @ĸ qUC}+ >:E3@ UzCQv_>J@ĸ㦱o~:(<l~, 1o+F$ ,8+{>_&{Yk|+i;&l R~U>"l6W6B/垏^!%-߷~EAĨ4< 1Ɖ/y,W.T#AĠm7sO.œN^Scs>߱| 1tҥT)w½+!s}+uRe>Xݐ^.I[RRwCL%`&|dbǻ xے1*>-sAĘ WEdzyԷ]Mܔ9S £|]&w6֥WaיM&0~cO?My 7ŗk3s]R`ѳ?}G/M]ט%i1Eݤ`%R^v!l:T6l~NjX&[ NpkWo&_S3ׄ| ࣗ7Y o:,QsESM%6'L4qpf_lޢY?~?vf(wם#^ Ö$O 9dТnWnvoisEC]!gC_vlztnO āO qȗv\7ifIo_Jԅ]-8~-?gC:N "<G7iԳ󴇻=`Γ&@Ё;UjX̅}e?wO`BMf(:m=qS_s>s)ÿZrt7C/%0Kwn`S_S[GD¾u~l 鯅++ kTwy'%ws/4oWl[mּm9=*gCҚ56SMhVY3r=  @i-UJ"W..Rm4N7 5^[f/\ v{ZT|S5ܗvz,L' Hd;?mPM|\@={NuyM׍'U ukn6Cۯ+U[d&%D81+^OyS>à+m2cBS#k_W6Owyq5n}v">2:$k[ VP*5|1"渫_oas0@~ ][&W0-T$\:Yӌ^:]OγI9_.T788=ס/~9M7dQ4wR/Vnr퍷^kNe⮮zVKǍYo$_=:0¹OS.^ (&fuoHpapU$'>`[J *Uԕf&@(z<'?Z}E"9qT~rr\HLZl>6`a뉫&}JEe^Řmf EO/.V;hȭ) r xnԦ3}'FV֦Y JkU\ҊB~Q|?>=ŋ-X3 0mgߎ]C'1;jJY& P9i;S~6w]#r?p~'- >h}#If&@(3`gg c%V7)bGpHt=^zI̋Il@?4~?H@H)˦N뗳0@`B  <>s]r*Yc  oj5aդi>=_p(?K¹ȶn89Cv %dnɜ'WArO'|[ewS~EqB?&F7f e m&/5@p賮y }Qd'3F2dmN[dEV4Jߐhܪs㿃H{\.|@۟m~p<.6>Z_3>{]($+oa:6G_tUHA3W7D{@vg f }8rـW >qƬ[F%S"tzGb;=Bb \69kK{%ms'W6^DGbVNi5aުto[?Aᑢ(2mWߎ]7{Z&,\9aS_| 0O;.Oi5q/Kb}i ѝ_+ JI֛}<㝔7goy:sugymVˎ|;&t. ȿ8BMk;e~7smvΝD˦yn椭}O '_ b[m,2eG_]jǹ>=KbKJ*LA`s 8~nǾ䏒.䗃M_;zϓS_>qy5Z3|+@1r uc̞ب}}O V7LZ19{]M=sB "gn8cA'[%x8BƇ \r3>l<d~?uCNxmbD @Қ?a;_/"@ g=|K.f|6+&L⯀dnʺ!@k%@%1qZ#@T4{U:ו'ެYrrOT 9o$f,"@ |BnCmݝ¡w}lApIܛ"穼; }E+,_C@ @(bI Ʈ'@   JXOqWakqg@AA @ @ @  "@ 5 @ D @  @ D @  @ D @ A @ %$@:X)4 .jsY$@\Ԍ"kh1~m ` ۢg=S;] @2fw οkuѧTRם+C @K]4z[9 4V#Og!@ x.gȥ#w&Fwe\=#'4!M+@%DwfL?k3iE]鞿^ g,Iܛ.@ \ٗ6-Yo nb,HbI[{ۜO2ĕsvGh;eι9S |JYGCǺy|ApN/w&f3v'nX4Y%&6,"@7J]@ Z>a܆^8Y[2/"@N.!cgFߧOސ3 .쾏Gõ?Ps }4)_u,֎/:fk D;ᔧF|GBds }wG-X?QۚݘupH3~rf$@}qU;NJddNd^ 욷prR˧$D6dw/Ą}6asO<53|^H\#1;mH;qŽҺoO֌o1IyV%3z=l֞.<:6[ s ӾL~ ^gK5<'i^87'@Xwbod+@y /;Eٯ p"@N>uc37d7:qdk팤<'|Q|F3#@~\ddTtM׼;{vS^yjxl{y3}c=ܣȘFjMYN}um&=zȡ}֠<뙂ē$FdT{3 Ęjf=yyɏ~ތ`?wF>3dlx=~mkr2xI6s'Jg6a&H*CF5#@1[DMdQyO.4ynSLyI[c3V{HFl1:<EOi jt/(\YS])5y{}7$sWSZNxmԝ=sbE#;` _?V? tW3Drrߏ[7.1.y ;3mU]]3H9>w^/8|3I`5cϝm|7 V7_Sss ֗*xPq /Kl<6饼?K|LbT.^Oh7}°W2Oק?- 䨹bmr]9;#=c dmb] $^Hll5թc#k{$4ֳ_f-Ο#?2SJޔUՄ3w2V 'l/)@ v7__vϦ(7zKjhb7@xa4@zH/мgr%r@W Ui79|/ߢq+[OZw~)+<K%r[3 İ{GH11/31ss֙%5<\U6U'[ 7@ .b|AO~0VK^* jbr`syǰW6)(v;Ƭt(85} ]WR|;kRTvz_~i9ǭ$kOJܝ>biږqC?6eKV;́Ϻѷ ,Uu @ ]BƮGS_Ti?w׿<k4fk*@\t&*_Z5 \h挪5Xn#j~|BcM}1qƎȅې7GSꛅ2GzPô^u,l0b]v㴭#MM %o5jU sǃIG4)3'!cgFQ5q𫯹&PYvz_gݓ^qqe׾Vqnt| H~]kp7USjǩ[jխ: h0lmf<|-J]S[oq\9ҽp7^}}zTlۢ F\g,@o٠C Tό >Vo芜kU{G  Hn=Iwnҽސ׳?k-@HᨍzCVg~wk5ox̽ilӾTRWi:? \ٝH9wif"7Uk.@ ,>3͚PJz4섌] FX/55  RwzWMqk^2\w[lر.@ ]kUjT5dM2+\T]{}!j]! E8}{fg3ۻBuLpNy mȮ^XC @.#7d  "@DA @ "@@ @ D @@" @ "@ A @@A @@ "@ D  @ @ DA @@ "@D @ A @ "@@ @ A @ "@@ @ !@ R%00IENDB`calamares-3.1.12/src/modules/locale/images/orig/timezone_9.5.png000066400000000000000000000036471322271446000243770ustar00rootroot00000000000000PNG  IHDR FsBITO pHYsE1tEXtSoftwarewww.inkscape.org<PLTE88888+Y8882b"Ex-J08*YH}/G3d#-\ L&Re@@ @@ @@ @@ @@  @@  @@ @ @@ @ @@ #@@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@ @@ @@ @@ @@@ @@@ @@ @@ @@ @@ 1@@  @@  @@ WtZ`ȍówV_ڻtD F[Y9lM1[QS1S1}<#_m]Z PF @ӟmM;㎎@EiD-~$EjɁd2@A@ @@@@@4:l@HB -@@@     @yc@ iO좺F@ly ? RsZ.ZgqƋOJU@\{. GW,rQ PTnRR 'Y.$3on&(HT5(s@ A+7=#Hڤzdo @s=T5O{u{A ~:zJ *_ ЦuF@@ @@ @@ @@ @@ @@ ~JIENDB`calamares-3.1.12/src/modules/locale/images/pin.png000066400000000000000000000011401322271446000217620ustar00rootroot00000000000000PNG  IHDRabKGDHHq pHYs B(xtIME 6L}*IDAT8˥?kAs>K\!NK'$" T&8(ķ#wo-Ge8Ȳl8Ni.+fY=H:ja܀j3^;nv7 #19yY*08w}ʲcO8h:a` $uM^8n7凃ISţ2cixǒfIt4ZԽNus46"$p|4c]ڎ{{5 -  HNlBD!0d0go+K+ TPXb`i@޴f`BB@uE>.#2z^xASC{=k+\)1e\\\Ծ/P`|W_c-k꩐@Ue;-mOB4-gEi"I͘=3~h@27 IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-1.0.png000066400000000000000000000226451322271446000234760ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1$uIDATxyxU}덙B!!$!!! YAỊ@4@lcl:َl3YvL}N޶6mszb'm^cc}6-[^TwWwt ܹ=R.ua[+CoGpNk (8lԜT 9U4dwBw"U_58-j;gZb/T [pSsfMKC^mj;*r"`E-яcy܄nN4< G!5$20|~5NBM/.5=mmb}%m/r$wm3[f7NQXW4pIEi'gM șoyW{rS鶗Z*#\Β?f+#=:acn*h8=o١5囷>vM ݿ{BZq@яفiE+c'=,3bhhk: p9gz醒{ùKnY=|UaYEكGO-nU9/_1џ=-?~&5>I.]I{ 4kZd踚 UUH*S#VF?Q"4nV`TeS`dن[<݆^<{ƎY+^䶊ήPt% .W Mc&$ Hc 5CFWL+nϨ?9.|cy FO/6nS^h A?\:{I}t2*nPZaʠ1c?yLưGkL/T^qIϋ̺~]'c.U+Q4CIFKJ6)'_3s &mZ7i#WI0R sO-n,:vƒe '̛4nKfgNmڢ5j >+ ._q =R dM]]QRX;vxޢ촒5/2rR WY>4y¡c=mѸ̻aI~CegY0|^i ''tƂ`K@B@A#ϛΊۑh4NL˔ϵW%fZ0lyhox(X~7\P>TFGLQX7h Zx$4a١e_D?o+r$ !YU7 =WʶCd"U.l,<}͈̼"c+О~#T;0Ufm#]5a١EkXpd['[l}>\ՅG `$ 4nجiN6aAJV;wʲBeͯLXzhݓjn&jЭ[}g'(ZճCsfVgKol)Mχ+Zl-RsEVoIG=〈21ӇeT5Ξ*e%wΊ=-B^] pIvMqCkR⣟U55X8vY׍=-e5CsPVWQ0<  y- 2kZ+-ؿqg:bOHP^FUn]7Cgv0;(~xEn^~'Rv2{|jM-ۚ95P; }uA0 ^ 7}9-/hCWGCbCǚ\}NntgQ9,3kFU߽hѶh0\Уw\q3d л_bFkwox6XasU-.ݺ;hD CFWU ͙א9 eq:W.[77Ʋ?²yf.xh۫,i^W#ߩpӑ/oX6:3Ϝҭ|?!I0WcDQVGe?39~3o>UMG|iv?6=ym*\xxb}) X_ѻGͿQ$_qxT/oAtө{d?@u_j,^[}]sysOn:úutVC}M߷Շw>յt/_?QXG/mO ՛6m o-ߢ\_ki;[Vsezo8ᛡᱵxtmn=OԾY{~֞vt^'! 4]]{ZNc?o}f?|h[O=Z{n}d 1aN~7w-2 ?VVUm7۞Hs7N]/ՇT袅`(n``9o:?}Rޯo?n}Ϸ{lOYtP0[rO\7;bUk/Q蕿5Szz7==\Ʀ}sɛOj[?k~cOG?Zwڏ^Mkƚ?릇xŏ_Ϫ?p|OQ'~_zOٮWtxo`ޢQ4ҵvoys{1ctE`/SmN,bpjg37^DbUzt3{?<`B۸7ɨھqHV`Wy0tPlrq %f 3p5\,Zx%jۆ1&YÑ<"ÙSCF%Q:nҊڃ2rzlƮw~YP~"x,#^rMJR .r0N?]]׶m/+Z^ _|{cjq^w1K=b3kww]{_ctۋq oM)Mq }=)T~*|}];% ۷0ygΜq૒V`=&޷5/<km u=5{pF|MX#)k,YfʺDŽۗUؓN?ђ=cxW^>@ٶM/|{>Y"KYc2r<\mYӂkzqpJZك! Ó2rkQ>{%ZD ][7ֽgY{yutlu>` V[vhur@@,} K|9Q- J8"?:R& 46/1+:`|?X摥gH:(mRԂ' q&O7$cH~C{YY +X:,^O?7O/Z<bSpdCfMpбӇYY*9j?]dg"cf_|DъszXYS+X<6a]ˇI,,5;>{<=t aTEpĺ6(˲ ~ #7nVj`87+uE}'uO̲_0es{f_ӽWù"U?i؄c 'B2O=pD+=J>~ ;.у@0ֽ 7}-M c@0 CYk{#Y#3[A JCpc[R \% KI\Pv"RpdMҸY2\NVz)?mKW`~`8ɯpCRl ej4"t"VLKs OGgJe(|7l֊ȏ?h}O,`;s:7kzZiଽ]?ԍ֪Zڻq"TzWJ6=g_s8j:O>~ۏ~++C|÷>\y*t# r2\P^hm9ۛmɆj~:f>tu\Sw#݋}҃K[e܃= OF;qp֞g.?x[ޫ]Ú7?ۑ>lNϴpEGWNՇ>rʿ?[9.p# ]gO<rśNžw~5?i{.^.mM/{j.W#K_[åM/vNbG;uw|gm7áCO*oyPgm4, Fs,6\nkFnU%76I)ܖu\r~k–e&kg+TP[JqC= Gq n0}PZa̚h0|jv|,Xy84dt^#&LpJ+^'kZHsʙ#GdWP8(b&.ϑLK+W[2(<NДhJ/۴.!4nȨ޽,(\+ ]v,oHUy)y`h#Sn;wDda-,v NLk4LZgp3`oQ*o~d›7(\90u/l+ /@0> 3#FMʭ o2ytG9Yg:t4 TW>pcU&,{؄}Zpڃܓo-mz)RpikF]`V*mz!8aɝ#/I̞ڿ{>S->\[5TGáe_R Wu0|+t{[EUe̊PJ+YHH` }SPG[s޼5; O 'A0` A0 ` A0` @0 U `8"ӡS=Um'C u  p%CWhҪk}mҜ{gEgع{fgTm9$W\0[~wC܌^zg޽ vu`Xwʁi)533+:p A0`  @0 `` @0|`we)Ϝ׬{L`?` ^:q3wFY+-:eͯ=N7%}9U`MxGR % " L`AC` @0 ` @0 ` @0  ` A0` A0 ` A0` | j.%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-10.0.png000066400000000000000000000245011322271446000235470ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1(IDATxwQ%&4 9&C@wݧYPfQ%HP {gvjݩw=#x}@.ie|BϹs2B%_BgK=*<, `  @0 ` @0@0 ` A0`  @0 ` @0  ` A0` A0 ` 5@0 ` @0@0"J gFm090wB"PVZ" i52Yǵ_aR:8۴ {ڛZp"~`C(vp_F`Z#j6:~.ޭҰ˸Թ3aTצftҤWGtsd] gk'%fiZWnTяf=д̚ ij4f"qK'u -xׂcZqA,${/ =r1WB̭#n9 $ 4>}7bb^,f?TqǚڼyMSf4L=Iiuconע%mcY M?Zp27ԂpzB$Zx:<Γ^-!VӁjO t'귫tvXQ m7V,<uԬq)-wKcXi%M|yDZ㈞uZޤ; oDv>T)3ʿc#U t3Pgۏz~LQؿ^N֨P+wս]rv?4ոc[V g3F <(Nb L~sz kH4SEBv#%ł"𵥱8v0TQZHfɗȥPO :M؞nXTdv7xnDkve|JхEGѠO6PEVaX(6”yG"^x!yPŪpjt$rH0`H J\g_poG0` |R&TzuB޳MRfĂat7f%e:sk~PÞ p$Ωuۓ{'#|$-tsRg#}ōMX  p755cI\ gF˂/CV\%'c[fɕPdUYrkNFۻfٰzG#i4aȔyGѐ޾嵵S3yƛlяG.81pk3oFA7_ߧ|d+,;^L/θVV|,|8t.zl߯hkV,wvZLjF䊹߃Pk/_%(벢WBQ+?[wхȷ+6+'D\ pi/РԏHڏ00y9i)*Ռ_,OǢ7+"ډ0 xy@$>"iCz?w9Sx2㩛9o&ݜǻS> "-i ;>j@Ib1zv96[nNrlqy1>ݚ{͋?NRƌߖi·4a[ޫ5)q:5){;J} T}4Pzo&uǞnQ7SfG `  @0 ` @0@0 ` A0`  @0 ` @0  ` ?G0˃a`K0` pW4KhMaEfAyf06 'uh6|Rso $hZ>3 ;kZ eaIN 46g'Ф̆ fv~&)3鱙V?>{NMN=k}rFIuuXQ uvWA籱SaI=fe8϶ʪYMHʜ>cGo̴M-3{3dwgFjѲ`J66mN $=X;W~dL8> 6v9%-t@%WӁ` oeǂ!?vckA0A0` A0` A0`{QUaFB;YQ8rp nˡA?^6pѥE)v!>\Q|%T  C% Yo5tIfɅȠ,l~`\ eE2\m;־W 3>p0|=ep󻞟k{#]Y?UI0`MZy/9r:Xpa#<4^iox;۷o񙻼A0C \QEg3gU0*<6:C ^yxٔWo) nK-8v[?*d ϊ^W܃h  X0 + 7?:uWIǂ~;`0$Mܑ2ԂE?76CWt=mw$7V%!ʭ/iKYI_ 2ql]~Ҩ=Ɍ^ x<]~=mimRX0Lw<<|O9`fa0$Ok+4ef܏ kVbrAPBVɹ CP_0Zǂa nS @C6uhuB|/ 032+=ۺomSM%qi5Z+NNcd G)|- j'\+±Я VNrNE||8F0=fg:g>b/B)?(8ݨ,殜$h=dyNMN-[VUۏ~~lzb`5F _2Qnvw>0:RSZ]Y|U0C c6O=XtK0S Ou~}pVl  2~*` %~ ClB=f87q@Myu4:RB2U16~0S"_T$a3. x؂aty0}7&] uAnZouB)3[ɿU/0`ː4O5oMWo_ ! ? 7}枹,Jy\^@#+'w `&FPx(i~q?#U3V2_) D0Te6㽹|eI*7K2~*` cn  N{Uoː2_2x(v+ 72tV5-?N뾕OLwD0à:.ne8>-?ecnA0}! y>*m&4:~Vͺu |E`yG <1 Gn 72t%~Ҩ5=;<}~n&w,-/jВ@%or,k7/USw24-cvNN t[q)%(8 j`i":ٔk(neEFFxvU[dvK $O"OugΌ'ψ\ E [ (mt2M0,m^փ ,+/sZp2~i: }T0C WR0evsNbh:mxOpVJ讬2|j< Ńx=N鑯 ޿k4DB]5''(>IHͫvHt;csnܖ.:[{4@Rʁj5 phYhmX0ܼJRzⲻvդйHZtQZLńΖOz\Qz|q\(N\(Έ\ͥ+_:\`Dvmg*MSfVv\0<[(9g^DZ['M≯Vihx+n Ҕ3e´pYaz_ _g~Ejmשqb?`3ŃW\^t9Q|6`Њ羻bݫNʋe/-E톯Mv^C%g_rhܿ}7zX鯯=Ϣ#.O_CϻmW^(?Fyҫש m0,tɸͯnſ{-9[XW5kʽM (|yeig]+Og},I?jk'x!.w(n7a f*42r ;g6!-t6sѐ=^|mk|͕Ј_ooVw*C&/nT%VC MSf=a̦a'qqˎ~{%LJ:]˂iAOԧRxʎXwy>4篫Ooş,Yr1og%:"d76ZqfE%x Š3k+/:ks:]|$-|)Km#7];vӛo}e}-9Mo~hubG"ϭA籁K!Ш{v6CWf]Q|%QUᰵWYxuY-߿t`|KW&=M;7XΆ漳|fɕwW".,:WQ\q SgݿjЊM'l|!/MV]!.OU [s1?\'s4٭>1M ,8u=c'v9{ȥpA+?^>rY%ݏ{*0}~t]q* 鑯 n|,<9::3|ݾU]Rkcsn{oycˬkD^ '/L*^pCN#$fViUк۴wrBg@}C˃O~6[t꽼[|ea#K'm{yېUOxpWG)og -p#:›W`(J\;ٜݢOSMzaMu T} 4JʘԂ?dWį^to]Szx;?Xu~{oHYuM}JU\JhЊK84r"&WJ:Ug$ Ƃe&\bnUM=&?a̦Rxs3W'Ss)<~˛~=6~9hӤ^vsU`ZJpޥėؒ8E}J/F7_)~:S|Gak7XW|ϳ?0V9} 2ew";88@=JOH]+4Ň>Ǯ,_Œ/sfn+&eEODN{/z4rh~YPޗ\j?)-Fܓ~3-n֫zxvz-;7[Y(\AFKVl]?{}: 1`١購Tz,VsΩR5l)S ⛡[tfvjX4\wx+L觳[/ZݞK>Ϳ[(ye[%EGus?ٸK'tyRӔ;6ׂc_P9ֿ;MooVW;LߺQ{yKOF/yoғP鼿[gumkvO֯TE?<R5m^X?iSGm藜q~F`FѥL@T\V2VP~ܸmK,>2Eۥ^` @0ׅp0l ` A0` A0 `  @0 ` @0 ` 7>S6Q0 ` A0` @0 `` @0\t6 %ڃ2p旚 6NiY?dD5,Gܠ=7Ж2FCculjO]a|#>kU OoШ>(^Ӆᲂ2E`ǗM3"یf0x`蜸? Fd̲%&pweq X# _n{# Sjw\ܠAʬ`XJ- ^P0t};}j[i{-E[^ِΊyF$fqNۚpO. b3,Ip*;B֢/O*K?kʛ? kvmQɌ̙clh \(~0p }_ʌyFN$&l3j[Bb~Ys!>Ė*>H0DCpuljh0t7}>ukyk7hoI*ݴiĤ K9M 7{0DCd8-n+ɫS߆ۿj-{5mfQOqYc $ٴpCu41*ZS'gY6slbLOYQO-SRݶ5[ǗmY?h]e{'&nbM u/uֽ-wRRjCC2f Ș H*-ZkBŎy';*mFc_^7} ޖܘY6ebu鑑*I̚7pM46uи A悻G vm=]2- XnM 1v~)і`(ywtr?PTyވYGds CH=kcq`buS0imAٷI%uAG-)ɋ@nLł> 6-`*Zxϒt2vvPw[vyR2훚KMO_"k=Ӧn{`SE Or3`+wG=yq|{glsWu 98?j4bjh=ѦPy'-eV|HYGmK?pDz 7IsΆ{buSƔ Ϯh4ݗY9mΝhuDElhM׿q;$\pGma ;?jl=h=T2|6N](Νh UVC[i}7N^شh0 6pĤ۔1b_LCܽk>mVҼU--V}YM/B?C-\u/6}zUd'&$fK [cC}N'pb1u*T⭯m*º6NsۜKZX\8*Zf.c倄!i3;J7 F.LY O:5K $O`:{`s4j &vryǭe (k*rhq}~lW.4o_0%ѳ-׹1˃ӯ'N^ػj:N,H/~ CUPޚÛ1h:̸u19}Rҧl#sN0Tw|퍆 [K+?a d| 1kJxjcU]S20f!cI<\璫vIu#r?8 KRּOԧX5hTvbBZM!FJȘ  _^AAqEzԶL_# ?Wvn?Meh[w O5yɼ_6axjU I*Lk501=`dޞ Um/~`s"A8vr zoga7=q?|d!cU}$OZ9_N۱k,o5>  vB:_m; *o((yb)<#V&k\x׬IJFM(Z.'TlORn//`DMωU IsoGWvlA *֮)Sp޳$]|N"_lxn𔊉ISWgX0iޙʷȘ1pTĬ9kJ6k'BѺw=&T.y_**CLƬwO^ydNjUm_Ӝً_ԖImHޖf՛P5{OAQ;ڎk~X #-S^I%ӣ54jbuCm`t޲h){ R5{ЕγW`p*ڪێw5+{=󖎈EQcݳ&o%f^`NOO ~FfンPm|WN"K(LiWM牫º9(wf-05%xCJ;K&|tew_nYr(S5 !%jzMoˏƮL-IBt 7}e[[:gT٩ӛy|[Wv6#jNEڜ^?0t|Q0"sf#sϘzηۿb an*TicW ?NK*ٴ(gJv.}h{j;^=P~uy]]ߴF' g O Fd͉}c|i}buOZ~x ]B][)h)7O&{IK8ΒoDOYy~vwC`3Ffϋ]-30wI*r2GpE~˛?x҆9m-mD?T|YA??O쾊bX0` .{2׎ȗkQ0T! O^ɽG}E3#u(\҂Ε^$L>*mfgU[U<6=vONCmym| wKw㧽L0d 68 <.w~D?^o|rҝLss#V?qkǻQ>>S?5 g P=RʣSq]ΈAbo6-~+퍮gX#?aj,F7)3͸hU\Y0M Gza 8O0 `S|wAb֜o=Es1ǔ|E0ujD̸qS7.`iSUGBg. :3j^˷̘z?4Vm|Q9/c?F`܅A{'4Yv҆ڎkk:O]ס)UĪG-K*XM_:% 1iz-n }9V L;pKoO [a#  A0` A0`  A0` A0`  A0` A0` @07f0lsWpM엝;˟S|^pW[r p=CkKOPPɎKv}fN;Li.93m.=-~89ܔ1w$`8*o$\%'H*+4綌y?#ssGf2bEY|Ol<=K9=I;{B!v'\_P}GG_,{ /gWAmǃ̅w A&: { ACgo'g}ggAۂ{`h=9iEѻU Noa'2+;`xK2`#@0  ` @0 ` @0@0 ` A0` 7h[t /7 Ž蓘9;C$'f:2{3g; }7(_ܠ\h%]?e+ 7M +rvI̎qv'\_Pvm?l_)w J;Co6ROKe؝p}CtTv JYq"tտ<}ࡢWdwu 9`hZ|O ៃ! ƬE  /7d-;p`\(@0?ve.S0`8O0l~ig;RN yaG)v'ypꊦvav'PPE˞ۚ6+6N){KMY˛eMOU>~ 7o0+Z>ݞTZg mfg0t 7{0/l` Cn3`TUܕ?+Y uAag4!r~}XC_OY \|~nbM˰CM "_Rn~iG%fΞ1/7ֽPhGM냻|U c î,[[Ɏ M2~Gʚ> 97>雕3chx__  Nlj^7xLnBʴPqmz}j+yu/4Mi+d905 JV]peYG}{n*rߴVwj}VE3=..c`(k$XZ]q8*#oot_8EEWڎ';;rG! < *ۖKöh0L8 2$ֽ9 mֲ񩇞Ϳٚc Γ/6N>jl pPՏģwok7Gk _u.wK'V|v*=G;Ow͸Hw^uZ&͹m=7g\q0|Zy{ׇ|ѧ`ޣ֏76V=#5_E0OA cƌ*CtN|~m߼0}:{a+;LY1*\A0T t|^~w|{M[ׇü;WMzKR{{`H̙;cRoo}{9޿mڞcmWpDr&[^ʴOm8y3V{zX$x@˷g= {fG:/W mK!qrV~/7?[cΘe󤹷?l%7pdFyw],>6Oa2HM׉3#]nW Gf^2ۏ˛3gv=޾{^Zqv3VmtV+{!X/kSKv\u*|-.vx4r!fИ[UmBykxK|ROeKxxvy9UCViDH˔M/:r՟>hj' o𨾞p5 yk\\-V X _"t0`DZpK|R;n{z=&V5o}msui{ͼӮڮ΋| 1t|q0,GڌSy콯_O.q_vv g%%;nyۻ/3]#ʊZtOmY'M߄% C 7TW9v bN /,r=3n(nnqS6>e5GfNH &ۄ NCuסҝ\pGy|ԺΚON>h^rhE!Цp_h=2y+Ɨ'FФ)6'_PٍO.I@0㡢M7Q}'۬ ̩PuljpɎO. Sm^ OpY-+?*wؽO@0Bk^=t/虐Vc3`8;; nc]HV}ҧ Pv<\:d\~D ut绍KMO̜9-Aʴp:=Զ) uك˛Қc W[wl=*wQ{%Lþ_c0pEДZ|ς%^|pv֢{f쨞P}}`8pfZ'd_=ij oy%{ɽA0` @0 `` @0 ` @0A0` A0` ` A0` A0 `  @0 ` @0 ` A0`  @0A0` A0` ` @0 ` @0BhX%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-2.0.png000066400000000000000000000125701322271446000234730ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1HIDATxsw}GeK$KlmG~$k$k;G^d[Xwx}]CVI ()0!-B:@$vLŽ>RH[h҄I0z|lϑf/{sb#淌}{"~wν>=T7x+j` A0`Yz탹p( /M_}ߛ `vibwbsoޘ|ks]43.ν1t3kKà ~7a{?0m^n07G _|['t}ՎKN_ w\L/b o XJί9SVh\*gcve|cz^]ZF~4-}SBbRCg,دYvCJxv~JZJ~ӡޫe5=Xi'n׆`N #m+ņ͕)7&%% {6$n*Iʫ?iHϫ-\+vOdS0 Zh˭ߕS-2ζ-с׶+j;i;yfr˓a$,qY޹7&ÂIk֥%Y.mK–ڽAvE,%xUZ^m񖺽-aT*8]q:V4Z)3-%|mmNՎջ7F֧֤ g4Fmȍ j=*ucmxПN~vyOFbrJHKFVYg ;%o?>gg/e[Um#bCw:*l)PYu^0.0o4Y?tMYABrd#AaѠpno ׬ ֥.Gsŝ]AGHJ) I)D6eԤmٝ]r8v2z,a cM%Yʻ2#c%U{nvԏBtUe9#%-G|$ V_>J~: Af y}VWdyIE*`"953HHL/oo^[>T{pYlB `\3qKmEdۉ܆[ry>?ejSOȩn.[vCvPy.ȯc`'TKl$-:(h ocq1ʥۖ&mPlQTq8 RY%Z1}nچ_n:K{0R2 IA3AjfaBvEoFd}3C>{yw'd9 &7o A1(lLk8_=`ǥW0N8Nν>Z [Vv0%$EN.?,j 2Kڂ AA#KO'n)_Wr$bܦ"a(t7_M o!W6a0+AbԬHzaHiHEѡZFF[Nxҫ3=3/G0} ~0,jY_SC~sy|;]j9mgwkⵙskį/IxCCA0}bK͞q4zCa~:trLtlw0fHx`nɠXk0f{ӟ,ϻyfzޘ|W(9;H۩]<|8{3=_>tJą`h8`ca㆚c4aUQj_4W\LiQi%볊/(h ~?ib`~...a(,O }Jl{ΥHH+<[VѡֱNt|)f?},G07$;+AN},P_cu8zsS{Q?3 Vڃzv~)G[#䷌}{⏽~`U @0 } Mȩ ޟҵ X[zca̢֌%#pkj8Vo03;ٶs/mʩ ?XpzXU S ˳ll᭹&S#uHڃ:̽>=T7xK0`` A0`  @0 ` @0  ` A0` @0 `` @0 ` @0 ` A0` ` {&w` 6]Mo;3ow?j`L뙿;SZnvN3[%ݗK/Z XrRP{0(j1`؋':s @0 J Sa0'dl 1ac9+>Nt|t<Ɗ3vF,.v"j ߙd8LvOrn_ ᳞҃޹'ChH A0`  @0 ` @0  ` A0` A0 ` `dom:™/i<(꩚T#gύEg'Jz2=ŠbPub e ` قcϝo:99%#uMJԤֆc1`5C՟N_ v{gUÕ`5C3fcw>|f::H'`{}2:t{n` @0 ` @0 ` A0` ` @0 ` @0  ` ?[0 Gx8/ǯ=[xky o  %MUFo60N_ܕ.;ϭuOn a{VpP=?4~)(|['ޝ Xؔ3 a4$ =~s% XO7u\zu^0'-&Wݓ$? ZN}Tf|XV4DNnlf՟|xhft]4 j7/AvE,)>yfkⵙ qʺK{7R̯Z(X~dlٻ qё[^ `?l ߞ$`È` @0 ` @0  ` A0` @0 `` @0 ` @0 ` @0 ` @0A0` A0 `  @0 ` @0 ` A0`  @0 ` @0X/X\\Dp#X 6w=ks5oM{KwW&;ޅ߿I⏮vOj sU7ƒ ?wyoJ0 7&>z;枇P[p pCڝ+ߙg~y[xcV0 ;f+w_jlɏ޹7'v\}9g;'g [&DZG*vͷW^qnQ{[?ɾwf#{ѻ$wɖ]N\&zWBtv0ʕ@0 ` .7Ɗ, %tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-3.0.png000066400000000000000000000403731322271446000234760ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1?IDATxw|e+6΂P m3)@zHH{Hz'zzݫwv }(wz J ~>m^2f1#nt7=/ϱ4ѕGG5GwhЍ =`iv@0 @0 @0ty0o}WooB{  }P6R XZ C Me]O'-!{1tL~hTO"Bf!r0 q{mC& q_3~ £” Ad'|`m%,B$(r9e-Ν i{:`vev;^=èMKz-2+arj5̋q+dh|= EG|!I:Q-N)>˪ΩOWʟCNljlW+v]"ʹocղ|d[GMFe_a*@#EY >z!BlSץإL Z zSN"y¯6r[\>N:=Y+ ή~U;Zɇ?^^DZ'\'j7k/'[ 3j/*3jS QτO !עj^I9$~~Ba|Mh oG^x8 _;,ɬO,p;mYC({/p-<2r}pןo#cL ᦂ ~ f !B7 i k 2 k /KrE3gM_2{IJE_)Z;|_Ngox}?vx.Q;_ׄ^oIsY__c0o/kMҹ&sa i9 icT$#R0aK:EYQe.1c|M,<:1atsA xQ ^TŒobp߱ύOur]EYds"wYvmta#Nܨ_g^k Μ՜z/y͈>Gb%=JVOr$Q:]v"aϫk Zū>ٿV}%ߏHƘ8K]1 ?Ή*AY[<5_ w^==AbvHųfjgxiڪčQ;*^y>$p7jۅ'?^gHĿUOŋ&ۂ\nt2V͡}ZOg_mt95數kWkr9ՑJE;lխW.&_3߲jcVTa|,qR9giL\H=:Nsoܢ-R:'Nl?.0Ifd4BEH6i~_Si4S7ɯg_KCV:ZW<`ߏ#jz.؆X3?<6\.ͫ;oN`g֊_~<\^fE_(jmH>tZ0Am%cttC0_4H~usn|*=7/Sؤܝt@7Cd}`~2S|&x4v+r[=9kc:cbm8mSBjy_"|X^/g;? k <6qA̲p w kZ76ȧ*5_#9㓊j +}JKe[>2kO Qp?&>_~zRt:vfss*)*Cl\Ȩ?KϮO> j] 1]ϧKo ^#Sfvx+!d(XNkJ)wdTSViRJ5kӿ. ݜNKmU:RwjAj"^qR3~WN|*aEAPijcu[jQ]Pʲ~!dD\Ga0n~6DlTdȟh|wCvt36gSi.4Hg3j*I^?6)ǟL[^J+ )\<>8O7hVW6g5 ''*ϲjŚGkfߢV]Fv+[lw]lgyd*:NAO\U31lB[-~2Z&I:OBbtd ݋2 ݌j͉C*5P5] ^ @8~](yͷ}aAx^_+V5K%KF^t2\|+iL^AZTt#rct-Rjo(xS JGoPKOԼlj9vt݊~cc'mczaw@d(&mJŒz:|!~)|}:&wqӝh?&G~t6tzqIB9WV!㕝]8լ{ {q/' .ƗՑه㜸wbmgV)WÑ nF'] IVML9 нD $0c|nk%BFC8$D["CzZY#^Dα1| xRe3T}XNYsb~Unv#I=wH;劘ھ "a7.V  "hwEnq3v AgAi=*ffn23ds*Enz^.*qzkKUқN7y$*^(2ZO}8 -XwBz {&o_*Z#XE;VQ^|', -VϗlFxsJtsխmG皓~8H]\ '̟m|N OM291ĦϤPTuebI.qC~-!pu#E:Ge ʔtRW:x?HhQ]=M̨ zKi T&O?Ψ>άLJHug{9ƙ ܢڙ(q*2dNU'te7<:,UK3VL ꂐ4Ǧ:Lؤ,/l.W0zCd6DB aXV1,M~ߍ=.+8'VP1@oˀOXJ>(~G ҫ~q^&>?kIC֪ e_Vh^P>[ ~؛6V+S(jᨬ"x@?qSG81ԥwݖfҍ 9 A+g W'h/HOF2Qu v"3l9 9C$3OK1;T W<>W"!IN{ϟbWhR3k7ҫB:-2~{Jes׷jN7bpE0Bb?x/\.NvI] Klbo`_iО^/풏ϳ4vabӘ~T{tbDŽqSGیpV᛽6ȧ^E7yw?i`o"/*P!# .{`=M}?X|)Jz'V{aߓY)kVS]]W7jHي 46I /3=݊57(owgZW!h0m$xq& &(c~Si+V;7mT%Y+}MZG1<^Ot;V&_ނ!tj"i6_U=OXսf<.RzͶ+T6OM[h@\ p?qf/q(m/.4H"7/іol6.v;^v/u G#6wDow^Wu*N>($.hi:EcdƯߎܢm_Y^b8a(c>9yIcuWǨpˬubI+ҵ3W.Ip;v>b΅sQnn Kcǵ)%*ʸ; {Ŷ2]n/̝;uv(&>_o$ +S ,uv2Yf7 >/M(c2܊?OGʶz2`r3/Lw\1^wd%Qy  Em>^2LwXSIw2TlBrFNVU~s66yeM$ҨiU/ [gdl TsN =R=¤`a@`W v.r.ܬ|?lkJWvFx{=V5Q>O_7frbKb4[\#,{?N~3ueˬͮNW_V'bwO~+nuEGns+Rft"L=OHWW};C:K)xc$ip BO9֮[?I)?:=^%t@{9Q%}$9 9 n_6UʟCt!Z tʐ5NӦ-U<Pd1aM54'*' p3( ۴s]mi X52vo~{ͳ/]i6m=~؋t6$kaQRNڪjΨO4ȧ:zukׇYn"YkFO~7N2Tpۀn'sd\5\A|å&5?hag=PP$[ RpUu/S*%w{/xA|ZCaB7Gn.,0 5~41ivfZWi\gY@ :)fjF.fֺ}jZm0T1ASPkIN~Nد= 1NRp]&#bQ"˘~sQΔrgEW1t;&U  ab:onOzEG3+At-I%-k a݄qS%N>a^t>Y>ZQfϗcw,q0d֊N_h+c``0ޞl2kqf9y d.uuv:)e'`$K:rL?ׯ. u a}XgSnݨ5|~0>m~=)5/ȟJE 5"ku BB*.mnXnb\y acXM#¬֧$M13||GE6\!?@0 ` ` `@0   @0 @0 `@0  @0 @0 'z?M{v€?r= ?]|̻ssk;'&G00z1;}+ϯ`@0   @0 @0 `@0  @0 @0 `@0  @0 @0 `@0  @0 @0 @0 `@0 @0 @0 `@0 @0 @0 `@0 @0 @0 @0  @@_}}>}>k=8?4V}FhYn}[ {y[ SDAtbeRzTK]ڕrHI: W,TN.3ôLB+F7)]֙(햏m%0~l-ŜtnYNuZh/,9`n`E^R=-_EG$}F'~7Y%nN4<#UísXu._oog̞iB07 UcoE қ҅+Y_"^ Zau0p"B07E3ߩBgR~_PrT'{!cuYDgg Nea-~Br-ҹJR+é+;d}f r m 2l !Ш)E6hcw*63wM[bY#}^] 䶤Vbn̜uȎ5`&}p瓏>q$; _ɴ$h#nfMVECat1a?%-p`m%L m/fElVg4ȧ:Y>%6ecYdW?AÄ60yjTn٨1cQEteyTk34^ՠ [zqku[r\^P(tW&ϗC7z ,u}dPáÚM۟t-7 @tÂSãKs3q{)rqGfvEfԵk6y.])\o]an["}g.s}?R{Md\fư>6Qۨ=^5ݨKV9ffGU  IzmU^ۂVRat!]>j7].:]D\^䭨MkI3ăߊV "sh\)OVocU *Ҫ\?+l/޾>jǔftZ k2oYq fuUᆏ#,cM#Ct_<"<~rQtDgKz1Sݦb誈qz @700zfEn|Wo=vR+"eM %no81iz˝ =rܾ gRkc]SA@WڪΪ`h_]U:^%V&.TD4u(w>! SIota06 q8RɎC@3ި-f|WÿxYg!p$XLqԭW_DtEcezn ƑzH]eg{ "Wʶu9 ? rux!%x/GںW,ȗhV:NE7o&Rz{MzC2t?mi5.f@Q1;ReQЅP e91t2?xruzݮFTvq1[=ǟFXV!}Йȗ;5tf1@Wy <8H0/Z)~:3QYP&_J)c9vev =q[>N|jRNt"T׿/H? `7})v}/1@^Un^|CCU{>xjǻb~f=OO]ˮOw:ϵ32*厛{0nꉄ=MƉD$N:Iݸ=^=69wN)ȫ EGd}J?Mͣۃ+ @wE$ѱQS/ۡ&_L:ixutc㽬j}0fY +H[Jۦ\aMzR'=Z^%9;KÓ?J\n4 1q`fqy^mg-fV΄qM)ӝխg;wU{6|KPYd}(tS%} Ƒr:puvC, @wX4M+3x;Rɟ*K0ݘu2լztaᄾ¡tmUQܒt[/=CkI۳jwz;R7f/.[2bڄSgey 9n'\g#M$cJ*dʧ:b^CAnUXb3hJZ!M/VL}&yqJIv` Gk}+?ƵNs4YNwkN;HՓ?_aYX +^̦YoYt!f, ލz}8)򻦿6V u-b&9^>OJ*j^Ri[@0J2 Őеm؝bp6_cԴJ]ĽNDkͮEk{vxIw/VWJP*_H|{ѵ:`x1vf[nt:E63ko6x*%Jkּ/Aa~mpR ߠuXz݊dpE` M{>zg@hQeȟ?[TONDWdž8W&j#yb㝥Tu؄WjmqCW%x+x]Wn XwyZe9fI zF_=cHn]'u2i> ߨY\=T3hR& F2j܏N;eSa]nQ5aQu? pY/ø kK':MN4o9҅Q[4C)b] GbpSwR8ZʨUiZYsUK&m0 y},pkz?"O'GlVk2G~|O f;dCFܩ[VtD~Tt>sYƔGE6o BkrN|*RJY+-WW6^]%u/VY[>amM> Sj* Aqj';TLyO;s~i8tPka=7"2ko啅GYϳj2Wi2*յi궬Z1]e!cYg @52"\zZO/oy>5K% @qvw/uT0\+z/W$?prB0$hJN޻;fHM2<ڭ@0?+v:8N>W̓4Yun'f0u̕6_#rQ-]05g2j\Ndjm fM  5V-,l/tϫ >Sm c7*cܱ@0`VeW]NmrV.ɟg]qpw6eQA|{Ƃ|6|K`CnjEI"B:> {zyw>K6ZD5:+ |bmG?!ɸCvxj| lӈ @ަݑ%c!^:^9}zi[Uu{zROIwmI'0%?,llеNcS\MB+# $dt: `-3J|?_˩۠θwF8bjc@æ1Bae*~JRat&BVYl>乐u+:':˜W;OvOhܴt!IB.EHncÐS/@^3ٸ =z}S(9N7`/j&SI05] |L6E!F X[ wP&_L-ZaMM~3*%L0OoaҤ&LIk &Bnt,JSDz|lcM]`|>zi{a#+2k3kO3+55TkvӖ)\G3'by%H0]=n "]ȗ-UJn봚id?ڤ Ӗ)тC+L|7 /4\õ.𘣼3lVR<$[qgW7Uo(t2"B7Ox>ߏI̷ͼeC0qCn+S6˭G sSfOin*ta \cdL_J IگYV.6Rڽ`cڛ`c~G& -ҥ5~Q/ ?2`k}[b~ ڱwCN~wjSvxGl*tiwKMHY'>KcvZ}:'+M%X*-R|Wx6>U)~*mb@&KT67 :tk%yMWs~|.a̽9Q XYtԦ @+Seʧf{o,W ^/ #1,&[ k*񛢫-v=_t g k7b"YU+P&߆Sg* :l=.ޱ;TEm/^a(h/ԉ&6PO8 󱝵^PKۥm_|@:Q9amӖ)3+^pKߓ_OߛB{Fvv @gg=tTbz/CARy}Z{ZP: Cŝ!kI_P&_H/Ti7i2SuC]/aӵntNuՕ:Ja|`gTkeHgjޝB)z `F O[S ^bmVA\&kcw(FmUg|` 41d1[)\F7U'<<6艶Fp`+׍: }Q>e^ Tiւ/ 3uCCd]Pq?[>iW2p,nVFɽiE O[Q!9uin3zrP%Wggh$O8xƬIAH;1&2%Sg5e/WGtiRÓ!kK=\`d rHx֞,n2-^:Y&}[*_ȩI>(5K.y\)vzӶ }d<9)C' L:|[{S` MZ4r!pTV3.!.tOa.s<}ǜϪ >(G;zNxdL@R״rrR/BEOuC3ӒhDM=`un @0 s瑅2%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-3.5.png000066400000000000000000000022301322271446000234710ustar00rootroot00000000000000PNG  IHDR TKgAMA asRGB cHRMz&u0`:pQ<)PLTEh@xI}L}L|KwHkAha=}L`XCnIr];O`@lFA=,+/W31tG|K|K{KvHkA|KQRRRQMiExLPSOP>vINUOsI~OQV@0 @0 @0  /[SJ#iyc7l'hP6+:>En'2]g8$oOs>{25X^OLp m):%zf;[NuId'b櫱j`}9:Kסk:?w=`z1~6P}6akam0'_,:¿Znᆐy 7'*^aȳZ}$h{Fסv]t&fMBc-g |`x0H~eHDF?5"}0y+sSwY,3+1_ejç{ 4OhsϡkǸ|vxm_Slg0@/4|ؙ>Z g4xʖM42b֜`uIY<5emsIL<2LgcygKrAGp8;N0qK,KS,a>H2oNXo &$kmmĕ13e#19hTahq玶6 flecR]>M:mFLs2k3vg68T8|"x\c!E *P/l3Zi#_ǡ;= fZa cns'ɧ2u0S07ܰ 0b> ,a_W'$;>0} }>zx焚a3q[݂Ύ[IB 2̝3'y]GKבlW [8y8#8~g!*hrYj!^IF[LP\|Nq`OM7 ZCg$7 –3Tbxb/Cx kT^m{xYn{E*s]q'MK; Q>ߪ+^cߟ#<tSF(NwBC||S/~.?%&!u< $?!DJ['PVkFlQ ?\tDZ5;=˒ǾYq&)V/ꯔp ' B jC#|Tu)%ڸznÊ#,z!@sIk/mW&=4/kd³HI4_Xy +̏YА&-}}TCҊUjGGɉ?yh[g^V,U*<8f !"OLsD݁˵W{EFC❖ۊo*>ԏ[/*R[)k"\hO6˂rw FTyFv]%kІ[i"LFy &p4'K!-X)Rⓑ=t)kK.`K|GSZ=j8fzfT׻^9-M0.]Yǖ%L8OKQRvJp]Fſ\Z κޗY}q.Ŀ&}:Z\-uJݝdl-2W3oCU'D5UD0%Q8b2xuww ꀁ Z&. H^%[%K|2h*iְ} C}.>4kŊ8b12fw¼-lq3j Ch TK]EW5^TwGJ?v>/:irO;'Y6;b `;t }I^]ꯍoxPA9f~Qc0@0USE@ؙ>#/o4a0ܛ ϕ[CSm\8 e&2l5O7oVhts_%Qk5\&E0S =%i.];qH~qJiِ1;|i8Gblc`H0 z@;;')yNTcm욢YKB6tzS?I_SܹNiҼB0_3'AnafY?¿tKXfeAEe Jt] *we{msyΉ!S'0@/Vw/:ӿpPةr;?;bil#G6?'d¿]` лEG8nozA yճkZL5cIGNslLys9k<ȳ [\)\9hg az WѬYYe eISKa~d;gS[˟ KлXb]ht4vZzwKwQ D5 @/X,ɵ1s"\fHTuFttIUTc{%I@!*7*{nYM>+vU>K &9LuN;יzԪ?4]WD}x>ﴸ~obC&>]8 Y0zG V I "v{曊bުضUlb.PW޽j^O|>gUp> dmU ^; +>gHmU^>lg$56rm.lKX{> %Y!~ ʳt#rɶ9s{݆9  ?ˌzi;n-\U|t㺖4rW8隽Ko?4yh yGmy۳=5I\C'̚7|DfeѩҎ?׸ѧSݞ@l\Wz"M7z.STx]|Gw8QϮҝ-0,\;Uذ[hMd3@/#%a-^g^tWkZu~%߰x3-][Rw~k.뢣kNįL<+cZV<̓讪Ŷ]^r)S FߛurNlc ,zzc0_7B=)*wZV+.K45ek⟫Pq*[g>ۂ{.4tN٨>_qL\ϓX  ?ٸp(8jDzc``XVyFO ]]xQs/E"/F*ۙp¿Y ~6x@ؙ`z- o̺^{%Xh#L}EaoɩB/$O5۹;E?|ʬe (}D@B5 S(m<[SXM Z'>[IڼloB0O!Iꝷ#yɿW;Kv{_xлΫચ3 Sߠ~Fxykŭ|vuʦ5/Ԅnl]޴6H[L0TDs a6OM*nCCʦa;xMaWaW7ޅU= ' >VS%RWak8L^Ju$+zjj-WFԯh)>.ISju8k Cr.1igΌK[$40|b!c3cӞ8lA0$ ɬ8-MKݒw{f,a0K)&n-j&Q^|>/[ /& ,?Qg tIpP5 zGN٩HVy^'j|>6CM{Uodn˼V`n}rK7u4a4t)~APN=AY%ޭ=O, SDl%~eI1ȼհͯpWA`P,~sMR/xgIoBҪ0E%ů kiU_]Qɷ g: I` _wk.Ԃg]xV' @h\]sQo / ]-^GɄ_j$Ԃ]z鴟ĭjZ'ѝ]@0E]C⿖݂ve>;~gɥne/mxG/f٩m[r g`z)SǾաۆ;-.޹{[^$~XMNݵ܊yu EzgLjW&'^d]BދQ{u7weK(J n( jwe{m`襦{LZp jK]⽥W53,|]۟=m!:/=am.쓹);Sw%oNQF 0(.k]P3@@>M C'r'`k!_pZ$(5P?ynMb6W䞻GiV:-g0(Ը[涐 <|gXHGXʜ-|C' ˆLeXn`C\ާ#`PAXa]tPJd׫)~wZW/Z6_-L#߫@(hIt  Y8'~YhSQOo~a曱wžܣTuܫg]uWD`0+3|<ef-L,* l#|sɶ° VL [XULzYW:zGn͆hh.ܛs)vҰu>gty;#"ᬃ*iKCX 5<3|>_ϧFߏÈYz5<:ި/)K,\SRm+ZW'm^RƻR~T_ت;St\7W"ZE6GiNTy숺yVNGiVh|t}r[B0VtL9wMݒT7㺬mOc`ʫj7{i֊Ӝ!``gVU5yFVlDG\2kː*̃i7a`蓴"&\?gHҝu} VU;ePdQdV.:̿z@0KGA{0J*쫊e/+ǾUz2i[JFo_]t5߫7*07dUݾHeCaطǽQwmߗ\Cͥ?dވn衹Vfu ״jS|VUI0Op0RYф\Xʖdk[,Q\v~ѩͭ܄Mgީ@0QcVW7R-uޅWqf8)}YUP4 5+>q[ U@ʠK / cW;u^d}0 mHOCM0 Ʈ{t?1\U/1m\Q{+{Uxl4qf# ̿sW{j.P.j c0hfPmsVuNi/%It{5 cW3*bibEE@q`d4bf`|y伄-ytpFBJ0O3+ *giԧ_a̜?#sm`EǔQ0uK!clg PW z 67i. lk4qMٮGT]னFS]RG *-W]x);@0O 9; 8-Yy&[+;UAG0OE$,\6t;^brzDש$QXpKe' 1Iiږˎc4pIY̳Oo˲_ܺ :ķ;cٰ̻C}^-^Qy_T{_ثg4O;t¬#LNsMg6_%J0E/ Y[Ե^" ݛ!EGKn(`#v_SO榈<,Icf S1aDg;x̌~Fq1's` Oك26fU_.]rQx].?hW\{7&z&g!Z05@:3#y}e{ԩSћ+e)h =#]_KZ2|YVC8"lǗ}> J6ブ_ ˊ$+F ˾i8@/! BV- b}c }$Տ> <|Bd[wM,|Ҥ+({g{؎IY 6*q!}螶^ុ].W _|ЬO]K(8yG#65ߔ]0oo>:> m w r&uIzu@~ժs/?/7v\PdjW>BMBLdȅU]-Xۆ=w[np]|kYūMyNZAb_UA+F0r%W>}/77n4^WWr\v0"Suo˒ U_KY5On2ze'"RtK RM|舼j$G?J6xvqrvSg+.+ꃝ%I]+lWC]⏚b%"_%-$7CCval_KDhaX% RsIשּׂbJ_^Ď Mg?M#U^U0C !@o{,I;, UsQbhI0*= L@Tu{ Ygo;tCtW*?Y)7ХxJͲIt ;< W{Ú.݂e5> a*o,8(Rסg#Y|┢=}-ً !L ӇvEVu<5 _{Y_iY[D&x"* h[nZ{YcX$JׂM7b5wF.Wz\#<%oPx!Hc>pS|ԻmA@f xìKN`Y]vBz1(ā"y]}  U?M_ ̌QtM1 ҫ=Ϭ~AL0#g`0{M_q>zlA-OʎIkHk*Љ Qe, VMgQg+N:W}^݋#>(>g PqZr斨p& x ɃU@4DIgy!rKx3_Q韼:ܧ>Ъu7+w[@ xF̴#]\/iw[e+#]"(Å||ӄ׻q-!K.?nâaU9ۥe +UM\(QJFjkų ǒ Z?}ERa+?Q!QsQjTUgww7|c,7;p>12hTgY=>s+?wJg|ߑVw70;LH^-M Iw%SV]0Q=aoifPC ;ױw]E^w 'wJ=|1Q g gE[zEB=RfD5EzΪ ; ݷ!]WW*<۵O+)~)Bh}8'jW.8)(wI6L4{*ec溎5#&]xX^%77= g`wCһ ow1H`:'IsĕQpk*w5e%ۛn(7CiiWGxʃAR,T.8rKAO0˺<9S y1Ϯk]|>wKSVʖ=[`je|tUpw#Cs#/k,!ݽb["0~NHO1گ7dt^fGg ?.INO]Ňo)_`wEU?`MGp[0j0Sm.M#LcĬf)[D0_*1]yưf!Kס!Sۥ߾d  )YxH#o 9!Slgצ(VYڼ$8w6ÆN;~lUn9 L%"D7oZג][{%X0a:'#`C$;@ˠ 9QM1{5S:\=fR}vwa-|a8gЉV?h =k@L}ؼCK=" mUYG<ȿa(aK`tE+ ;eD{E#\x_9Rة2 &F.Ի"ꯉo ;bw)<9oi"jGĬ+Z C4tn/=|/oUSTM~.I|-ܘ a?u+3ĂvKCQB0vCM&&nXE뛼j?wv ?l/̄Y¼MY9g$3{1$liOҫջc x>Ǹ0l`-Gm阺+۫5 @o; :T[F l>7x`HT f̠2aYHmtIv3' qG@o0G0Ovܒc^$T ~x0 ;387sgds_YasΕƭ:rW`MXΨgݹ -Zq?.I4rPN;v9q>P# &"(iJ}r$şs%l?r0jKY.ꏆn$|P$rK5 ۪/_DeXwg2J0  C'ܽI퓶H{ "DOv-ge%龦F *m6ߠ$+BpˆicoN\R cDW.;) |S<#ۦw}alFZ˗-X?W='jNT\kŊ̃9o.#&_^sI??SuNowՙ.AT=`.IOXKqd~r 'X3d'31N=Wޖ>c`c PASWXSsY猍|X &͓;̍nɳlP'o˺o $ x:LF27ˬ*n5/:"o<8g"뽝Rw/

#}7[ _:b8$Py  oծuVo7R|`è>/{5,^gStԝ ^{v`QbCpe\s`Y!C[M7?[bw)ũ9_:ESv&{x_ȓ =ŮK9H̲7liw9ҫ(wJKu8 㭂Lu8cfNT-d<*_m^g0]#̍nZ[+'yΪhx0?x- ];7w:[-\eF:'5d'5+tcsJ03I\*/ER'gn!YtD/(ۼxQ61rO(%j<y )S Z|4BVp@_cg &niN{oVxB,Q:=sS؍'O~. %K{O?{=9c>Ia9>)žEχ\sY׬- Al/|_q `L0O0}cZϯ㚔1G'Vz\z#qE&}}t 0`}rI} =$GiA0>nU>[KO^k-ХxkYA} `}ÂC]x)_Up)Kܧ[i`P0L$8.7i}cg& ؤ2d.Ln:BVlkXx_TӲUq7*&_wxf[ p}7l}ea[Ue)iJ6?P7]=4|`.8 Pޛ㒓I+S/GE_MZǧd!J ϵ?Y~ZN5 cEwG8?]j<{Z>}L3̿W0VX`UӺK_ymU@Ş yj<8 터*_#Ω\wϖ#=Vꠗ~ *{kծK{] ms a}0HtL'v*}<.%wIz#lGR4L iߋݑ?-=!l<}(ayȲCѿ[%ǢI&LuΜqnک䶪@/dd/Z αQO[|1g{OFĆ/IOqC^ɨb\'Nu9> (6emiȟm!S7EjS j"ح펱'OOܖ(^ 1q190&9H,.4-h <p(iUcѿ[zUNm`n*=ISVJfUΉn}.MyZ_ܧXWU5 <-N@0 @0  y2#ejb!%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-4.5.png000066400000000000000000000054071322271446000235030ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1 IDATx{l_ ^dt8Ȧ:T@bO=yCDA;.-+$t:L' R@.--EEl.s&JLI9sa/8"\u%DŽ+Ô_ UG<0VxDɏ^1G˚w/۝mpx^ޒ{yw^˜:p֚+Ǘw)yv|tf(}>{hisNrCON8쨨,LzG yK',5`c avS, M~f<Ieذx]XU>{G zOEe`EOն_ؔORGQԻ-h-:DJqZr1G6)>P"L?3zuO&kМL?ڥ ͜iU _UoQAw?Dboekwo/ZuOGs,m5Y!:0: AH|loH~E;^QߞrscQiHvO/?68BK É Zg6t&?? WjvŷߐW2gmv Cv}M6ʚkv73Ri"}5KGZ|~&I6^|tyK^A]{C\NQߞ|rS~Y( V0+¼ w.~P_e(ɯϙ8)v@Ysm7t5Iuo°'9lcS$@Q.컶,^TMEՋ j[zN򿦫 Զ%{!tG ?V N}?o wWì5U۝[]{h~߸'- ߙ.;scN2#Ma^gyЀ'!93b e?#}DT}! y_ZpNն% |kv3suo<+jkׇGrSXڵǝU_韶}%I~h2N*??MpvÀO w>;֯rCCGEkf<9d²Q nnY>]Ջ>koFE]x~;:~KT\К'33qi]*L8ܜ2#ơ?0Է'/ߐW1Cnjk)b^VwssWiO GKW`^}G]zU]9]zm+Lcjv%´顨"lU9%/Yۖxe,K%l'xW8-cP(kIVXЙvf7K YMu퉽- ն%:oȻcֿE1kv_\h][ JJ>.]"$諦Hs̜59w}ozhLd}UFl9BWOP)?Z $x`0^$% F%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-5.0.png000066400000000000000000000550251322271446000235000ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1XIDATxwXؽkU[[m{e'ywN' {׽][y@*Zm݊~\V$9i4T$rg*iLƟ=t]x"0D"05 05.\20$^e`hA&76&F[M1l>$)4e4PӾ?0, &vk.Z*%j^`,jᙈzmLbP\s >@m*BRb&mk Tn+2V3Yv1{c+}%na\<@mtQU%!KE075WVĢ?+5|a]@Svg9 vX,[WI{㜵{5̕!;ć89h o Bjiתp2fϡMgdʎ\%lGx ya͊RYk[]q6`H;?/]]Yjy2U@p*; -sQ_H ;EbO5䗉ۚgZv_wiӸ{Y4vr,, 6\*.䐹/wJS;X'Һ4C@HigO @7qʊ}N8\0NDR 7C 9nG I}-ci~N!4-/}OY+T:E[SE]'XL ˉDgU{hfX8[#Έd~4]ra~`wL߇ꊀwÛBwH F *,V{|Bj.LZ7q*"uћ]^>e)7]2.B?L\#`n5Hs`mV~UL^#|,|$Jbk=Թ媯X=t,9誀RJy|No#QIZqPFtH|6$g,Q~hGb3W]'u,ٷ@i[QHlbF]ͪV]9/7ݰnS0/SS}Jה fCHhRAa` 0!LB AO! qpop^S񭶕|I-U_ܿ7x~*(˥ugǥX_oCwWG쎬ZD@-4󩠰w y&sŢI6)cz=X ygK|715H y꾜:~.Tq*rnbTU&3=qH~>4LM\cA(T8$7ks FTer&?^- G{q/vrO3eiu]>I/i] JVxT%UχZuifA_X7 梥OS-y8le!c- } >MǢ)zF;eq}#Gi}Ͽ__@݌dx?4}H\i&m;Zƫ$Vz=6b^m'4^K!$ў~e)fcA$boєH bFji]Sj[ؿT}[SMN Yi:47o!|yg>2b{ww=(a);C`*J\60$5E\蚼9NuߣR$8x >Ek?ޜ8b/-x$t5^Z@{a> p;ي]=WoF4 _Ճ"Jފop#JgwV–[Dq;T|059g`3C0)7>:dtxKђIJGyX!ۈs < f_5߄ n mx -yW^-;R6ZȫWc\`XǙI 뵉36|CTDt$;ϋY#[?5nѼ'$V6^ j :=+~f.$ǩGWy~I\៝b sYJCU`"j/1nY娙?7v=i?3s>ڃq/V6`uć),* BO*$5?= )quɭ1~^xFtŁܠ- ʍZ5V9nYdcO9f:]ɉh#FԊz!et{t D6%uMjq'lJ9}Ui+L_vH<5EIY0n4G^Zz(62MT6j{0)vaZ0WNץ F6GxMhWk"…$H@i`%?fSq{q0m<,UR{!mL6>67!>/!`Hn>,TVJՁ[5ۑn@X\[)P׮NuJ - ~+p/\!OԨ+SQy5Z/}?#)YNP(, nh:N=+p%#]<ҺNLl{DUeZl7(]#;NNhX /$QWX +8l'6z__@`KV"ڢ%4z~3J ؤ?Lv3O1nc,I*P隲11aGBbInjP@`ü(`~s7L\cQXɡZ D55!0ܥKO,2Wߔ=0iYzsYocVm+V;wJܖݔlXm#0܅f V Y+V *.xOCJzᖺ*#mV|Jl:MƒZsY.\ΰQWcry\MbUCJwG5FW|Bݖq*7Hq?RW OݢW5*r꽿0b1awl-EB&'Fj'lj'qEH":Yǩw +Jߌo&A8P*QA<~cuZȣQ_o8ƪVX>7~md# ͹{K>+|?yU^bw% t 7+߉op18xU֪*lm|I-?_Ma # T~x|*RTjҠ ;X -i/UW'm#*z.xQvK/07j6 BGV2S׹&IX>v[Ϻ-AD?_m8cUW0bcˮ'FX{%'>|HRZћ<ˍhf[) &fCX隼=\^%vѮK +͋vnJ7mɋC;߮*4tcJTGiu뇐-hrV63 LdGZI-?C:FSM֨O.LLnnD]*L ͉Y"yC&EotjnTҶ'{S/0xry;҈[,檡;EUoQuM Ȋvg"hgX]j.7[k)"s0l'!pg}Н"{@}?x;(0]_O|N 9F>:zăX1; 0P WےL%nBk8 4u^_fM)8#?&+S o &;薺*3tGTnJy_C9VP6iA$qrU&>m/ü3 pCe:=Sb}>qMޖtHţ+.kZ7aLns˯WD9TTJ;AoP_FŠB`Gd-)`n ]r-MI Ju6XX3Ό`fH`5egh JIOTKFJY&5P;m\j[yq{cE#Th򌮋G%m gCHp1>YJ0i7m=Yn/u\/VG}tWm?ډ^v#iQXj1{R3ikhK\jéIl"H N|W+ԶET`s\^a&tP8BRמj7\V'44;oL2U|'oDcJQjWbpXHbLiwMQ ȴƲd_G{~.YunKyC{v^qI85hI!C~X]&h,^r(')qLܫY&PڌEmܥg3JY07MoM25WF;oKtIޢVR5ƢkʆTIaPOrhGChp5lpX=I VWl0<_[g[ a!q/;a?_8Cq6X1['CР^vK{SҶbu1ޟ'4z|"OgFˈ7H M4jY*cA= ? ^k6ijHmg.c>B^#` qk*PGd2cMF^IqnYϺM {4RMTJUpI^gͤ j71aGWVN~mMU~Tׂ6,x8fyŌ\M^f6wln2Ӳ#vK:'펧 &4C+R;>㶙˩nߥuNYҺX'<w)YSqJ;* emPɩhChR.BG]D.v^[h; zm0@aW6wK06̤+a4 ]'ĥH'$*]S,1Kw6T gsza)".?l ))!kW貴-dv'${ȁ#Jy;0DU@: B^+r; >*|+r;KX*ˤQ%Siontd" zz{\6!]'yJJ.։= -.V( 钐M©ɓ>Fh pgP!~w{C8{!\mC3נK] ڄmN1qr{i =(J;CUUbNNduj8FgC 3.f2,rLrլ3sy|3nM,7Ɂ9i[ [C^u`H&Ϧv'Y[ &FRNpID(hQho8ZgR?wp`R"R;ɓW}i`!{Y7)&]MCεP)dAi[?÷uP؏X<4 p E(ljvaHhd"\MSMBψ%n p&fC3RY,+=~sc˦xn4a`8'y}uGzȳ;-eh&No2`Һeq+C "cQ;(&6S[˥khv #.rXiq1,f(%~=!;brG}LZXk*JC#*U۵4f<,8pu&Ml$8BvKBz %ca'j:Wl䖚e&/0F6޲˭9nLb3e obq3+׺[DX wR[S0àvG؉/7zvЇVF&S6hٿ(fxp]j F<@{A{F[./5z pysmzNh& 2Xܿd1 IF+ߥ3t;Xp[ۉ~{e춋)P ܚd+}\K\fq3&XM\.5G3 Iΐ^[n&kf!DX'n汤z;~z6dljdstx9mk]Xq[n*j#Oˋ=̤Bm gu]^a,Xr͟3Dp%anC`H&$6$.lrIަoV+㟭١mqsgovWF⇘J*F4TȲbhO܇ ahE!]bbo4uN0%Te  (25{ +pCߍI]ę֏2wE=Vqnq;Dк>AC:y&yf^z#߆$ Bvvq],G]zDY֭, _? =YC!!nRYR*enydulZdJ;`?6T̷T֊Tb yBQ*unHt]2+p!<5TõU/׸TWQ:ۘMx۠, z]](?2}Zl%> gT{X=w2X+V ܬGZ_EI&5<)=AfdY{( @R6$7DN$HpK?.xcuQDƥ-fob/.⬾6P;p,[QApWnaei֯V!P&5V?s+=_eLNQ/k0V*88&L%N]}^^dFRG gҨچf/"7F3 {DAeUjE^[ϱYZŒ`h['[< zKUrDU./7g]Π-q;9\Y(_P, }5CP-/0;h XIn;{eRWV֊5[{+ FWKgˌ-\SI+Lƛ=t}-KXX.sZIJ?BE Ϫ+ދ?},u0Nvij=8W%V ?~5͉M^mHܲL19ׁ  3=3{R~XzN&oɭ죪799^}UFFښ]J{ujtNEavWGLge:/9[~^h+77!`Sn+UZ}HAdlL WYzjǕ$\vZ=V'o4JͤuBhXǙɧn]ByDŽbj?*ͧfdelN!+l‘ې^]'q6ɡB؍Z3iuP`C`vs^*eT]៺Is\ >Fuwz+gryM{xA[6j}1*SIC`A`U|V:Jeɭ]x!83pmjUpȽA|UKuek"vfm<&Ӷ^DZ ٨Jc2Rb..p@` TMnH OҺ sEisYt>JF_`5 0a(M &e^7FUy}NPWfc-')K\bR;n|`0^m q\ZmCw+2WJWp+L0[Y4ZǐJWyMVnj/[c,j^Q$ILwh[nDM!~HX8>r嵄hn[ȉ#yrs sUW_ {}jߑ$Q;5 WtCaR7.ˉ5R7", 0Am+UHigU*MMpcC@߿KJ$N{_.y}(SI3F N5JS|ퟏ gyZ2cu^p3v."n3ULV|nJ₰VQvހ0a)0$4~eM7=( 0aíhj-T åB$uDŽ&6. lam!Oj&ɳCL.ɻMD 9l-o a#_O>/u;Wn^pTx<9t 99hu =ڵpʻ?02D;T4Noub 4(J]W24bu+-jۨMpGs$Jlv 0}ZxV|Pa&Yv25f&>t72n0d:/Gǭ*?7&V0L%Ux$)5M縔[n-|YIktA0,e{4; |SA@qCfkuR6Շ\ `e˩PT+*M%b!L^/-aXmR Gڸ{0P q5-dK~OB`Fr}E>Fh,l##1ie2A;X1s}1>;!~[B& 15yyMš!y 9 EN]>u,ϵ+֐ӜQݞBgSIi8;R3DR'0T,cL |>  Ct7E!ù㜴;.|wTp6FYq MR ?FW'8 vnM2IE wuR#KMIgkv:%nN2ՈE}}csb ]Hq%  ٘qK4Faq˂hսSlr#O]ʥv ,=?OX)+ J OJ:Y'%opIFTE=˄m*|f+uv!0ܙ:%X/\*0\̤B5mr}~U\ZU1%X~m"'zA`^\mK=t6wp`0 /euB"}M5+ id:=.!~JU"33 =uM:/7Q].gfFOl4ƓObt?VN C`7.@(,vp" "Ecagߠe *TXɃ(sS;qu#"%gQ .9Fp=7 p'GjY)K=פgu[5[ rm>bwoZF'9vT9t8n0Cen2j;'mJ 툭TVx$`2\^&oTVJ+ӲBn`19+)]M'b00TE ה}1}.85^(y0wy`0|O@/٤š,E1w}`!m-+ `Q"\aY@`[e*\ͮi {7 zi4 3cP pggC`^>0X*R7󸵺N00ge ^zV`3i#s6;ukȓI 7Ԉ'>0C6c%L`h噈ZR`HQ#H Ƣo#֯]2> enE"Mm7bw:~m!~t-^n4\,P 5I-?Jܰf}x-GaJ`tKR,8٘u nN2}x!.VA.aN 0HJ*GM*|.g:aZ` *ާ8{3BCT9^b?30D&- 鎫ccﹱ; .7u؅ 4薤fHAfv)|:}CߵqaBۋ2\ѳKONRGotB\g0CC kmj=䍯_ +d9f`(rItf;^eޙ. 7 `"nȊBӺXnF`F\aKFbP`j|Li u{>UczfbR``LS<{BY^XJu,P f!+sm &ufu{Nl$~u=a }W:82qADKZ7i"BKX* rnvRǓznn򌲘ψwB @&>Szq2$%xa8V 6{`hⷧv߬zrЭ3 @ C u{ լ沜C002muNܜ@~%rJ `*iF*Ue܈Z5ҺuUo',C20̤2sJmw'S&5u*a%vY1 @ KEOT$O^_6.'ƏyӗYf8B @ }uM"^ H8 p3Ybzok<.>&E$y(hkk@*tG>]L-<ĽM7ެw5mAs]5K2U)MpXRcuژߏ{nw!EZ? Chʲ7ӺWR:ʋ? Aoܽg"n9-+B:*ѷ@z)۹OEi>]w8&DDWm9<{qpgck|?uO1  8ZxBl!NjgaphHn%~W9w3JU*Y.~#?4ubb+eN|;>0hmrod`&6R~;ۨvNos ў3 6,[/k'3zTL<ù!m/ ;w90 nQC^$;,8Ł( oK8CȩN1 S.s9'.ƌ 0\*0p:/Č 0햤A30 F+XP'뵙5yf`vS.EZ~<Z@ϡ nh-Ug{s0q!d:Ay7tP9{hv`\`$VSfLsMx#tW)[Gbf`Nu1 ڍԱ'K1&`D 0 0)!.#0CsSm+e^XmyGGL a怙 **tDkRC`x3 0c,/W߀Q#X1Rdl b`*mJZo^<v{<7YI[ks,|btL._-)p јY"0ܐ`","渚!0p˹D 9~OXi?gs{x `fQdhaPlqhAss/&?0F2\-A#-~(`K`&3S:yytس-M~ep.<0JjבO&(xag& Nt[|C,o`G3MGppQcz&(B^?5ns$V. &F]/;>Y?Uݧ:X (0,Uq8h¦9k_1Y]d}|䔫]xYP+p*UcA-:8?F4Mr̜wS` |ÿ"W^G2^6T'0wM`9,\C 7{kkiиe!ѳݼ_\c3j˴yGGpejd{uAf80~ό|  T z~-Gp4}YW}=?a`% b揚5yKj|f28<(Y捜n3IwS`05zm0g,4_iƨzٌ]?+p7q.إASbf82|l~ό5=3M"f+}glUwS`5L $GL`=?2Ǟ|G[((c"j6> G_\'U4vižf8-0d_s|}٬xU3Y;B'!0܅oxMw)*^Zz1=3x!0\棇yhrQAp7vtV0A#,$|4{KFvd{sl67 `"n- /epsSlt~e{{13LP}x lKTšy;7sSm]Fplc L4\bԘ3ugf51 \90yKŠ3zTK"GLv|vXWL#]'XI'٪FtY"gGv{9Is6>> s<֋, ~6sd+.O13ᯘq. ^$g~m\S'GL%xc{>7n0^ZOh-^Z7^zO`إ . z+pW־[fgELwK l%~Ŕ#~~6#dбF;.|%/ g oCOg_+p'7C`ވF2,rpqh訙ήN0]T1yz숇< ;AOY+h#LDsig:l c%cEN`) x42h($^6 =۔*F r]S[&`%aP4̤m9 Ap<rrJ`*0%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-5.5.png000066400000000000000000000015401322271446000234760ustar00rootroot00000000000000PNG  IHDR TKgAMA asRGB cHRMz&u0`:pQ<PLTEY6^9P.7|ZGS}2W5W4W5H~(.t}LQR|Lh@ONiBONiBOTUUUNiBuG|K|L|LsIbDh>mClClCeETUT1j)tRNS U_ rp~n|1rpq7bKGD,q pHYsE1mIDATxӵAω%n 7sI(sVo4SvGPޙD~fs=0 `0f-fӃctA`=x1%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-6.0.png000066400000000000000000000406441322271446000235020ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1@tIDATxwxTUu}E  Nz%=gR'uIw-$@ @H=qW}ײkEEM@yCV8.n5oҶ)u>NîNw ` ; p`p!` N3lU@0,q+p` ` ׎[nu+l]*TV?Vrg +m Yf-zܻIO.wgD۞pydį-*8Ķ^?0`qƪRejϞE+oQW_{v+ѿ^}#X  V.SnרqHkoI;jo[rGmOyJn}R䆇$>0~`oQMNߘ;pAM}->p.PvۜwQ&!Sa70h}knb{̡Щ_Fӛ?6fu?áGOSo9 fɥPLH6l"v' qħ~$?{ל9CW,lSL5 Xd( ]%-iVvЩYl=k[ޢT`8:o:}Z^b9YK|!ZfǪ.ę*S{n"26e-Om%=`l}mypHH/Ì=GRs?!-Z6)5uUY`XC= rqԶ-*‰8;$K*hI}#SS]2ZOo/]Unp Ol'%.vϽ7tۦ \Zb 빨+mJ[O1hp6-ɉ*,}”+-H,_^Znr6_z`.ٷ-ޟDW=C2ajcFN'T uJ{|Xi'Ǟ$8UoY5Ǵ$v{x_F{-[>#^ ]Yޟi#::"KBzܲ—XG>ClJc C^WDv-2MHA2|ul;}d/.E`oUܢrY61^NL:vctf纊4}5#(El?#Vzٱ:sOOS C}f痾 +l k]2zmtcN}9*r{4:ݬWub;N79]o+_Tu/bJ_Z/)ItxF6dmjC]^{ Wm7:gϛ_95#10šٷWh+V'J g)7қl@9kmcjya{cWKlZnRl3EFU݄xKMbbR^lܛ+%n{I~<_܍njsFrF>1mm{^\L¹R֤ԋ V6x{~W[OKޟ%K63wKrKrs|Ϝ0?(q|CT|}TSo%=\(j3 wO .qaEndq\@QazOb7G4TR ;7D75~%|;x?]6viMoqr{cjV)7iDv`}P?m! 1T Cv:s'TJ_Wx΃ _6CvE]+9Gnf0OJ-O((9'y.,0搢5a  X,> 6Ά:Ob*&wARɤ4-+MYRצyϝ?Ř렍x3b1)˝Λ|9+L{VjwsM>j_6o{1~Mlfk]jf oF'%zW1/DS钳4G%V{,!/~ouʴŹYLsǗ'0-^&nbRY9&l ƕy҃bl=re[Cw͚55sUԬtiUzKurqC$c]LC~%I.u΋Gr6_瘺:]6+ankK=#.Ứ*칅VΏ_'GH{%&3ݖV&) -]CGP'Jo8&UCm A6\M1z~{ΐt[<_\-Ldu!&0= E_dwʾ5uʾ؄\{~k]zBbyBTzc`@ *nOS%Q)Hp|#tt_7SNr*!= N:CrEyfϝ9{L3= 䉛mb[T6ܼc痹=ew ?6m۩Ҷ+d3hY w_OڛEIBС_)Pw;qHސ<9$F:ɸ"oA:yy5U%q[ģW-5mJ%۸{€Eiʼn|r]+C__*$vkfNϳ:?7|V=Ƴ:0 )vp UoUZnWֵ+]jbD U6Z7)eMΎek]f7z/B%lf]\6^kkSNHu2̜Mq]>NդjW>z#Y`]9+{<%2䟺Q%M|_Km7S2J'vq5eI+./^vt ]ixKixoaJkmh0Xi;ק-3TiGu%37|Eϼ10ÝOW.K-n |1Q2Gz0?\' w((6v6'%''6'FAt#OY"%HLHة)J_RzNЅ{Cã?]9+bfu!v(Ie ?ċ 1e:Eqa[B}!"!O8Ch0O"Ktŧ%7l(Nؔ񪃿^-*3-Ic `M[ /3gC$ל*5x jnCNWNg2]ytihx˳C$cw sS;|>2[SkM$Oא ALMO!> ef YTÖD$Ff43z7̑p} ޟh񚓷>i{zstk~dyUE.^:umrI)e#`;gg ݤq;"{ C2>/j6K:e7ա˓B!Է3Cxxml)8s9^B'la8hGZjZ+RKsNvY[F-qHޘ5S̊ص&i\=}JƦ Sח'_b[ޜm&h\^ZuqzvQ%yO mޟ.X=/gItIPSa" 1X1aVZ^(kyZ;b(%5{~eVϧMѭq#ܜI5t[|r+mIabbELY't?PހI"VƔ`87=Ӯ(;3>赬Ͻ%bd/_!oAڪŨ'W?*E3Y[T'aKbZ^76jS>%c}f9[؟K8'='^Qdm;atbBXaʍ!_^ٜ&USiC^9:}OFű[쓷 8)NƵiV6ml:TIyGN:>ɵuѥ-smbVn{7VabӺ+J[,i|}LsrVbM(H@%3dy䊄c_G7hWk' 2wH^✹4;|b~[?^Ko{_<~5 rѓs5Fd+cZ\f 'aP(?;ٴ&Ac  I:{YS-Kr\3 + i~ ,ޛ*5#$s\Hfy96XFnCNௗ ccrRt&ySr]+3WLH=U}lVn:0C R);at[]sLL*3x](__Gڛm^@n!]ypCaӼ/ /VT)6DltfGNVjz9ݲoTeZ*N;fZ[zVbOpJJNagwFߤm`c!e}lV|}E6Et6E8fe=褐 *]Uu~o,w3x*\z+o(-J0KΒ\$YڤMTmXU`]Ýc¶Xz=rKMOtLj_6+}y|߿_fuȾo ]254-{QbFMUf:fU?9OCV^qs^o5ûT^iD2Nr`-֭{V(~K΂!Ov қ=?3u ߚ:e<IJ6̂2Vz)Xd5/rŲ_ąnJ֐Eg vIs?je'U?о+RJfgXi6N峑19,F\xDp8BgFGY1 ml~~}.nU무rk]BYzgmO{]ɻ:0ί2]j0'jތ[-+`qR: vw*Q>0Z-Nt6b!p8EIN qv@,;F?V`w}vw ^oͮg#7}mjk]J)u(Fߩ^vC“>)w ^kP[A?iSN p﯒7gN{#ѵL![)ֺ6% #˧^//9:a(ECVg:RvWSE&D$Ft['Oz2ek  p~o=Z'x|O:r\- 0ę! C dux}0sc&M z ~<%E|S}ߋ*UҶ 08}C9]w^M&N N8fu*KI.p#?w05吲66E5>NkSoנwƄ@0`Ok8(vLYo z%]NEEg&<8E  y}Cy}Ÿx8%|2AV3)F CGW3VY<`82{~SL0yp`g,V N &V O VϽ=҃@089ݲRߌ*ޑx) 3%aBǴ4UYdk~ #ߠTdPLZiLo2 /rEmc4-*s@4S8i~x+\`NI_i`##OiKQYиB%/ Fܷ+WjTih[f病`ptd"KbF7S ~ ed `8դCՁ2u ߲ N_m"*dOӁ>ў\3Z6+CE7 s]ا)2-۳pp ֈ" Sy, x+ Si;=Z:orr{z vI1~s#g7q}0LKᇔ-]j&B* <躋%_1  'v%$/5<>f&9]gV^ف/.Xᒳ4F[o9K.T'H{B%.SX`8ɭO&y`}QvJ?wpNoxʐ#۟7u[:[}SSNiO}:*i, 0= ;z⤤e d ߥy\|D, gO"j.s}# 7K/W\yC#X`zy!!}|Z[z(ag?/J{mHX`zxת{=w3dxw 6cKn}V.‹[wã_6碑X`)[V+|s>6<Po] qFp 2ۤ Gp(Q59VFn}j$dD3+McUns N,0 V$M1u`0Tm2 X `홻 +rˎ&_nq\7=!^5;ƌ41RyA\Ƈ`D^!mfgwA0TO[qÂm }K^߹j<^Emj}qGX`3w];&]w‘cU7I?L[,d=_I<S# ({|T"qUr?N~pJkUtW'p=$"'S,x<^P8.v m׆1k\[X)`Lbӣ;S?O88A{GW%u~$}yƞ 'kWovjݬ0d9S7[F&*V p bVw5Lq7  ~ڿ`ތZ%d5E!EWU C3 n{zqα7%0D|f{7I_$]*mdr9i)A7k ^n ~?IUB[jY0EC,h6$Q<$S~:J:X)RV8 ‹oa'~/-JkxIѣ"hB} L>Pnp [oqN;|'>]^_{SQ; + .pD Z; ✋ۙA`H#p8soRIUA(5Qk#EhN, ]^A]c |Pr]{_ws^u#,4p<$U^=OħV3?5_ї^ZG U:=,:kO.>ˮB1Jt '3dGI gvZ11"!yK{lei%i!3V zY5tWȖ"u[޼BKMZש#iNmlZMoiSYiZO>jv+ Fzs >f3Z}>VlT9KTw-51V.8鎱ѷS&MH7)e]asKS(8uѠ|&x^WGipMt}jtce9 qSvKLsf8MkԜCO#>5 1NӁk&!0wrM q;d\mkU3s0<[32≫n}bV8-_] \EMs6Yu^cȌSjwLp.cpI"W]dõ\DCflpnhZߩ|hǦ])jZg& v CW跎]0dO178!/ Y\-Hws0 k$Ut]C֍ :7}f錳:҈;65ISÒv ~k0DNH֟8hWZkͣ;q:T9 Y/uǔx5 ' % 5s qjذ["Ng#Flwc.oӣ)Ҕ5uH?.ê!ffbҹ{`R=PzCoyl Ǐ k{շ?q %ZGMӗ(wJC'#U`x{ߟ\sշ>&XTl/ J5EHu}&{"MH՝`G%'/gYPlzZf) Y.'.k?W |eqYUy ډ.9Kre3gΝfZ=9}MĤǽ\w..~6f8n3ƨ.wֻefJ>My%)%Mӏ6Kʬuʄkon׾nϯ[0k#*FAkB);{MkVKnz&scDkRn mޟ 3fϞXmVYi;[iFߪk4BYI5_*|^'OzHYhW8wnHǿLwGcnfi^p`G""7OX69<%{upaAHQJ,9h\u󅻏!~+E%T1i;x;K%*n.Morhv5Wzo6C~%V7WA|mI-$:e"K4;lcwבn% *~9~kd %qs 瓀Ŧ" ծ_ugI$'Ȝ, prd}Kfb!|U[z?]93Y{ `sJ$ \5K{-/v^јő׌NCAxQv>ف_"O8=1umK.fZWѷlbUi+ 0\ث$+<$/}%9n-8Q}E춠3|?"1-U[¹3C ◃A/ }lܙs {.*p]0kYت F+RJ fU,. )AbH.i?tskTN+3̲7lITֵ+ L3mKĉewɾ}'=#0ⓇݲC#lR=QZî0 ]vkFOciSZkO~gxÄqkM{gbTnK͘J09`nktˌ_& u~oyy&h4Xi[Φbc̕%q[T~}_KvP ]08#({\ y% táK.z&]|9$QVLYo z-agȋq;^/q;՞]A˲VX:MSMR<66Ncfe/NyW|p`_Bݡ$?|0BnW_,1͂ҟ_H}WZR#XUO `{͙57.Uhc!:ܕYV^ۜ[Y+`H0HvUa ' ' )MnOٝ}2WB)I7f|~{RiM^%25(I4O /:a9I63Œ1/>jiW-p4,=1NĤmAKWg|7kcoeIx6B˃{ϙvuس0866]\|CS) Y `8~CӲ>JV }{Ǫɂ ` ` `S9V N `"` `8nl-*ZSn$ap]rMIKSKSĀ8p ?N0@>!2svqצ툵kuJUPsY;ʹ*R#{Mj}Zצ hnWSߟ%$[;^j @0 @0`@0  *C ' ; @0 @0 @0  @0 @0 @06th_ N S` @0 @0 `@07=3;?0υ|!0cᎱ7=&̑>i !Bo_]HY 1[N0Ï{lcbmW N3N^=N^5.<}JJ0=ny{`Jژ5N\t|ax`~-Mk/ry'KMFTDYM.b0x pr-Hfs0D  aalh+`[Qs0X ~! -]qkﶸilĖ(p`G0  r0ahU}%gmO`X: O @00Jrȱ7 ~5s0 wwKI0  Ίˮ9yPô۞^ȥW*'o <v;3 0)a3x5xz`@0  q0l`v  N ny`í0\rn}:σ!`@0ptPF0 N0F08.Zr]khq.r7=ph`@0  i0L8pn@0,Lny̕` .Tr^c\vHa`@0  V?X%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-7.0.png000066400000000000000000000353621322271446000235040ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE19IDATxwxTU€R],$H̝N$3){z %JzAswm}]A!onbE{ y=#zbo!VK3},Qs-ƄmGFJuS)w=5#zעIUרً5^ JH璿"y ] ]aMMڰujYMtGi+ֈsAaך֩[g$H0U #c4n-'z9oXUn7O 2J.W6\m2+͊/:K;釔Gm nM_nH,Z"r˲<.Kߔb,t.Q㘞8_3;\P"L0'0 J-Mc |Ӥ< $i)Q bsWx/Y.+^X쐵1.}{EBumVOn6~m3>$wYRy&ӬZ3̩-w 'Itp=OeKn >ۤxC~}Lzh;"H/g0t05*yGtg6[mVOi0>)} c˴ \}GxuIO+kOR-YTZA) #Qy"V/;Z_?M)SZ".\鐽,gjL57uE}4Q[[l^5wC,E p%k{E̐kW,9@i6_\c^< YI5gYѼ5I[ut{mVgt4juY*˿mV~6,nq3jKfώr>,N]3ݰ0k3 t>we>pY:sUJ3Y O _C*7! YeYi| ۤ5B[btWaB5`6mm6Mb֬9:;r-XP1%QuC<7E )Ԙ#ziߏfl֧o$w/}햐F䂡YcU°qfzYF'tmu^I~S9tN!`yvie [˪uD~2E<սAMax]In]7kV M|B I }۽=;>x[D07Sʓ<-_"qokv^7+=Ju7YZ v浈_z*FZQtTYb|[&~#mŚK x5ٍRs!z$jb’[K LN3%NٓQx.0G]4 ajҐv-r-XX-U+ԇ /g5(OzӤ,rkhRHEl:)"),x3IƘooU|)1:2 z%YtMښL֛"F{Uus(~coZ2mRHuCפ>^…BZ0-Fo/:uKxASlyҢhhzSDmBRHx/s&+5l}e]oiTsvِ&-d|_^"6}kwf\)faSvlw$gnM60Ow+\R<*yg^3%̂ak8 &:cx4y}_io^6WyY (gMxˤX6#lStf׬>3;`8=#cn }EXao ~M9#mR2}dAs.es痊 'toLĴ؃Q+YHY>p]iqj禮G.2 gVF{2smNSi7/8VKS}XOzirvD 3;Vdh>cNf?xNwZ3qvvǟO0W$FZ4eb>EҞ ѻLKGQkv~ۦC#Yy2nOHܢ~댁Yt,.jjH1%%~2WJ]8gmڦi\!w<rC UftZtEX1N],.e)NzK^\:"qaFXLs+ѣهߤgNYfT䒿0fg 9OZ絨>Pꎆc0ZT@071!sxj[ o~Mt&2Iu"-#k5U['y38dEJ݌f$싙S59E:=q!q݋["rVh˃[bvwoPv(vwKmv*̢S&& Cf9­jNS75u>o[,~\f) ^LQ_tS!%[-vܢS"=$TH> <٨~[kCθI屁4>)XoSʪW&<ɭ`tXEHiT(h;@|HNvOciu>HgNs?$heڼ~fs?=`|)M= n[xb}]渺/)1:3U,v)JgNm]8$Z_I3w3 ƏkQ~>fcl1b~s+\Txn Ĺ]xQu,b3;x6e85q6iR,k8^a>訬3la6jA+9IuL>`.{&<5](lL5԰7XRM+  m֧C/Oٯ[.b@ְ#q{gAKs6H @~|gnzwGCn\s? Ý9 q1,Nnz4ҙ=5Z.77FOZP>EBQq~L=唻&3t]\EԶCҺi=n{ȭ꺙k [K_ڔTɢ߼ơ{qtAĪKKMk)tY.dOA71aX~pcd6Pj5DpM*YVm\' m&Yb+%bcˤs ͢q1G> ݣgD׬>>sSK޲\yɢByE .32iދ2W,\:L4{Q.~#+|oqM|rݛKOz # 1{[,Enrnp͌).qa t[er['#6L1!TU3.N8-vw q5z$۴-)ҩ&Q"D{40= VVF ig#iCmA3Z }*{QںN+|zimaXg1zBc271/|M6}Ѩ-΍1;\m}R!гsۖf|kAޒzSܸM~1gaM^LzP-{QR])Q-?aZ\UtĦ] k&ᅋ/nP~TњZ|Q$hwBHwf7ȏ-uK-R'AAv¦c EˡP+[\#;k;dr7q}CiReH5wpitϞ|F:-Utڅ>ycm_v8[^昽2*ygEX%̞#/^Z&S5w:w.%IMO}0gSβu/((lW~3+Ǭ>KR|]nk!ͲEYn/i7r)m&>zO Mp˴7M0 2'#pBWh- k*d$~,l|uAQZ<|%F~xʰyjEn<1fwȚr%i=e-W.뜻8a>,S[Z|)>z+vW Gl_U^"qG-&q`g((SMe[$KWn,8(|7o~Cp=(ؐ/7G Z1{Upi)QCz`ynoIT>kC4>r_ڈ݁rU[_g|W%jNb_ڌFW0 X"/ KeB2o dk ů. uckQ|YQbu_bvEk[.}cdm!{YvK[es/+fJ31^88f. [VoHؤ'Z"7z-,Z"{e g,Oys3 ⷗m,e4y:Ƅp1v;V4t|S<#-Dm8Uij꣰oNoSeݨ17TeeXK[>@^KIv5tɾƒ>cnjަS X^.=$LX:g֌%!k ].ߔ~' UMx]`c= :ai:(vYCP&~?KRטEW=,My#kwi62mWa6z*<:;Ձ*CےT/zkq K\LVgW&rnZtTޙתB:A{P@{ B+I}[uMAt*4\)=g\H'T'u岲F OMyRpH@Xvxd^/IHo *;޳SApgr_JnLyfvW+_iR};OzH E=2j`52ZU 3<Ԗtz3QISu(*5K|KqK@`wX xs*t/%7_r' E@Hy]9`cȭv{\Ff;R <\Cee:D-+샫qBs^0ln8[s[g*2i}ܥ}޸S MV]\KКwt'W;4'/EmygN&񋈍 qUfэiu:C%vh?ܑRhC{q_ɽQXQqB>Mo_Gav> ~XvZe6)S8dRO;^~¾ <%06[ 02ᡀEα nCV䇮rgiG/ltVWySk}a |PbzϿr=>mv?Qtwk*h _Eo7j$^[,-uLjzwJ|yvJ]\ZE6>awz<)p[[bg1Zxx[R;Hsy\++0;yrK{T\{H3tw;w5Gvp}S8+긼 {>ޡC1b؛; \!C \G Ϲ/}H. /w04i:N98an"p ݒ~e 7./@0 @0XM V"Q(qTN_!&crIU;%{2. XQS8$w~V>`n0{ 97%Ǯ)p١f?#DfeH![Cޘ"$VDank[Sgy: [ȸ]+\`/L3}0=R/U~`BX`>:έ\MQ[\ ;/(r ZCVryO"? a|n!X2琬z9>:'uz[wƫ& :N-hݔ swb-*9qdp|VFr؝qŽ)3E*?N0& ykax8894=Ån]oU6N~m08ȌW7lcZd`m}7&oq8oʟaf7~<ppI!˴)hWc8*)lS.;u)Cv*Rr :ppJnY+Wcbgr34h0zGIu/npК vqO&Uɛ~_ Gv>uyyi~p=}{ ד##=)8+ iuYo_:"kQU`7m^p;7^H D{]Z6+xҏ"3Em OpG2߶kL, <]v W+qHq;LÝ`0M|IyY[W[!~s5]~&dcyۮsA̵gZ駍V:ع[[%U` 3[ܪ} אJpL{n@-np{-Aq]~ug΍jm]hp tzqn6N9_8#Iu.\ǹC3|cx&9 !;V;-wH}[\;wfqk+wHbAiE#w\#wg7?^by ΁O6]YEW0dV|l-z: Y 5'~􃲶gJ?W3O|]Qn{rbnp ]i|]•S-l;8/qHĄ!7s3USSk׳v/54]VMUo{GrҌBaŇ1;}teZys(Uy; _0cr#=!E<[!6v(v-~YS nIԈoR%׈B >BbNEn$N6 D'tvv eEmW#JMO"ֹ ܄4A̱Ef\ s ܋nC1ۡOBǠ?7ːqHgp \*<0aɠ[=Շ H }c+$QȮ@|@a\PFh7a]01k ͂{Nc,u\yrVx`Y对e88rE?GF:z"VۥGG9W ~ EaJQxN6#}rB:<21 `1G9|yFBeLuY-lO6knjc0L ?7E?,Q# =ιJml$T-݊F҈f#{[+訬kBnS&'v}5keEJuC)#G,ZaoИD5V&Uߪ8%{A+=R?j0HT׬Jّ4{eouy1?w1bG,ˋq0Qu]UW[]o8,˞ q MA߬6k-ɋ ~Mq* ǚ)I͑/Ⱥf"k]_g[ `kL93՝!D>sSj>WZU/K^/=$EU=ͪGhIu{=`7WCCMhQq^yi" ) ;ۤvZgo eZ'sS|\`mM55.M^on05㫣VniRoU~*fwM)QңwO'Uw^"SLB7O:-z}su#h'Wj'ETj'GS4Ցw,[jR>߿/K]됵:SZ BL9霷*[]SyXq~ .{L+ ܀<|B}Gx|bx85bР'cӶnFv!kCZ iBi3\9AYJ%Ujd.8Q}[YA7i,%nN9󦢴t{;,5gNޔZmUѓlnQqE?'&be8 ]QШL-5"mY UAe/uQ0! yQok0Ǭу-=chh`KcyU(G `ɘ` ` ``@0  @0 @0 @0 `@0 @0 @0 @0  ` ` ``@0  @0 @0 @0 `@0 @0 @0 `@0 @0 @0 @0  `n`h 3  zhxdS?A 3w=mb2µyp5P  6\m 7N*}0l['\ֻ \ [5kì  ;xbR NIu mꑊyKī3ÝGFMp]Ctk4iڈnԎNzn`A3c@0 𫃁G\&) ` ._0 . #Γ` `\k`  @0 @0 t@0\0"B9@0\  ` ` `  `x>p1<`H0S=D0X @0`28 ` ` Y0AI0 @0\`K0ÅAoa .  @0 @0\`j `3 @0ï }?I C1 p`$`#Iv{` 0 p`ئ#` ._0 . ` ` ]kd@0tt . %( ?9PGJj%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-8.0.png000066400000000000000000000201431322271446000234740ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE13IDATxwxU A(Hr)IO!;V,P@@DZ:ufggf_guvfw}{; yzsN"nNvi+2b*sb-m/N(m5@0 ` @0@0 ` A0`  @0 ` @0 `pBCnrdjѿ$Eijl0z1y[rl8v+/{E\x5*_hWu$w6ӄg3oҼWa Ұ'RZ ~Py(nϿ~K>~}׹%κ䪪˻^O=B?*snސacI+56ɩg_rjAkSkfFC᎜.Yۥ:~A}7ljfp^i65Ps2[^j7a-Noi1 ut\iDP&jR0t/ڕz~)/g~J}YZ:m|P&jT0Tod.ؚy P/ҲpVZ4Pc!w].H9ʸ']pU  EN>ʻ&΁@8'_j]qXP&j|0Lݙa#vҬ[Aۙ4 78_?yMCcN9If mɻvK=L`8BenLlٯ}2S J)wĝעf ЭpGuO3~^e@0TyBUIK{ի !㸧G_yt `隳)ݰ{ո@0 E'>?e în:fvU.23нhWnum.Wsk`LqnC&9RA0!A0ONz<%}aR-w7.Hƌu῕nk#rW%%׺'uзVUUUlZV`&)x6eB4~a7êeoUwG>%éEuac_>~8 SX|T M~t{GqK[@0(~13`R0``b緿ʤ`XTy tJTJx />9D@M)+)GS.H ,}FԎ$`))oڐw#n8{fjp0}cύ7ZA݆uM(`l8lYR[++Ny'X aբ]gmlqS䵑M2W=+B/~Zf7#@0|e,yԭ җ&r堫M,/GGc|u)םtP!l\ig@0Xg F*|vb׹a$8&jr0|aOxtП?rgZ\خ#W@0yzR^CWF]QZnձdOТg;\d@0|m_$/af_ /[}wCCo׹eAt _4kGVUUe't Geq 'w`ZE\5U˂/0 ϰ2 _>k[y[`r,9_L47uPڇ~K;_zh54G*O?r򔇓F:9kC- WLpF3օ V_ XʌuS W/uel@k_F'_ {8FkC>WPr”2|{wAm+ߡY=A{UQѷ~O-y7vZxM⬙듷/~]do8֯wGYO7taFK_,X=tmdkV,.ƍ7O<[{HUd̝u}Nwwıw HN]ҿqi[itS7}iֳ6$Z;@0@ 4dN\;IAS{UU? v>?ѤҲo@ M6 hЯ; kS/!  uϯ~熮X0_{k(uˑݍKG>)9?qc?ޔY"?跭c87-k/`[Wf0\7dӰrq3) dO7p۰np~eNrHY,Лorct|ZL{1%(^ =OnC_ײ^J7n8tc ꛦgK~=i0AۄAje4oеO'}ٱì=nJ2/>hշ9κ(h#&1 F9`jM*,oVg6ink\iDФ˘)Aج`3U]s5W}-w;wOµUӂ|8ۼ[Шu_jآ/M: o8vaV7:9K2IYdo7=-lgδn~ Zoʡ`hتW6;K;ïI)mxwdzb 5etb7Y4 UI3'?|a-,ιk4z&qE(Z3y_SYWlSmˋ/|#;".~4_U|hmu뎸up0mFm^?򂎣{fYS#{MTؽhk^;Ny|ԁY#-x~?e=9oBCք\4?cײ"pgޡMGni^3cZ5~WESw*Y_vo*§Kօ2Ò?޸1ˇ.$c8ResԾqϛܳ:G=+JY>G}ы#t%ƒ{#I4TTX7#oqj[8].)[ئC.X{s3b8 =m8f^>O3^I}{IC4yP ,R {m{\S1 գ[aev e74fmLMv 4Tݸ1yFጙ)7UUI׹۴&mozCns?ةr߳h#vX wF>Z zD_t{/s|زR Ǔ.<Я/4̖ft.㉱1P[Wi,gڴJ{|o{4T84>={D>*X=tUҁMw&h8 &kk:^?q;OZ3un_xߔdz^hI漒%kS~9kclOylG7zڰ/rp} Sxؙ^tBpnz-Noi콣,*%g9?3֏Q[=M鿬\V&5,NpkԦ_Z];# {-^<{ʙO0e;Sޭyǘ{^XΆٛ.ݞ]Ǒi^=/~J^em:z 3qYl)ݞ"<.~j]SWO~tҖٯű>iZ߆-ݶ^'SN?7ӈU I;#vܞkɊ ;RP3'R~GȻ?4o˰8JGq{uN;g8\7QEէ':nWԜ׆b}&skG}`檲i_Í÷J^} N`bYg?yㄇsזǾ1iϥ6Y2yGѤٛ_<3𛇘p8у!2g'_(ۑʴ?=OY}â]'=4$wMw)A=L<]f7ݹlQ?[HUϧ-i9ڏ$U?yA]u?e=CHY5bVfNPOJy/~r,'%U?]5' &͋N`ؙ%gwָg?`[^4K(4@قc2{S>5o_戻;kc{#Y;hdCcW$jgUylI5 ߙ%F~5ɥqu>%w_8º)u +*x.w7d_rz'G_S3}oS'+l傒p47;MPїuY˃{4} .9{2>Pʔf' L 'GG 8$/>!2`ٛG9RDwčK]<  #`A~N`蚿73[oڈHՊOppֆOׄccڋay.Tҷ0YRq9[fW>7t{m;GN-N;d+'`0:V8`84 ٨8~4a  vg|)Iˋ>qS|a4~F|op4N}-ó,1?6lGOW+t tɏhW{Gs VnԶ_0Tgؓ׎A*;fuɾGCS7)`Q-Ks?,~CŁ`3[ip8bwtۚ[!ns3n[~{њI{N{z_θ3 ^3$={yjV09<}ɾ?O2AݤcݳtuN.j^0T )|#@YŁl&'?qԋPagNmcja;kݴ]s_lٯϥ׏=*5-G/8va't+%:` %FMM Z ~ :a).qr`ؾA  oF]Z1.Sдm˂QrÂV p:4~pP4-"k)N?ys^݅;=b##ץWgQzѓ kگ/ 9 G S| 3 L&ݖt/y9ӆFVgGggO#4nWhݲ_"" u O~gUrEk˶E.o&;ީyo544{޳cɷ)ʼnA͂m/m0Ծ uY]hyu6.߸M5;O<ᚗH'#oB# kD#P,b[튗oNZ=KR4̞#eiսWjsB q5%?1>Xؠp(-#Ȝ;<wcnP|_$()8(>o G~?NWXq&^:hʵNy>4Qŭ)oL+-VpBZBϖ+y,bAp_8^ w4}?>#F?ڣE'"/T<<펌ªykw\]®[C 9;غf&]}"]ܣp͐3I=Z»RP"e*y$*]s;9)mkW% ؖ#DWc[,q;X+^gt~@ ZhލՏfTT=fgcs)wL+kNJ;V\w"6IǢqàhY|ĚXt j>S =n-"4Q'O7~S4"邫RZB)-ajjPlXmyO{w_X$|cQVخO ߭Y¨VޔPz>3iۤ;=7GB,T9oMoK[Uzo5yG+8p∎& ,~Zj0.  :Xx8uL%/rG~P(`'O)ֲ侜U#/W,|lF1sɜ8pE'״4ijGxib¾u7Ph Ofsz֏mN{qpNtRPxI:]2^F\=e q6(VtNs'4Ȫ!=J_Jh4,z.H\9lapo~3+uW{ܽ?YPVڢotb?Δ 8E;No3wk۶6E39K۱_p%NNss]uZ_p߼/yu?>{pO =߳."蚹4v3}H}Ǵt/Oճ{ɳ2ggII/鑛p{5a~~vk#'h3'ztU"N`8#:#UO 9`wЪuqmɏkٮ[^ܬm+h{Q.l+wـF_\e*U'\W`٢BVt?Ii4;u\gG`d}zV&#vx`' ~95?Ҭ͙A[N~Y١b[ޤ/F7{#R 6~9á\ukD_ 98nP5wxP%|]MJvAȚ)Ko9k}Ţa+mx-`SXaAޒGT 8pݡyO8Fչ-r :zrWwXR2_M0gTPa0pC+3RUXU`ރ+F}9ݬ[`؀#{^=oH;r;_ &ޜ}+?~lx-ڣZs$輱o5o8NYϨY|E~7ןpz~mZ9t͹ ˷[y8'~`S\ܫ= w~w]_ l l|wU#Xl _?y.Ip ,ʠG^|\΂-o>Wͅ{"}2lݮݳw^7|[/_ϪÑ_;y+u$ \Hd{Ce 'U?V1Q=ڔ3>CÃ9JݹpwkZ~ okN B0G~:/(\}Yc7vMvNjِoaI l=鶜WJ irAM1` RR>)3EYgM#n͑6?`/HJqr3=UXxxk+ iMlV o7bx+E~`W_ZAE;_$;vH)gl Y"ψX7 ?3\7ysMzbɋǶv{%' ق/B?Xs4g ./:tNi'v yƐO/=7H-,32i ԸZސ^Џ˷}엗 M<>zsM%=_}Ÿ=m4ZޞLw. .EkO+/eC?YJD+ s |K&xp!54Ù+?cRiUiݘ^lVw[^?^y(I~5ysƺℾ 8/jd}})3F%N20efbj\V[Xerv>W# џN4$޹.Lᆥ/졂ʺݑޕt˰Z9/ʙ1!; SI&'N3xRBO q_4O7Ͽ"[Њag.x8O<:\P}Ku7>W~kmyvW~٪.Jo-z?ܯ-K1'cuּ:jӽY*^8gkޙf,[p׼Cw=38+pO{Eߚ~OauxMy7dz 5l:9/ic-RRmָMlF&ɍtqo$dk$`iF6 jW32WAi[ *{(omњkd5xk֪y|o+s7-0->_^T5}`9;|p3'oκe斂+.o~%? .5Z,ymnP+EC?ο_СwA+[jԣJK=V_utPYNJ[i[>ZRO?zxK~u(ƕ#_{&7Qz?i.s+ߴ\{>^+ΦXk~l+xo )Ch9kYo ]s^+Ӄ̹Âꎔ'վ$)K*mɮ6sskU;‡ƒ}#ȟ~r?8A=Y#k2.y7,q:tiQvDrV-K(Q={ ,\1_Cywo^3ys~Mu3ݺ`uA%/~ƽKB+/Y hZ|_a0Ƽ .} ΑXryAYqp̏<5ۓVĢe3,yqb[w>7>gѺH(WL='HN FK (8©wEً+ }0Vys oMyDY;;lH2/V4s@~B0|0Rf?W;j 7Oc||o~ZH9S;vgIP a`MAP8Ѻw?_J2 Sf&ߔx={K=0QF hH~4}+=?Oג'5g?1;38Z`E -+1+:Ǚ7ڷH ёEυn+ΟT .x?|[%ÇOHh N}UX% e';w3捜U7P}+F~2e6oqEa¦|8i_?y9-+)l_{#oGoɖwan4m7V?ϕMٜ~o!h1j繫g #eɵOmX|F=OOs1.z`CS-;? ߢ5iI<ܞA.iھiд{~Qqrۗlέ|$ُVgtzrW,{m~308AΨK1;uЊߒ8=H-y> miS;Ჽ%z䡩/:ЂF[1ߪy,|#)y;!&;(\i;?-~wa'*L='B;c3_zaKߗ)izrs.m}Nڟ9〮A+<{9u3'3-_ I_7cuGnmS\{g7qù<^=zι2, ^:%w:d/H W獸`O[S#eÿ\/ؖt-ïD..`hM67:IШqC!Hyb%,M[|ϊfPoN2c_/~_*ʃo)֗p8gP"=wSN~>"%] zc!L%ɷMtkVznApv >tm &`NIWhِ9Fhڽ3jw1TĘY{q&_Β+Sk\|mA^5:➽ۥ&Kֿsڌ!eJ\!pE)ۋ; q=0sSߥ}ť&۪0kmF <>qEri .K[  P{ܽS.ީ}R hKC^cxW]pU1mgm '@E)O6?5YgG^\Fg4 =tOiͣH*mmh=}pz6Ton9+v8vO\|u%mAV8 ޛ#Շ*OgdS%whٶw"|oe w  #ѿ=S{y+@0|D0<=`A0` A0 `  @0 ` @0 ` A0`  @0A0` A0` ` @0 ` @0@0 ` A0`  @0 ` @0 ` @0A0` A0 `  @0 ` @0 ` A0`  @0 ` @08-pc4K;Z~2>ij8][֊}'=4o`3+j 8 u8邫F̽kҮ4rVvv#li 嶥!Mt>K u/X/ ,@0 ` a>Zez4/gd3vMI9\!?լg-{ݒb%3ѕ |@Kz51 aW MM}dRbKSqݲWfƗ-? 8urkUjפGpBŋevO=ٙu=ט'T ]969|,|]R6݆_w򶩉+f-JW*Ŷ0l۵q!C+^!~zf-/ L :V\Դk3vGW?EH}0Orъ> 1eb6݆yaa<]١ݲW XDIROܲ0dQ6:cG/5kbs2HG\B㥉5GʢPg`/Z\W1GOMEf=3Bl/SWXeǿJ^,Xwpk~ b_YmYd/|jNR _F= 7Tn?}QHRe{WOcf{)s|גi[H>V-Gˆ-x|n/;1ߜPj``(> O!LlZ'ջO_tѷtSƲGXwg2go͸6ϼ,O}\0) I|mxbT{䖄Wfb"@t^*}oNξ+,=~K p*ClABѲ?:^!7>[5kykֲ.߻)=r) w秧]?wAS:tԸĵ6;]0 [A0` A0 `  @0 ` @0 ` A0`  @0A0` A0` ` @0 ` @0@0 ` A0` @0 ` A0`  @08Ļ%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_-9.5.png000066400000000000000000000015401322271446000235020ustar00rootroot00000000000000PNG  IHDR TKgAMA asRGB cHRMz&u0`:pQ<PLTEY6^9P.7|ZGS}2W5W4W5H~(.t}LQR|Lh@ONiBONiBOTUUUNiBuG|K|L|LsIbDh>mClClCeETUT1j)tRNS U_ rp~n|1rpq7bKGD,q pHYsE1mIDATxӵAω%n 7sI(sVo4SvGPޙD~fs=0 `0f-fӃctA`=x1%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_0.0.png000066400000000000000000000316431322271446000234160ustar00rootroot00000000000000PNG  IHDR T= pHYsE1tEXtSoftwarewww.inkscape.org<%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/ IDATxypGI)RÒ,SlGdͱ㱝9j7[;[)UmRI&IURTƳٹy]$D]?W.nY~ "E0`P.@]u "E0`P.@]u "E0`P.@]u=X:^S3=GZ|Fu 5=. 8Rs&}_r8961.L4zhay=%&+/-9@;O7zX'0׮M;ccу`=!l*?x< >駧F+yv~n`‘#Gag"O>3 6#_9ޖ;D*:}v=-'"B0 M'wt_ n$:Ҏ,Rѫ)lz 9n\O^mٖWLhGεmբ9vG<G ;ՠ*Exht$kZT2}ZKL~nX/|賎a:+__{>}KQ ZjT zB0Qج}#x/"FDЩ|dj9sS/ `kov{˽&?< w`__M%<ѝ*"0 o\`3EN T%3n#O4z7 _.'7wwG%ձX\|lShZ zC0ϋȟUpkێs'D6lS*_1, @]~ "E0`P.@]u "E0`P.@]u "E0`P.@]u l#`FV{)U^ReL)dž_"F QiXR(F<5w'v!wBoJI^>R 2tj.h/d+:"dήk{-]L&Fw]X(WKe `!y\=<T{jao:34,E}RI䛚r;(S:;Dc\Ϟ;9T<"@0p T&wkPv}Wؤw[[Zwu6Ne]~3FB'0-}JqʡW&F 9#`1V|oxb|hL$H&G}-Yޱ7v2mQJ3Y8"S;⤲a[4>fnuZ,hm9 6 GZKk-B.o˵T]Lآ>痊B>=nLYJeJ:Z. p "` DgZG.[뇫\&Hqj@GNpirdhJf&XV)-TjUIk٫f_UTę &ȕ+%5k]eAc](ZgdfdݞvUex$" x 5 L1/vOJRJ9N$mpM̪&4`5bM{LRUqgcAM"m%ENLXkZYlX)&bvg̪lLkH[Yԑ( 6uxKoÚq=ձtRk{[2.\6,Jevn3Rh~\KZ_IvU0lƧa R坄jq6hFӭMdP2j8177mEcր5FY +vwjy0Ӕߣ(nj-nm<խDTJ칓7|֋+֋gō3ZSJʾ6F0qk NE[وZʆmJEDBf|rdw#JPsi`8% րMlybd߀^KA ?]dl|۾W6nh4ւ֘+斋 5VVl,)څS?z gh,֐ҁ5_2=qRuʣC3&"o;ti@Vٝ_;W9Q] fUJ-g#GDtŽxr%*KB0*~_*2o}qS Wyull7 Ǘuqhh<ԵGN:ZToGd[yGV?f̛ \l{)9ZUžяœ&-VmMo/D Xk'gt9(U}Q7$XcŋT3~d>~C/r: vϚbbk=ǵ~s}&92㕋?voXYNXKf՗=ZN],+f[X\c Jx "2=T\ eMT(lk;ggv({_TT%Mylenje_/`#`e3PuG?mqzQOT[d΂7wuNäUS~,U(̄M]FNsjZ%7¿U6 ?z zwa FP?&s{2ꖛ>UU-W?u]`<>2Fٟ-a<ϸ::-bBjř ]fq{VA%Z[(l2fR7Y툓mlV8ѫSg ݽD&C0 ];⿞nֻš53X ̖g:'0d"UvZQ?x/J8?zccV*V+rː(͕KY)%}ϹJUa gsóWFFsͳ;Z-:2aNnHkĮ\8#/ 88Vй#ӹ5m9y?;~e=MkiV=3뼴OG{;M۶ΖHÏ5%hŠ+`ԲHwciT5*ʺJ85b_.o=[jK'u}=wź(m `k;?GSqlKi|x%E?Ύ#C%vf/+bTX)kQʚfEDH|^`#`Kmɞ}$v~\lS"QRJ1ŹphnjSam HGgk=P@Ft< r|[z<'VR_M7zI1K e]׿֎_Ff_?ԛ7Iuw*ׯaEUJULearO4du<(OO=Cw'7;n̊1Fl@j̊(%"Z+nr&kLefZXZ$L5md[h7X'XnKq#Z[55w0I'rCsgO+?;mXWU([t+TX+_=G7}<1@0mGym2+\m>սun׳HL9 " =k-+/_|?^`_}ޞ{O_)= ׷w+*Wm-xWc;uH4-Dḃ8B dn-wy]G+a9`{Z{-绔RJZމrJu_ھ's-gc]t~&r "ٟ"no˶e۱C.k= Cٱw~&^ܗ4JhG${?Dϯ _%I]%J鉾鉞+Je|ŏ z.kMKƄJJk!=elxЁ!%v`ˑ*:xy:=&'* i/A,8uKJ^D¥B0 \mڲlsۙ-D{AM +dԿ~*`5 ”R.ZUJA LO 7:C0 ڪ+hLn_ޒcRkа`%0"b~(۳v?ZK ת2W,^:8[-z_c*-E&Uj*ZG$]_];swMn?q'槫QǷs𥇓–hGM= ""bÚ(Qܲ'/NfF]˷ں&RSɶBf# {>utOYd̺'[ȣVXO|)lD?ۛ[SxXN񜊮Z+%J CHflł{*W7;Ɵz)f '?o7;cݍZ&ŅTcG7>*lFnw~$|9WWC)/-Vaq=?cyˎ \(X~n۝/%3vHX}4Ğz{PmS|0?ә&HT+'XJ}}[ξxab%xw~NzV[zqVje!r/v{*դvi:_88^T[h󧫫|,u<;~)+>q\jWD:Ρ׿unZm4u|ͶyK̾PJt2b}?m۶sKfj 7[M>Հ^Zƥ3pu}[F  `3#=⿞mwI?׻iΏtrh{~o9in np[:ϥrTJxJ%R`S3k~\Xu@TH*S۵#n$"h?~LN5ǜ;<1`7n鶿*}vST)|aV3W77=.Ƴ.5(#Q'qL$2-Ab1kOz֬1VIUwW_ӧI= f7ɌFkE"1oU jg'd\Dq6foūJ֎DWzX1F$ RŠ.PתUyh6 Zv3oM*&/ 8#"ZD5}Y9\6VO<8w>ֽ/X*i>Nc"|d+s33Z,ʵZc$Ծ77^&xa a\\kG؅7&.<^M[EÅɁW&D W6Vͽ69yhĆRF]!07cV[gA*'dJsD|n?;,= 8=C϶rU׏`٤DimR,KH-M~ɖf&JsC ck5m`P]}:ڊ!*`)y8(Cm*3%g m$uʑ#|YX46cy]MɦmۧHu 筞 Y t,>qYs ?k * ӻ}}{O}rj$F[F p !`/|VJB)/dfh `IPjb*Śc m]zXeE UǛ]c]̍NRuz(Tg'}ъk6:?S*x? r~|v58! #~,u5&|(=;X.o9D` F{Q*ϬUJ\?*lz, eGJYP d\.@]u l eqJ|JX&UY U :gK-`r=5ģF+*#J2XlB0SSM{8whvjrE(w#p+ `\Zs5(ת%`glyz(6+R *4N$ӎ:` luܕ9Mxj)-w~,및p+! dz"2aHh5"̨XOEf$X/u "E0`P.@]XcV+J  Gkξ. u`5UtG:[L2m`31 /~l߄Xm=&kh1TˈˑkΈ].@]u "E0`P.@]u "E0`P.@]u "E0`P.@]u "E0`g=`5P.=mVob-{"ܲ~VcqD1 :ޜhpYx1` rrƉDw?k1Zm{`B(-󾕪Q1CF|m <'6ں|2w9n1#6"f`7t)rEGi>FD0UӕJ9U֚M`e3(.rld,P+JSny V1~>_^NA0JSVWa'4ǦgXAZ[uï_>[:. jvDni0Gi+6UUF$X`c` JYcrb@)mraC0"J)LT  &p#ɶv`E{cD2}h+`E>]>+ÉI[`-wV#E0`P.@]u "E0`P.@]u "E0`P.@]u "E0`P.@]u "E0`PћgG>IENDB`calamares-3.1.12/src/modules/locale/images/timezone_1.0.png000066400000000000000000000464071322271446000234230ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1KIDATxw|TU EE[z;=Lf2Wz'{鍠[w[u]u];*e~s*H~ie~=9G? i4VɭtX۵c=iJ@` 0@` 0 0 0@? #7Iyk>, }ږ7øQ-&=чI]c0wp]C[ϰ66i ߟ=?uViV6@`N`sq Y6~5)|Bѫ37ۧ˻]Xb$?G}RZΨn㞘Nݶ;/2.tiYK,3 @? iuХNrP"6?rM$KåZǬ;32sg.^5Sήt)p~FS̠EŵTԢ>Kܬ=bgھ_>|MJ-Q>QZ[w>m,Ii`'A^%+v]ҁc̩ r֜G6uoʏ:c\p>4'ڤYg.=!so{MYƃ0<0\HJ;+-I+vؽ ]fjq#B%>vE#>-{V]QxGS0"7pC vǨ m$)Ɔ$@` 92=VڥKg3 ,I ?    @_7A_=z(į d<2pV n'0>YD+WeOm?0.6)33ȩwNt+!y_uk mfMA{njH5wp>0¦OXsuC&x}6){SmRئmp+-񟟿3?~hѼ3>DKCG-5EQ"EeKUUK٫"jv |]E}"bhG%|`hXZ5[Bk5[^JvDv_!}Oz5fH%l`hئNvܕn756ukjDvj*Va과% ;OKŬ<3Pg HMZU!, ]_-%s8KK  )os^@U~Ώf,IݶWsA♆fTZϘA?v3Um`0cέpUam){^O+ _nnbx ONY9gqw+%';] %eR1204k Vv]džoyM*@ Z9A 7Saa &havEkz77kM֑u?8!`[ -j{/Ԇǧ+xpN\rku^V"je#~oIzoA>ZUw!so|%ϫy:  Qwv~qO…Q%msܕ~q`7iDžz)}}#~37Q!Ovy9Pͻuy(l xSY$ ߉]gm<7?o2A;6`Yg~ャO@u G46)uFKqXU0{iV΢IY@&kU$9fbFH"ѩaEa<WmNq/77uC¼-/g ~gȯq'9&y".͆ʅUC ] WFo[) <@̲Х 2Q~Q5| M=W)}s,Q+s6˟mO4t$NՍ Z?Zz%{ϻv3GXzkg tɯ96ftL#մ}?˻ij+Y(iS=S9oTMGOPin6i=Uxqw/f(E%'xinxF-s]?:/*O.HS^K˭ -w`6k&FlN^0VNqQgKGMQT{c{yʏ;/z+(I28R/oz6/fٛ/f*&=Хְ6>q̗9U9gBW4w<2@0GKX..\y\YxK<7_36M˄ ˒:VD Ae>`/nLJNܐ^s3- _6=h, _~l$cA>m7 ߱O˜Sv\|?]ywa8_7۞xܫtEAntޯX[kܪ3i47I[c|P!:rJrb[ٰ-SwAn^.mWcن􃑯TN?~rfB4Rߨ- {|ZcTApO |0jt.lOဿVuKg40T7HԳ̱w%X꛴I ڋdЎ ^:>\o~| vIO; ŭ~\I<3nҴ-f4?ÊFpMP85ǸGjNι;3tէȬBIR^&ЖxpWIS:{nܐ]U?:/5Ofh*<k9sڦݍStar֕~z3i_W9gKAgue`3Ɗ\oOۏ(U*dQR캰'lL皿9GT)- b+O|w/CYMuu =MaԞhihm)&4}qŒ`o@@4E.9{E|F드sZ%'Y%7ks:Ͼ+03ѫSvZ$ Er*]RniH$4hLJMz)=iQ,ItG!dlGS6) :۴CIͩ"^qٖ%28fH;D6.Y+K}.je.[TaLybĦyL5JRT{O?gV,^uFGqtڛf%2uslZX!scY3;tYZ&Ž ȇ96Gz @_b}겼ŭjͫӑnkl&I'ۦ'd/mpiZ}:wy- Ǔuy%[ 6)h8>==wv.NWon>~0O5,m9[,-n[[ƠdmE%/34.hb{bt`(+XP A}y;Uܵesg.Y9!~CtSIgՊ%mK<;g\q*2cI߶W3 q>K3e 6'-'iH(h}O^7l~{t{IGC$,_$ojԙ`|ң۾]ǦG8yf^v /Nڙ+Q4#jӶ yU5.}kc֮tn۳se*++X. }9<=uz#rsBw<~bfsEIOh^t aн_ }00LK8(Ww<荒VTV5E5ڽa5Iճۥoʲ< ?Ykm+C$n6Hܬ;={Q;O9DA*;~c#kZ&L&ᠩDVPZKCCagt,Cݶs--UϮ\/fqWDm!ky6R\ns͎]->{9ua^)6qOtn>iq}yVy务TN<2݄1qZրety[g5?:)NLE-'5u^.h |xSh0<ϫNMeҹdʫN\)O1 R5tӐBo^31wH:Vۿ5acBfKtKaE'P o*pKy& `d{eo>xe=Lkko]9KqoieeVCB>{K:}!$T~7clH̃׊S)p {OZUGd0//%WMb5$R4PiiTU =C]8$1dW\E.ɎB`2U yN;}wJgzjF;܂aMT (ipCTEoSM7+s}5,,IM!JWARۣ<?y%ꯅʏJ/2ˌ=ʺYcVzElϩQqBp.IEٸU 7Ip=e0V!VݑݻKZO2*wG׸L{jSvO;;5{Ht"*}X[(?,=tfIaX,qyT!Slی#XDLԥBB!aR0A[X*|GGd1.*snfA>[4Zh9ih7xMgN,Mz˝# >"{-&UN7Ӱ3I=J+9GŭVFw wz̓ _SSZf{y2vgU.,jV+7ŭ%Sq7ѵ1#]'=wq– ߝ=(pB3 /9EQJ[%h2.Z(ϫIؘp{g~`1&sy#mP* |)a}mvӅG n{V)';Cxo] 4+zs"9,dׅ3!ho[#*\Ԭ|]%ӓ: mVqgr܌C} /nK٥SRwYDE^m38qIA4[N7 d I[ՂnZHڬbWBW%D.}ָSCz׿.k>=7V%I-m!KJ|SDg2E:x}TV</^[Tr]cZ8=ܚ7zp^^JZ/SɭSl=ܘwgW!qqTߪmV$mQŭ֪D&E?($oWlJ٭j9*S:%,^|3e"-3hЦ4'Z#gn*=uI%m~$oM;hЖhrL=ofpߗ~}CA>:(ۻywn@QN+SWv]C:]!}V.?K?M돾ύxQk*<pIq7`c3j<^ʻ"j~-ϸpق:K|zsʂcAꖾ'Qqe rАCMʞT9a5ڽoUvsNL|gy{g/v̈́v/Q\y %ނ_T!T2Cy؋7ZŸ"wF)%:dJOܤ?9%og},U2ί4Tudgڂ }g<`ihZ'4x,)^Ac'378 &|YUy#Ϟ`a+]SuQ|A|JCl`d=&;~*w1 RnA]5ߙB^s/ܞe3{Ьuۜ޸_?SA}:HC-g.)_Q☹7Um`ܠST,44O.G[=w~"kέ,(h.̩G/哱_MW:PyB>@~bfb3u=fe|9zMñ)ۤC-ϩ SehWᦴ]}*!k^M<гҗkԞ蚻>/O.n2~TI3iP_[sD+ Uҹ&m>e3yM +b;'0$Y'7笍M昵7Y Eymi̚ 2?AE-Q?dū ىM ;5 㾼s򿵨Iz+rZjup 0,BL^ .bҝB ڍҎ+Y8wL!L Slc,L[%Z.{=+fz;g-,l4YCCBߑ`oڧK _0`ثm^|[YGuYkQ@kp/\S?噿<+Խ8r݌Z Lǻ͗2w'm,"' ݚWj%_aZ ~V7E/W >9NɴVg=4q@l{\Cn}ސ3 w b:*̡E^rtMKÅنKN;2"箕Z<[}&pī5Y{NvFPV,tܑۦ=VqBya>GƎ]~~F_* |7pq`=.߾vEqk|f x 8a@LV{E-svs[X8,&7}[`DI{KY I?*I{ՐU8` ^T\v J> hoֺo ^\w9I] K#kBk6x[ΰW,O|[`3j}֕w>aA>!m=Jd2 ,$dC k^M`mj} _S8mF?Б&%1&[7i}9wobcUcuMqK*S?4,wIQw&=[{1DpMyU={S-7_?KhئgNMJ}]Z1@s֬G_WϞ9IX¤oNlQ9lbuxyyG;NpI5jGuYa8!rn)c\v{={wCB[eNH ;sX[3=yWL{V!16yg⒚a=I FKs5xG胣\Ygice[)7NygwH)Ĭy@,,y#EX0xiYc!DER֭`cgBIIrpH<sץ9QvUEh*i xOY5 7IG߃M35nnb(<ؐg1'nmQ'P?.❒3 -N+NGwLیe>va6J֩v_d&N-y||8[<-lzbW+tDI nE %lLٝy89ua\X\0|}4sО?=&`Yu[ rB^/jO!X|N͸e'b]s@4uCWxI!m$L>xFY ta>5Nۜ []C [ݢu[|'D-SM4tz7wV֩4(U(YzQs1zU[qV铒6鳒6ߏ[-ng NW+3mӓ:e+JW.qۜχiI3%R|tJPeXX ڑWzV冨g\w;04 >9.]O!pNjakQu≲vN 9PϏ_~K_}}g˟[I3ϲ6~y - }n#Оgc?i{w-| -`m (Wzw>~{Os/ F2&aj/"x뷩veQEzBQ-5>ᒻ% MZv90o3qBJݤA cx}ll*;&冼\IQg~ܸ?ƻ[<)eCW),|Ѱ>jлA׺ _Uy-f"j WۧMέR @05vpJByի*Ӛ͚2dY%7\:3W{[}]}J-Z85~_HO'oVmZK}StݴCÞN|W+^Q ㉴#Wy1YהITX*2JQm36sbĦɱ;uƤ3`~nJ!գ9# }S3^PynroU/jQ-z;aC> zQy;1SbO/fۨ8;Hx;U^2͖}}qjWQ~5jlx4ow)UM7|C/*ǧG yW &ICcU1~G)*-pϝb5Jp;ȟtPaI>(爲tZ #Ob8a~Vsx0r2Ac5j)ut!1Lf{Wհ܂㪗5QO?eT N䓞G{?'&S8&mjvA\_|%rCb­ `䤳"+G%f+mr[I gK='=4S 56 Io%,|-BryD;4R P,Sؤ]1偐67i7 U>etazԞkF[́g8 \MٮBIs7|&qOEQkP-rWXu qc@`;]<jGoKM&G1BWcӞ|rM}!sݭ[JZw{apKI+56+ůvuKs}D_H\&2lW[.~OjSLj1^+w\SĬPDU՗K_ݔ:ORw+v.:$\!}>ڀᎁ!|v($p5yf9Ux߷P)Nީ S`1t<ՅMҧ=K^م#g,qkQMO*VuHSXGit:yXYz'`~BѫL3,CQv{d` {K/:OC`:e@ETJF؎O+5aWh!+a[2U _nyBW §:-|ʰYهWC`A qbƭ=5Pn@os; MXH;&TҦ{ PuR:O<:gL(&bW֙Wù e(llP'[9lʋMRGu[Y Fqu^ңS@/u40'S뷸=0n2#>ҹ~!E$nnȈ !qJ@óat\TqB:S֮vgTl?YUh6SPYVF5KeI=K<],ڻ84h`cCq́T _5AKow"aMzp1Rv)b[3=<*O==Վ ­7PaG[f{CvzeIS  _ rL\SKi [uNvgjCGx h:8xO^NtjU:k6Խa*$3 pObWSsɂT!|r}s%  Ugߥ ׍E_+Pd9V* 2${p|:mbKa98sr.HkM"Ig TMyu>[F. UEv>ywE׸h=Q pUBQ~!q"_]0wħl_+b[%(]48A'( pߨ{)$p ;$!rVx{qޥ  }[:sΤQTtvQ!:8x`ϐ=]95ƣhECtKC&re궊.k6ːGۀ^V1ЇJgۍT<- z"VSi*I=CZVyR:s@:jX\k="*`Ԉq'lZ(E8Ms4QU%k}ڳ9p {b:A=w`e|YUx^Q9-Cے[ͣYm G"~SyB:a] G.1L x:WIB`Jnz)ox Ou>[*#ubTxF0| 7RV]QCƤUW~6CetSMĸӳo*? Y}&Iɔ{ > O 0X4|̝S^o䖶gǨ 9kx7<ðkcR'^%+сeɔsT/AxH:YpJlb-( ?C>Hr='?64wJ璷{/cy[FO`$yxm=$S.3;zhֹEԺTُ*@? 6[酝ΕIJVg{ OǠZRYqoti-;T臁&A'͞3'`+@/twTuKǥnTgؤUT.9VUQ(h,n_J\'?pyȘ{Ɖp×!x2xVU[~kТqْUps^ @? Fzy]/z9˰*`q4Y-La E_Y]ZSZNo-GZ`X$Z=B10ؤ4Vv~.K]T &P ?%5Q-rx8 ~v <7!tB['@@ IY+{АW/*vw"` OÍTˁ!!)tY^aOTvWt>.l:m^ه_k7}blS! ܭYGB J13j|A#gvO76nw:av`wJj**TzGs`kg9<8Δ%?n~R 3='=z`pEYT/QO$0!saWL{I, 0\2ŭef7Vu_,ydUQN]/?l;՞-UES~E90}<)pA& fW/mrs:>ȫMc~89vm^9|ES!%(?d~<Ҏ$G}g[)?Hyx`r%W:}ز?dIjYEQ{aihKtߑ/e@`NI9{Ғ%4%Mn|6D}N}&0? /KjѨU6}wD٩"Y2 0|c{Х%m/ %0,&0? 28fIKب?P֮A}.la9槼W ){ož6qCnWm7Kw[ķRp~A#1|9.#|ByT{*|\F~ghzlj3& b4[<3yu`0i%L|ާ;d6 0\oM2lbSb2LK<-z`~ 0|-4hQd3ֻ*KghN9gU lzT;Z= %MٕSG'$ 0|}X$5ƅ-;|7~0xᾑN>B6`2(s v-MT7<2O~7 {G'>O?I%Q`8pD7>tv"'/a|8| %Sڇ {%FM*!ъ&.Nk1>Sl7 WZr&@;S7M=jj?DH0o{ M&aVLX;N}R}?n5bvƌW,cbت{5fMY:hF֑p7ޜ$~i0A)6Q֓#ׇ٤Ƿ]Ds0!h)%Ks|M9K`,Yaluawp1#G8-+<@=o-SF#GE+VV:g4KoԹrޟvF#շ)7~qaN'O=*Vy֤#;ZԞE U "Pq.%5On,qߓ*oK果߱vxo*ޑ]-`FkW~ Vmqcdc- RAVvʼ.Gmʓ%0}{Tw}^t&O=Iqc>jg*jKw-74Ni]d8PvLOmOUJgTPJJ{}jzBa[H ysǭs8-.7_cXvTw*Tt},~^z6/+2/\j/)Cn*<E%-*Eʓ wŭ/ڜ=koҪywʑF Лsc x;kΞlĶ\ b.3 OrON/ݼ c~c&nk:hϧjVVv4euY⣚N5䃜ѿ;1?5S\V^1-`A`~\Zz9 O|Ǖ[i$$SMؘ3juʓI4 k2v)-X_5P+V3ԧ sysJZ?H;N袊vm]sal0y0ەR};E͋]mV Ι SZqaTתr6?s$9^\4-u^>#UbyFϢ%Ю>ğ*^_Aw9ݑ0GWJi%I\fӦB0S/^M}LQFmUiϧJR]sfx庙?4ΙGYY^E{r3)U--P芅NY6kxGD {.TW|s<q,\Z+YY9x \ٿ1<9swlKn>M΄P* t>9^%9y'Bؽ@a2%-!+h {kS~%1I-BޯXuTsQSaS`(xGw넂Sm/w-Z~ Ɓ[Et|uX֨`f2z:3_Q0'ݦL&aZ ^a;zodfْӊߊM,eG4ּ"xyuG]@Oc=~@n3W;LM&p7T2xD:Qmm,oW|t7$k!*::raObH;MjȅB̊@!fBHZ/۴DpcYϘI1|1|VtFwn\B5Fety/iw>y~?PT>|ʯI^_K[N}/=wo*Y@n1z*4upo\we)j[w6%o/Wm \_Ѥ-9*oP|P}AtŻ l< Le3`1&Lyv"ߘ߼_{k\o5`&<;u (oXM]Vޮ~DFׁn S Yx3ÕXqvzϯ_yPөMÊVclrKQ._J&ڹ&ߑ gĭ*_L>X^/ I{s% 4=QpHr2&&tf.*L%-Ds12AV! &r!K%wᷠ]iӈR&r_Y if {ꍉV\ >9}'fed;g76]0ӡuuYAA\ D-?1j֌>:&P%:,WyN vW{^31rx8$HWatg AނG!*yF ٻwU5`ڀgԇxT;N4U Iy't]0Tw*.h?hۼw焐joVO%o7|%]?)d ^"/0}wa\7AVWu^.|fW4;A6^/ًgf7;+e 8"PNj |~|UE;=ĭI;y{+Gfy5vJyX~g{#szW__)T9'r 5s,mxO&)lg `ϳ& {eZkOL^;Qp5,S󴜣;>ycWf:oiG,d6 +l!PPnS);dn'o޳77I8;%U\ѡ9>VM\?>f|D⺀qal渼-VʭqqzFpK墜)8$:9&skEowq6N(~}DN1ˎ*/:,k+Oq`sTy\ %8\wBvQ\P{FBBiO~k$`zl (n s4G,f~=2gq%KjWik:(\;T>pJ_όY/s5 g԰쯾 f䦚Ny/w&Sӹ"y~Л T!>vtl?ϥn7Lܜ+n]ѦM;bmNڒPp.ysʱйɲb>\„W9XvV{ⳜQ ]T5pcIFmUIg]xJ{(6yk( \ L&z!1):Yh*< @hST_cJڷk 4C{,ݟP5Eӎvus0%K3e dX OG1~C.;fn s0Xs5 ң=%6 {vWtPy>C(-qp+p]0թ,H>?GU$*59v]v,Miߵ^6!vj`Az>艐jQ9Geo{E)DjuL;T ô]1哸"yO5 +;+s[~YX!Ys'p}0LS:+X6yZq9N[_Z[Leg?קVLX"bv&*,HR| ^i26Tv(>XT|v03lɼ%.2 -껍aG(ςq\!CtNzp{DαV_~Auo4Z}Qr9gLY/!aܱ\BxuƸ7pkivKREM{+j䵫++-N1}i^L9Q~ .}">.FvS{"wa ץl8֐D)v|ZV%}X=Yx2~mx"A+'UXXvV9{W ^ک>!ЦS0L ]n~Or% "/?4kAU4~UuAF_\| 4{į6eӞ>m*%NM+lOvCik0qmargւ{*}ZsQ~9hҮ) 35dv\ +݆Q5]Gƒcs~%c(nvBYc:nj_5(O=P[zV{ ՝Ado8ڕueB-)_[m5)ô])&q=j%~NYeG+ϙx;norsG`]SQt&/bۭJ:o?z[xh۴ #ܳݏaI"D-bWN߿$ݝ}s2jSIɈx[RğB,z[Rw0l}/f}Iߙc!y 0ǂ8zp[X#nsΒxs0U;U'g:Re5 Ng>-i PKsVզ SͶĿu/N}ft$k2 `kɳ7D6hUR"{ʲdU݋[*:B> ]\{Uhv'a`c@ղy+\Imʮ`J>S?5T`۸Uڤ4کH@0;szαNk_=sēo5 τ%kwF1.fMsO3ߑOHpL?jpJϐ[mU5Sl ~m[ , ^0c'#4}qtSܦASG=濫;QuAqOf53Gÿ3QQ~Ɯ36esUNu#4pR;{0Gx++o8Oݕl/9<qPޙwB_,MP3F^-++ob+BߏXZ\5 svЦS7& ZXm2 /99FOmף+쓧[ m\7j-6-ѳ=^>kB}B/CcUnjy{ȇqwמ,5#V//kS|٣jtL;j׷)=Vy0!d{ד u3#=rbwI5_0> p;f/n٥ja3$nה+>H?ߘ9ogԑ+WV].lCآUN鍺kaFA8'S7'ɅedmR[ p8ټSnJfCO\z-PFV&l4o͝@^`lWMOث_mwkMx3#s&M!Z9Q( }R(^^vVt:A,t06_w+D{Z55z{T5-h^ٚk%sJל=ޥJ1q u\]hiF{{;`})R}b`o,W!t_ʀoL,͚{Q3|_ɸa%3FL ]n-{4G~] #ܳ'2©SϽ[3c' S[/A<ʖEm/iJ҆UšBy~O7˹'fF^_=2gs鳇l1 L&~y^;h{v#2͈mhGغxq! >Ls67W_P|\yNA ՝ϳFԿru3 QƎS]o̟yeh7a9 ¤ՂxͷxmGy4c+o=a%I2!x&Ay; pWp2`śVuA`9-ߌ&ulzm{>Cm>Clng>L 3Aru}~GԨ17w p(h"|䦴mj0xG~]_?n'GZllSm, pz3Q=d캬=q柊CB_w#Upϫ^? .6z6W 0-97's8-\oNW1:~wRfc^ܡJ/++k}*`s&xW'NmD cqk$[9`jgL&a!$qCB sU( ]07%8z)]3' wɘ88᭙ Ü:C=!Hk%3&z+o?-qzB60`Z< lFmhu( ]p&Ȣf#< 0g0Q- uTuV4>E"I#^l- ^4WG: BϞ'X;#ۜT?%Hc<9yʜMs'5v0  Oxym_nj)R]^.l`OaeO0fmLfGNYnnTwuKXaځW'[h( 1rV0ݺu o }{O>.$pU횳/3x.YӻH cQgւY;s$jcFq(-eGځdHm]0ʳ}}S} Cl{}~F!LVmqL?~ߢ\Uݣ<zٷ-|ڕݵLEʙY9v}vA閻=/x/FاtG՟.iA eթ}ה_pL?XV)66cio"EiMZ12N+וE.ZS(:Gb~,J=-՞E]sdNiǕ`!pu@w(\bS wWoh\s3C,M;8gYGꖻ-O]8`;em7ߗW1QwY6U 7eyl-70XV0d| Eu]PHު<`̬C⬃K+l YXسh9$:Roz]]})oAkiU#g  (볒6֜pّkiK>ܭ{]\|D{>}Ol5n6̘*79`3s4L7&V@xs|p[=ӝUy=w͞5ؖ[GM9ìtƶsҳmUG7f`` ````hcW0`JrW`:apaW0gK2~7'ɟxsb Wy }?9ʳ`M goLt%_ BM=q\B2¡[3 #ٔpwpw!ќJꨴ"M" JoBEsaz8Oi'fCSP X'6>vM閻7˧lykΞl믾F g4w VDxF8z<5I:vI*#UoW֢`ۑ[ Y?H^EkJ]g85 VAiC0O JQTm((ؓ`li}k<8[ݳ߸HjhV*X䖻ȳhYgڒYnu}XWR6V}Ga:t{ v/]Ⓗ7^ZsL­ Ǵy}Jոȵ7+4! Wal ]T{In(7=!ᝤuu9FC)PG꒠k,).`OaeO0 k kF%Ty.?GcbTmZ\!.Hf/V__e5 ] MneG0[Hu૩d-rS_V/hە]]u3?ggeU9T-.mOAޤ6vM;p>lq s@]vĭMu4Huͪ !bLW'$€!\!Ir.OuP'(>-<C<`Ch-wWNƬҳ!tՠ2nKҜOg)mam_.jV~[4XLY`oC+2..~#_) cՈPy^Y9g%lRuؑcojg#qYR?q-Curjw<N\ Nw>8g439ߘmзl)y/hIX_Yブ m]XM?Y6w{¦mswT+~ˌ@%{_fVҳ{I.ޞqqK_*\_/o@'MV]ػd|N _܎>oCiL6hF~C;9r](a i$7q[uƛ/bgē=v/ ^0Q읩U'1W,7֧Ov7BkqD۔d~>փmc`;T"ERP/Br* WH7ajmѪr06ku%J]g\; lo8og9>~d2 .?RקiϨ,]񊐸cF)߻O|D>jovGW0اL'Kc[(oW|*xsikKW٪I[n C r T rS To.ɀ~kl5Imꑸչ{A5 OG!X/#WrL?@0!CHXeOC׸$ޞ$7ͽ(7e{޶`ޯ9Z HA}/ϫo5C9 ^2W;J0߳`4cPog/{nV+%D/ xS['kq0(L%Z]FՙL0ߧ`xwonK!eL?^y2q_@qo7 qT]x ópKTvM it+8xۻca<0.0fb~bשi7 A%oMUU (G 5?JY_Nv~Ruݑn6j.L-F-`r0\uꭄW?/7eѬ EC1{cQ=UoW DIK_RF.蚳7N{N&G84^ۃ~8bIJU33Kõ'AJZC.ZI05Cn=97A͗aoF\* ׭k(h /|IJaDwF}'k{ :$xowƮᖷ?v]%i0\=Mi;Ht@0\w{Rqsk 7dȰ7^0ا̰'c0\-Ki-X,շ -W=HblƁ``P.(>K;x>lqz-3j`(k [ŧ׍Nŧ5w4˪ѝ% r-ԭ/B>Y냘ilK\MI0 Sㄈ"CŐʘ'nOy YG~]B0 wK`({w2>e;ovlcک@0c0\R2ȫhgnG",̿J?/Z=pۑ1 ? xw݊D0S0\RJZB>[<Dת@>9/'woE_Q6y͖ە `ae$oXuL_B/X(շn5҂sHJ \PqvТX {0#3)w;gN CE9+V٪So7{ H ^N{N!y +揗l*`yb>IW_P\WJXz6b\ A6E!`ޔ攭%N'uzPX09OFrN? 9&;T|&G!Twʯ#c1? _1n@AS{5&sX\6:1-EN:gpLkZ( 1Ixy=^zyɉS:QҍŎi't;s,[q( +Wl0۔w`zһkFzG#ѶSگ^kW6lsّk=r YìtRs dgz/<_K-j9{4@0H0.YY.x$uvY6|Jյ  xL; Z=ٲ5G1 lR˫W9u%x5 ўVǬR̆w7ZU&e{z}䶬s~9gU:uG*3 c gUv+[^*+>+oO뚋mYv c CUk/)Ls/}ux[9儍;f(  Y)j4ҵ'AMǢ_B\M0a0$o,8N[ےCKl?3>ڭW>R@0B0tݚkU[ ` ` `  N0 @0 @0 @0 t`` ` ` PB0 @0 @0`@0 waWޱ3-."qc}++;mq i ɪ*v:LV8̋?j*vkU$cLBl^lnqMl TtZk|Xkv`M0Z'/]Su(S%[p*uqі"iO rQfnJ>53O`3z8LȿoL5I'=Ǥ o&{~j~Q"lյj `  L  /c(f^쫑Lؕz=xz 3%sPmk#tU(xӑ?򟏙>ta ,$X}IH[+$m-.Z(xQ񎤵IyՐTFw"٧tsX{Mq'lq`S:O,Q(Y2`yrIJe-ٟ-|px-$wN\#jݐܮxǿuٻƏ%-SF\lJ!Y/&/&ye.4Uc0xLYPw֓ӔQzdح{cݖGp2l˱?˭UA} C`A~]F::?R,iߑy`a\;m^Q~$yn{)GS$PԟMܝyHyHsaɞ#QK\|AIN0pV.}Aӆ}aR%-}Rr= w"{{I݊Ͻ_ћvikTθC jƝZ5ֱC_;Фqxf^j32|ӒK;. rc&B /ٛqX~pZ?D-+V\һds[,6Ʒ ό O?rƠ:xM6ugT-֥A;u!̫ ]nu9Ƒ_ܚi+l-jE{,ke"BŃ1"у=l75z#1qkҿ?S$e7_VN/ZNuЇ%- wD7%*j !CaE&:?Qt-/\yxIkjcE]UBf́6OըL9x3~gvФQ^QΐV!j`Wp5Gbjꅒj4K>()y\ \~~!&[,yaWjnG{Cp^9"ex]UٚAΡL:;]QpUi5|?E^rS[mᱯOKkϪ&47M2Fg!6JxC}-œ=IaVL-5?-Oq@糍{YZ4[wkMAy,tx|TOCY?(jVUqI?n:|Gi@0[l&t%fRXb|,lkA}_RH?夰VxㆃrRQ#_L@T䦲2Ln&+MVO sqk0/ Co89l]F[Ш9iul?ht(3=\P5z?r)݅(5FEܘ-`-It :^▄)I/m~r&p*%{WVvJQ\RIV˙ N!-;Nk7A /] I(i~:YXi;.ӎ  J[M2tu!\cI۴{T= w55*{]Nרx"Lcܐa&9L@YzfkOǏd/v>B SJZ}%CsJ…=y4#iSW#~ZG_M vμ~vYvfZ5'|G&{K7Ns"si{,#RtM)!x̼ a'El(`gĆM%;  5ڱYبMٻxGapUJ1Y^|9sIeFEeitclG]%W^{#mhEπ"W$OvAX\g!mimTPxuFK eћ3I/rJ=f=n҂L!f^'\i 7}(Y$ssxW~}W-k[)&0uj+9tmGԗω.&j~I '|rZ ;u'-O A5?hT| .Zo NZp c>äݚ3k7mלJ9  (; {ْ֕z8l]f!ե 1?UP9JmS%9 И=ݓh_qzJoO-Qa5_T,vq#?(&|N.M*>7*% ۶omFkEM̖ -)}ڿOՅ~;)fkΞEr > Jǔjs[ c{WAߤU(#LZ9V2`=''&B+v,uQI*0>c~wh+{E M˯Iӊnԇ!b܏=ékIM}%7|On [j;.Vc,}W۴w-[_fSO-Y;%x1҂/"W pG`V/*_,5OOA]aevQrJ{9ciF(w8>oGnMiQB ;?b-E ]$YޗԜ+PnQ =m?q(ecl tY ."h?7Il/" L=oٺ a__7S.k̫ 05(L,_بn&ۨɣ6l/l;.!\yXVSpQ+ִu#ٹ^57fYgK^g $yX؊i}oIX(?(ؗ+>lO£`O^NݩGݲN5,SϹ S<1IXv3%-A^_Zd\y'R!Z> 6ʫ١[Cɧ x&pzx$f__XԱ5&7q3fL~߅w!P9-\;)wPѷv.ZxrчKp:W^_Qܯlu򈢺z?.G2rSNik:ڞdmTZ-9+!Y5"xk&ΙxѤJo>߂j+]e_C(SIۢME?jo+U<@WJYv>ݙdߦI%,N9ȍ;WW.Do`?J.蔇՗*:j:&ڟ$)NH.Jcж%6ZV}]X_I EtrֱÍ&'9z5.clGG `Ⱦkc0~t$Ik8Jyغ[u,`E:IE{]^_6B{WO8dL?k9f>xdc#wL0\֦G`栿5%J*_g.esVvL0\Sd5d]ͷ>#G4DoI=dSvl04)mK2{mė_ׇra2ZgՑ% 巤_5 K騟z(tLU;T)MqSfa$LE25?B4hxB/͐uT0;.[VUzu e7)?);7s2rVȦ)yoOxZ[Ec93yuf:]ܨXs$3._=>v~]%K;?ڟ$6'0I; /sw~7z5hw:}%e7>˸Օkt3 V]W1#GxL': Nabm%lJ.ay9v wPcSJ0k,s¶U  v{-]U隹+pElBǬ '3*fԜ!iAS2zg{]m!`q;#;*/\SX$+YD S:B|1M,$*d(RBk8Wc估* ;e-QStה3VL)L0@3bL `  }- 'gg[0D e$'4w>T4hhfZѨo̐&^2E4-]dGYLrTLb`/.29Ͷ?X G3zMtMu{0VyNtCiPUv{ypnoPTm @2`pwf˿ه .gRBnؘwq2ǔvFNy-!ލu*:ǔj͂Y+z(kժuS0ի <= X۠pL=z^XS-kOVcU[)un `/iEߵ^`C0x1[y0@``m<`6q2 @!uޓkQ`c0h˼6$ׄ^QeU:Ks0\=n J;eb`^`QXSuNl2aȹ:FmoT @7 !\Omܟr&;383jnYG2p>eW @7 Ѥp0\Dn(ޢ>؜_q9hՊUuBgݹNR~`^`)H&¼9 +%5q&N_תt`h"k>%ۊ+VMzMt`3EV"U& O9` ` `  q0 J[UqTk?O09 ] S9O^5{9f砜g/^S @ MQe?Iۆ}#w۪j4Н!tsg75F4`R, @wY!GΏgO/ycyĎ([u U1%Ia"zoEޠ; Vge‚軿_X =eQq^ X]'Uʄ!<I%ԫ·by iUXCLp44lWeNrKY*`PGLk/z `Q^I0۳oaxioRO8.j1<Vn'vNV9;PwV0XΫz yiEmk B(tM bME(Ɨg%]Cۨ9vr)& u ʹe]S 39<7 ޛAi|-!y!,Wx估#-yu -!b3@0|{s݉]S&knY1?bG団:r^(o6@0/r]P/5??2@0|=lյꙁG[ 5?7 Y0'bGgĞ^{w ldS2mAg5Ya|ViS|wb`p*"r>1bGzjvw]M o>9?hpd$"بĖ&+WRS @0  ` @0A0`  @0 `` @0@0 ` A0` ` @0 ` @0 `  @0 n hKi>~k7z Zg~޳Z6?W:xwQ` psP'nV諞vSa7I0<ԳEЁdFCW=_,ܰ`h)g ^#@0 ` @0  ` `&r;GgB`0\P+cܝEcזml`T$XDe`Z c+W:g>sca#63vhue#[sK4q̫1sOAh{b_q~αs.]a3Yהx疏)l ˣ PKS>s(zjɚg˿25so伖st݃m* O[a C{ ~64dcI罓]9t`= *c1k m96eϧ睈|" Х`O~EFՈUϮt`: H*}eK_\cy:RgS`0T\Ϟ[d ^qqq!FC~9OeWю[c]ǾX[o @S$CnӛvhCY9o-V :ǪrS`;o˼&laňJ3{gm<:l剷#F=NJ%E0=b--+Y??m)ZP;dޑ-[ݵPb`ɫF>jՐ/u)8,6f Oԭ:1zMV=\`x[~ū=:zM@C ~&BɆY-=:G1@2q#si体Z p;w~4"e-t)8TGEfN6HbtulDvDqagw+gD` cUT:çmn~/ѧdyL0`$NDy5|/2W,3!vCFddyvOq// b0ZxmdG콁e$N439R;  0XUbiՈ-zCySS8FY2e73ǣDe`: 93չEiqҵK{ܟ/fCNɌdUW<=-iPE^s,/V}9? w uT>q`~@íFmx&3a3ɏ3d>rU;~6~=g-qWgZp )ƪw_?.﫜Gzjд{^@# _l{k_?,:4Ϻ9S0 6#[|¯tMޑ֨}VcJ_.c9r} 7- PG~\Ɲ2RLTTZ|l>:[9'S+x0\\i8pcS_)9b/}ܪ` WrS9v6uKw7MwA@0\ ޙڴ[m[n`l'mjqϟwQ@0\:Α#V6 }Opa@0\vkRsPՃ]uq@0\c@cO?f|3sۓ@0\>MСnǟrCe8? ΆRkvSޜhvw?o u/*  ]kf$c}/Qm;Ihcr+ u,36/,;s^:'O{e\nz6ԡ`&NT5ėfnV?WIXyը#{m=3d{α1es_ZtM ~ǭFFͺ: ѡW/p焗fn/:<yϽg;F|Wn1jw0\Psނ+WYRY ~i,|!{O]4@]z&tOFCU]fw펻P7'vҎGz=~ݍ֨$oԥ`H2V.p$*"O}eC= p2w΢e[t/|/ӟ? ^ۤ[w7Z 3ޙ~#vpş1s77ySۼϝ 5cT㕹z5c;";"/xu^{#-Z*_ۑCek ^([7ty~6Dߌ-<0^vi)" ]q!nqnƽ ك!s3];s[+K;Y>s_+NOv~'a0u"NF/xmMEƬ-Эp`<W|Iɪ`: ]{FdgxIuh.~B \Ju)R%<6hg>-=f)ԃԽ`HA꜅I/Qtx/Vτ0pbEV<-I .`T88+s?g`(r;ٙ+V3wpͳ=>N:s`p:=i&o%7bmyn  IhZϝ&i ZKW7jk0d䟈v~4%TCіO6h3ֆƹEo1S/_:>|Ur[em|`Ii6`a;^zCe8#y$>emEGčtIOT's'"cGzzZ a9}Wy)@޳Z a4gr>ԙ`3  ` @0 8*DUnj ^w΢Ɉ`;V =%{<3zzs4LרӤk9v6o99wO2{[{ dnH|ڷ<;H] %Ƭ-[?oe^ vnIw7`p{'*B0q&7uQtgnyё16e;ϱnBOknt6O O~[2'6[7{e+Vu?Oŀ`wvo}b#/ = ;P|lߍ]pcլ.q'h1xΑ#Qѡ^\2aÂM>` Pc|-nA{txf3鉊ȵ<9?=s &׸Ԗ&998uMcˬNvCk=fӘ@Ă`ܟvo~ᰕC:~Ӌ1_i~9SO.|򑨧"]ܟR0@mw׿;k-޺ݔ7|Hyl J᛽9+=zq p4l?I OD?oK购 O߳Ggo]j{[Ky<1bӝÇ#6pY L;[|l_XY.uzs0q""i꘳?= _}sxgj[?o?uWmrImXnQζ6m1oWy i3Bڄ`d|/];~'GknRpAZe4<=[>:BɆ?ҟ ϹY~#z(sųV/~p?s2; pCi{cCW혳?Ec!KAyl]Ke?v>5K<׋esL}/; pVnkA9_<R{ʣO-YhƁ?_aa0\ ;_Z/3ey P{Ge &'*_8OD\|qZI48g_%/, φlz@@^> Inz=ooq\~ e*FюsͭHz-/~xF }h&*.ſWv?Tu~tgoK*OceD0 dž>!{O]?Za+N; &łGS'ߟQa/_,*ýl-r96Ƭ]qw,y~i=u/ܓ6Co߷_[XX1Tfry:m=}2IP!q*~#^iegF^Hǣ#kT5?XUKKl毦n)|{?WOb`H%P"W<8穳.]Y:ckW!?{03t7)t {jJ0gr;*K6-oᩑڳpBbsf=3=fT::d}t5o#EjtO4o>l@BV7(*ɣ ^^g'KBٙa}d)oWk:b-,Ф[IDATxw|TUK RBz2I# iי;w!dSW]{IpW] ͐9τ{<{PȑX蛣uQ]:MQªH l ` ` `  ` ` `  "& MQ]9y% @wᣥ7O1+9z.z)˒A]|4ly:kM#C-"yr߽ w~'- ?׵caFL|Ϙ ZޒyT?&qĤ<9[1㥻 zjӣ}zƽKZ1څ'2@74"r -1猞~ %i-3t`=B~kҡoV7FZ`L @0 @0`@0  `0k03s]Sf͑o$`l s]K&\w24dIL]|apyq"3viʗ9fo25Dŵ;&v Q6;dn̶Mٔaߝ:y{؃[>K7ڥL \+jVZkQ2Īs]MpqN+By-Z^={}ر^o|{֊1;u{gsAwk4_ 9}ϏRz5zGH4g#:e]+6 =vBi~_AmE-_7ߨQ.uI_juaG>x>\ݹ&BD0=Y2_϶* ?/?#_ y iϗ"ߣQ:Vnٍc(1ީ7:;qư)̞q(<`zD{A((ov e<~jgҎ|3xmpMJQbƉOM9J]14D͝pCtG\RS8٪ \.UXGQu)d.f1~ xGY7h󨧦8 wh؉#&툞/,d4t`x"xkA1IKUsj\S0 1[[W/՘X+ OL򖟪o8䡡4g3{>e0FێY;kRњyMW댤JMER˫|Y.vKrߔ/䙅<Gt{<{.뎻}COϩLBB0kF9IϘMj>G0L^іC֨ReSՋ^ &f鬼FǂIBeh04kaDŽzb# y{_{i3f!?:¾דS|{13@7bh&UqpSIU-vn/%W*ckB#L2Ԃ nw#gL}kIhӸHs]SY\}Դc=Etji7pݳ?o՛ `;EACmRvZ'K2=o-%ou%VXP!kSnJzι|tF>6h+{/=SӟzbxCL%2Dv{"N=FϏ =>o0͌c Y7mɨ8Q2[00h  ^安>KkS];:dW@Չ^b}pDZ@v&X ^(huQuiJ3MwE۩&׶Gn<.'^aSڋƷ~,.K}ԳKPvT)K W;Jڤ >czn^!|(sE#ɞ6yJۡS+}r=P~Z2d#b~\a@UESo{ i^1V^, AN9u+7r+3Cqhȯ)h>:nUdY:$h=̓&/Y2tKU|A77R[y2 ҥj_`c, m΁z~ ½'Ӏ)]h+Z cUㄑNK?Z&uȥI򙆜{I&qۀJ!x&2NzzCKSJL=,5DnR/w<|"hSe\˫zM:NB[`q!{U!T0jjC0}t2SWJ;ytz/G*mI9$XG?J)y'WlUhG:Ox P38N̮Q7-V[3Y'ϋZ$CNnZEljQzꁬc7a3+A; "6iyskiz'M^E ~t3{*.fU\B?ۢ]Ur)܋]TSFWnǽ}B[$Gg,'߻ϐ&?uwXEXv}d݉gB^䚙WyW Q"~\KثO_o|qZ BaE=rŔ_Z#) %ƷiGTSiGn=\N{o [o;+wy>Fq[gD|W/Swb"MIUG/;4~Jr<$U5.p ބ}҅ ˡUj'%ÀnQn W0w+6OxYn$Ga،1wϜ63xV1w- Yih}/3tG3zGoQgߐ7V/N795[Du]xvƴ~LUƸl,͆44Z}S7i+9XԬ:ʢV =?K?M3w-T;?MpH!̈'.5>g>Hw\Y_r,7z|-H yuDyυoJۥ㸔[aҁk26y̯X4#iyX3{[b[d# oƾ GKn;c?1?wU}u A|;vN IqiaH l3 g1nN,Hwi ˄q(s]SIlcm궴 ):%VYQ8oY|]eK}U䠝1B L?`{aSmc|j }m A Q{RfHۜV7,DP&]L=zԶ=bq!BϘ݀A07b[X1k [s ǽލQ#͙72dbQm?1:>:cSκ\5݉c=>c> Msw&s|"o>bz0\߱hpېr^E%K-:8MQS*FK%Н%uB}B|Z4.iY`3 ?Mq-f͑5c0L b3].PZKp5P&O<[-Z_нM:8zzYA/-:'Tv+ܐ+_ntC@0U BQy,jbWH&mWӸ\D0[RCS҅_ 1mRuڄ[`pX(\h| [R!U,)w}9gj0ؖ }U2IUjA*z &5w[rg!pJ_S+{5 =>^T\w,qйY|SU!%%t"339u^zr8Swx̛`ZTSٕq5b̄?,8&\g:L1Bש[>Q9Oe\Udj{M5g2%YpQdw\=E߮SGqxs!/U?kpTQjWl \1pMFyk/ ko˛"*3O~xS*eNXsńvO?f;Y*tvqYk1:l:*PNoƨGIC:;YgFiӑxɾOZ{R:^|IIٵDo?.kQY+s%>]A~ y6sHK9%B6ԦW{[eQE-Qqh-&G 7տ+h;_ogeߏs/kyp5K=-9uE{a\ІWbw"/L؛d\h?>cU^ئ*bvn^;1 l5}Cҟi}aL8.!ajgI\(nGlMo&!cyMThevisӫ}Qܪ=/|ү9[K0 0 2%OGuU>MKumOLM"=d 8.[q6FN~Dhb/fNp݋$n+ #H>ׄS̝+R@oo꘽&9tnKNIS0 Zn?N6 {nXük}B(~qyzjiQfq Q.y=6 E->=՗n 6ﴎ43 7bVI_վů5j{`[BϫVMYm,V)by#6uCwK:%BV9EL3[gpaߤG [iҧ^ =ߛ"apaMd˄zJh!ZL%w^EZOK?uԫ yNf^a~n|Q`` pNƪ n1TϓeV//z6Kۚnx,N2aϒ]~̭>/i|wtGQzK{.HŭŲCq\Ag Ɵ7dӼIPQrܤQlDRC3纍X_>{k"ؖs]cQmtXoe?sY\욗{q5[<>oZҦ='o`YiyKŭ_ZQ:lSЍqUI~_xU K'U_j7Nej!z$ re$7/]Y܄'M"FN<"L^ii&xyg.XrNԭq51ڹslH,wS,L꣜dnK nwgYJ]i&1QQ9 d\$O>Q1u <% Xx ~ ϘG#\w2NYDU\Y@Q11kWmjU|&ewXU!.Z(9&u QߞB_k'ŭ`ck\- uc½]Wiq h=t"xuC7FUGn _}^JI5FҰN:ﹰtIܞڤrD]|% Ck%Y5^\"n˧Z=l$뛣MZ#LbZ#3viʗK.J<߹*bA6:!-Quab Y'~94Ic>m1?o  c0璢H9a//XϨNJ0K&nLSܦ=sP*O?}feECZO~ Ib!bVbWp;Z=:qA ,U OD a0ܜ[^i\svҲoمVCus_i!?p!͟S-4{*# {U[{\SC׫Y=6۽~})Ft LثXf|ۤCNnϭTnj0ĶDhWdٵ )Ug>Q"<>97`o*^RYRYE߾.=%kwCתZ >X_ܹZhHu{}R,؜iPoҢqyDlKOi:~riɐT{3 ãi~c/QdUUsw*m bd :%yI-?NI?ߏ;yC{ KO':;䝙 <>˭y;?B^N횿5UmcqyxcJLX&J<3*\w36:~ )TݝZijG&nu H1KF&p?Xo٧M2a`JeB`R]ZG;/C0D?dtߤJeJQ.h8)!q.yҫmRE 6L}=v}#x]AURMY37%mYw82O*n1?TJ那~)QvZ0~v\aQA%j*wˋB6O%WW ˝JNi =~YbIz>nwx]IJ/'} گ?+lB?\c!M{s a!?o(k %mUbnMbQz(RQ+͚4 69)A<Ѐ2G=үma bM!뾕jԑW/}ߣj7"D MRe9EYV,~x&MT_zz4G詾=0E0*U:CpJrH]5a#!kT‹3p:B'2@!\MTX=ZQX(~tpF^ \T} #{qn.^n^pI5E땥W9γqdO#8`b0s^$lUFgT%mWt1f2r:3eUU}Wj6K㥩wS.Wj\|k ~6FlIۖ!0;$=׀^Lg}9wL=j.j0ZO ״3 4XL~f(詬#mLT-jwu8tݛt~*GwraOA+%k7QەX<]So>2?o4JۥoDɫw4债Ui7BE0=TΚj_JNIn$.RU{oY&2 Rɟ H-.?VF.\$I{qԍ)^_d4nBb1>Ip)fGhdi=BI%H?X|I7}J>`@=QrURJQtA^|3!MQV8υnC&y=:x=.5n㢷({Ɣڶ:oRqZȪw~ {8r7!`F&?3{e8dp <1u\Ԫ~]I9>\$~p8x|&bY?7 X%$Vyg<5W=,b8.jbV>͞mbM 3/.E(Y͋c_̩Q6`hu:*EA {qA5ʘmQW=ؖqTzE:'HҴ͜L$^㭅HQiܓꖛ M^\v֊uEҥFZ_uҧy'Pr$|A~vXs*ɚnMk;_۠r=fOV' ۔wU8Hڇһ[%Wf fSDm%HاݟT)56K`(i^ :>yG+^,vD|+lƉn} ӗ͎+u}wYz6K!`[ 9gn~$ȝ>Ԗr獫y>{r뤯v>7J`x+A>P&^,i.^Jvf b] < ]f-empW]tPzJ&aj&ű)t5j⟺S(ȣE$W:嗜tpX{oEJE< ݉;$q[U7F:V1:nztk ۮL0pZ2y~.-[`i|9R\Զ?  ŭ_IK1 Φ = o3 ` CqA(ԞTߜt0-2)3_oo*V̟㚿*6 @4cN6"^VӫJRITdP뢷k}`[==1B$.}kxHlY|sM M\lI3Rު9 aU;Sx$z/ _%{Qf a£c/mEI, ]8{7H}``@0 @0 @0 @0  @0 @0 @0 t`hW7ֽ̎Ht"3 ?rIsl `` @0 @0 `@0  @0 @0 `@0  @0 @0 @0 o20HL%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_3.0.png000066400000000000000000000453671322271446000234310ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1IIDATxw|TeC"Ȋ"bW@:餐fΤFHϤ{@zGv>qWZߜD\Q@@Ju9$$. +G,V, ]*ͤ]:  fp0b2 040LSa4 0D`I` pKa8@`Z`<@` 7F 0(0Tj'm o4ХաV.Y`W':0%BW}۾X1J\`{ݏ{CCLuB7Uu\åAnoI1G78|4g yI  0LDLm/^^R0pqzYI|ñ:[m ;seKe[:r`7(uM1S51vI9,Y37o[ΒB[xRg)իpaВAK&O 0"0HuNiQy[|ԍ6:=sMxUr~%.Yk=ϳ^WJ3 JfZT4IQZ\1A`b`+\9sY~{pmʊs˝_*/I^7cYk"N.RUV̻p{-*݉>JJ]&^yֱSiG7̮ ]:pWCX;6";HpY5=uccڎi=gE~7^9=`QoßU!w~5Qb6a__foiRm>6Te W'wܚ0m'fo _߯[9s]̵ ;"Z!ӼzwT&5l=,XE}Lsvvwd;U;B[Vi]w(o9>% vwxsqҍ{\3Um/A^QKS60Q3k ʲI[(.w]^0{edWg׈_ɿͩH{vWkvwODo16ebvIcC`B`K//7ou1 V'T_V;l7foRO8fԆؽ!+-,Ydw(B_#-S2(.*pdμũ26KuUjm)Yq񂨍 c"*7w~RnIu@t~2xY=%jjp$յfm1+r,J[ v[bw~*iw^ }6@uI)}KZ:2yhٯWZ1cS٠v6dl< +.].i{Z^UjsL`J`vIw'zuؚ&md2|!+wH}# S "מkr,.+r]m,)lLOݞ&~g5OH=ǹ;uj][%ERe{c5u*iSޤi ?~OoTTMc4as[IϕN?rL۟`r8Nt}[?{ևAe-:~ 0 0 0 0t)fzP1Ӵw&0 u-{ \Rd֦ݑ_01}o5iTf3M!eSzxک7J^~*y ZmXk^NinK_?sm.퉤cS,o-9+^E-⅔o,C`:u`3) Ԩj S7d(i&{0!zr,ho3*f#:LARxYmNgq"^ژ˳`MZM`:e`0]Jڤ윱:G,-Y:uS‘eW~.briba׹u~%Q[yz5yRI?\Wl:)R_*\Q!~w+h(.EmˌdMs9 4ˠڮ;*}[i qڶ}tbǪ-0HˎcOu5eEw$Yp9 0(4fW~8y]~K:mO0^:I*0A`N5O({͚oIK? g7Aoaicum}h܇6Q [_ab+g )'| ZxBoi@`:M`0W9KC~V~acP os_D4U&{~Y`J`فjckceT|Tݦfi9Rrw%mSkiAW='*imkV E-K>BveұoEm.mfeKQ1GU/y927W   0H\}e U}=1!Y \ u*ؓMoZċ? R6{'͵=` 1~˂01t1F垷>K'Z'>Xi̯+>#>4dV+pq,t+g<1)Xt4p1%0\޿`Tf [>4cfj ۤVEK: ]C/UBccEf./O2Vjҷz/ ^nܙv߅US`$5nˬOCsܻhYu)[|L1>ZWShK{|_#0\)cGbҒU6`-|易ksN/3Hpx7zه4}৻rWcrxAg-L[i{tA927hR[ŞZǞğę*鱼mvaZ*ިzŜťK%K흠QwpXxyW qZ[?M}d+#qkkC @#0Pa;QG]YnZy;1[5sW:elKKڗ`?3T'+bu1R 0Wz4`g [xwU=u"Emzj %ނst,Sj`0)͵'Sյ=!eodߌ=?j6SUhN6cb9'2qOp_zv(aKĀ]b힎$7$eAP$4璏yU-#xWhR $Gs;+Je/v8vw40L?bjKǣ|Uyrz.SSZOJM,6_^)/-^[g@ZS$7]瘾+Y ZrHݑG6gW~,N+^W*h[q#[Lw5G}'EqF?o*6vxac#=q?=Ss{UkM~mmh!}h?gnAڏI! hI֚zOLY^7t{f׸fɑYǻeȏ٪)K=:7&_=Ho o\}W'~^y¿)RsUXh"|09ԈޮIq/`܅Ҍ•GV#}Ao/*\*iO>g\F휱!3䌿K3m}8ҚUoϴi:\Qxਟ=lWf/WIϬ8˅nUK}.i_4H2T|UrLڿ0E=Em{\?cy]*t7JtTP(' ,I}-jwȏ~|c,-)?<ϳ7ǜL+z;:=itiR7~]Ф:f]ҁx3MK)IJJufy%eEak)%bG Ϥ5J|? 12ʢmfaΟp ܻ.qgW\t iPRYVkK_^KW&uBΩI~䌬˄ː]a6aVeE..ZZdx(vZ!)nimM nx];^/i9\DY\HIB_Y{-/eVݭ:$ou8mi]*jC6NmYұ6zk Gޡ?p΢i 7eeUSAfe?#-ߖ[qG WV{M z06Xp&s6H.^ӞϨ߾^iPNG6ijf3m&9sWW\Y R#6ۄñ+eFYU6+]^#7(8Qm:njn ?O/m֤I}} ݄ISp!r_Y)[reg~>_Fm4֨7/Gƒ9ZYzT\5R3?Œ&Ö-{-ɮǀX3cGe[o:٫;bO#Ps.Zo{JgkKNfoߗWyGڋpʭʭM. _4яwmm*qB-XWs| yn ol$LOےf?.tU O>a{"*ñ;zXH;zWn6hD^\JwPB~ySUW1=mMFmi(.T?MK93*~:5#-u>֮U EVanm=-l?!XErq+8n\E,rj>6u)[fI<GSlpIEvaqA?4ϥgRWez?TM(j$'!]sq-2;\ e56wPWED^ϼZx,%lc,@)f~TeC!YKI\U&9 ai–8{eVf2+˸qsKC7x$gBdvr`H+W*sjsHO<|0k00BsQ~ȯ&ոW^{,W` yA`1"F9(ՉROxW%rxح$k y$FЏ+zI$I]ZQ.{ /ROoQunS75*pxASh@!tommN:G.b`3Yפkn[YÂ!LyΑ+F/tI Y`5>x4 < nyg" cgF lG Ox.6q]';ZMu Z:μ9ZnjCL~pk)TA(s9+zn;5iLYvT]8-}4ͭ:U;kO)b,tF̲Ts[zܻ.F,Z$JЬQNn4pKnŮS@G/fxK&>h7+UeڤS/6>ϪXgH/27#dL]"K-h?yҿԟn]\'<ȫ30dU+*t# NN==2Nѡ42:Nx;[Lg7FͼTQkZ(s,E_Ȭ`Wa=qF 0NS b>Q*0-Nw(PhmZHNs _}Yx5s d=(ׄT%dZڗ#ݫnSgBL]HO3py ]['&ojI)<^}cm.>#]Y]0W<NhU̳J5,`41m̫^S/qK8aBx>L1g/ED­^ipx,L.تy^Oy0Bw 7E=Vj+kAtM'忽}Kvl_SfGma{5ShpjK+\tqD myu⧩'dG=b!,N ކSyO:6nCxȬ;זӔƘ*~{Z[+ Ng5v  mn=+*3NU,^հ[+~#ft;7ZGMlLF.7Fs2n«c?J6zo爈neV޿^gK ;=.(L +їGyjX1)@.2}Qk<2+J`H9.g^<-Q(Ƌ X: ]w^p0Tcm^gM52bJs|"pp5Kcw^zV_aKX˶^t2}?%E;33+d-R[|Fl풕kw˼f$Xz蹁LٵGogߐ°wˏ+>ΩQՎg-ւF|~Mv3Wxi<瞭B>^]O~A?RfgXe .-ۤGeS]ݥ{z;>lξ&ߢEӍExo~Ŏ1|lp={7ХKt{Hz{߸%[3NK3 '(\--mJ9.WBGy7]t1#/}¢IqvMmkfsv'֖LAo'd*tt+f?5ܦ} i'oؙOz\c.q[n^S`g{xttP) |+^{`V}vu[n}ӳ)t\4 fzdg'J3 z޵{}ۛirY]a.Q*j_?$k~uͤԵ{ RgiSib\7ewj}\rfr[ENsekֽn|@ *u JcFs競gU.)I/JK ^iQYŞ/ZYl2$)$ة%0T @LmQx~AMAb^q!TgӮwρuK@ K-tm{Ƕ?׫'DV\={oq5Nr'g)(AkNP|CkyV(ԚzB7'Un]{֣w==ko#?~MOU3%vBq3GMإ8sjr]3'&N ]5U+5᰼&Kx,b`^Et;E!r`:_rޏs~E v*灳F8<("~k]%Ė { ѳ.>ߵǺ~@gcSm_GU c| e7]YAj - {*LS ?&tG>PL!IGz`{#MYھ na HKH9`P>ڳ]tڽKn? LO<VCN@2e^SO:'`j ~ |[4OAC4)0ȳ z7+ӣ=4bȁOث>B^LЗݺ<+ ,T[D!bL+vV3#Ce9L€'G2D|@g}P=SHp{>zhH63'2uNY>O>${7C#_)0 4> vj*1,]z6kWa٩SNL<"K<ɿcZu96~ LՃO$|]J[ҳU*}ϻ)` vqM^r} ܒ$SXh+vl IjU,^^2psqV^v͇Zhv)95ggVMobmLBQJ:&yδƎXT~6\[%XͶ*ᢖ뇅JG!\B's&*p?=EGuKvj6,bWxٱg?7wPFbZ[~ߌM&˜Ĭ52yu^,|?P!~0skش3Wx @+6+|S|ƂuF]- x1ѵ5gJnmٛ RO3KL+v?G4,Y*R!henQ'B`h+ )efb'tB>gSn6||ڝbQ ά*7 ůn),\1 vɎDtϧ tN]#WR2s7ČnS{B<&mV[^tS#~[$t\}ڟglBC"|Z' _vo%705go04ؼ]4%qSxڭ't$!\r!j(L~`ZW^{*eo17PћҧDOأ~-p͌U/[p!t-7)myY?,HW"xY NeiWY*׆?11p݌ l/x p/R7U}fv5MRI,jK[*zC_F ǁL,>sC)0Ҝ0J@ * }6pl#4|y7CBwK2N7 t^uh݉ʊFWw[x!B|7ᐬ̸#MUuRؾtWŅv? emqLߒ|<;<)AҰ[v"zZcs X/3@ԽW#,f?7Tey0E1aW^w䤼:5SH6/QBb/:ʜ:c3n€=E%F'mK7(/iO}ѵMonw`(j/:G=xX.CI;ʹ5JiCs4&,G7x0"@84r[L Yc~xuykш2,t 1?m?lt\|"c뒶.[ᚽ)cZqVe5}OB_UkԵjsmzb fp 2Zd89%r?(-ٍ˙\S;2<䭄wh< VXǝZՖ@:'3 @at0^^R:߻hiٛ/җ[|\]R* q.\Tl+I:zL+T •A!uGP~}]3n X,f<p"; A=G >ivEֻdm0o}P2֨+cxZ됲#w^B.#g\f[SeIuJ3Mc!zR侘r2zk]乎=D~Iӵ&ŷRY9ONN2)HvIeF+2EOةܦ;doGUN^95:lNTq؀cVU갗KCFh3z6ߢ_\(h%/woP|)mrKK% {x )D_ }*jV|[Ԣ8/hR[JfE;I[R-5I{Bz9>cg8V| <lOQ/'^t{i8=Bw\gL(&F2a2a4vKG?V+)- uóO0R]GPz in];$SCqx!,Mmǩ{K\.So/ɬT|frk?WcX = ]ML:&mnӒ3>,6|>vt{Iz{9Ll.ͩ,KMe"5{agpO#& aK=kygdKYKΑd O"|jVƟ?vԋAgvR[!rǘ3gnC3bkV Yk: i]"LO yu Y:⧳ 9nӖ#Ɂ詂M]q&ےYYYUS#nZШF][*ZuY=+u5K/JŰWM- u*p2G ￘}ljriwCWoM8f@`ޯ .IvVs ŌAPҖy./PP 0wV O[U17_G=rς*^ySa9/&L~а{EF߯طߺt]ʨgMĚ7n,;:g?/n/4|Qnܡ7>*l/ڤXSN;|KCB_@`ef/1s)hQO8;Rl%J9__Ex4 YB [Ns;}7_Jow~2KcZ!7+]_4b=䞷>BW˃f={'cMU"h .?r:>tU[ %g孉B_cmma9ӻ)Qlz~:nM2V>ssۤx4YheܖeHΓg; bg#x*AUV!+6ʊ ]+[ ջ4'\6fZ4t3seBR- J rj/ sF7IlͭW|1q$<@`n U]5ߎ> gIeoz35ܑ@`A{GՉ-MJ_DOfV߱pg\sZJ{saxްVKtε3 [;r-EJ;5eqHٜf{B I8)pY,va_L}tFKCNa/ϭ~;tj{ivI,,I:+4箊<{=skŏ ykjy?f,Kd7t^NBRo`axx񗆆%nI#ƛ jKCMVڢ=0;`koW_3lo; Sc&:0T{ZZGY c4;$/tb#; +=Of孪T7^(}rr^S {lMbذ1^C>tF<];M7YݲϫϵzsᡸEުݭ=ni(T%I/yy.­ }bEpةmAkKl zH=!5J4^{13o\3mSmF{Ip4ʅV^審x&Չ磷4[jnxaKЗnyq@nw{}]rke^oy%Lgjŧ+wXv- ?-E 0nX]0dS[&e+?uZ]ba;fZlbCh%!/皿3*wn9ꠧ& WDqI9UzXI?>Lި-/$W/46Oj˄g'8s+C!ekM^ uJ ]\S5W_ԧ5fS?~Bض0020; Oin=bJxynJ=>i1w&Sp۴f4+:Cʎ=ۄ VƊl8gͲKڕtߙ^L3pklX;8M-tj s܅Em,FM>KRXWc,UqOޗ`vV;6oL`:ᓃ_5ǁƫFee,zͪ$)[5j=6V|zB@[ Cm GP"^,jQ\;4󬥡RC`:!>ڌ~*ͭe>J0u6=fVg{ tr {߫Sci-u7jչ77\,.e{-Kxx׈k:N)ZmWfXJ;)?Rax)Y  @'Axi^p˶_y:Cqnٛ3欌}:&gUq͡ @'wpaX6K7>sĈݳL7lkPXΰ/!T;MsMVN'N? 0SfC!=4ɳF_/,HK&&S.;VII;cl0GWS`g"vGՖnl+#o‚TE>碷hX~t\}?eR)Gt*m{?\٥jC>k,G"0_`_,\`ȩ%kCFM`~A*+Ia9b‘7 @``k ^!띎.nM) ]2xyZO=W[W,uJ̍NB",m[ԪUˑ }ں<7._TF9)8|\GjUy@`жxZ㚽--deژ# ,tڞft(B cV- UjrۿG`~6 0 0 0   @` @` @`@`@`@`@`@`@` 0@` 0@` 0j4"_m`Q˕QEN('m zxc+ ڊ]2/8ave?g,`4_g`ytynzz tXloh`>9+8Љ zfb~DT-ΙR-;wpe / 6c0ShwxI9Nef;FNY= n(׬:$nɪ>sK'O3 *ոcWI|EV3x܍= ׮}ht@g@` 0@` 0@` 0 0 0 0 0 0 0 0 0 :/ED5@%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_3.5.png000066400000000000000000000063361322271446000234270ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1 IDATxyp)VUӪE)$$$Xa\ $$jmUDT9!;vZ{Zqmm;Ve.LűR?doٙ}pUn, ܛ-#1̏ې&=6 5dɭ4ydSVe_cL:;\p^},ѫi2;{qWE]Z*m8q᎒kv7n-9 Cx &lٗ[6-(_-6lmsoWrʪ~ښ6BU[Q~{,| a3WhPXL7{`jObT/DDE*&R4i!m}rSA;[7rc30ܓqLgjNk'42C*k+׭eYҔpX2+Lg9PVRV[YzKW5tw/QNQ 4 PoZ+^ņ#cK=zf ‡=VA9_ø 6Y=?MRV+k| /YvOݶVd[Lk>0!.yq}2oY/D!{%s~ W8'jo>am+^ܗD߿jSpneao'j dy˛{9~ZCͨ,n.[Ѵ|GSOw`0݆]5EZ{@xcǾg[+^9-/E[ U^WSt267Shm-F-*mi/@Tae{Eߘt2Ĵ5a}9#vlٗ|p(YC M^16\{Nyii;z >dnCu{-E3[/c%WoSٳN@fUF,Yb }?mM&X] VVxt͖+{konSCZ+/*kd{S!3|]\uׅ'U.wҗ|vk/2ʳ ]8a|Y[Fn=?L/'=g@U[Kwt(0D>O?zl#u”{n-޺/xKW}jʬ!8ҤGʍ[yhHtw(p&&{ͅ˾ݴ'rv{FT*?gH< [UzӲg_ezҗ[iؗL-k:(0 4p?$\{k+.Yx ];Vw̽~{,QhiMlhx% >5smQ`g8,83T>Z~9`#㏯;)m,v٭C$‚ͅcw?^u_(\`tM{(0 rKޛڋB}gi( 5^x137%~/Ŗߢ?}zɮUo):;ƽetD)G]*Թ򿰠0n[(`\UZdgYcCw-O!Wy?>As tz:;D T(0ؑgmYTSHjaبaUGV5O%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_4.0.png000066400000000000000000000116211322271446000234140ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1aIDATxitpi]("B$@HH\&-M M@n VEZiqp}33s:Ι9giϴcmkLV#|{ܛyR\욁쉦VחV'Tq$aԢQ3jZ9 A0٫G֒8C0, `>s0,:pc`n J`8_O(*j=ۀ/U*~3G. tI.n3guf};] 5~Q?+64C]#VK:&~E/mts0hZ 3 0vɮNF4-   NA06%Avlx٩ep wh; ZգG ؓノ) T;ꆄz_0ՕOnP7&cDyS7*~ܲѽ VY`YH,~`>{?kx<>;-Vj'j†e+^.u'ÿ{-ܰpW=~77Nm7q׬r[~Ŧo/_~QS<z [ob#;M=7?VׇXz#wW gc,>dNoJ`Ȓ`ٓb?G>l#s|oт_eD3sGFnjE5wV<򲒇rU- ?2n7]vc6/Go@xg$iВ]|^ʼv̿Gư>RԦ.\ާ##Bk'aВdVfbA``ļ A.Ќ6wvo ҃=Z:ußxu+dn\7]E_/KƗ۴;]AW!tK%IU{u [+|]Ԯt{C~ѵWnnw]wOUNG.IwUĎD#K379r >/ƞ9KkBsolhz]\wӊۈʠӠ)M+\ұ_p>/<˻_+hw]FpUbA%yV!(:튤VחVpSbGsV\Yl {s2v.{Y5m qY#.7ۜw;3 b?nnE\K:u65~i J _W; X8)pgx呢wgXȐț#*?Q4m笤MO`Q[5#N~ʤ9zΫK읿ܵC7}d5-Ef>6[w 9I= Ȩ },Py$2;6/?g^PZOF_L폦V/kzߩ|4#PxPWq'}bgCRJ49P8?l|jȀKU;^٭hN0g`Q)㲪 Bkj[a˦qk4s{7 6nh|Ȥ_oI>/O)L>TL/kUO<*L5>^jjh.Frgeɢ߮;97kOͺFXpۍY-0gWމwoܒSD>uBGO6"&Ȭl5ySN=yV z_ 7lxcpz8|XZg] C% Q#9!'˼jy_e/n[⸽K_}7Pz5}moQRoXQ U' lӹפA š?퉾0v_MJx`\)g^X7g  _Δ{6x7$@Ɇ`b]ހO$6xe;_c*SbeZACAcyV~dzh//ٓVtBZ%I0@6hҀh`[}Ujg{ӑ+Xrdܺ̾i{YU[+}Ս|{1' -y! ~xwxfX%o[/r 5QT7܇ /_xpтǃwM"}֟޲1ۇ/"bA0@3V|^G7qS†'s˶g/|鈅/VľX ЌqQΜړ _ulүn}yJߗ^/4$_C n7OҸTQ8wݷlgƒ'_yWC 52'%;s'.Ų7%G+Fzh ;QyWB 5ƙP?fukwL}zW sݐM0Y !kQěweeM)4B};4s=vI+Z`a0U/?ŸF0@YsuņZ\<{ݻ\=!۵ãIV}<"{!hش~T۾EŃB0*m @0gpY\y$Sqpa{^2שكmEs)KB"&9$}̲҃ԍ*8S0D @0 ` @0  ` A0` @0R!V_;QZU_&@0|%>% YmM} A0`O}y(z82sL~{CKw)?Q"@04Mrλ,Ļoߜ=Y*@0|4iՇ#6>U-Fw44ggsw|ǃa`G_eȌ˯N.ng Y `Qذif*~$i޹nyr *}7[8XUĂ`Kӓ#Vݿ>gۆ+ .^%^Ӫ}od,yf`>aDͳ=2KvXR`W99P労R+_*Il<}`QԒ}%NV8i[A| (Ze$89\;hwz ق `  @0 ` @0@0҂!%V_8\i|.@0| 'JsVZQxssw-z"sĎ h0|ʑ-h| E_-ͫns1yDzn}liJ` C#ʦE/LY;ydC%{k3?UV}8$h\qlҖM[~u}kZqXéDBG$`* @0 ` @0  ` A0` A0 ` A0` @0 `` @0 ` ݂B00sĎtNYo$9CRQ3gUIV  <揂!M0c҄s"eaNsMhNy-{!Z%m` A0` A0 `  @0 ` @0 ` _ _@82%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_4.5.png000066400000000000000000000052021322271446000234170ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1 RIDATx}lUgmJ1Ôic [Se|h(-e99n P0)YSbdXL8] ϓ97&_9]×=8L~0Y׍̺O .w%!:;M=|a+/YK=tqS8y0|gÒa0wknPnT(ۖ2Wi+^w(|C=bilٟ ҡ@"Tô# ]Ya7^3sދvOjƐXonJ6 >k㘛l7p N=t8pd>3w nFK֎NE}*vc瓀n~?)*[V^oKhWˏND6-SX@;-Q, oJ àխ[* Gc7~0jKoO˶憖Lis}ā%=ʎ_;VZ8paSlXTF Qa}zYK_3~9ܷ s;+k17E}֬lO~^#*g'_eܠ8{TB;D C`{^(X-|4榊U4qCqwJxʎ۲p~hKb flu]̬ CUk"*?_v0yf≺(_QߖuTB2tQ3֏#ݝ߂o^aǤ ]Sr1Jg;_?]Oʶ原iZv xE) řGS/ݖ\=ok% ]XFk7.Ja8~pyX v /BY[ɏ/WVeU$Mlh/- ^+l~h&j)\63P9> QUgkG]_?LTl}[?|G^n͔ L[3Rp90o.UeG=R+baφ$\(wuukPuE[ѫәtXљx6:S^=\;ZT\ޖUfu;c}[Cċj%{ U5?_e'*oj[- WٱaqsAI!YfsKo3uaթ{:wKyaO4m(j H0; ~K-Hz%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_5.0.png000066400000000000000000000370561322271446000234270ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1{sXWK;E=om)>c\8# a{ ً w!3```6` `]!ռ` ;  N&p0-lS& U0` `@0 <nί{߱Oq+a  @0 &ώs_Х C0mz5# /Gx.t3N2+8b7#_]<uڳi3io ;m]ڬ XeNOk{23ɱ.s=gE/%d2wYmhv&oɺ ]2;285ӛ5s#E'O1Bua]jVU&l χ!egBW2ԫfgv>U3)1)dk\n^`V FhcmfLq9Ÿi/kv7%l^5|բM ;}Kj]5C/Qh{E^kobY1t|K C&g8u3wv:}MMUJ7jƚ+Xa7{']e9p^ܯޕrηxG9ͥQ+7W-6/s&&z nY= G[b!ټ`Nث^^'|*V[Ŗ&&-X`̵y˖=o](E?WkU;Iڣ#l6B~G:fb!_kohЈk߹[,GUFƑfN: ˖fj8_\Y*-nZ?~+eX\epyڙ' xb~ڬIv&]jڷdgA=j7 EV^tSiCy; υUAYc;wl(>+A_Sј\ {UX*Z(]C+rb3K:ta~蝉^{毮]y4Mju19Ս)eKφUnS7dV|qL֠_ߎߠXe7˓ ړ~},G8i&ψ+.<jyc_ y%!H•%+x(0LX"[*]zWᄭt4S'47{bҼj^i=I1zSTyIڼo\n|S0:-I2f{%Bߒ敄NaZܶQZ2=G4Ty9d]𳂺\oOw*o?ĭW bFva{̈ږlo:7h=fZ[*}r/`1?wڗmz9%d╅uԤ(]}E7?ܓoČ-"&W̗DuL Y^CUKڽlu4Y2w|9kw*WUxύ 3`hиV\rG]iGg'8m %!_|OߛuLlsӓSFm;u۩mxz 5ö[pIS8Ȃ_s |ӛ~QSkf&\I\dsyS%ʺWϓ%/Uʼ -ÄsYv.yEc9CZ1N;WYBz}_"_џjB 7g栏̧_?l,:'o~iq))0:+0;HQCUm,6y`1vB\ ]Q#PSƅT[]KoɶQ2EjH Ɗe^I-Q1wfLNkׇ*_Hڡk%?hUި]ysSX>~&xOfOJ8,l߫j .Mԓ~e;  u^N^JuZWwѾ\AK.M9}2%BQnc~+'^n LM`twc$I yնE/szE$Lc_!֮\{:7>QNtugj7lxCŰ/ WPOKf x@'BjR+Loҿ|пMګoé{ȷk#וm*$5S'nK=^_ 9!,t{(|,rq>q7WJ"L;`KӷTl9/~dLj摈+/՘<_ _X]$°#&:17]ˣy޻ڽ~; i*[?}{:)P$+b+óW=߬j ^0킳?FޙgMjbY% _~T>P()fm@O{wW5`nѩO!tx{A+:/CՁK:)zR; nZ~;uCp׺F|cEͧX w;ihG픤ګ'Ug < NSŲwG!V(Nc€iÄ߶8&8PoL;\w:pYiT*yIkm7n0cx9tv?]& ϶(dܩ%XOKUJ*`0e40xz]'wZf99%1'ܢW`8[1Q $aQ$ -c!c»5s`ޫ(F8 :/ _ᶂ\+$hzSkV)OXj矑Ro n] w5|k,TȟfWmYh;67 |`k]\*=MsB|%zu eL*=vwtv7.I,h9q>bc@UAx ~u˝+F ,['NY9E_-8:[pFy:jipL_"bI~(byx> e_zyI偳#WHqeo}۰9NCϱj &MᷴjPZ/,P+ F1k%!EY] fz z71~ sk5H1\>)(m阢dž g\nőrһUǢVJ<=z0+~@K+b.Ƃ:e(1QL Dٛ\~Pu|].\>4W5;0K  Os>Ǥ_?$Ol/kQsU^Z/9tIN: tl8t]uL\sE#ޘX*ߨj?*kޮRuj:)~VØ)p UxD^o}\ݙ́pM6V4֋,I9ՉG6lBj|l"g2,VaVkXfwuO[P n^$  H?x9tfNeE2^ѹUbaHap&h&y*nwniq)[t:RqůlI?ְE!Er;tfº Xt1lsBǧYH,_!jjax9H2jwzgl 7X\ܴ1h1DZL^=@af2%qvI]͗b-8+>EVESK8C"cd~+Z` K }}<2<0aלѫ|ԕOˣ9)> =L603\ s0<J{R|{k1Wɛ*AOz2zuD_+A]̘i,7뚫ӽLP(+x2~c`X11ѾkYBǾ=lG>}%du'.kR{ksM] ɯo/qli^?9p8 sB ҟMpFص]KL x]ėYU8V( }fUxDc#~sO03@u`i`Je vѓg,5\q67ݨ"}}\|Ͱ/pAPpWr<`1[AEfigů`~;_I8/QS8= xP`8aK2^O䝒^WLqA1鬣bSU 'Ux:LbO'!dlW*n ʗ`)$>6C7WW^Oۯ:(pVrNVO|)N,~&ʞARy bo!z(1l?^o?-ñW5{4gFQRsl U40'9'ū=lg-7D^as`\*H^u ?ϵTqHq9p说.qOsʨy+ٝ[7O7byc{lkulL{^ ?_W w{څ. R?ge?iu6:CZ!Qs{Mo]h\tw/E.%Wxr[amcf8/ Y8'!MB!5ijI7ȟ~m,I8urs׵{Aߨr\goh fkֱ[%5jN'miM9GV*՗M9'#~e8z>e_E U/䜜 j}Zs%zI}GB;A} 5јS{J @UEYY +mEO{=ng9>vf;ChxɌ߬;j8J\n])k~.𢡄u<2Jl*xp01{eW[{&Lӄg'<# 9PPy q6m_<ѥG̈ܬ7\B48_l)Vҟ0]i޻'!毗]U)*=Gjlo]LBIcܧvq`5;;}Ff=H2k0ܫCG[<=jfIbiI_\i74˷県zót'}wZWw;5yYCȊODVQՠOxӜ$]{0\"_7EAe, 7˯r(̫ p)Z?~c۴6Dԉ89 'loA@uԊZ*Oa\li;zS#mEkTUN9։;>q.3onʵ Efѝ?n?^,^->,AQ*oU>V{TK~t,nCʅGͷCqUikMCUzUzIkqE7vjIQ-cӃVNc*Rժ'#~]x>"ߨ Wb\/;rP$afuϘui65Ha7̧JWs4(+VeҪezTpFzRdg%1`.`ėSiSݲl*zRsWk+ݖbNS'94_ a4o٪%ECf~CnLlP*_jޫ,]}EQ6T眔RxN;Eq%˿ZxT<*@xj ܯ9]'KtMZӸk0ZRV=!=S((<+TG^X7?YWZEf㚫oV M^$}\<7wdVK_xgͲ1먲@:ܯOvϜ93jǼq#mԧ M;}kxUMfU ]I ]pIq'Lr{ Q1/(hw䜐T6K2)k;j._-:/FC ֪Z%w e,ľl7$mfe'm?ӒzETWΉ~k5gMch~=ҦP&OZqHkjϦΎ;Yf?//sWēIG~ ]0nj۔)2߉j%;$|joU=UC nYYGKU-wcU>q2SK˔B:Q/i= ]Fv=!Mm?SNp\5"fڌU=e)/(,[Exh,WEo})|7lAl=¢ ј"!e/vKk靇 J@W&0;a~sB6IM*T6;%_M|IQwwT+}8{sBg;~g`7yvUh,kTko&n ]SݿCP[f1wo>I;]treeJAVNZa}w`ٱ˷y3ق}B*8j.o^yYwAዝsuxwQ|#\f[mP圐uMXޤ4V_Xɨnnԫ/. ]lNkuUߋݮk1!$;|k1GWzgE[ۋOw:$t[}ti:(KsuPt>f*/TW4FuI5y7x7_+Ø$aoXe"+?6}>gS4|T"~xjɦ`o|ao).;w4pzZ?<ڗO+ UƂJ.)߻Z˒k.)wBWĿW>[x>uIaaTFF#eYFp} ()oTWzIJ1YZl9rS#^6 DhVRި]on}-8C♱`z,ĮJ wHxYKN Ag+ _tҏx Fc_4aӾi< @;7q\5E;uڽi@*ev\E ӕ T?y!0Z*vwqv D+ _ [)]ࢶ%n,erKYϪk_׍Sv.–p\cBgnob=ef975W\?@s]mӛ3KbkZ!ykX- yNxrpaTaЌ47A,/SmT_sUۄy3tE_ұ^z4g&}rr H/ymä>]u,[S3NʂysYWNUMȢQc=gqnO( ZJ.?/:SR+W6>>[rQzWkBMZOsNvF9 gp0m0׺nX^ ʭSnBtFwޕ~)4Wf^;w_6qœ#WK?(n6ap;2ZO[囵WecYaUl{1K. )>/"lI`8": A6/4_5jeQ>/o?,%]PX?f;+ #!z>&^(8hQI; xYPlJ_X=# &~}~ͣO2 mѠ`WAÿk-ا^z+ h1`J#ld6<nc?}T謹pH,;tgTsL2ngd6<&My~_X#S&t̉;hKBHTxiIY vřwz'N'VW3g5hmHj G$43*,x~^oWTҭG7  S5 /&V9XX>ĽF}2``0 {Tӛy 2;|q  M桽s8f\Ό7-cB.z}ƻw z(]yuˉkq1'`TuR^Cu9J8C9enQVG"қ(bp1=w(1&vUJNw.}Fq ^1`B 2FsJ F/nNS.+&M Z!u5p4zN19``67fB!ӄj&]LjtGNTv& , &M0=/?#  /G:t;Ɠťn`h֨3_1iuԠY cΰUNW(:?FՑN QJ(L$fY'י.!+ #]Co4N3uZغdVG ].ÌiS?3zύN ]N0s0Xe8vSgU:qk8.=񜃳-§-KF0q0O5ٔ=lc7e5U{q3c'O }S;+ MjݚYhmjklN<2}9{m͗lհx<\e%l j9I3ihzT|$}hxڷdWfLɈ_i$_Yl]* 8*xUcz``H3nJrO9-t]0 m^_N<=yf􎔹I4 \% `@0 @0 @0 @0  @0 @0 @0  @0 @0 @0`@0   ` ` `@0 ` ` `@0 ` ` `  @0 p/ZG lb٦s15M;ޝ`7f[ e}R׻mbځ`3#՝Fk>9gfg?Al57\~d@0}CNP5L^d8aQ֫Sf禭\ZILZuct:VҺͯU|NssgMK336N}?3isFы. Vf_AGGG1),ՔuٽwmVtZ;Z>E3 [Я[GNJe?Ztƹc -RochچnՐW]ZCük ~>cS Of89wImk]aX}Z:e` -^򩲆={ߺ̛nߐ9-l[/T/vܕ~Guњ tow.Q%wc ^l,E׿ؕ—ᡦ9~A%FY}irՊI匿Ե9wm)rPmׯmKQ/qDG$ǙrLX~aʍ\]ΫGP-2|G^wN~>ޙ1ieTvi~&0(k -yv+0$zOxmcAf$.N9m̒~3# k1Ե'.,kO^ V *93h=,J ,N n[2r4z0wo%["Uw>~ jC`”>^Xm^{w%bg|*ܢeq xЙλඬ!:%09{mȹtܲ` 8];@{ >.kzV6,ז{MzX[)/`J7- #.:Aޕh]{%,w;8;WM\>铿g8ϙopk{6\\3ym8,UsVf\} dcX5wp”.#L9|{]ɧmXxsMq uo. n>;>+fm+ wO޵*3:Ox"= Jwy-Ͽ%,$k)kN^uV{& w]pM_8c<=y}zۗ Q2Ҳm5յ'^ sV5~-vzߵ]: F>u&oly;%=9-|ܴDGdzc_VඥE_|c}dgޯ~"AGi2|rֶhQMK_ 5"^j,X+$5Y_ؑ?; w7',u%j5yuUC>#uҥןQ| Bô 9 ҭ_9wTًc~yw2|{^]ID5궤+ .^vý}AStp;W NnO&+#|żu[~cC00d=QUUݾE֒AlCMYu_Kٶh~~\qo?/ C=q a1em֠%^ O'[X8Z[yOX5RRI)..=9N\޻dKd͑˷mV!\/ო<@Xp{vy 7}ٷ]sE]-x-9sy?w7n~0,$vR-fzx0%ҭN]sإΚ)wl 6sKHY*Ám/߽~?1hԸYvΔY(^dȐ'|Bx[#Nz:Qv_nt}>;#*K2Ҡٯ^ܵxM%["Aq^T2#3Dzx*ҋ6fWL\189"P-puகɅۂ087?!iDMnm-Cr57?)='-pw؜;"+>vˢT'+_^#oq n5OZyUrƂ`C׊p2+ZyWðk^o<'8ϙNv :rwcU>_#詌 oF߮w< _pF#]*v䍪[1ЖxeΞX}ɖȍސ`4- s7*v/*ҎmKg]#5e]b\Uͳw?1iu7קI |}Ϩؙ__Zgnν̋o9E 4,tizkjU+ OYxUݒU5L\ !:D]nG*v}ksOrvN{E+]u# w/9yl_?*M]J6GÊt)2eMVOyp"4D i?āaW~cI}NX^sjVTl/}fؘՉ`꺜l[* eSf'(09=ƫ>- &Uc)/ӣp dVlɹtfXm8tҚsn^ >k/xo+wϯ[bSe_G)Y״[jcᶹ!2nԃ)A輿!:xm=zU3y#M߸c[j[ ^)ȗz2 y0j~45@3cյ'[`j,͹= p5Dj*xnߐܽ'>+:j[ zNߔ{' pMߔ=ǫ⏅*w<^Zz~cSXM%YvHGGǻ_WZ-m-|ЁzMKdXܳ{%:+V[ua?w:+{Ns wl8SAqnY֣>25Ús37GOwt`򏝐c$5A+2M^uU]2ǘi;ϙ|MYD* _~Z#O60<#09^3oƒ *wl6 -b/9eچ+ʷ ؑCŎؔv|=14xn `&]Oj\'h л&xهR5 NNDN%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_5.75.png000066400000000000000000000025531322271446000235150ustar00rootroot00000000000000PNG  IHDR TKgAMA asRGB cHRMz&u0`:pQ<PLTElCiAhAhA{KSd>%RpEkCqEpEYnDT6Q4_yJxJ]:b=_s(=  BG/&_zf 9?|_ϒK-Ymu j~Aaя͟AK^De7oVT!y@/x5%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_6.0.png000066400000000000000000000213311322271446000234150ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1!IDATxwPQ&U@: M }z? T,D;XPfM٘f7&s h(*2<2y>o| IָsJvJs$q{!/"+UHk5B0Suj ;l~փ!U0@Suj:& Ӄg1^ F0'5`  OCwULV}G4 \ٲOаpT`xQ0@UTuA-Iϝ`X"eaaW`h[˩aE yk4=PA0@;pյCF,`C*7~PYԻf@3-Ls,gR~h;e-۟HZԪ=}W8ZXq g4? 8:,c}?Qwڎ *{c!d>S}w| kJu _.9dyNJ+|q[*̴f=#suq3 }g% vkV>]2Sʁ:%_VNQ$ z0Ğc̝ +PN+ hӤ ,_.Z 0nZFM _0_s=3GjN;TsxIJv#V1꜋Z27aH-'ޖ=.*%aKS>|P 盼J }s3?oSG?:9nJ8ЦY֍2tȸCzNޖ9qѵGo>ûC+S2ԨY H9OZ}(MoFƩ16NߍODoG"~ #55KRԼJ49/u~`XJAP8 =:8y[N|ϼ.5jԻ,AҜc7efؗwd_<b#U<ol붾@UAc"҂#{&禕φwL, 7".Kte[T5C;?j\Z#uU 4oL3+4sD-qg[rےތlo{oI%muULZEUI&ݖ|ݜG"A]\TV>ސѤ`{e{9F">-iK^|*f]>:dw9DRZX^dܩd,ܕClN򫌅?]e\u0𪑉9FT"P?9xX<"~㫑-"^{4޺c'oZW .?\݊@2뾌 hocg>}JhUznYݬ-Ie A֗m ԨY=_ּ7дxlŸlLt*++؈oSn )?`g;3{6¿Zs87ل7OM{285ֿ݌so?z}VYami?u y7-ؕͥ侴b_7c68ۚ`~|-^vSmXi8] oK_8p_xӞ_B`xUZZ+k[l8] _*z(̊8;&G/oӤΨA$G e-ݳ3j}C?y kg^(y8kQwU`=i_[z5>|a۳gĂfe~oCGv.?k]CkumG@3YT>UT?)ӹA1kv)۲FߙwۭIoDp޼y S.n3$"]< I>l.K_ }c|!8`O|>f|3gCmz>ϰpwEeo&畽4)}ž?u$WЎG=϶ };~W<~衜Mo͒WUv>\a֩g0,yȣݘ.5npiVVet >mY;XwUՇ"lOXY1F{u_853׾ϒ 9( %# iߜ#?,| <}ԆoU wκ/\6zczaYAî_4zcF៟kۓbې?7ʷ[2K[^jtL3/Ug=Z~0w 'CݜUtU?=쬪~7`{ TګvƵ,6q[s1sM3hž!'zk}sjB4j~9Enx&"/,z!kmY.sޘiZX->o~cGܑ}[B5ߝ[shAKF8"z%`ϯzdmfyw=u¹ kD~3~ka^j5ɉwwg,|m]y> | C י~WC>7"+x轕){p ӜYt=ŅV-T}ԸZm75p &%+kNV:!Xol{[N~ތi{:7]>2/mސc7'[ F 2g"OnKz/wPx"=l7ek֧S.=nE*utd UUsjN%kF]זo tk6̸' 6ap0)ґuݕrܶnM+^+w_v:0I UR {ijPx~t |@ʁ bWE&8eD`# ]̄px`ƽC%M _H _ 83ϧ9z{.%L%_Jr+R;/x>gRѥ T qXtOu~D?=Pe{3o[,wW,IkD*?<ֿh4̊~hu>}.3gZ'_˾w_7Gǭ+g|fti(фӗ?cM)1;/ztx#/+zdDF9L+y飹>ߙtm, x`\PX(r{ MVȘll8y͡yg; 2r\`ޑ|eKv~孿) '" ^4' Le`]* OD#X7XQS2«S-t1h3m0`hmz3\pqwֽ;G>)m֧I EǤN m[;句;~/vaѿ(|`'7W~9[vzY\ݦ]&ݲ&h&qf,Hȿ,y9˒'~7ky=rn.um+^o7?yfsW4ִ{m阾$>yܸHҬ+oݰo2gN^ȲfŜWS2{p~A/m0-h쁥{J^.M(yt`فAG+J{463'q㶦-2s`VD8Լ^pYAAeeeЬW~%=\HqsG6+n)ɤyƕ-zk=|sqgK:gjm/k6ތÂzu^÷3 /]9pxp%{ˢ/,1 u0uL ) \x5L~`f y#% ޞeqߘҼ֫ߩ4pתo)kmиs%mw=Ķ}PH4-7.6Zl9AX$c 0>4c9)M?[4 g15_!eqP+?g(5aɋs׽[4Vl5AnY buJ=UTZ陈?Cqm0YS6~ym;$Mr,T%VG^/J{Ñ⁥{;-WY\uԹ:.qae==''/Jo+ /`([9-jҨnSP2hN`ny['Z s,{$~eK~֫#O^, \7gCTY >:(rCZu GJ}r]C[N-o;`ٟ֮Sےf=Y8!˻Gn4.vj&j7W;fnIk蔱*倩Z8oaW4nۍ85ύ9ݣ0ӂ!vu{m:.ge<ۆj;gCwj78R0 - i {O~d0 PgC%m p\ߐ` Al0D> mwO kdx}]+go%k8~ 'A+`<; S?!ky[.Ip6=92YO%5^3 ;cUx0$vx09ж/&fW]JWۂ2oYw,Kd.+ruNL0| 5fu;moI?٢Q'-tUbWu?_\s$wϦ7#_ȆA5Ɲ`]Z١4hwqwk=',4 6jl.P߉T9{. ;pޓ -e:WUsgаp gwpҩe܎_ٖG+9}'4Ӱ]PCPU?y[զ_JO^rF9O%o7j_?K#YQMcrqfoؓnA4FW]i/]7j[N>cĢ@7` םW翎/Ů47핕%g6N/Em9^ߨU4/cp™%#NqIWf@0JCB+÷?qSW{:`Й-E' `'vϿ-e߉ EO8;pkN i(z[k\մGnpIÇdOIЖփf6mO3  _( iE@0|d$2S~_ݥPW0` A0` `\j5uj4&pJ1A#;#s`;.-=iE$Ol8-E*Gɣł8 7(z cC\?e8sJ[94 )s IGv R+#f'~e` *'ÍÇ,-PzaߙڧW0`89+ oٶnxtƽ Q25+ײ" K(,zŵG;W9AK0`8\Pz;W5GpS`ے4hQG6oۜ[M,rqno1}E˛: s@0 ` @0 ` A0` ` @0 ` @0  `  @0 ` @0@0 ` A0`  @0 ` @0 ` @0 ` @0  ` A0` @0 `` @0 ` @0 ` @0 ĀDy2Dq%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_6.5.png000066400000000000000000000056161322271446000234320ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1 ^IDATxylօcl.8*)s乂IYO)Mc{ |gE|odR7\\[tʷ唗nDlsZqSX&?ߙt0wW;-]oeL_Ng^]_,TίZَZ8XEc/->?@칒Շ%Ʊ@W6kco5'4޿w\r$ߒx}V)3Y 7ccx{SY3dq}@P&;{SM~uJ=μ3CCR332?gpW>ܫbG4@/)|TÒ#c m?-Z 973Œ{y]qShHUKıS 'CE]򃁧8P\&eKv?F{:Rv]kŊ9U!w㼛 &?|nջr7׷%^1ꖼޜ[x5}jC@WsʑApVsFS5{VH_V+-~V.$tUAqs81\@4/xtc֕_AHpk8;(\:oނN~#*wF/}"#J5nrg-ŏ{RW+Y͙ ؑ޻p8jRrGt'}Vgo]|(G[U-y*笪oK)5&~?okvO]f4@1(7E; .n ;u(ۚ}"@f~d}u!W)q֦nE ^V0Pv%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_7.0.png000066400000000000000000000355431322271446000234300ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1:3IDATxwxUd*P6W{n ;37{^{0AڡZժINPM" :ͿT}^kwIcKCzF3 }w>f`FL1p`G0n`%%6A Pxp'%$``@0C0n郁[ @0|]0(,"`f 6za[q}aeF_x<7/Op{aS+".*o-iY){] Z%T`MrĜ,pa1, *s}}?*֭puPXsQWֲ8nfB7){[Ov[4#ͣ3=['R,إN^E/9ƭ@¡m,7~>t"H55TWS99wL\C".u{4>8ɻ~9dnޡ?\j^)uEV?V5S܇Nzq0H2[Ew4˿ o-"ݢ uKEڿExwMRjȦzs}^ܖ4%lܓܟ`듈bM5MJZēS'K^* ٘%jGA8 EMy;;z@zҒWě^IQvu ^JY=z[Rj條.aG ۯB/b66)Z5VmiPڧHM;fe_ڷV(HP"^v.0F`LJcxNwg[U3Ez==; |O~P0d cTتFOrkξFVu3/>Lk/k.HW|WI:ot45E} ̝6I zdqpE<^>LWsO]g!.)[!x̥- :dʰM>lp<\wAcSj/ǘ难.eo[e%+Y]in>O/0k3 |K<:lv0xx\9Hu0&UK3]J,?BUHJ똵=KV,h]&bK}o[`moٯ ݧ7XۉSϛ 3 =<4b$2W1jUEn g :kْʚ7rk)hr&䗚 >+ZWvdHx=c0s|A3y)?wC&X[EʾjVmC'NJ6q 5f"Bm5ɯgW+>Pw/Z:DM]vɇ0;`8,XxUek0tw CFKY%%M;0\~ьa1?u_8wݎY;2愾 { G/7+ݾ;tA*}bDWkG0Xbk#=unl8kc]Msf Y .o/-i% |-Hf7ɕW>7rG؅9<$LZ- .>19|vhs]7,^6F!\'=hgBU˗^*lsN-g~Sgqm o] nNJbk~ ?$W)r[a3ƴ1y]%<9bv#̣FLV >;u+ؑ==h~C8)x +t޻Ӑ銧&8΍<mZKC>mWM$ugNwIPGt[ō싾okD],jrRgcDM6')Jh$j/>阚 ٔ۳d]Zc/%ˆk~ kY^6*>?/9o+wxC]Ryz-Ɏޡ?Z1kg6xCeMre^;U%[Vԅxɧ&f>cWt#݋ۥNrڗS[QtYtҷR$_)qUH4crgO)^(?ʩ[֔}JWm̾p\H:.fg.Gu0Fw@~:Fǭ0(io5KX igYؗw Ib4AԴӲKh |e̓qՉUG3 R7(x4k{\0+l{YŗPb'&Z1YRHg5Dc$  NnjΏi^[ OSN3Vy^ V0v2g Շo}BaYE= 2}Er|Q*ɼL4eaQJyuI?+Ya &ӄcc E/ت ] !v\0ov*[饓A1c,6ٷUXeӇ Í W < ctqSUMyBAc tyfޘ䓲+f͌'rwf*Lq{Qp4 [ ?(;_ܚTzEޚSVc5{3dc%XE [[+a-.WŞ2=YE9.͇%nIj[<2= I̟?!҇h&zZlW|Y~ûjynο$a؃!Vò+ݙ]*3&LɫSցoM*j_7vwN3qKw? q`{$ח;UzYnvYRy|$pDox/l24RJQӃ+RIx=Bba JN;уt$9N݂V%u/ɭ~/!5ÌU߶,# "'aa&8 )gyOFoqϺ ^^e(y!|WrGW |.v<Ο"#g.eGIK +bkIxA1"6* }]q"F6ep6s2*hI'z!1n7pa3#t ܅}W{xғN*">7Ynd8G@y 6U-q ]8@)l/o6ޫX8'{K5l~_3Amg,Z|R -\b[:Fn֨rGz/ԝ tD?o{3FN}EMͼZٛ<*+e3ɪseɹ(Ca{Zfrab|ɰylѱ;]Պ7$-[2lΘ'u0lg eA!ٶZS)J_?ѺrJ q orr\{ݣK_ot&.myU*wm!=p\6ؐNOr ncO 1~mDA+=˻MBkaigaa^40z|9Aߥc t` 0St<$p1̞& *K^g+CAP 3PS=Ñ<.Bק F>) 5Rm=Q{If;_X!x8sGNp/lZ[]K_l|"hs}{35Х_:֮fXdCqNꢊ?2J|x-3>Ї)k)j_H(hPX}.HE\jn1%t`xp-;ƴ3?+l]BAŗM>`o0 1aJ[$V甛.+-.!-9;=ێ&wOX'[ "lgvAe? _ACfj5 C#ijIٙf 孹(^cE0YI0O&9L{pp6Ign~_vؕ*}[_|P"^ O1|G^^duY`,¤.ByDJ7ś t5࿣8.m+ JV'U,tUIv356'⭌g/ua=,`$':8dC@йj{-[&dE\N-i'4cJZ䭙U^-K>luq#L '7x{U2]4hSsf0WoKά x5:͈R* _won #-IaW}W-])]YG_ ShaZXc(mg9=`ILEڭ`uiJeIO46i˸tmFszm8Yҥ{M5MJ!`~BK0q*oJs[US9fn)jR|*-dj8b$CW}zZtỄmܼAL#YC3# &?ѽaN!k:iڃQSfF o MB X]N7~xk>'pʬ} ]O ҕMc%Cܑ=G 7XQa2Q 0l.y3w3w3vȍAbO+v{f1S}M-[Y:F~_N18|։%iۆZﵲ)kdSxƱcbdJ q:fAِi'9G0toq9BuuVcW9fX#6`_QKO52GuH߀1UέtQ1%tN q*U2vd߿E5FnO;ɹT S/'<ֿS'2b[O̤Ǻ݅1IB'uzdQqNYnuxf3FZ#-f! + ?'Go6'pNckRJה yE^xxAqf=tb/ֺ 7շyku0Gl" 2iv Ƥ?BoaSmW5Ӟ$I XS>"j/ky?HQ;'VNw2+xՑf^œQ>@m \됱'kaZjȴZl/]u3j|n4@P1aq“#fg1'x^A^|Mҙӳ* (i6Rgiy9ʱ=7ce| -> ߒ?QcMn-|4_o7F%#½\_f.74Il& g+:zL9O1[O`T0h[1V%$2Xժ勗,Ϭ PbZqGZ|*Jg|*ުmC%okNɰWʮ~Nqx8 O<[ȍCl?Bck^iX9wkvJ_1ŗVU^I<蜻lY_wKvoܩ5nc& s,! ʷ>6ר}VɩyNPtYó**—-zw^/hM5mOR27~N3ƱĮL mCZjS!?/?Z5~?]gmqp5ԫF?Gg05@ Nu 5dSJ;5KIw$TӤ͕ -3FY$9:F0ԩ%/j̍A`p^绢tMҩ_%Us㿭DBqv`WU|!cGE\~~ I{ G5CCՋ6n.M>o s]1"j NeEPعQCzu{QdV7JgQfKަ|+ Q ~Yj+奫ʜs7ޢ=Q?p۳ 7x)z<\I=OyJ;kIG ` LЁ־ v'<7ξiMCFŧu˭;&zH7_o \6^.pZe:69: C0/%Ěiuy۳eekJ#&7lW^L8~%ŗץhY֚q}5U[ Gb3UMi5yMqT6|$iEMyuuBVzuړ.\_s6xTcbEĕ Mrjx˼\:hCdrf x`3ZIs#_tI^$8~fХGf x῏R1`iԔsÆ=CM4l7P2C1L b*` ` `s&!@0a㶶`%n` ` `  :X0@0- @0 @0 @0  :~04`;sfკ ` ` `  ` &f@0|5mI00 @0 @0 @0x Ǫn6,`;H( ` ` a!L@0 @0 @0 `@0 @0|GY @0 @0 @0  `T p`eTÝ` ` `C(X  * ` ` `@0 ` j  Ø ` `jfE.%tEXtdate:create2012-12-02T14:38:45+01:00{e%tEXtdate:modify2012-09-21T00:53:03+02:00w/tEXtSoftwarewww.inkscape.org<IENDB`calamares-3.1.12/src/modules/locale/images/timezone_8.0.png000066400000000000000000000434041322271446000234240ustar00rootroot00000000000000PNG  IHDR T=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsE1EIDATxu|Tw@FHqwɜ31@8076TnAQBa`? `DEQڰY)u귺M~ ~|}{տ9#~I:_ܢzPWY%<*{[ M!fEݙVU~b][[Xܦ<_*l?I#YZ֧F^u@|]҅?/j3smༀ,ǹR/h煨A”Hr˻sŪ:-/<.ih&wTps|`Z!o}0"ωxlA }WX>#u_~vSx}_WV;*OJrTY ]V 3׈B4"_!vRM-=rt Kڤ|sŭ-TG K>A8}u|-ZiA~*g-\'.Z-J:"$o*^厧:0)I|xj;׫Dea*#sL1B&D+׉LGM;Tڴ\ɐKܐ(80)?:(U!}7ys[|wUҮ7Ј0mlk 7:s%m'LU/U> K4fUgw_٥iCA!\<ݤ<*@Գ'6ˋʐP֩:[)c 1wIfTn|סpX[&FY$q*'o"vZ jՂ_Ik⛽-,X+e\5tZQ[R_?˝li{JڥN_ο|BiNyGu}mnNAB7JhbFq3{@;5QԜ|bpƶ_`'H!h7J%mһ90TwV.;:P:L;y pM -|bh~K:wGrDb^u܍eGWLωeҧE-{ |㝓\E Q\HNU#~.Z>#vvMX1>ոCw%շ{gJŭһٍA;,l&(=Jיf6sxSȴSY%̚8\հpJ.i?ܧlP<6 KݾwRy UBb_nX(( jݕB*IBDB <ύ\JiBX3 + 8)}k[hrrjSF34)I|ŰY13zrR#<:qe!~Jpy[?}9Seފڀ +Uf)=u ;[pѺq3 }[pUGr?ӝ#شD..^h ,[Ybڙ!ozr`(jMZa|ӯCR/bvCi{ߖu]%ewʻJ3CIՉiU:;~w ] G {gS)?A!R{$ꕨXV*cW>睹.La[״+_.d kDUXQ!UgX<*N}&t?}7WPRb:&ޜCG*.BIN!9A3T˕a) } }T7vˁjseS5(FzSjO}.>)j y3)ꏚ=RMWyR<_}J;2AȹAv.Z'P W#Z2_ӆ:ޫ =ӟ7W)=?/͂h+6yV?Sۤv?Gҹ٨oLڠ?`ߙw4׿yh[qĿ_I!3nUK"q砘A"S8{~~7uJ})TҹFA41۰k~ƦD 9Š7=6`í0tWbI]/;zrRI''Bޯ8QcY뱰*g"wW3(iJ*<"?aP*EeE')UzW^\sbJ j<$rqŖ=RYtC*#렪 G^J|WBHY,XBIm[z!rJ6+# ׋ZٍAG-buNryUMhx[>90r"(s_CvwmZ!K٥{OݢݨR(5b?*<<~47 z7d~fea5GF*ujWqKKu{=euJJ7N_]>JW+=},cyN'oU6st"Uǔȹњb5l,jvwK9I:WZ,g$O甴f;kW)3..ԝ%D &@l/$T ^G LoIoZ;.$WY;w.PRcA]g wϮfBթ {=>[7,Y21t%&gz Yܰq9/ Pywd_ϒӘ{S[L^o*1jŶq3 KE`w0ngn7sK1Wu@uaVrwIݦ~Y&8}J8aB=N[bSw+%V,YxԨ_ v ыTBp.WL9FL.?"Ѡ<"SU+H(nޗ_i8 #soKzȿ*NHKgKڤ7>_?rTEfQV kꮧorNwJUV'V4IOT{˴MlU< qGsN;PI\%>&/Y|J[XX7]'>| qxvb\7:Q JTo *j(8zð?rǤDLBloW8sw/r<)uY ЄrW/4m"73*g $ C|yIK G~7hیA'RrCs38 nzg7Sxb[bReUGZ]=U%}ӤjܯܖTzôMb3죱˜ €,]*6K!yY\LrѬS~WqBHMGv.I39,Hގ>73*"ݍ]UJaco #r;tOg4(W\Ҧ[Y~'8߰*myWp0nuV΄ΪSBCIӂ3-' O;Z!BHe78~Ӝ-S>/ܴM7Iߔz!^:T!CV Dž-Y%쒶/eƲu'.U656Ղ )tww  (|q<7*WX;g2E'zWvdޫ(_\rh[bhgnc8!vB73ʜ&XTqkJ6:mhC`nӹeMlL:,uv5]'6D?|(^\wڍ*1gztc-ˊW/\;-sOU'ǔfoE-!s;'&8;t61O N*{r,%T/3pxțb*'!H.TԮuN;hٕnglZ{^\wm?lf8?ѠNH7tӼ;NsDacʑҍ92[u6N]r7Cp; YseuZ:_w|ҶsS벶Ĭ,\#V/$0'19vbyN*OFWYg{i ]_*>u9?"pa}?wbgYU:O??gAB5&)Wmc?d!_;>MoR%Yyg$:7yY96Kcg؛:Y ?yzqMasɒ?U?CBQ/tN=lwKr/vP"05dH7ç^41vZ͌6\W^]ų.]"cl%_W?CCέ?CPJ[-{cʻTݦ$/j ͸CvL`@s,Ieй[~]31EO`@`k',u{XytutJ}.>S!#}C]a~Rv(ߥcBY Rwi=UUl{c  CtsRyRuY|6Ǭȗ#/wH9j 0WnmK$Fcv?(i>?>7Q7{do&0W'Uvreqh:wՒw]wy=nr9?زKQ".VyR:_qNT~BQi%ٔK`@-v #w:16sСA{ 9 T/TyiVS37jjSw: 3AmT ^:&Lg ,'Dtww w= L7Z_O~.X` ̈;lj%~W&ZT.CQK.uLi T~äqۓG}lb(.lCDO~_  L([;%: &?Wr_)uobWY}npD;V:ҿiFx>۸Dža.CT_ JTu $䖹;5 m:[aȀ݂[9+ H/$@>`Պeپ_ (nة5i?j eC40c(1nQ)iS[v?Q薹>ܢ/*\\-}S40c$V^鼇3 IQWZvzdȐG.%gxkQNJ_,nT|A^|R:g5&]`nyL#o YxdI`~<,jqBwf+էrGIg9 [Bi-7Gӎפ<VQ:kXX&\ʅ^Y“v8;E);˧F}n 5g\ rURozjgQoTj>!SAyiKb\UEk)H'8U.v6~u7$2] ]{. y/l~C1|R u<;+<6վ_?]ZC9d4hPK87|A!ڍbA~5s؝7ƝQw4䵬7kZ%ܢXRd9ͰZҎ{SMͺ) QGΚ0}}XinPwZ1~#2ԩ6qqnrf]1ʀ)_xE4UiӮŒEAB3ƭUTuә䑄bWe-j*x)1Ztɝ{SRaBdk6} Vkzn˖S79a~–`KCg,4y@ߴTVes=!9a_CCcU<X8cEⶐ:C:8!sڮiXd kӷU--ܘdi4^g 699liz֬^u9HZݐy '՟4{M7Vh4Uۦ^>0(l yp-ay'0yjg QluxU畷9M}b`( ~oƲ =2N|mƅ.:Akoj;kCR-k{rvmyc9,T˻1)+T^G O.K;3౉wXØbIٛZ )?f!|~}Q<%}VuJ:JҥczPaȄ0!tMpAOLr 7N:sL{ca)\SP?N9aSq {UEKB3><Kؕ}]1/UQU-S.X.Ք/4>3maϜy'4N-kZbMg,Osښ霺/%cKfye>s쌟m 0=0dKUfDݠ_?Ѳ;%>U=;kTFU8uooͻ2eny״9kk+_\*O?->,_3篛w&w<,<$ u3 nMs3ܲ)NP R^b#s/\y7B|ѷ@xN.? /ï0 (_\1}iN Z-\vۛ:5NTU}VY(j WZu}%'k ezӃL{b{An/FT7-wrT$QL; d rM~'s=5ZC m>/ Ud7ҿ*v~ajzjCJvE*8%s_ܬT$=N)9ˊMZ3kKWe|Yas1+-<6%!G>Fs`Q`l4hH% XE.eSm5S.gj5=kh{J{:o*a5>ʹ33RwIeOƮJW!9Umhk/^X`:lg$<;K6:z┄zCx\"{cas/ock7-vN)W[VS~vyJ }AiGcV^$\-_e`x?t^钯0^KT5qr®K0J 6? mY ۵?&,\,k1LIb`.9d`3sؤWm-Re` jI:y .5Foy 5RA:-uGߐ]wn0( s7CioUv.GeFV;tB`>`JX%ꏪN]6,|VԟįrMo4  I[5:=<69BdaCUXnԇwSyJ̼+}rC(E*^yg@Qi95Y/k]qB -\jW+@䑉uXѥdTLΤЍ>^Zn/M!1.bNlEU{'EJz/O*wlc:>Ze KX_՘GUx\XpakW{N ssp9u9 :;cF.{cV+2gWͷ7u1VؤHC?Ԡ;>-=bII#mbcOؤiw]kLqP0OѯJ7K1 6aHOTdzU|ɷ>K3LeOK1+-] ki763i3:ypK}ԝIRwYĝnߒci=|lb}Op/aoLezc!*7q/Cb{ ǕwIh6ݳR/.j0꒎'m0qڕh>,̯ [(zEᚐڂbu<spD7.li#a}WJۥ-oh띿)ܢ9tl_=liG{ ҷ gѰYvOMĦ˒w^['lfsJ2@оN=Ω {c[:KNZol< 'mgE>feE KMIqe9d4!Sbw*)_=_#>=`NK۰VT\qRI)Wu򖪝ک3>15zWg:>iީT)}(V&/Vϭ3~bWnGх֤nSO;Cl4gv}=0h)r?VVuu߷ _{㗧6;ZQK V{KQ.Lk貮aW# g[]~4Gi}\a7̷3a̽1+ D.(lo20􄆔ɮ3r%M܍ʖf<=ɼ++dnkF}}qÄsws>A0m-}sЩ778[_ edBk`pIOsIk4%9/0t˨˲>V?%qO#/ù@e?3)n{.ԮvXGZʊUMqMߗҬݔR*iCl[&{ӑdvԙ Ϻr>gËM%;奩{Oi6elr0Z~4ٷ`qzV%z90hkG{s>ꞧmn.acobĪuCk@_*4eo}iUٛ-TLY̧`Eh_J%>Kʂge2N pVI%bCB䌧G@/4db]80όg>;N>'ubq崅+"f79e="jhקy.0lI2;´3jqfeyeٛrSw{dΟ oig鴆_lRg-TbOKгqχ,5ab̖=FwTko5G Ҭ^yu9Sv[/]!mX]31>3.9bg(ɇuj\қL/IkH9UEk*96&֌RT@/4+gINcJvKce n:'KI=b~FQ/'3vL9fp0}R} znʑ[{`E` @` ת ډڑ6@`…Y2+pXp0}Bxv$ |[uه-3RwYar]ZuO508>i ZS5cʴk2Z}F~IJ9MR(ZX6Vi-Cԩ!ٛ'̩_Ь~…<%<)ugSl~ArxzO`Htnf{,mӗflP*~tE a-LKz)jI ҬCVqBmg-蓁A^ЦUϚ_bæun64/L:fk#skj&O)_86a9`I-% eR'DfG]{1.q̫e&I,}࠿Yt$uvƠ .-.G ( "2n\d9x⭁0̡k,/=j=Oaa Y&;Ql5 1 !S_Jw6e߼7$M*[s(_<;ji[# }`{!} w5jYuqt;"TnPמ_%oGL$%m@2Ų+uk+7Tyq4\:7 tSzfQe2O)>QZO [dSҏow&τ<Ty*8?,#B#$:rE؅1L0MŬ = No~8շ[WL  S ,uU `o@Q]'EaG/ })S hP"=dOrSTv]7Dn <.wK_~Kbh:%|ic4~)qS`x;Ԧ;f_`mKGT;8qsв+oK'x_ߖ`BAe|s0 aGojmv)K #?:M}!ecuI'% k~T0WO%^.S5Jo;|4ewKpUqtv!7V/^34W4ܩ-~W .=0%bY8 Nl';h.G[2IpN`<0T?4Kz3Zo=t9J%oW !8% í`Z%&TЅp?ㄬ)bYݬB)[r6IA7$nGPuKaK K#]& BN2 $l =/ѷ<[%٧?]h>;3 |}c_ɻvGéBȭ };-uffZ$l T_Q.K+ޯ-~PsG^Ay'z)u\)82[.u2:KK-_w8d]Yk֯E֜ z h03 bʛ?sV`vōw,Y`!j|1W rLd~̏stlcmue!`N'?ϧ{kʓ6D풍N- *(/~切n*/| x;!ugwipӴYP1Jݾ=Bw"OJ`0Mz[(D Y|wo"~ I- MlYo"b/6-,6<ORHZ (*?QHd]PA9{'C.!9~ǽH Ʈ/3 .xp[{gv$is@rυ.ZO&hLcBwra~ؼ9gek<#y6~=6 m!EcZ6(fMА˼*[dpO4eN̬l}ҏg_\sWf˟n7Yډ-!udt|X;+ydb7ӵI J5솬WSw=q# 7U~?$mE˲S !)J3;s׳Xprwpm JC]TySQEb ۛ蕁BA{}G{*$1qyCYV/-+v"#ªff 9uR\uKg U /˾twx= ܙ 94Cr9YcMiAgsq7ݓr(e{Q+[GNZ- f)nm<\ȵfOҁi{Z]n_tUyEYEWğܑ3qh8!tlajyK!ŋǮ 3dnYeX T x-e{ >.ʚMƏum9Ć!Q++,SwU<"y88~m'ӹgņ5sg<";/4^߮)f;$`&'(fM# &y.7ˬO^+ g˽0ӟM~$\4#tQUt2_?\X{eM!_l MeBx}ԔbX2D K);eɺ}ߞ5_\P$c"m7k] U11e&S'$اQ I;Coo~ʛٰtKHGy^A~B̚'doMշ\:xHU{u0;dcRA&Ze0/uҕfL"D.n}ûau[ܳު%ʛwoLJwO֧Ҟcs.C􇢅G~~!q>/EWş-bݷ1RT1{$n֔48~%nv ;^L{87eVG+DžW;̈^-[. ;y[HU@] O+aMbL^l:y?;9A+|T;AV#1\{V*yMFpgx/ۯwZbܬS[ʛ^?eGS6Yx7!\`*j]mCYV;÷39C[Oz\(y[ªE'9 2a!lx|3eӻ H&@wT-xj tL# cla3x1|f\6ӿycLpo|a5&,:u^}M{ ]'쎛dGؼU.S| 'g1~$A }h]ugV{^-efʼKt#߉ې6&|MDX+q A1 W 媯 f)e:"7ǘ?Xk7Y5NuQ-(| *ٺGo)wN?w:g]YZw4Q}@{AYhhV^mzV9+5+)z܉YWmBA Ź#~TyS~ʞ#+ZMYm,<nY Lxck96A;4.gXPk4$M/w>3h8$& x |7 B-l.\ ]M?~\(i-}iq?mlEopNoUn^;*mW,+oV-*;Uƈn˗O>jnxvkI+WfQ?+nX+i?ÃhSUku7*fYd-RW*a[eMaJK]2/״by_a9sG^۬):'.[WX6l[ wџX]6ytb×87\hVjr.OVv v[iek\UݛrSEka9w"VXe ա+V<݊{Ҩ%mӴdڻ}aܕߗVj?. ?Nؖ~$ewڥk M*Vv JY:CXSd<~"]H$I:Cl[ịō'ŁAɵ?dXݢw3*U}Jl<֤:='_X^xU]P;ҧ8 @ DDz7V.r:amIndl8KQJ}1쏙c>-HWF(abYHq*uU3\2N85}΂t'2 ݫ ]x0/yWጓ17J Ej^Uqc;-+/V:3qoVn-Vʶ}qoJ0,;oZ6wyo^;U^/n }W:3@jCHM?6.^[1leEGr ՞ys<~XB @ ѤzZYk찕;/Z7eKZ_d[Hͺ钥u4t`׮h!8f*XCy9/-m.f_%LBgC SFUB^vSvړ Ьr0\ֆ,ئ:{/fc.F}`^`xp'E.3] fs01fqN'_tؚtԧ mp`:f0<ް\Qۦئ}qNcrJ77zGt?`vNn, ]dax'Gicm:3`hVd3,*Vs$1[xU,rOZ|Y0v0p0CQWokۻx+ ʖGN-5`0`#,zB1-bk$A&:z~$s0,}{3c/>=vA(X hm9 5`GGǽ `:1 zX-r44i ͗p45swB`:F0d8oAv$/h0< AA:S9``SMϾ`06 'ce b=3& Xmڹ'ǁ`:; =`ԼWt {elLqUEM0/D0f G~2}u`ඪ>o `@0  ` `@0   `  @ &Sz`l8蛕!5jvd/Yh&-t7ɻNJ"~ts%}KF](h:$/n04h eI첤vK^L&0~a?41xt`JXS.bS= 3+_qH1r9#Vg=xR'f /_a<;q vd7|arJ=)&?+ubuxߑ3@ ;ͭ{2Nwet׿v8ӍZ1}G[ d6 [qwLjJ57=- @ {4~M}.qYjtr&x!aYa`p2^3]]HޕyJ;CIͺ#I7V._%5`'ϖA\8?Z9I:3Hv@Ŧʥ;/GL (HaŽWז/^[3zr_pTi8_{-p͔.K$[i0rnhoK G'햌;oE)WAS%=+T, @;4tW~%v NxNܮ?y:ɻ4gso2{U녲^Gr4M*;ʹOW!m`}hV٩/g{ѓYs&{Ιd_wE[D<[@92?ܬtN?U"le=.1w>\9pEl<Z]نZp5c7{/b ӭNv7qYZhV^Y_^פz;6jpeM{䦺7ESrS=x"MSFUkpKMSH / ucK'2Cs4[6lQ$nXpu9 Ygk}w]hVk+d+ lߒzſ{C<ď2OǽW@'Y٪:Ų>E˒vf-oM?_9㊮`&m%/ڍiCU/p9閽/-{GNhh4oиK=hk G}9 n9/kc6oWH>ؒ'A}pɝMmqC(hvvKS7i%Bշ^|p,eɖb} KNt=xgЭf2)@ Bӄ>æ~!<xx]8)j~ ]&yft&hon0ߚT6SE [2+o#fl)ۯ>4?z[~ꃾIc3z$aQAߤS]P٤VڤQڦX'К:k`}[4K3@G|Y .p1t32$ΎX8?~94*`8=$Xt$n聖 Cuua^Y5Q3Bꢬ"7'̉ږ<)vĜ S|rL^8S:YDo_:?$7Ӄ-:wL&Zz~i>?lmb/sT";gq8a㝖L57nbU+W&O u;&( ]Z4>\A{H?7=R_&_*4wMtF U 9Q<2TSr$u! AH~v*|q4x>F>C[?#HZX_ ܘ1F,.=V9.L>4GaY3gָqvIH 0t_WeBg<=:^{˃AsU3'j[9h0E0˖E3SFo_:#&a¸ɏ qI=fM=z[/$IרIߑ1 @idi#f͝9fâVGn cm_R,E9_ o̼@{,z ۭ]+-}çwzҽw1 {N^0/v۴suΆ'DvJ)0< /)tM0Z4 }GY SK3: hD7BmRN՗u 8:+味xEaӄ~~>li%vOIHTF6W x &L&г]u"-L9?:#ݞW xIFeri=^9[ޓW0`aĬ aVK iâX^7zw,᥾#Z[瀱 I˜i޼0j{ac$}ia]m&4Ta4/aD^0;aQhASJL?#U2>WM+=?rpaS{KAyG[ |amn0p#|A^sUk:4XrnM3B- 5жoFX-2OרBA]yh3BTq`lQ9燱{5M͂iA: ɟ=hg aL#x=fdC{BKA:[$a'sX̎\覱>۷gm7lfPo2??l3gw:j0 4'AwMerJ5iytjw2-"UE]0+ۡ}_j+ ``̍ݝseCM^3*rs삥ܢ*a ګ Ɂ-u_WϏߕ1kzPY>tdxyq{Dm:h։'y 6']ΰq}ƍE^`h&ZN<*:*j~b7u)si+th OM$iEmUPNt:u6Z^`p44&^۠~Jyqq9d/<bÍO~kK&Mki5i/<{GYX5yK^ /w}Vgvp5SsoNlI/_?~mY %Lޒh ')~1GVW2Utg'+<[4l⧫~qaqSwOoSNϦa!apcm _2H(8IGo_nAɯY`]g&O-K_fi5ɔ`h/d xW W=̝fӃNٚwm@Ļ6F03﹒Gg<]XfЁSw4q" _O&މam` A0 `>I i5G'%Z&NF/c:ٻ/]` .^ϪW2sѡ![x%>:%ں(m4,TEUϕ/<8QLiQ0@үpͰφ7&i١9V>*xAk08v_Y]K/:oH )} Yak/ݔQP͔ye.zއzvlҦ.d??'cXdms◳wϘ%79~ߜ0h*s®֊P1wO8`**{?^v`D +m:Nsv/7)[lmm S|p(ގw@ЫNQ("Kھ].I=Yçn˻gʶ 6K{Z0|,ghx}tH,̼s^9e ɸz3E4oqS:׵MR⛺YX ]zɸ5eW6o:|1̹.ͻk}W}+:;|:Wn/H:a)oV;O~%=¹_= ӞАW0-(6Ե Tn/ images/bg.png images/pin.png images/timezone_0.0.png images/timezone_1.0.png images/timezone_2.0.png images/timezone_3.0.png images/timezone_3.5.png images/timezone_4.0.png images/timezone_4.5.png images/timezone_5.0.png images/timezone_5.5.png images/timezone_5.75.png images/timezone_6.0.png images/timezone_6.5.png images/timezone_7.0.png images/timezone_8.0.png images/timezone_9.0.png images/timezone_9.5.png images/timezone_10.0.png images/timezone_10.5.png images/timezone_11.0.png images/timezone_11.5.png images/timezone_12.0.png images/timezone_12.75.png images/timezone_13.0.png images/timezone_-1.0.png images/timezone_-2.0.png images/timezone_-3.0.png images/timezone_-3.5.png images/timezone_-4.0.png images/timezone_-4.5.png images/timezone_-5.0.png images/timezone_-5.5.png images/timezone_-6.0.png images/timezone_-7.0.png images/timezone_-8.0.png images/timezone_-9.0.png images/timezone_-9.5.png images/timezone_-10.0.png images/timezone_-11.0.png calamares-3.1.12/src/modules/locale/timezonewidget/000077500000000000000000000000001322271446000222635ustar00rootroot00000000000000calamares-3.1.12/src/modules/locale/timezonewidget/localeconst.h000066400000000000000000000022161322271446000247430ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALECONST_H #define LOCALECONST_H #define LOCALESDIR "/usr/share/i18n/locales" #define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab" #define USER_IMAGES_PATH "/usr/share/pixmaps/faces" #endif // LOCALECONST_H calamares-3.1.12/src/modules/locale/timezonewidget/localeglobal.cpp000066400000000000000000000120121322271446000254030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "localeglobal.h" #include //### //### Private variables //### QHash > > LocaleGlobal::locales; QHash > LocaleGlobal::locations; //### //### Public methods //### QString LocaleGlobal::Location::pretty( const QString& s ) { return QString( s ).replace( '_', ' ' ).simplified(); } QString LocaleGlobal::Location::comment() const { QTimeZone qtz = QTimeZone( QString( "%1/%2" ) .arg( region ) .arg( zone ).toLatin1() ); return qtz.comment(); } void LocaleGlobal::init() { // TODO: Error handling initLocales(); initLocations(); } QHash< QString, QHash< QString, QList< LocaleGlobal::Locale > > > LocaleGlobal::getLocales() { return locales; } QHash< QString, QList< LocaleGlobal::Location > > LocaleGlobal::getLocations() { return locations; } //### //### Private methods //### void LocaleGlobal::initLocales() { locales.clear(); QStringList files = QDir(LOCALESDIR).entryList(QDir::Files, QDir::Name); for (int i = 0; i < files.size(); ++i) { QString filename = files.at(i); QFile file(QString(LOCALESDIR) + "/" + filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) continue; QTextStream in(&file); QString commentChar = "%"; Locale locale; QString lang, territory; locale.locale = filename; while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList split = line.split(commentChar, QString::KeepEmptyParts).first().split(QRegExp(" (?=[^\"]*(\"[^\"]*\"[^\"]*)*$)"), QString::SkipEmptyParts); if (split.size() < 2) continue; QString sub1 = QString(split.at(0)).remove("\""); QString sub2 = QString(split.at(1)).remove("\""); if (sub1 == "comment_char") commentChar = sub2; else if (sub1 == "title") locale.description = sub2; else if (sub1 == "territory") territory= sub2; else if (sub1 == "language") lang = sub2; } if (lang.isEmpty() || territory.isEmpty()) continue; locales[lang][territory].append(locale); } } void LocaleGlobal::initLocations() { locations.clear(); QFile file(TZ_DATA_FILE); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine().trimmed().split('#', QString::KeepEmptyParts).first().trimmed(); if (line.isEmpty()) continue; QStringList list = line.split(QRegExp("[\t ]"), QString::SkipEmptyParts); if (list.size() < 3) continue; Location location; QStringList timezone = list.at(2).split('/', QString::SkipEmptyParts); int cooSplitPos = QString(list.at(1)).remove(0, 1).indexOf(QRegExp("[-+]")) + 1; if (timezone.size() < 2) continue; QString countryCode = list.at(0).trimmed(); if (countryCode.size() != 2) continue; location.region = timezone.takeFirst(); location.zone = timezone.join( '/' ); location.latitude = getRightGeoLocation(list.at(1).mid(0, cooSplitPos)); location.longitude = getRightGeoLocation(list.at(1).mid(cooSplitPos)); location.country = countryCode; locations[location.region].append(location); } } double LocaleGlobal::getRightGeoLocation(QString str) { double sign = 1, num = 0.00; // Determind sign if (str.startsWith('-')) { sign = -1; str.remove(0, 1); } else if (str.startsWith('+')) { str.remove(0, 1); } if (str.length() == 4 || str.length() == 6) num = str.mid(0, 2).toDouble() + str.mid(2, 2).toDouble() / 60; else if (str.length() == 5 || str.length() == 7) num = str.mid(0, 3).toDouble() + str.mid(3, 2).toDouble() / 60; return sign * num; } calamares-3.1.12/src/modules/locale/timezonewidget/localeglobal.h000066400000000000000000000036771322271446000250710ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALEGLOBAL_H #define LOCALEGLOBAL_H #include #include #include #include #include #include #include #include #include #include #include "localeconst.h" class LocaleGlobal { public: struct Locale { QString description, locale; }; struct Location { QString region, zone, country; double latitude, longitude; static QString pretty( const QString& s ); QString comment() const; }; static void init(); static QHash > > getLocales(); static QHash > getLocations(); private: static QHash > > locales; static QHash > locations; static void initLocales(); static void initLocations(); static double getRightGeoLocation(QString str); }; #endif // LOCALEGLOBAL_H calamares-3.1.12/src/modules/locale/timezonewidget/timezonewidget.cpp000066400000000000000000000151241322271446000260300ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "timezonewidget.h" constexpr double MATH_PI = 3.14159265; TimeZoneWidget::TimeZoneWidget( QWidget* parent ) : QWidget( parent ) { setMouseTracking( false ); setCursor( Qt::PointingHandCursor ); // Font font.setPointSize( 12 ); font.setBold( false ); // Images background = QImage( ":/images/bg.png" ).scaled( X_SIZE, Y_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); pin = QImage( ":/images/pin.png" ); // Set size setMinimumSize( background.size() ); setMaximumSize( background.size() ); // Zone images QStringList zones = QString( ZONES ).split( " ", QString::SkipEmptyParts ); for ( int i = 0; i < zones.size(); ++i ) timeZoneImages.append( QImage( ":/images/timezone_" + zones.at( i ) + ".png" ).scaled( X_SIZE, Y_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); } void TimeZoneWidget::setCurrentLocation( QString region, QString zone ) { QHash > hash = LocaleGlobal::getLocations(); if ( !hash.contains( region ) ) return; QList locations = hash.value( region ); for ( int i = 0; i < locations.size(); ++i ) { if ( locations.at( i ).zone == zone ) { setCurrentLocation( locations.at( i ) ); break; } } } void TimeZoneWidget::setCurrentLocation( LocaleGlobal::Location location ) { currentLocation = location; // Set zone QPoint pos = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); for ( int i = 0; i < timeZoneImages.size(); ++i ) { QImage zone = timeZoneImages[i]; // If not transparent set as current if ( zone.pixel( pos ) != RGB_TRANSPARENT ) { currentZoneImage = zone; break; } } // Repaint widget repaint(); } //### //### Private //### QPoint TimeZoneWidget::getLocationPosition( double longitude, double latitude ) { const int width = this->width(); const int height = this->height(); double x = ( width / 2.0 + ( width / 2.0 ) * longitude / 180.0 ) + MAP_X_OFFSET * width; double y = ( height / 2.0 - ( height / 2.0 ) * latitude / 90.0 ) + MAP_Y_OFFSET * height; //Far north, the MAP_Y_OFFSET no longer holds, cancel the Y offset; it's noticeable // from 62 degrees north, so scale those 28 degrees as if the world is flat south // of there, and we have a funny "rounded" top of the world. In practice the locations // of the different cities / regions looks ok -- at least Thule ends up in the right // country, and Inuvik isn't in the ocean. if ( latitude > 62.0 ) y -= sin( MATH_PI * ( latitude - 62.0 ) / 56.0 ) * MAP_Y_OFFSET * height; // Antarctica isn't shown on the map, but you could try clicking there if ( latitude < -60 ) y = height - 1; if ( x < 0 ) x = width+x; if ( x >= width ) x -= width; if ( y < 0 ) y = height+y; if ( y >= height ) y -= height; return QPoint( ( int )x, ( int )y ); } void TimeZoneWidget::paintEvent( QPaintEvent* ) { const int width = this->width(); const int height = this->height(); QFontMetrics fontMetrics( font ); QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing ); painter.setFont( font ); // Draw background painter.drawImage( 0, 0, background ); // Draw zone image painter.drawImage( 0, 0, currentZoneImage ); // Draw pin QPoint point = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); painter.drawImage( point.x() - pin.width()/2, point.y() - pin.height()/2, pin ); // Draw text and box const int textWidth = fontMetrics.width( LocaleGlobal::Location::pretty( currentLocation.zone ) ); const int textHeight = fontMetrics.height(); QRect rect = QRect( point.x() - textWidth/2 - 5, point.y() - textHeight - 8, textWidth + 10, textHeight - 2 ); if ( rect.x() <= 5 ) rect.moveLeft( 5 ); if ( rect.right() >= width-5 ) rect.moveRight( width - 5 ); if ( rect.y() <= 5 ) rect.moveTop( 5 ); if ( rect.y() >= height-5 ) rect.moveBottom( height-5 ); painter.setPen( QPen() ); // no pen painter.setBrush( QColor( 40, 40, 40 ) ); painter.drawRoundedRect( rect, 3, 3 ); painter.setPen( Qt::white ); painter.drawText( rect.x() + 5, rect.bottom() - 4, LocaleGlobal::Location::pretty( currentLocation.zone ) ); painter.end(); } void TimeZoneWidget::mousePressEvent( QMouseEvent* event ) { if ( event->button() != Qt::LeftButton ) return; // Set nearest location int nX = 999999, mX = event->pos().x(); int nY = 999999, mY = event->pos().y(); QHash > hash = LocaleGlobal::getLocations(); QHash >::iterator iter = hash.begin(); while ( iter != hash.end() ) { QList locations = iter.value(); for ( int i = 0; i < locations.size(); ++i ) { LocaleGlobal::Location loc = locations[i]; QPoint locPos = getLocationPosition( loc.longitude, loc.latitude ); if ( ( abs( mX - locPos.x() ) + abs( mY - locPos.y() ) < abs( mX - nX ) + abs( mY - nY ) ) ) { currentLocation = loc; nX = locPos.x(); nY = locPos.y(); } } ++iter; } // Set zone image and repaint widget setCurrentLocation( currentLocation ); // Emit signal emit locationChanged( currentLocation ); } calamares-3.1.12/src/modules/locale/timezonewidget/timezonewidget.h000066400000000000000000000045731322271446000255030ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Originally from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef TIMEZONEWIDGET_H #define TIMEZONEWIDGET_H #include #include #include #include #include #include #include #include #include #include #include "localeglobal.h" #define MAP_Y_OFFSET 0.125 #define MAP_X_OFFSET -0.0370 #define RGB_TRANSPARENT 0 #define ZONES "0.0 1.0 2.0 3.0 3.5 4.0 4.5 5.0 5.5 5.75 6.0 6.5 7.0 8.0 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.75 13.0 -1.0 -2.0 -3.0 -3.5 -4.0 -4.5 -5.0 -5.5 -6.0 -7.0 -8.0 -9.0 -9.5 -10.0 -11.0" #define X_SIZE 780 #define Y_SIZE 340 class TimeZoneWidget : public QWidget { Q_OBJECT public: explicit TimeZoneWidget( QWidget* parent = 0 ); LocaleGlobal::Location getCurrentLocation() { return currentLocation; } void setCurrentLocation( QString region, QString zone ); void setCurrentLocation( LocaleGlobal::Location location ); signals: void locationChanged( LocaleGlobal::Location location ); private: QFont font; QImage background, pin, currentZoneImage; QList timeZoneImages; LocaleGlobal::Location currentLocation; QPoint getLocationPosition( const LocaleGlobal::Location& l ) { return getLocationPosition( l.longitude, l.latitude ); } QPoint getLocationPosition( double longitude, double latitude ); void paintEvent( QPaintEvent* event ); void mousePressEvent( QMouseEvent* event ); }; #endif // TIMEZONEWIDGET_H calamares-3.1.12/src/modules/localecfg/000077500000000000000000000000001322271446000177055ustar00rootroot00000000000000calamares-3.1.12/src/modules/localecfg/main.py000066400000000000000000000065141322271446000212110ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Anke Boersma # Copyright 2015, Philip Müller # Copyright 2016, Teo Mrnjavac # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import shutil import libcalamares def run(): """ Create locale """ en_us_locale = 'en_US.UTF-8' locale_conf = libcalamares.globalstorage.value("localeConf") if not locale_conf: locale_conf = { 'LANG': 'en_US.UTF-8', 'LC_NUMERIC': 'en_US.UTF-8', 'LC_TIME': 'en_US.UTF-8', 'LC_MONETARY': 'en_US.UTF-8', 'LC_PAPER': 'en_US.UTF-8', 'LC_NAME': 'en_US.UTF-8', 'LC_ADDRESS': 'en_US.UTF-8', 'LC_TELEPHONE': 'en_US.UTF-8', 'LC_MEASUREMENT': 'en_US.UTF-8', 'LC_IDENTIFICATION': 'en_US.UTF-8' } install_path = libcalamares.globalstorage.value("rootMountPoint") # restore backup if available if os.path.exists('/etc/locale.gen.bak'): shutil.copy2("{!s}/etc/locale.gen.bak".format(install_path), "{!s}/etc/locale.gen".format(install_path)) # run locale-gen if detected if os.path.exists('/etc/locale.gen'): text = [] with open("{!s}/etc/locale.gen".format(install_path), "r") as gen: text = gen.readlines() # we want unique values, so locale_values should have 1 or 2 items locale_values = set(locale_conf.values()) with open("{!s}/etc/locale.gen".format(install_path), "w") as gen: for line in text: # always enable en_US if en_us_locale in line and line[0] == "#": # uncomment line line = line[1:].lstrip() for locale_value in locale_values: if locale_value in line and line[0] == "#": # uncomment line line = line[1:].lstrip() gen.write(line) libcalamares.utils.target_env_call(['locale-gen']) print('locale.gen done') # write /etc/locale.conf locale_conf_path = os.path.join(install_path, "etc/locale.conf") with open(locale_conf_path, "w") as lcf: for k, v in locale_conf.items(): lcf.write("{!s}={!s}\n".format(k, v)) # write /etc/default/locale if /etc/default exists and is a dir etc_default_path = os.path.join(install_path, "etc/default") if os.path.isdir(etc_default_path): with open(os.path.join(etc_default_path, "locale"), "w") as edl: for k, v in locale_conf.items(): edl.write("{!s}={!s}\n".format(k, v)) return None calamares-3.1.12/src/modules/localecfg/module.desc000066400000000000000000000001311322271446000220250ustar00rootroot00000000000000--- type: "job" name: "localecfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/luksbootkeyfile/000077500000000000000000000000001322271446000212015ustar00rootroot00000000000000calamares-3.1.12/src/modules/luksbootkeyfile/main.py000066400000000000000000000062131322271446000225010ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2016, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, Adriaan de Groot # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares from libcalamares.utils import check_target_env_call def run(): """ This module sets up a file crypto_keyfile.bin on the rootfs, assuming the rootfs is LUKS encrypted and a passphrase is provided. This file is then included in the initramfs and used for unlocking the rootfs from a previously unlocked GRUB2 session. :return: """ partitions = libcalamares.globalstorage.value("partitions") luks_root_device = "" luks_root_passphrase = "" additional_luks_devices = [] for partition in partitions: if partition["mountPoint"] == "/" and "luksMapperName" in partition: luks_root_device = partition["device"] luks_root_passphrase = partition["luksPassphrase"] elif "luksMapperName" in partition and\ (partition["mountPoint"] or partition["fs"] == "linuxswap"): additional_luks_devices.append((partition["device"], partition["luksPassphrase"])) if not luks_root_device: return None if not luks_root_passphrase: return ( "Encrypted rootfs setup error", "Rootfs partition {!s} is LUKS but no passphrase found." .format(luks_root_device)) # Generate random keyfile check_target_env_call(["dd", "bs=512", "count=4", "if=/dev/urandom", "of=/crypto_keyfile.bin"]) check_target_env_call(["cryptsetup", "luksAddKey", luks_root_device, "/crypto_keyfile.bin"], luks_root_passphrase, 15) # timeout 15s for additional_device in additional_luks_devices: check_target_env_call(["cryptsetup", "luksAddKey", additional_device[0], "/crypto_keyfile.bin"], additional_device[1], 15) # timeout 15s check_target_env_call(["chmod", "g-rwx,o-rwx", "/crypto_keyfile.bin"]) return None calamares-3.1.12/src/modules/luksbootkeyfile/module.desc000066400000000000000000000001371322271446000233270ustar00rootroot00000000000000--- type: "job" name: "luksbootkeyfile" interface: "python" script: "main.py" calamares-3.1.12/src/modules/luksopenswaphookcfg/000077500000000000000000000000001322271446000220625ustar00rootroot00000000000000calamares-3.1.12/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.conf000066400000000000000000000000471322271446000270260ustar00rootroot00000000000000--- configFilePath: /etc/openswap.conf calamares-3.1.12/src/modules/luksopenswaphookcfg/main.py000066400000000000000000000057401322271446000233660ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2016, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares import os.path def write_openswap_conf(partitions, root_mount_point, openswap_conf_path): swap_outer_uuid = "" swap_mapper_name = "" mountable_keyfile_device = "" for partition in partitions: if partition["fs"] == "linuxswap" and "luksMapperName" in partition: swap_outer_uuid = partition["luksUuid"] swap_mapper_name = partition["luksMapperName"] elif partition["mountPoint"] == "/" and "luksMapperName" in partition: mountable_keyfile_device = ( "/dev/mapper/{!s}".format(partition["luksMapperName"]) ) if not mountable_keyfile_device or not swap_outer_uuid: return None swap_device_path = "/dev/disk/by-uuid/{!s}".format(swap_outer_uuid) lines = [] with open(os.path.join(root_mount_point, openswap_conf_path), 'r') as openswap_file: lines = [x.strip() for x in openswap_file.readlines()] for i in range(len(lines)): if lines[i].startswith("swap_device"): lines[i] = "swap_device={!s}".format(swap_device_path) elif lines[i].startswith("crypt_swap_name"): lines[i] = "crypt_swap_name={!s}".format(swap_mapper_name) elif lines[i].startswith("keyfile_device"): lines[i] = "keyfile_device={!s}".format(mountable_keyfile_device) elif lines[i].startswith("keyfile_filename"): lines[i] = "keyfile_filename=crypto_keyfile.bin" with open(os.path.join(root_mount_point, openswap_conf_path), 'w') as openswap_file: openswap_file.write("\n".join(lines) + "\n") return None def run(): """ This module sets up the openswap hook for a resumable encrypted swap. :return: """ root_mount_point = libcalamares.globalstorage.value("rootMountPoint") openswap_conf_path = libcalamares.job.configuration["configFilePath"] partitions = libcalamares.globalstorage.value("partitions") openswap_conf_path = openswap_conf_path.lstrip('/') return write_openswap_conf( partitions, root_mount_point, openswap_conf_path ) calamares-3.1.12/src/modules/luksopenswaphookcfg/module.desc000066400000000000000000000001431322271446000242050ustar00rootroot00000000000000--- type: "job" name: "luksopenswaphookcfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/machineid/000077500000000000000000000000001322271446000177075ustar00rootroot00000000000000calamares-3.1.12/src/modules/machineid/machineid.conf000066400000000000000000000004531322271446000225010ustar00rootroot00000000000000--- # Whether to create /etc/machine-id for systemd. systemd: true # Whether to create /var/lib/dbus/machine-id for D-Bus. dbus: true # Whether /var/lib/dbus/machine-id should be a symlink to /etc/machine-id # (ignored if dbus is false, or if there is no /etc/machine-id to point to). symlink: true calamares-3.1.12/src/modules/machineid/main.py000066400000000000000000000046201322271446000212070ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Kevin Kofler # Copyright 2016, Philip Müller # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares import os from libcalamares.utils import check_target_env_call, debug import gettext _ = gettext.translation("calamares-python", localedir=libcalamares.utils.gettext_path(), languages=libcalamares.utils.gettext_languages(), fallback=True).gettext def pretty_name(): return _("Generate machine-id.") def run(): """ Generate machine-id using dbus and systemd. :return: """ root_mount_point = libcalamares.globalstorage.value("rootMountPoint") enable_systemd = libcalamares.job.configuration["systemd"] enable_dbus = libcalamares.job.configuration["dbus"] enable_symlink = libcalamares.job.configuration["symlink"] target_systemd_machineid_file = root_mount_point + "/etc/machine-id" target_dbus_machineid_file = root_mount_point + "/var/lib/dbus/machine-id" if os.path.exists(target_dbus_machineid_file): os.remove(target_dbus_machineid_file) if enable_systemd: if os.path.exists(target_systemd_machineid_file): os.remove(target_systemd_machineid_file) check_target_env_call("systemd-machine-id-setup") if enable_dbus: if enable_symlink and os.path.exists(target_systemd_machineid_file): check_target_env_call(["ln", "-s", "/etc/machine-id", "/var/lib/dbus/machine-id"]) else: check_target_env_call(["dbus-uuidgen", "--ensure"]) return None calamares-3.1.12/src/modules/machineid/module.desc000066400000000000000000000001311322271446000220270ustar00rootroot00000000000000--- type: "job" name: "machineid" interface: "python" script: "main.py" calamares-3.1.12/src/modules/mount/000077500000000000000000000000001322271446000171305ustar00rootroot00000000000000calamares-3.1.12/src/modules/mount/main.py000066400000000000000000000130261322271446000204300ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Aurélien Gâteau # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import tempfile import subprocess import libcalamares def mount_partitions(root_mount_point, partitions): """ Pass back mount point and filesystem for each partition. :param root_mount_point: :param partitions: """ for partition in partitions: if "mountPoint" not in partition or not partition["mountPoint"]: continue # Create mount point with `+` rather than `os.path.join()` because # `partition["mountPoint"]` starts with a '/'. mount_point = root_mount_point + partition["mountPoint"] fstype = partition.get("fs", "").lower() if fstype == "fat16" or fstype == "fat32": fstype = "vfat" if "luksMapperName" in partition: libcalamares.utils.debug( "about to mount {!s}".format(partition["luksMapperName"])) libcalamares.utils.mount( "/dev/mapper/{!s}".format(partition["luksMapperName"]), mount_point, fstype, partition.get("options", ""), ) else: libcalamares.utils.mount(partition["device"], mount_point, fstype, partition.get("options", ""), ) # If the root partition is btrfs, we create a subvolume "@" # for the root mount point. # If a separate /home partition isn't defined, we also create # a subvolume "@home". # Finally we remount all of the above on the correct paths. if fstype == "btrfs" and partition["mountPoint"] == '/': has_home_mount_point = False for p in partitions: if "mountPoint" not in p or not p["mountPoint"]: continue if p["mountPoint"] == "/home": has_home_mount_point = True break subprocess.check_call(['btrfs', 'subvolume', 'create', root_mount_point + '/@']) if not has_home_mount_point: subprocess.check_call(['btrfs', 'subvolume', 'create', root_mount_point + '/@home']) subprocess.check_call(["umount", "-v", root_mount_point]) if "luksMapperName" in partition: libcalamares.utils.mount( "/dev/mapper/{!s}".format(partition["luksMapperName"]), mount_point, fstype, ",".join( ["subvol=@", partition.get("options", "")]), ) if not has_home_mount_point: libcalamares.utils.mount( "/dev/mapper/{!s}".format(partition["luksMapperName"]), root_mount_point + "/home", fstype, ",".join( ["subvol=@home", partition.get("options", "")]), ) else: libcalamares.utils.mount( partition["device"], mount_point, fstype, ",".join(["subvol=@", partition.get("options", "")]), ) if not has_home_mount_point: libcalamares.utils.mount( partition["device"], root_mount_point + "/home", fstype, ",".join( ["subvol=@home", partition.get("options", "")]), ) def run(): """ Define mountpoints. :return: """ root_mount_point = tempfile.mkdtemp(prefix="calamares-root-") partitions = libcalamares.globalstorage.value("partitions") extra_mounts = libcalamares.job.configuration["extraMounts"] extra_mounts_efi = libcalamares.job.configuration["extraMountsEfi"] # Sort by mount points to ensure / is mounted before the rest partitions.sort(key=lambda x: x["mountPoint"]) mount_partitions(root_mount_point, partitions) mount_partitions(root_mount_point, extra_mounts) fw_type = libcalamares.globalstorage.value("firmwareType") if fw_type == 'efi': mount_partitions(root_mount_point, extra_mounts_efi) libcalamares.globalstorage.insert("rootMountPoint", root_mount_point) # Remember the extra mounts for the unpackfs module if fw_type == 'efi': libcalamares.globalstorage.insert( "extraMounts", extra_mounts + extra_mounts_efi) else: libcalamares.globalstorage.insert("extraMounts", extra_mounts) return None calamares-3.1.12/src/modules/mount/module.desc000066400000000000000000000001251322271446000212530ustar00rootroot00000000000000--- type: "job" name: "mount" interface: "python" script: "main.py" calamares-3.1.12/src/modules/mount/mount.conf000066400000000000000000000006541322271446000211460ustar00rootroot00000000000000--- extraMounts: - device: proc fs: proc mountPoint: /proc - device: sys fs: sysfs mountPoint: /sys - device: /dev mountPoint: /dev options: bind - device: tmpfs fs: tmpfs mountPoint: /run - device: /run/udev mountPoint: /run/udev options: bind extraMountsEfi: - device: efivarfs fs: efivarfs mountPoint: /sys/firmware/efi/efivars calamares-3.1.12/src/modules/mount/test.yaml000066400000000000000000000003271322271446000207750ustar00rootroot00000000000000partitions: - device: "/dev/sdb1" mountPoint: "/" fs: "ext4" - device: "/dev/sdb2" mountPoint: "/home" fs: "ext4" - device: "/dev/sdb3" mountPoint: "" fs: "linuxswap" calamares-3.1.12/src/modules/netinstall/000077500000000000000000000000001322271446000201435ustar00rootroot00000000000000calamares-3.1.12/src/modules/netinstall/CMakeLists.txt000066400000000000000000000007121322271446000227030ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( netinstall TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES NetInstallViewStep.cpp NetInstallPage.cpp PackageTreeItem.cpp PackageModel.cpp UI page_netinst.ui RESOURCES netinstall.qrc LINK_PRIVATE_LIBRARIES calamaresui Qt5::Network ${YAMLCPP_LIBRARY} SHARED_LIB ) calamares-3.1.12/src/modules/netinstall/NetInstallPage.cpp000066400000000000000000000111421322271446000235200ustar00rootroot00000000000000/* * Copyright 2016, Luca Giambonini * Copyright 2016, Lisa Vitolo * Copyright 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * Copyright 2017, Gabriel Craciunescu * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "NetInstallPage.h" #include "PackageModel.h" #include "ui_page_netinst.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "utils/YamlUtils.h" #include #include #include #include #include #include #include #include #include #include #include #include using CalamaresUtils::yamlToVariant; NetInstallPage::NetInstallPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::Page_NetInst ) , m_networkManager( this ) , m_groups( nullptr ) { ui->setupUi( this ); } bool NetInstallPage::readGroups( const QByteArray& yamlData ) { try { YAML::Node groups = YAML::Load( yamlData.constData() ); if ( !groups.IsSequence() ) cDebug() << "WARNING: netinstall groups data does not form a sequence."; Q_ASSERT( groups.IsSequence() ); m_groups = new PackageModel( groups ); CALAMARES_RETRANSLATE( m_groups->setHeaderData( 0, Qt::Horizontal, tr( "Name" ) ); m_groups->setHeaderData( 1, Qt::Horizontal, tr( "Description" ) ); ) return true; } catch ( YAML::Exception& e ) { CalamaresUtils::explainYamlException( e, yamlData, "netinstall groups data" ); return false; } } void NetInstallPage::dataIsHere( QNetworkReply* reply ) { // If m_required is *false* then we still say we're ready // even if the reply is corrupt or missing. if ( reply->error() != QNetworkReply::NoError ) { cDebug() << reply->errorString(); ui->netinst_status->setText( tr( "Network Installation. (Disabled: Unable to fetch package lists, check your network connection)" ) ); emit checkReady( !m_required ); return; } if ( !readGroups( reply->readAll() ) ) { cDebug() << "Netinstall groups data was received, but invalid."; ui->netinst_status->setText( tr( "Network Installation. (Disabled: Unable to fetch package lists, check your network connection)" ) ); reply->deleteLater(); emit checkReady( !m_required ); return; } ui->groupswidget->setModel( m_groups ); ui->groupswidget->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents ); ui->groupswidget->header()->setSectionResizeMode( 1, QHeaderView::Stretch ); reply->deleteLater(); emit checkReady( true ); } PackageModel::PackageItemDataList NetInstallPage::selectedPackages() const { if ( m_groups ) return m_groups->getPackages(); else { cDebug() << "WARNING: no netinstall groups are available."; return PackageModel::PackageItemDataList(); } } void NetInstallPage::loadGroupList() { QString confUrl( Calamares::JobQueue::instance()->globalStorage()->value( "groupsUrl" ).toString() ); QNetworkRequest request; request.setUrl( QUrl( confUrl ) ); // Follows all redirects except unsafe ones (https to http). request.setAttribute( QNetworkRequest::FollowRedirectsAttribute, true ); // Not everybody likes the default User Agent used by this class (looking at you, // sourceforge.net), so let's set a more descriptive one. request.setRawHeader( "User-Agent", "Mozilla/5.0 (compatible; Calamares)" ); connect( &m_networkManager, &QNetworkAccessManager::finished, this, &NetInstallPage::dataIsHere ); m_networkManager.get( request ); } void NetInstallPage::setRequired( bool b ) { m_required = b; } void NetInstallPage::onActivate() { ui->groupswidget->setFocus(); } calamares-3.1.12/src/modules/netinstall/NetInstallPage.h000066400000000000000000000052621322271446000231730ustar00rootroot00000000000000/* * Copyright 2016, Luca Giambonini * Copyright 2016, Lisa Vitolo * Copyright 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef NETINSTALLPAGE_H #define NETINSTALLPAGE_H #include "PackageModel.h" #include "PackageTreeItem.h" #include "Typedefs.h" #include #include #include // required forward declarations class QByteArray; class QNetworkReply; namespace Ui { class Page_NetInst; } class NetInstallPage : public QWidget { Q_OBJECT public: NetInstallPage( QWidget* parent = nullptr ); void onActivate(); // Retrieves the groups, with name, description and packages, from // the remote URL configured in the settings. Assumes the URL is already // in the global storage. This should be called before displaying the page. void loadGroupList(); // Sets the "required" state of netinstall data. Influences whether // corrupt or unavailable data causes checkReady() to be emitted // true (not-required) or false. void setRequired( bool ); bool getRequired() const { return m_required; } // Returns the list of packages belonging to groups that are // selected in the view in this given moment. No data is cached here, so // this function does not have constant time. PackageModel::PackageItemDataList selectedPackages() const; public slots: void dataIsHere( QNetworkReply* ); signals: void checkReady( bool ); private: // Takes the YAML data representing the groups and reads them into the // m_groups and m_groupOrder internal structures. See the README.md // of this module to know the format expected of the YAML files. bool readGroups( const QByteArray& yamlData ); Ui::Page_NetInst* ui; // Handles connection with the remote URL storing the configuration. QNetworkAccessManager m_networkManager; PackageModel* m_groups; bool m_required; }; #endif // NETINSTALLPAGE_H calamares-3.1.12/src/modules/netinstall/NetInstallViewStep.cpp000066400000000000000000000115761322271446000244250ustar00rootroot00000000000000/* * Copyright 2016, Luca Giambonini * Copyright 2016, Lisa Vitolo * Copyright 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "NetInstallViewStep.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "NetInstallPage.h" CALAMARES_PLUGIN_FACTORY_DEFINITION( NetInstallViewStepFactory, registerPlugin(); ) NetInstallViewStep::NetInstallViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new NetInstallPage() ) , m_nextEnabled( false ) { emit nextStatusChanged( true ); connect( m_widget, &NetInstallPage::checkReady, this, &NetInstallViewStep::nextIsReady ); } NetInstallViewStep::~NetInstallViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString NetInstallViewStep::prettyName() const { return tr( "Package selection" ); } QString NetInstallViewStep::prettyStatus() const { return m_prettyStatus; } QWidget* NetInstallViewStep::widget() { return m_widget; } void NetInstallViewStep::next() { emit done(); } void NetInstallViewStep::back() {} bool NetInstallViewStep::isNextEnabled() const { return m_nextEnabled; } bool NetInstallViewStep::isBackEnabled() const { return true; } bool NetInstallViewStep::isAtBeginning() const { return true; } bool NetInstallViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > NetInstallViewStep::jobs() const { return m_jobs; } void NetInstallViewStep::onActivate() { m_widget->onActivate(); } void NetInstallViewStep::onLeave() { cDebug() << "Leaving netinstall, adding packages to be installed" << "to global storage"; PackageModel::PackageItemDataList packages = m_widget->selectedPackages(); QVariantList installPackages; QVariantList tryInstallPackages; QVariantList packageOperations; cDebug() << "Processing" << packages.length() << "packages from netinstall."; for ( auto package : packages ) { QVariant details( package.packageName ); // If it's a package with a pre- or post-script, replace // with the more complicated datastructure. if ( !package.preScript.isEmpty() || !package.postScript.isEmpty() ) { QMap sdetails; sdetails.insert( "pre-script", package.preScript ); sdetails.insert( "package", package.packageName ); sdetails.insert( "post-script", package.postScript ); details = sdetails; } if ( package.isCritical ) installPackages.append( details ); else tryInstallPackages.append( details ); } if ( !installPackages.empty() ) { QMap op; op.insert( "install", QVariant( installPackages ) ); packageOperations.append( op ); cDebug() << " .." << installPackages.length() << "critical packages."; } if ( !tryInstallPackages.empty() ) { QMap op; op.insert( "try_install", QVariant( tryInstallPackages ) ); packageOperations.append( op ); cDebug() << " .." << tryInstallPackages.length() << "non-critical packages."; } if ( !packageOperations.isEmpty() ) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); gs->insert( "packageOperations", QVariant( packageOperations ) ); } } void NetInstallViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { m_widget->setRequired( configurationMap.contains( "required" ) && configurationMap.value( "required" ).type() == QVariant::Bool && configurationMap.value( "required" ).toBool() ); if ( configurationMap.contains( "groupsUrl" ) && configurationMap.value( "groupsUrl" ).type() == QVariant::String ) { Calamares::JobQueue::instance()->globalStorage()->insert( "groupsUrl", configurationMap.value( "groupsUrl" ).toString() ); m_widget->loadGroupList(); } } void NetInstallViewStep::nextIsReady( bool b ) { m_nextEnabled = b; emit nextStatusChanged( b ); } calamares-3.1.12/src/modules/netinstall/NetInstallViewStep.h000066400000000000000000000041131322271446000240570ustar00rootroot00000000000000/* * Copyright 2016, Luca Giambonini * Copyright 2016, Lisa Vitolo * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef NETINSTALLVIEWSTEP_H #define NETINSTALLVIEWSTEP_H #include #include #include #include class NetInstallPage; class PLUGINDLLEXPORT NetInstallViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit NetInstallViewStep( QObject* parent = nullptr ); virtual ~NetInstallViewStep() override; QString prettyName() const override; QString prettyStatus() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; // Leaving the page; store all selected packages for later installation. void onLeave() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; public slots: void nextIsReady( bool ); private: NetInstallPage* m_widget; bool m_nextEnabled; QString m_prettyStatus; QList< Calamares::job_ptr > m_jobs; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( NetInstallViewStepFactory ) #endif // NETINSTALLVIEWSTEP_H calamares-3.1.12/src/modules/netinstall/PackageModel.cpp000066400000000000000000000201321322271446000231610ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright (c) 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PackageModel.h" #include "utils/YamlUtils.h" PackageModel::PackageModel( const YAML::Node& data, QObject* parent ) : QAbstractItemModel( parent ), m_columnHeadings() { m_rootItem = new PackageTreeItem(); setupModelData( data, m_rootItem ); } PackageModel::~PackageModel() { delete m_rootItem; } QModelIndex PackageModel::index( int row, int column, const QModelIndex& parent ) const { if ( !hasIndex( row, column, parent ) ) return QModelIndex(); PackageTreeItem* parentItem; if ( !parent.isValid() ) parentItem = m_rootItem; else parentItem = static_cast( parent.internalPointer() ); PackageTreeItem* childItem = parentItem->child( row ); if ( childItem ) return createIndex( row, column, childItem ); else return QModelIndex(); } QModelIndex PackageModel::parent( const QModelIndex& index ) const { if ( !index.isValid() ) return QModelIndex(); PackageTreeItem* child = static_cast( index.internalPointer() ); PackageTreeItem* parent = child->parentItem(); if ( parent == m_rootItem ) return QModelIndex(); return createIndex( parent->row(), 0, parent ); } int PackageModel::rowCount( const QModelIndex& parent ) const { if ( parent.column() > 0 ) return 0; PackageTreeItem* parentItem; if ( !parent.isValid() ) parentItem = m_rootItem; else parentItem = static_cast( parent.internalPointer() ); return parentItem->childCount(); } int PackageModel::columnCount( const QModelIndex& parent ) const { if ( parent.isValid() ) return static_cast( parent.internalPointer() )->columnCount(); return m_rootItem->columnCount(); } QVariant PackageModel::data( const QModelIndex& index, int role ) const { if ( !index.isValid() ) return QVariant(); PackageTreeItem* item = static_cast( index.internalPointer() ); if ( index.column() == 0 && role == Qt::CheckStateRole ) return item->isSelected(); if ( item->isHidden() && role == Qt::DisplayRole ) // Hidden group return QVariant(); if ( role == Qt::DisplayRole ) return item->data( index.column() ); return QVariant(); } bool PackageModel::setData( const QModelIndex& index, const QVariant& value, int role ) { if ( role == Qt::CheckStateRole && index.isValid() ) { PackageTreeItem* item = static_cast( index.internalPointer() ); item->setSelected( static_cast( value.toInt() ) ); emit dataChanged( this->index( 0, 0 ), index.sibling( index.column(), index.row() + 1 ), QVector( Qt::CheckStateRole ) ); } return true; } bool PackageModel::setHeaderData( int section, Qt::Orientation orientation, const QVariant& value, int role ) { Q_UNUSED( role ); if ( orientation == Qt::Horizontal ) { if ( m_columnHeadings.value( section ) != QVariant() ) m_columnHeadings.replace( section, value ); else m_columnHeadings.insert( section, value ); emit headerDataChanged( orientation, section, section ); } return true; } Qt::ItemFlags PackageModel::flags( const QModelIndex& index ) const { if ( !index.isValid() ) return 0; if ( index.column() == 0 ) return Qt::ItemIsUserCheckable | QAbstractItemModel::flags( index ); return QAbstractItemModel::flags( index ); } QVariant PackageModel::headerData( int section, Qt::Orientation orientation, int role ) const { if ( orientation == Qt::Horizontal && role == Qt::DisplayRole ) return m_columnHeadings.value( section ); return QVariant(); } QList PackageModel::getPackages() const { QList items = getItemPackages( m_rootItem ); for ( auto package : m_hiddenItems ) if ( package->hiddenSelected() ) items.append( getItemPackages( package ) ); QList packages; for ( auto item : items ) { PackageTreeItem::ItemData itemData; itemData.preScript = item->parentItem()->preScript(); // Only groups have hooks itemData.packageName = item->packageName(); // this seg faults itemData.postScript = item->parentItem()->postScript(); // Only groups have hooks itemData.isCritical = item->parentItem()->isCritical(); // Only groups are critical packages.append( itemData ); } return packages; } QList PackageModel::getItemPackages( PackageTreeItem* item ) const { QList selectedPackages; for ( int i = 0; i < item->childCount(); i++ ) { if ( item->child( i )->isSelected() == Qt::Unchecked ) continue; if ( !item->child( i )->childCount() ) // package selectedPackages.append( item->child( i ) ); else selectedPackages.append( getItemPackages( item->child( i ) ) ); } return selectedPackages; } void PackageModel::setupModelData( const YAML::Node& data, PackageTreeItem* parent ) { for ( YAML::const_iterator it = data.begin(); it != data.end(); ++it ) { const YAML::Node itemDefinition = *it; QString name( tr( CalamaresUtils::yamlToVariant( itemDefinition["name"] ).toByteArray() ) ); QString description( tr( CalamaresUtils::yamlToVariant( itemDefinition["description"] ).toByteArray() ) ); PackageTreeItem::ItemData itemData; itemData.name = name; itemData.description = description; if ( itemDefinition["pre-install"] ) itemData.preScript = CalamaresUtils::yamlToVariant( itemDefinition["pre-install"] ).toString(); if ( itemDefinition["post-install"] ) itemData.postScript = CalamaresUtils::yamlToVariant( itemDefinition["post-install"] ).toString(); PackageTreeItem* item = new PackageTreeItem( itemData, parent ); if ( itemDefinition["selected"] ) item->setSelected( CalamaresUtils::yamlToVariant( itemDefinition["selected"] ).toBool() ? Qt::Checked : Qt::Unchecked ); else item->setSelected( parent->isSelected() ); // Inherit from it's parent if ( itemDefinition["hidden"] ) item->setHidden( CalamaresUtils::yamlToVariant( itemDefinition["hidden"] ).toBool() ); if ( itemDefinition["critical"] ) item->setCritical( CalamaresUtils::yamlToVariant( itemDefinition["critical"] ).toBool() ); if ( itemDefinition["packages"] ) for ( YAML::const_iterator packageIt = itemDefinition["packages"].begin(); packageIt != itemDefinition["packages"].end(); ++packageIt ) item->appendChild( new PackageTreeItem( CalamaresUtils::yamlToVariant( *packageIt ).toString(), item ) ); if ( itemDefinition["subgroups"] ) setupModelData( itemDefinition["subgroups"], item ); if ( item->isHidden() ) m_hiddenItems.append( item ); else { item->setCheckable( true ); parent->appendChild( item ); } } } calamares-3.1.12/src/modules/netinstall/PackageModel.h000066400000000000000000000047361322271446000226420ustar00rootroot00000000000000 /* === This file is part of Calamares - === * * Copyright (c) 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PACKAGEMODEL_H #define PACKAGEMODEL_H #include "PackageTreeItem.h" #include #include #include #include class PackageModel : public QAbstractItemModel { Q_OBJECT public: using PackageItemDataList = QList< PackageTreeItem::ItemData >; explicit PackageModel( const YAML::Node& data, QObject* parent = nullptr ); ~PackageModel() override; QVariant data( const QModelIndex& index, int role ) const override; bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override; bool setHeaderData( int section, Qt::Orientation orientation, const QVariant& value, int role = Qt::EditRole ) override; Qt::ItemFlags flags( const QModelIndex& index ) const override; QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override; QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const override; QModelIndex parent( const QModelIndex& index ) const override; int rowCount( const QModelIndex& parent = QModelIndex() ) const override; int columnCount( const QModelIndex& parent = QModelIndex() ) const override; PackageItemDataList getPackages() const; QList getItemPackages( PackageTreeItem* item ) const; private: void setupModelData( const YAML::Node& data, PackageTreeItem* parent ); PackageTreeItem* m_rootItem; QList m_hiddenItems; QVariantList m_columnHeadings; }; #endif // PACKAGEMODEL_H calamares-3.1.12/src/modules/netinstall/PackageTreeItem.cpp000066400000000000000000000132611322271446000236440ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright (c) 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PackageTreeItem.h" #include "utils/Logger.h" PackageTreeItem::PackageTreeItem( const ItemData& data, PackageTreeItem* parent ) : m_parentItem( parent ) , m_data( data ) { } PackageTreeItem::PackageTreeItem( const QString packageName, PackageTreeItem* parent ) : m_parentItem( parent ) { m_data.packageName = packageName; if ( parent != nullptr ) m_data.selected = parent->isSelected(); else m_data.selected = Qt::Unchecked; } PackageTreeItem::PackageTreeItem( PackageTreeItem* parent ) : m_parentItem( parent ) { } PackageTreeItem::PackageTreeItem::PackageTreeItem() : PackageTreeItem( QString(), nullptr ) { m_data.selected = Qt::Checked; m_data.name = QLatin1Literal( "" ); } PackageTreeItem::~PackageTreeItem() { qDeleteAll( m_childItems ); } void PackageTreeItem::appendChild( PackageTreeItem* child ) { m_childItems.append( child ); } PackageTreeItem* PackageTreeItem::child( int row ) { return m_childItems.value( row ); } int PackageTreeItem::childCount() const { return m_childItems.count(); } int PackageTreeItem::row() const { if ( m_parentItem ) return m_parentItem->m_childItems.indexOf( const_cast( this ) ); return 0; } int PackageTreeItem::columnCount() const { return m_columns; } QVariant PackageTreeItem::data( int column ) const { if ( packageName() != nullptr ) // package { if ( !column ) return QVariant( packageName() ); return QVariant(); } switch ( column ) // group { case 0: return QVariant( prettyName() ); case 1: return QVariant( description() ); default: return QVariant(); } } PackageTreeItem* PackageTreeItem::parentItem() { return m_parentItem; } const PackageTreeItem* PackageTreeItem::parentItem() const { return m_parentItem; } QString PackageTreeItem::prettyName() const { return m_data.name; } QString PackageTreeItem::description() const { return m_data.description; } QString PackageTreeItem::preScript() const { return m_data.preScript; } QString PackageTreeItem::packageName() const { return m_data.packageName; } QString PackageTreeItem::postScript() const { return m_data.postScript; } bool PackageTreeItem::isHidden() const { return m_data.isHidden; } void PackageTreeItem::setHidden( bool isHidden ) { m_data.isHidden = isHidden; } bool PackageTreeItem::hiddenSelected() const { Q_ASSERT( m_data.isHidden ); if (! m_data.selected ) return false; const PackageTreeItem* currentItem = parentItem(); while ( currentItem != nullptr ) { if ( !currentItem->isHidden() ) return currentItem->isSelected() != Qt::Unchecked; currentItem = currentItem->parentItem(); } /* Has no non-hiddent parents */ return m_data.selected; } bool PackageTreeItem::isCritical() const { return m_data.isCritical; } void PackageTreeItem::setCritical( bool isCritical ) { m_data.isCritical = isCritical; } Qt::CheckState PackageTreeItem::isSelected() const { return m_data.selected; } void PackageTreeItem::setSelected( Qt::CheckState isSelected ) { if ( parentItem() == nullptr ) // This is the root, it is always checked so don't change state return; m_data.selected = isSelected; setChildrenSelected( isSelected ); // Look for suitable parent item which may change checked-state // when one of its children changes. PackageTreeItem* currentItem = parentItem(); while ( ( currentItem != nullptr ) && ( currentItem->childCount() == 0 ) ) { currentItem = currentItem->parentItem(); } if ( currentItem == nullptr ) // Reached the root .. don't bother return; // Figure out checked-state based on the children int childrenSelected = 0; int childrenPartiallySelected = 0; for ( int i = 0; i < currentItem->childCount(); i++ ) { if ( currentItem->child( i )->isSelected() == Qt::Checked ) childrenSelected++; if ( currentItem->child( i )->isSelected() == Qt::PartiallyChecked ) childrenPartiallySelected++; } if ( !childrenSelected && !childrenPartiallySelected) currentItem->setSelected( Qt::Unchecked ); else if ( childrenSelected == currentItem->childCount() ) currentItem->setSelected( Qt::Checked ); else currentItem->setSelected( Qt::PartiallyChecked ); } void PackageTreeItem::setChildrenSelected( Qt::CheckState isSelected ) { if ( isSelected != Qt::PartiallyChecked ) // Children are never root; don't need to use setSelected on them. for ( auto child : m_childItems ) { child->m_data.selected = isSelected; child->setChildrenSelected( isSelected ); } } int PackageTreeItem::type() const { return QStandardItem::UserType; } calamares-3.1.12/src/modules/netinstall/PackageTreeItem.h000066400000000000000000000055421322271446000233140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright (c) 2017, Kyle Robbertze * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PACKAGETREEITEM_H #define PACKAGETREEITEM_H #include #include #include class PackageTreeItem : public QStandardItem { public: struct ItemData { QString name; QString description; QString preScript; QString packageName; QString postScript; bool isCritical = false; bool isHidden = false; Qt::CheckState selected = Qt::Unchecked; }; explicit PackageTreeItem( const ItemData& data, PackageTreeItem* parent = nullptr ); explicit PackageTreeItem( const QString packageName, PackageTreeItem* parent = nullptr ); explicit PackageTreeItem( PackageTreeItem* parent ); explicit PackageTreeItem(); // The root of the tree; always selected, named ~PackageTreeItem() override; void appendChild( PackageTreeItem* child ); PackageTreeItem* child( int row ); int childCount() const; int columnCount() const; QVariant data( int column ) const override; int row() const; PackageTreeItem* parentItem(); const PackageTreeItem* parentItem() const; QString prettyName() const; QString description() const; QString preScript() const; QString packageName() const; QString postScript() const; bool isHidden() const; void setHidden( bool isHidden ); /** * @brief Is this hidden item, considered "selected"? * * This asserts when called on a non-hidden item. * A hidden item has its own selected state, but really * falls under the selectedness of the parent item. */ bool hiddenSelected() const; bool isCritical() const; void setCritical( bool isCritical ); Qt::CheckState isSelected() const; void setSelected( Qt::CheckState isSelected ); void setChildrenSelected( Qt::CheckState isSelected ); int type() const override; private: PackageTreeItem* m_parentItem; QList m_childItems; ItemData m_data; const int m_columns = 2; // Name, description }; #endif // PACKAGETREEITEM_H calamares-3.1.12/src/modules/netinstall/README.md000066400000000000000000000074271322271446000214340ustar00rootroot00000000000000# Netinstall module The netinstall module allows distribution maintainers to ship minimal ISOs with only a basic set of preinstall packages. At installation time, the user is presented with the choice to install groups of packages from a predefined list. Calamares will then invoke the correct backend to install the packages. ## Configuration of the packages Every distribution can choose which groups to display and which packages should be in the groups. The *netinstall.conf* file should have this format: ---- groupsUrl: The URL must point to a YAML file. Here is a short example of how the YAML file should look. - name: "Group name" description: "Description of the group" packages: - lsb-release - avahi - grub - name: "Second group name" ... The file is composed of a list of entry, each describing one group. The keys *name*, *description* and *packages* are required. More keys are supported: - hidden: if true, do not show the group on the page. Defaults to false. - selected: if true, display the group as selected. Defaults to false. - critical: if true, make the installation process fail if installing any of the packages in the group fails. Otherwise, just log a warning. Defaults to false. - subgroups: if present this follows the same structure as the top level of the YAML file, allowing there to be sub-groups of packages to an arbitary depth - pre-install: an optional command to run within the new system before the group's packages are installed. It will run before each package in the group is installed. - post-install: an optional command to run within the new system after the group's packages are installed. It will run after each package in the group is installed. If you set both *hidden* and *selected* for a group, you are basically creating a "default" group of packages which will always be installed in the user's system. ## Configuration of the module Here is the set of instructions to have the module work in your Calamares. As of July 2016, this has been successfully tested using the live installation of Chakra Fermi. First, if the module is used, we need to require a working Internet connection, otherwise the module will be unable to fetch the package groups and to perform the installation. Requirements for the Calamares instance are configured in the **welcome.conf** file (configuration for the **welcome** module). Make sure *internet* is listed below *required*. In the *settings.conf* file, decide where the **netinstall** page should be displayed. I put it just after the **welcome** page, but any position between that and just before **partition** should make no difference. If not present, add the **packages** job in the **exec** list. This is the job that calls the package manager to install packages. Make sure it is configured to use the correct package manager for your distribution; this is configured in src/modules/packages/packages.conf. The exec list should be: - unpackfs - networkcfg - packages **unpackfs** creates the chroot where the installation is performed, and unpacks the root image with the filesystem structure; **networkcfg** set ups a working network in the chroot; and finally **packages** can install packages in the chroot. ## Common issues If launching the package manager command returns you negative exit statuses and nothing is actually invoked, this is likely an error in the setup of the chroot; check that the parameter **rootMountPoint** is set to the correct value in the Calamares configuration. If the command is run, but exits with error, check that the network is working in the chroot. Make sure /etc/resolv.conf exists and that it's not empty. calamares-3.1.12/src/modules/netinstall/netinstall.conf000066400000000000000000000012001322271446000231600ustar00rootroot00000000000000--- # This is the URL that is retrieved to get the netinstall groups-and-packages # data (which should be in the format described in netinstall.yaml). groupsUrl: http://chakraos.org/netinstall.php # If the installation can proceed without netinstall (e.g. the Live CD # can create a working installed system, but netinstall is preferred # to bring it up-to-date or extend functionality) leave this set to # false (the default). If set to true, the netinstall data is required. # # This only has an effect if the netinstall data cannot be retrieved, # or is corrupt: having "required" set, means the install cannot proceed. required: false calamares-3.1.12/src/modules/netinstall/netinstall.yaml000066400000000000000000000102711322271446000232050ustar00rootroot00000000000000- name: "Default" description: "Default group" hidden: true selected: true critical: false packages: - base - chakra-live-skel - cdemu-client - lsb-release - avahi - grub # disk utils - dosfstools - e2fsprogs - fuse - gptfdisk - jfsutils - ntfs-3g - reiserfsprogs - xfsprogs # power - acpi_call - pmtools # network - dnsutils - iputils - netcfg - xinetd # firmwares - alsa-firmware - linux-firmware # sound - alsa-lib - alsa-utils - gstreamer - gst-plugins-good - gst-plugins-bad - libao - libcanberra-gstreamer - libcanberra-pulse - pulseaudio - pulseaudio-alsa # tools - bash-completion - hwinfo - lsof - man-db - mlocate - nano - openssh - sudo - vim - zsh # :D # archivers - p7zip - unarj - unrar - unzip - zip # xorg base - xorg - xorg-apps - xorg-fonts-alias - xorg-fonts-encodings - xorg-fonts-misc - xorg-res-utils - xorg-server - xorg-server-utils - xorg-xauth - xorg-xinit - xorg-xkb-utils # xorg video drivers - xf86-video-apm - xf86-video-ark - xf86-video-ati - xf86-video-chips - xf86-video-cirrus - xf86-video-glint - xf86-video-i128 - xf86-video-i740 - xf86-video-intel - xf86-video-mach64 - xf86-video-mga - xf86-video-neomagic - xf86-video-nouveau - xf86-video-nv - xf86-video-openchrome - xf86-video-r128 - xf86-video-rendition - xf86-video-s3 - xf86-video-s3virge - xf86-video-savage - xf86-video-siliconmotion - xf86-video-sisusb - xf86-video-tdfx - xf86-video-trident - xf86-video-tseng - xf86-video-v4l - xf86-video-vesa - xf86-video-voodoo - mesa-libgl # xorg input drivers - xf86-input-synaptics - xf86-input-wacom - xf86-input-evdev - xf86-input-keyboard - xf86-input-mouse # fonts - terminus-font - ttf-dejavu - ttf-liberation - wqy-microhei - xorg-fonts-100dpi - xorg-fonts-75dpi - xorg-fonts-cyrillic # additional stuff that needs xorg - hicolor-icon-theme # kde - chakra-common - qt - kde-baseapps - kde-baseapps-dolphin - kde-baseapps-konsole - kde-runtime - kde-workspace - kdelibs - kdepimlibs - kdemultimedia-kmix - oxygen-icons - phonon-backend-gstreamer # chakra theme (including kapudan options) - chakra-wallpapers-dharma - chakra-wallpapers-curie - chakra-wallpapers-descartes - grub2-themes-sirius - kapudan-kde-themes-caledonia - kde-kdm-themes-sirius - kde-ksplash-themes-sirius - kde-plasma-themes-caledonia - python2-imaging - python2-v4l2capture - python2-xlib - caledonia-colors - yakuake-themes-ronak # kde (everything else) - kdeadmin-kcron - kdeadmin-kuser - kdeplasma-addons-applets-icontasks - kdesdk-kate - kdeutils-ark - kdeutils-kgpg - kdeutils-sweeper # kde network - kdeplasma-applets-plasma-nm - networkmanager-dispatcher-ntpd - kcm-ufw # applications - rekonq - yakuake # enable systemd-units - chakra-init-live # overlay pkgs - partitionmanager - octopi-notifier - kapudan - name: "Wireless" description: "Tools for wireless connections" critical: false packages: - crda - ndiswrapper - usb-modeswitch - wireless-regdb - wireless_tools - wpa_supplicant - name: "CCR" description: "Tools for the Chakra Community Repository" packages: - ccr - base-devel - name: "Graphics" description: "Applications to work with graphics" packages: - kdegraphics-gwenview - kdegraphics-kamera - kdegraphics-kcolorchooser - kdegraphics-kgamma - kdegraphics-kolourpaint - kdegraphics-kruler - kdegraphics-ksaneplugin - kdegraphics-ksnapshot - kdegraphics-libkdcraw - kdegraphics-libkexiv2 - kdegraphics-libkipi - kdegraphics-libksane - kdegraphics-mobipocket - kdegraphics-okular - kdegraphics-strigi-analyzer - kdegraphics-svgpart - kdegraphics-thumbnailers - imagemagick calamares-3.1.12/src/modules/netinstall/page_netinst.ui000066400000000000000000000024361322271446000231670ustar00rootroot00000000000000 Page_NetInst 0 0 997 474 16777215 16777215 true 0 0 981 434 11 calamares-3.1.12/src/modules/networkcfg/000077500000000000000000000000001322271446000201375ustar00rootroot00000000000000calamares-3.1.12/src/modules/networkcfg/main.py000066400000000000000000000054331322271446000214420ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Philip Müller # Copyright 2014, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import shutil import libcalamares def run(): """ Setup network configuration """ root_mount_point = libcalamares.globalstorage.value("rootMountPoint") source_nm = "/etc/NetworkManager/system-connections/" target_nm = os.path.join( root_mount_point, "etc/NetworkManager/system-connections/" ) # Sanity checks. We don't want to do anything if a network # configuration already exists on the target if os.path.exists(source_nm) and os.path.exists(target_nm): for network in os.listdir(source_nm): # Skip LTSP live if network == "LTSP": continue source_network = os.path.join(source_nm, network) target_network = os.path.join(target_nm, network) if os.path.exists(target_network): continue try: shutil.copy(source_network, target_network) except FileNotFoundError: libcalamares.utils.debug( "Can't copy network configuration files in " + "{}".format(source_network) ) except FileExistsError: pass # We need to overwrite the default resolv.conf in the chroot. source_resolv = "/etc/resolv.conf" target_resolv = os.path.join(root_mount_point, "etc/resolv.conf") if source_resolv != target_resolv and os.path.exists(source_resolv): try: os.remove(target_resolv) except Exception as err: libcalamares.utils.debug( "Couldn't remove {}: {}".format(target_resolv, err) ) try: shutil.copy(source_resolv, target_resolv) except Exception as err: libcalamares.utils.debug( "Can't copy resolv.conf from {}: {}".format(source_resolv, err) ) return None calamares-3.1.12/src/modules/networkcfg/module.desc000066400000000000000000000001511322271446000222610ustar00rootroot00000000000000--- type: "job" name: "networkcfg" interface: "python" requires: [] script: "main.py" calamares-3.1.12/src/modules/packages/000077500000000000000000000000001322271446000175445ustar00rootroot00000000000000calamares-3.1.12/src/modules/packages/main.py000066400000000000000000000346761322271446000210620ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Pier Luigi Fiorini # Copyright 2015-2017, Teo Mrnjavac # Copyright 2016-2017, Kyle Robbertze # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import abc from string import Template import subprocess import libcalamares from libcalamares.utils import check_target_env_call, target_env_call from libcalamares.utils import gettext_path, gettext_languages import gettext _translation = gettext.translation("calamares-python", localedir=gettext_path(), languages=gettext_languages(), fallback=True) _ = _translation.gettext _n = _translation.ngettext total_packages = 0 # For the entire job completed_packages = 0 # Done so far for this job group_packages = 0 # One group of packages from an -install or -remove entry INSTALL = object() REMOVE = object() mode_packages = None # Changes to INSTALL or REMOVE def _change_mode(mode): global mode_packages mode_packages = mode libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) def pretty_name(): if not group_packages: if (total_packages > 0): # Outside the context of an operation s = _("Processing packages (%(count)d / %(total)d)") else: s = _("Install packages.") elif mode_packages is INSTALL: s = _n("Installing one package.", "Installing %(num)d packages.", group_packages) elif mode_packages is REMOVE: s = _n("Removing one package.", "Removing %(num)d packages.", group_packages) else: # No mode, generic description s = _("Install packages.") return s % {"num": group_packages, "count": completed_packages, "total": total_packages} class PackageManager(metaclass=abc.ABCMeta): """ Package manager base class. A subclass implements package management for a specific backend, and must have a class property `backend` with the string identifier for that backend. Subclasses are collected below to populate the list of possible backends. """ backend = None @abc.abstractmethod def install(self, pkgs, from_local=False): """ Install a list of packages (named) into the system. Although this handles lists, in practice it is called with one package at a time. @param pkgs: list[str] list of package names @param from_local: bool if True, then these are local packages (on disk) and the pkgs names are paths. """ pass @abc.abstractmethod def remove(self, pkgs): """ Removes packages. @param pkgs: list[str] list of package names """ pass @abc.abstractmethod def update_db(self): pass def run(self, script): if script != "": check_target_env_call(script.split(" ")) def install_package(self, packagedata, from_local=False): """ Install a package from a single entry in the install list. This can be either a single package name, or an object with pre- and post-scripts. @param packagedata: str|dict @param from_local: bool see install.from_local """ if isinstance(packagedata, str): self.install([packagedata], from_local=from_local) else: self.run(packagedata["pre-script"]) self.install([packagedata["package"]], from_local=from_local) self.run(packagedata["post-script"]) class PMPackageKit(PackageManager): backend = "packagekit" def install(self, pkgs, from_local=False): for pkg in pkgs: check_target_env_call(["pkcon", "-py", "install", pkg]) def remove(self, pkgs): for pkg in pkgs: check_target_env_call(["pkcon", "-py", "remove", pkg]) def update_db(self): check_target_env_call(["pkcon", "refresh"]) class PMZypp(PackageManager): backend = "zypp" def install(self, pkgs, from_local=False): check_target_env_call(["zypper", "--non-interactive", "--quiet-install", "install", "--auto-agree-with-licenses", "install"] + pkgs) def remove(self, pkgs): check_target_env_call(["zypper", "--non-interactive", "remove"] + pkgs) def update_db(self): check_target_env_call(["zypper", "--non-interactive", "update"]) class PMYum(PackageManager): backend = "yum" def install(self, pkgs, from_local=False): check_target_env_call(["yum", "install", "-y"] + pkgs) def remove(self, pkgs): check_target_env_call(["yum", "--disablerepo=*", "-C", "-y", "remove"] + pkgs) def update_db(self): # Doesn't need updates pass class PMDnf(PackageManager): backend = "dnf" def install(self, pkgs, from_local=False): check_target_env_call(["dnf", "install", "-y"] + pkgs) def remove(self, pkgs): # ignore the error code for now because dnf thinks removing a # nonexistent package is an error target_env_call(["dnf", "--disablerepo=*", "-C", "-y", "remove"] + pkgs) def update_db(self): # Doesn't need to update explicitly pass class PMUrpmi(PackageManager): backend = "urpmi" def install(self, pkgs, from_local=False): check_target_env_call(["urpmi", "--download-all", "--no-suggests", "--no-verify-rpm", "--fastunsafe", "--ignoresize", "--nolock", "--auto"] + pkgs) def remove(self, pkgs): check_target_env_call(["urpme", "--auto"] + pkgs) def update_db(self): check_target_env_call(["urpmi.update", "-a"]) class PMApt(PackageManager): backend = "apt" def install(self, pkgs, from_local=False): check_target_env_call(["apt-get", "-q", "-y", "install"] + pkgs) def remove(self, pkgs): check_target_env_call(["apt-get", "--purge", "-q", "-y", "remove"] + pkgs) check_target_env_call(["apt-get", "--purge", "-q", "-y", "autoremove"]) def update_db(self): check_target_env_call(["apt-get", "update"]) class PMPacman(PackageManager): backend = "pacman" def install(self, pkgs, from_local=False): if from_local: pacman_flags = "-U" else: pacman_flags = "-Sy" check_target_env_call(["pacman", pacman_flags, "--noconfirm"] + pkgs) def remove(self, pkgs): check_target_env_call(["pacman", "-Rs", "--noconfirm"] + pkgs) def update_db(self): check_target_env_call(["pacman", "-Sy"]) class PMPortage(PackageManager): backend = "portage" def install(self, pkgs, from_local=False): check_target_env_call(["emerge", "-v"] + pkgs) def remove(self, pkgs): check_target_env_call(["emerge", "-C"] + pkgs) check_target_env_call(["emerge", "--depclean", "-q"]) def update_db(self): check_target_env_call(["emerge", "--sync"]) class PMEntropy(PackageManager): backend = "entropy" def install(self, pkgs, from_local=False): check_target_env_call(["equo", "i"] + pkgs) def remove(self, pkgs): check_target_env_call(["equo", "rm"] + pkgs) def update_db(self): check_target_env_call(["equo", "update"]) class PMDummy(PackageManager): backend = "dummy" def install(self, pkgs, from_local=False): libcalamares.utils.debug("Installing " + str(pkgs)) def remove(self, pkgs): libcalamares.utils.debug("Removing " + str(pkgs)) def update_db(self): libcalamares.utils.debug("Updating DB") def run(self, script): libcalamares.utils.debug("Running script '" + str(script) + "'") # Collect all the subclasses of PackageManager defined above, # and index them based on the backend property of each class. backend_managers = [ (c.backend, c) for c in globals().values() if type(c) is abc.ABCMeta and issubclass(c, PackageManager) and c.backend] def subst_locale(plist): """ Returns a locale-aware list of packages, based on @p plist. Package names that contain LOCALE are localized with the BCP47 name of the chosen system locale; if the system locale is 'en' (e.g. English, US) then these localized packages are dropped from the list. @param plist: list[str|dict] Candidate packages to install. @return: list[str|dict] """ locale = libcalamares.globalstorage.value("locale") if not locale: return plist ret = [] for packagedata in plist: if isinstance(packagedata, str): packagename = packagedata else: packagename = packagedata["package"] # Update packagename: substitute LOCALE, and drop packages # if locale is en and LOCALE is in the package name. if locale != "en": packagename = Template(packagename).safe_substitute(LOCALE=locale) elif 'LOCALE' in packagename: packagename = None if packagename is not None: # Put it back in packagedata if isinstance(packagedata, str): packagedata = packagename else: packagedata["package"] = packagename ret.append(packagedata) return ret def run_operations(pkgman, entry): """ Call package manager with suitable parameters for the given package actions. :param pkgman: PackageManager This is the manager that does the actual work. :param entry: dict Keys are the actions -- e.g. "install" -- to take, and the values are the (list of) packages to apply the action to. The actions are not iterated in a specific order, so it is recommended to use only one action per dictionary. The list of packages may be package names (strings) or package information dictionaries with pre- and post-scripts. """ global group_packages, completed_packages, mode_packages for key in entry.keys(): entry[key] = subst_locale(entry[key]) group_packages = len(entry[key]) if key == "install": _change_mode(INSTALL) if all([isinstance(x, str) for x in entry[key]]): pkgman.install(entry[key]) else: for package in entry[key]: pkgman.install_package(package) elif key == "try_install": _change_mode(INSTALL) # we make a separate package manager call for each package so a # single failing package won't stop all of them for package in entry[key]: try: pkgman.install_package(package) except subprocess.CalledProcessError: warn_text = "WARNING: could not install package " warn_text += str(package) libcalamares.utils.debug(warn_text) elif key == "remove": _change_mode(REMOVE) pkgman.remove(entry[key]) elif key == "try_remove": _change_mode(REMOVE) for package in entry[key]: try: pkgman.remove([package]) except subprocess.CalledProcessError: warn_text = "WARNING: could not remove package " warn_text += package libcalamares.utils.debug(warn_text) elif key == "localInstall": _change_mode(INSTALL) pkgman.install(entry[key], from_local=True) completed_packages += len(entry[key]) libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) libcalamares.utils.debug(pretty_name()) group_packages = 0 _change_mode(None) def run(): """ Calls routine with detected package manager to install locale packages or remove drivers not needed on the installed system. :return: """ global mode_packages, total_packages, completed_packages, group_packages backend = libcalamares.job.configuration.get("backend") for identifier, impl in backend_managers: if identifier == backend: pkgman = impl() break else: return "Bad backend", "backend=\"{}\"".format(backend) skip_this = libcalamares.job.configuration.get("skip_if_no_internet", False) if skip_this and not libcalamares.globalstorage.value("hasInternet"): libcalamares.utils.debug( "WARNING: packages installation has been skipped: no internet" ) return None update_db = libcalamares.job.configuration.get("update_db", False) if update_db and libcalamares.globalstorage.value("hasInternet"): pkgman.update_db() operations = libcalamares.job.configuration.get("operations", []) if libcalamares.globalstorage.contains("packageOperations"): operations += libcalamares.globalstorage.value("packageOperations") mode_packages = None total_packages = 0 completed_packages = 0 for op in operations: for packagelist in op.values(): total_packages += len(packagelist) if not total_packages: # Avoids potential divide-by-zero in progress reporting return None for entry in operations: group_packages = 0 libcalamares.utils.debug(pretty_name()) run_operations(pkgman, entry) mode_packages = None libcalamares.job.setprogress(1.0) libcalamares.utils.debug(pretty_name()) return None calamares-3.1.12/src/modules/packages/module.desc000066400000000000000000000001301322271446000216630ustar00rootroot00000000000000--- type: "job" name: "packages" interface: "python" script: "main.py" calamares-3.1.12/src/modules/packages/packages.conf000066400000000000000000000123701322271446000221740ustar00rootroot00000000000000--- # # Which package manager to use, options are: # - packagekit - PackageKit CLI tool # - zypp - Zypp RPM frontend # - yum - Yum RPM frontend # - dnf - DNF, the new RPM frontend # - urpmi - Mandriva package manager # - apt - APT frontend for DEB and RPM # - pacman - Pacman # - portage - Gentoo package manager # - entropy - Sabayon package manager # - dummy - Dummy manager, only logs # backend: dummy # Often package installation needs an internet connection. # Since you may allow system installation without a connection # and want to offer **optional** package installation, it's # possible to have no internet, yet have this packages module # enabled in settings. # # You can skip the whole module when there is no internet # by setting *skip_if_no_internet* to true. # # You can run a package-manager specific update procedure # before installing packages (for instance, to update the # list of packages and dependencies); this is done only if there # is an internet connection. Set *update_db* to true to do so. skip_if_no_internet: false update_db: true # # List of maps with package operations such as install or remove. # Distro developers can provide a list of packages to remove # from the installed system (for instance packages meant only # for the live system). # # A job implementing a distro specific logic to determine other # packages that need to be installed or removed can run before # this one. Distro developers may want to install locale packages # or remove drivers not needed on the installed system. # Such a job would populate a list of dictionaries in the global # storage called "packageOperations" and that list is processed # after the static list in the job configuration (i.e. the list # that is in this configuration file). # # Allowed package operations are: # - install, try_install: will call the package manager to # install one or more packages. The install target will # abort the whole installation if package-installation # fails, while try_install carries on. Packages may be # listed as (localized) names, or as (localized) package-data. # See below for the description of the format. # - localInstall: this is used to call the package manager # to install a package from a path-to-a-package. This is # useful if you have a static package archive on the install media. # - remove, try_remove: will call the package manager to # remove one or more packages. The remove target will # abort the whole installation if package-removal fails, # while try_remove carries on. Packages may be listed as # (localized) names. # # There are two formats for naming packages: as a name or as package-data, # which is an object notation providing package-name, as well as pre- and # post-install scripts. # # Here are both formats, for installing vi. The first one just names the # package for vi (using the naming of the installed package manager), while # the second contains three data-items; the pre-script is run before invoking # the package manager, and the post-script runs once it is done. # # - install # - vi # - package: vi # pre-script: touch /tmp/installing-vi # post-script: rm -f /tmp/installing-vi # # The pre- and post-scripts are optional, but not both optional: using # "package: vi" with neither script option will trick Calamares into # trying to install a package named "package: vi", which is unlikely to work. # # Any package name may be localized; this is used to install localization # packages for software based on the selected system locale. By including # the string LOCALE in the package name, the following happens: # # - if the system locale is English (generally US English; en_GB is a valid # localization), then the package is not installed at all, # - otherwise $LOCALE or ${LOCALE} is replaced by the Bcp47 name of the selected # system locale, e.g. nl_BE. Note that just plain LOCALE will not be replaced, # so foo-LOCALE will be unchanged, while foo-$LOCALE will be changed. # # The following installs localizations for vi, if they are relevant; if # there is no localization, installation continues normally. # # - install # - vi-$LOCALE # - package: vi-${LOCALE} # pre-script: touch /tmp/installing-vi # post-script: rm -f /tmp/installing-vi # # When installing packages, Calamares will invoke the package manager # with a list of package names if it can; package-data prevents this because # of the scripts that need to run. In other words, this: # # - install: # - vi # - binutils # - package: wget # pre-script: touch /tmp/installing-wget # # This will invoke the package manager three times, once for each package, # because not all of them are simple package names. You can speed up the # process if you have only a few pre-scriots, by using multiple install targets: # # - install: # - vi # - binutils # - install: # - package: wget # pre-script: touch /tmp/installing-wget # # This will call the package manager once with the package-names "vi" and # "binutils", and then a second time for "wget". When installing large numbers # of packages, this can lead to a considerable time savings. # operations: - install: - vi - wget - binutils - remove: - vi - wget - binutils calamares-3.1.12/src/modules/packages/test.yaml000066400000000000000000000003171322271446000214100ustar00rootroot00000000000000backend: dummy rootMountPoint: /tmp/mount operations: - install: - pre-script: touch /tmp/foo package: vi post-script: rm /tmp/foo - wget - binutils - remove: - vi - wget calamares-3.1.12/src/modules/partition/000077500000000000000000000000001322271446000177775ustar00rootroot00000000000000calamares-3.1.12/src/modules/partition/CMakeLists.txt000066400000000000000000000057551322271446000225530ustar00rootroot00000000000000find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) include(KDEInstallDirs) include(GenerateExportHeader) find_package( KF5 REQUIRED CoreAddons ) # These are needed because KPMcore links publicly against ConfigCore, I18n, IconThemes, KIOCore and Service find_package( KF5 REQUIRED Config I18n IconThemes KIO Service ) find_package( KPMcore 3.1.50 QUIET ) if ( KPMcore_FOUND ) add_definitions(-DWITH_KPMCORE22) endif() find_package( KPMcore 3.0.3 QUIET ) # 3.0.3 and newer has fixes for NVMe support; allow 3.0.2, but warn # about it .. needs to use a different feature name because it otherwise # gets reported as KPMcore (the package). if ( KPMcore_FOUND ) message( STATUS "KPMCore supports NVMe operations" ) add_feature_info( KPMcoreNVMe KPMcore_FOUND "KPMcore with NVMe support" ) else() find_package( KPMcore 3.0.2 REQUIRED ) message( WARNING "KPMCore 3.0.2 is known to have bugs with NVMe devices" ) add_feature_info( KPMcoreNVMe KPMcore_FOUND "Older KPMcore with no NVMe support" ) endif() find_library( atasmart_LIB atasmart ) find_library( blkid_LIB blkid ) if( NOT atasmart_LIB ) message( WARNING "atasmart library not found." ) endif() if( NOT blkid_LIB ) message( WARNING "blkid library not found." ) endif() include_directories( ${KPMCORE_INCLUDE_DIR} ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) add_subdirectory( tests ) calamares_add_plugin( partition TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES core/BootLoaderModel.cpp core/ColorUtils.cpp core/DeviceList.cpp core/DeviceModel.cpp core/KPMHelpers.cpp core/PartitionActions.cpp core/PartitionCoreModule.cpp core/PartitionInfo.cpp core/PartitionIterator.cpp core/PartitionModel.cpp core/PartUtils.cpp gui/BootInfoWidget.cpp gui/ChoicePage.cpp gui/CreatePartitionDialog.cpp gui/DeviceInfoWidget.cpp gui/EditExistingPartitionDialog.cpp gui/EncryptWidget.cpp gui/PartitionPage.cpp gui/PartitionBarsView.cpp gui/PartitionLabelsView.cpp gui/PartitionSizeController.cpp gui/PartitionSplitterWidget.cpp gui/PartitionViewStep.cpp gui/PrettyRadioButton.cpp gui/ScanningDialog.cpp gui/ReplaceWidget.cpp jobs/ClearMountsJob.cpp jobs/ClearTempMountsJob.cpp jobs/CreatePartitionJob.cpp jobs/CreatePartitionTableJob.cpp jobs/DeletePartitionJob.cpp jobs/FillGlobalStorageJob.cpp jobs/FormatPartitionJob.cpp jobs/PartitionJob.cpp jobs/ResizePartitionJob.cpp jobs/SetPartitionFlagsJob.cpp UI gui/ChoicePage.ui gui/CreatePartitionDialog.ui gui/CreatePartitionTableDialog.ui gui/EditExistingPartitionDialog.ui gui/EncryptWidget.ui gui/PartitionPage.ui gui/ReplaceWidget.ui LINK_PRIVATE_LIBRARIES kpmcore calamaresui KF5::CoreAddons SHARED_LIB ) calamares-3.1.12/src/modules/partition/README.md000066400000000000000000000071211322271446000212570ustar00rootroot00000000000000# Architecture ## Overview The heart of the module is the PartitionCoreModule class. It holds Qt models for the various elements and can create Calamares jobs representing the changes to be performed at install time. PartitionPage is the main UI class. It represents the module main page, the one with the device combo box, partition list and action buttons. It reacts to the buttons by creating various dialogs (the (...)Dialog classes) and tell PartitionCoreModule what to do. ## Use of KPMcore This module depends on KPMcore, the same library used by [KDE Partition Manager][kpm]. [kpm]: http://sourceforge.net/projects/partitionman/ ## Partition and PartitionInfo Calamares needs to store some information about partitions which is not available in Partition Manager's Partition class. This includes the install mount point and a boolean to mark whether an existing partition should be formatted. Reusing the existing `Partition::mountPoint` property was not an option because it stores the directory where a partition is currently mounted, which is a different concept from the directory where the user wants the partition to be mounted on the installed system. We can't hijack this to store our install mount point because whether the partition is currently mounted is an important information which should be taken into account later to prevent any modification on an installed partition. The way this extra information is stored is a bit unusual: the functions in the PartitionInfo namespace takes advantage of Qt dynamic properties methods to add Calamares-specific properties to the Partition instances: setting the install mount point is done with `PartitionInfo::setMountPoint(partition, "/")`, retrieving it is done with `mountPoint = PartitionInfo::mountPoint(partition)`. The rational behind this unusual design is simplicity: the alternative would have been to keep a separate PartitionInfo object and a map linking each Partition to its PartitionInfo instance. Such a design makes things more complicated. It complicates memory management: if a Partition goes away, its matching PartitionInfo must be removed. It also leads to uglier APIs: code which needs access to extra partition information must be passed both Partition and PartitionInfo instances or know a way to get a PartitionInfo from a Partition. The other alternative would have been to add Calamares-specific information to the real Partition object. This would have worked and would have made for a less surprising API, but it would mean more Calamares-specific patches on KPMcore. # Tests The module comes with unit tests for the partition jobs. Those tests need to run on storage device which does not contain any data you care about. To build them: cd $top_build_dir make buildtests To run them you need to define the `CALAMARES_TEST_DISK` environment variable. It should contain the device path to the test disk. For example, assuming you plugged a test USB stick identified as `/dev/sdb`, you would run the tests like this: sudo CALAMARES_TEST_DISK=/dev/sdb $top_build_dir/partitionjobtests # TODO - Support resizing extended partitions. ResizePartitionJob should already support this but the UI prevents editing of extended partitions for now. - Use os-prober to find out the installed OS. This information could then be used in PartitionModel and in the partition views. - PartitionBarsView - Show used space - Highlight selected partition - Make the partitions clickable - Match appearance with PartResizerWidget appearance - Expose PartitionInfo::format in PartitionModel and add a column for it in the tree view calamares-3.1.12/src/modules/partition/core/000077500000000000000000000000001322271446000207275ustar00rootroot00000000000000calamares-3.1.12/src/modules/partition/core/BootLoaderModel.cpp000066400000000000000000000072601322271446000244530ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/BootLoaderModel.h" #include "core/PartitionInfo.h" #include "core/KPMHelpers.h" // KPMcore #include static QStandardItem* createBootLoaderItem( const QString& description, const QString& path, bool isPartition ) { QStandardItem* item = new QStandardItem( description ); item->setData( path, BootLoaderModel::BootLoaderPathRole ); item->setData( isPartition, BootLoaderModel::IsPartitionRole ); return item; } BootLoaderModel::BootLoaderModel( QObject* parent ) : QStandardItemModel( parent ) { } BootLoaderModel::~BootLoaderModel() { } void BootLoaderModel::init( const QList< Device* >& devices ) { m_devices = devices; clear(); createMbrItems(); } void BootLoaderModel::createMbrItems() { for ( auto device : m_devices ) { QString text = tr( "Master Boot Record of %1" ) .arg( device->name() ); appendRow( createBootLoaderItem( text, device->deviceNode(), false ) ); } } void BootLoaderModel::update() { clear(); createMbrItems(); QString partitionText; Partition* partition = KPMHelpers::findPartitionByMountPoint( m_devices, "/boot" ); if ( partition ) partitionText = tr( "Boot Partition" ); else { partition = KPMHelpers::findPartitionByMountPoint( m_devices, "/" ); if ( partition ) partitionText = tr( "System Partition" ); } Q_ASSERT( rowCount() > 0 ); QStandardItem* last = item( rowCount() - 1 ); Q_ASSERT( last ); bool lastIsPartition = last->data( IsPartitionRole ).toBool(); if ( !partition ) { if ( lastIsPartition ) takeRow( rowCount() - 1 ); } else { QString mountPoint = PartitionInfo::mountPoint( partition ); if ( lastIsPartition ) { last->setText( partitionText ); last->setData( mountPoint, BootLoaderPathRole ); } else { appendRow( createBootLoaderItem( partitionText, PartitionInfo::mountPoint( partition ), true ) ); } // Create "don't install bootloader" item appendRow( createBootLoaderItem( tr( "Do not install a boot loader" ), QString(), false ) ); } } QVariant BootLoaderModel::data( const QModelIndex& index, int role ) const { if ( role == Qt::DisplayRole ) { if ( QStandardItemModel::data( index, BootLoaderModel::BootLoaderPathRole ).toString().isEmpty() ) return QStandardItemModel::data( index, Qt::DisplayRole ).toString(); return tr( "%1 (%2)" ) .arg( QStandardItemModel::data( index, Qt::DisplayRole ).toString() ) .arg( QStandardItemModel::data( index, BootLoaderModel::BootLoaderPathRole ).toString() ); } return QStandardItemModel::data( index, role ); } calamares-3.1.12/src/modules/partition/core/BootLoaderModel.h000066400000000000000000000032421322271446000241140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef BOOTLOADERMODEL_H #define BOOTLOADERMODEL_H #include #include class Device; /** * This model contains one entry for each device MBR plus one entry for the * /boot or / partition */ class BootLoaderModel : public QStandardItemModel { Q_OBJECT public: enum { BootLoaderPathRole = Qt::UserRole + 1, IsPartitionRole }; BootLoaderModel( QObject* parent = nullptr ); ~BootLoaderModel() override; /** * Init the model with the list of devices. Does *not* take ownership of the * devices. */ void init( const QList< Device* >& devices ); void update(); QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; private: QList< Device* > m_devices; void createMbrItems(); }; #endif /* BOOTLOADERMODEL_H */ calamares-3.1.12/src/modules/partition/core/ColorUtils.cpp000066400000000000000000000113361322271446000235360ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/ColorUtils.h" #include "core/KPMHelpers.h" #include "core/PartitionIterator.h" // KPMcore #include // Qt #include #include static const int NUM_PARTITION_COLORS = 5; static const int NUM_NEW_PARTITION_COLORS = 4; //Let's try to use the Breeze palette static const QColor PARTITION_COLORS[ NUM_PARTITION_COLORS ] = { "#2980b9", //Dark Plasma Blue "#27ae60", //Dark Icon Green "#c9ce3b", //Dirty Yellow "#3daee9", //Plasma Blue "#9b59b6", //Purple }; static const QColor NEW_PARTITION_COLORS[ NUM_NEW_PARTITION_COLORS ] = { "#c0392b", //Dark Icon Red "#f39c1f", //Dark Icon Yellow "#f1b7bc", //Light Salmon "#fed999", //Light Orange }; static QColor FREE_SPACE_COLOR = "#777777"; static QColor EXTENDED_COLOR = "#aaaaaa"; static QColor UNKNOWN_DISKLABEL_COLOR = "#4d4151"; static QMap< QString, QColor > s_partitionColorsCache; namespace ColorUtils { QColor freeSpaceColor() { return FREE_SPACE_COLOR; } QColor unknownDisklabelColor() { return UNKNOWN_DISKLABEL_COLOR; } PartitionNode* _findRootForPartition( PartitionNode* partition ) { if ( partition->isRoot() || !partition->parent() ) return partition; return _findRootForPartition( partition->parent() ); } QColor colorForPartition( Partition* partition ) { if ( KPMHelpers::isPartitionFreeSpace( partition ) ) return FREE_SPACE_COLOR; if ( partition->roles().has( PartitionRole::Extended ) ) return EXTENDED_COLOR; if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && s_partitionColorsCache.contains( partition->fileSystem().uuid() ) ) return s_partitionColorsCache[ partition->fileSystem().uuid() ]; // No partition-specific color needed, pick one from our list, but skip // free space: we don't want a partition to change colors if space before // it is inserted or removed PartitionNode* parent = _findRootForPartition( partition ); PartitionTable* table = dynamic_cast< PartitionTable* >( parent ); Q_ASSERT( table ); int colorIdx = 0; int newColorIdx = 0; for ( PartitionIterator it = PartitionIterator::begin( table ); it != PartitionIterator::end( table ); ++it ) { Partition* child = *it; if ( child == partition ) break; if ( !KPMHelpers::isPartitionFreeSpace( child ) && !child->hasChildren() ) { if ( KPMHelpers::isPartitionNew( child ) ) ++newColorIdx; ++colorIdx; } } if ( KPMHelpers::isPartitionNew( partition ) ) return NEW_PARTITION_COLORS[ newColorIdx % NUM_NEW_PARTITION_COLORS ]; if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() ) s_partitionColorsCache.insert( partition->fileSystem().uuid(), PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ] ); return PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ]; } QColor colorForPartitionInFreeSpace( Partition* partition ) { PartitionNode* parent = _findRootForPartition( partition ); PartitionTable* table = dynamic_cast< PartitionTable* >( parent ); Q_ASSERT( table ); int newColorIdx = 0; for ( PartitionIterator it = PartitionIterator::begin( table ); it != PartitionIterator::end( table ); ++it ) { Partition* child = *it; if ( child == partition ) break; if ( !KPMHelpers::isPartitionFreeSpace( child ) && !child->hasChildren() && KPMHelpers::isPartitionNew( child ) ) ++newColorIdx; } return NEW_PARTITION_COLORS[ newColorIdx % NUM_NEW_PARTITION_COLORS ]; } void invalidateCache() { s_partitionColorsCache.clear(); } } // namespace calamares-3.1.12/src/modules/partition/core/ColorUtils.h000066400000000000000000000033101322271446000231740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef COLORUTILS_H #define COLORUTILS_H class QColor; class Partition; /** * Helper functions to define colors for partitions. It ensures no consecutive * partitions have the same color. */ namespace ColorUtils { QColor freeSpaceColor(); QColor unknownDisklabelColor(); /** * @brief colorForPartition iterates over partitions, caches their colors and returns * a color for the given partition. * @param partition the partition for which to return a color. * @return a color for the partition. */ QColor colorForPartition( Partition* partition ); /** * This is similar to colorForPartition() but returns the color of a partition * which would be created in freeSpacePartition */ QColor colorForPartitionInFreeSpace( Partition* freeSpacePartition ); /** * @brief invalidateCache clears the partition colors cache. */ void invalidateCache(); } #endif /* COLORUTILS_H */ calamares-3.1.12/src/modules/partition/core/DeviceList.cpp000066400000000000000000000112351322271446000234700ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "DeviceList.h" #include "PartitionCoreModule.h" #include "core/DeviceModel.h" #include "core/KPMHelpers.h" #include "core/PartitionIterator.h" #include #include #include #include #include #include #include #include #include namespace PartUtils { /** * Does the given @p device contain the root filesystem? This is true if * the device contains a partition which is currently mounted at / . */ static bool hasRootPartition( Device* device ) { for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) if ( ( *it )->mountPoint() == "/" ) return true; return false; } /* Unused */ static bool hasMountedPartitions( Device* device ) { cDebug() << "Checking for mounted partitions in" << device->deviceNode(); for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) { if ( ! ( *it )->isMounted() ) { cDebug() << " .." << ( *it )->partitionPath() << "is mounted on" << ( *it )->mountPoint(); return true; } } return false; } static bool isIso9660( const Device* device ) { QString path = device->deviceNode(); if ( path.isEmpty() ) return false; QProcess blkid; blkid.start( "blkid", { path } ); blkid.waitForFinished(); QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() ); if ( output.contains( "iso9660" ) ) return true; if ( device->partitionTable() && !device->partitionTable()->children().isEmpty() ) { for ( const Partition* partition : device->partitionTable()->children() ) { path = partition->partitionPath(); blkid.start( "blkid", { path } ); blkid.waitForFinished(); QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() ); if ( output.contains( "iso9660" ) ) return true; } } return false; } static inline QDebug& operator <<( QDebug& s, QList< Device* >::iterator& it ) { s << ( ( *it ) ? ( *it )->deviceNode() : QString( "" ) ); return s; } using DeviceList = QList< Device* >; static inline DeviceList::iterator erase(DeviceList& l, DeviceList::iterator& it) { Device* p = *it; auto r = l.erase( it ); if (p) delete p; return r; } QList< Device* > getDevices( DeviceType which, qint64 minimumSize ) { bool writableOnly = (which == DeviceType::WritableOnly); CoreBackend* backend = CoreBackendManager::self()->backend(); DeviceList devices = backend->scanDevices( true ); cDebug() << "Removing unsuitable devices:" << devices.count() << "candidates."; // Remove the device which contains / from the list for ( DeviceList::iterator it = devices.begin(); it != devices.end(); ) if ( ! ( *it ) || ( *it )->deviceNode().startsWith( "/dev/zram" ) ) { cDebug() << " .. Removing zram" << it; it = erase(devices, it ); } else if ( writableOnly && hasRootPartition( *it ) ) { cDebug() << " .. Removing device with root filesystem (/) on it" << it; it = erase(devices, it ); } else if ( writableOnly && isIso9660( *it ) ) { cDebug() << " .. Removing device with iso9660 filesystem (probably a CD) on it" << it; it = erase(devices, it ); } else if ( (minimumSize >= 0) && !( (*it)->capacity() > minimumSize ) ) { cDebug() << " .. Removing too-small" << it; it = erase(devices, it ); } else ++it; return devices; } } // namespace PartUtils calamares-3.1.12/src/modules/partition/core/DeviceList.h000066400000000000000000000032531322271446000231360ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DEVICELIST_H #define DEVICELIST_H #include #include class Device; namespace PartUtils { enum class DeviceType { All, WritableOnly }; /** * @brief Gets a list of storage devices. * @param which Can be used to select from all the devices in * the system, filtering out those that do not meet a criterium. * If set to WritableOnly, only devices which can be overwritten * safely are returned (e.g. RO-media are ignored, as are mounted partitions). * @param minimumSize Can be used to filter devices based on their * size (in bytes). If non-negative, only devices with a size * greater than @p minimumSize will be returned. * @return a list of Devices meeting this criterium. */ QList< Device* > getDevices( DeviceType which = DeviceType::All, qint64 minimumSize = -1 ); } #endif // DEVICELIST_H calamares-3.1.12/src/modules/partition/core/DeviceModel.cpp000066400000000000000000000062271322271446000236220ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/DeviceModel.h" #include "core/PartitionModel.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" // KPMcore #include // KF5 #include #include // STL #include DeviceModel::DeviceModel( QObject* parent ) : QAbstractListModel( parent ) { } DeviceModel::~DeviceModel() { } void DeviceModel::init( const QList< Device* >& devices ) { beginResetModel(); m_devices = devices; std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) { return dev1->deviceNode() < dev2->deviceNode(); } ); endResetModel(); } int DeviceModel::rowCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : m_devices.count(); } QVariant DeviceModel::data( const QModelIndex& index, int role ) const { int row = index.row(); if ( row < 0 || row >= m_devices.count() ) return QVariant(); Device* device = m_devices.at( row ); switch ( role ) { case Qt::DisplayRole: case Qt::ToolTipRole: if ( device->name().isEmpty() ) return device->deviceNode(); else return tr( "%1 - %2 (%3)" ) .arg( device->name() ) .arg( KFormat().formatByteSize( device->capacity() ) ) .arg( device->deviceNode() ); case Qt::DecorationRole: return CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionDisk, CalamaresUtils::Original, QSize( CalamaresUtils::defaultIconSize().width() * 3, CalamaresUtils::defaultIconSize().height() * 3 ) ); default: return QVariant(); } } Device* DeviceModel::deviceForIndex( const QModelIndex& index ) const { int row = index.row(); if ( row < 0 || row >= m_devices.count() ) return nullptr; return m_devices.at( row ); } void DeviceModel::swapDevice( Device* oldDevice, Device* newDevice ) { Q_ASSERT( oldDevice ); Q_ASSERT( newDevice ); int indexOfOldDevice = m_devices.indexOf( oldDevice ); if ( indexOfOldDevice < 0 ) return; m_devices[ indexOfOldDevice ] = newDevice; emit dataChanged( index( indexOfOldDevice ), index( indexOfOldDevice ) ); } calamares-3.1.12/src/modules/partition/core/DeviceModel.h000066400000000000000000000033101322271446000232550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DEVICEMODEL_H #define DEVICEMODEL_H #include #include #include class Device; class PartitionModel; /** * A Qt model which exposes a list of Devices. */ class DeviceModel : public QAbstractListModel { Q_OBJECT public: DeviceModel( QObject* parent = nullptr ); ~DeviceModel() override; /** * Init the model with the list of devices. Does *not* take ownership of the * devices. */ void init( const QList< Device* >& devices ); int rowCount( const QModelIndex& parent = QModelIndex() ) const override; QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; Device* deviceForIndex( const QModelIndex& index ) const; void swapDevice( Device* oldDevice, Device* newDevice ); private: QList< Device* > m_devices; }; #endif /* DEVICEMODEL_H */ calamares-3.1.12/src/modules/partition/core/KPMHelpers.cpp000066400000000000000000000170031322271446000234060ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/KPMHelpers.h" #include "core/PartitionInfo.h" #include "core/PartitionIterator.h" // KPMcore #include #include #include #include #include #include namespace KPMHelpers { static bool s_KPMcoreInited = false; bool initKPMcore() { if ( s_KPMcoreInited ) return true; QByteArray backendName = qgetenv( "KPMCORE_BACKEND" ); if ( !CoreBackendManager::self()->load( backendName.isEmpty() ? CoreBackendManager::defaultBackendName() : backendName ) ) { qWarning() << "Failed to load backend plugin" << backendName; return false; } s_KPMcoreInited = true; return true; } bool isPartitionFreeSpace( Partition* partition ) { return partition->roles().has( PartitionRole::Unallocated ); } bool isPartitionNew( Partition* partition ) { return partition->state() == Partition::StateNew; } Partition* findPartitionByMountPoint( const QList< Device* >& devices, const QString& mountPoint ) { for ( auto device : devices ) for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) if ( PartitionInfo::mountPoint( *it ) == mountPoint ) return *it; return nullptr; } Partition* findPartitionByPath( const QList< Device* >& devices, const QString& path ) { if ( path.simplified().isEmpty() ) return nullptr; for ( auto device : devices ) for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) if ( ( *it )->partitionPath() == path.simplified() ) return *it; return nullptr; } QList< Partition* > findPartitions( const QList< Device* >& devices, std::function< bool ( Partition* ) > criterionFunction ) { QList< Partition* > results; for ( auto device : devices ) for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) if ( criterionFunction( *it ) ) results.append( *it ); return results; } Partition* createNewPartition( PartitionNode* parent, const Device& device, const PartitionRole& role, FileSystem::Type fsType, qint64 firstSector, qint64 lastSector, PartitionTable::Flags flags ) { FileSystem* fs = FileSystemFactory::create( fsType, firstSector, lastSector #ifdef WITH_KPMCORE22 ,device.logicalSize() #endif ); return new Partition( parent, device, role, fs, fs->firstSector(), fs->lastSector(), QString() /* path */, PartitionTable::FlagNone /* availableFlags */, QString() /* mountPoint */, false /* mounted */, flags /* activeFlags */, Partition::StateNew ); } Partition* createNewEncryptedPartition( PartitionNode* parent, const Device& device, const PartitionRole& role, FileSystem::Type fsType, qint64 firstSector, qint64 lastSector, const QString& passphrase, PartitionTable::Flags flags ) { PartitionRole::Roles newRoles = role.roles(); if ( !role.has( PartitionRole::Luks ) ) newRoles |= PartitionRole::Luks; FS::luks* fs = dynamic_cast< FS::luks* >( FileSystemFactory::create( FileSystem::Luks, firstSector, lastSector #ifdef WITH_KPMCORE22 ,device.logicalSize() #endif ) ); if ( !fs ) { qDebug() << "ERROR: cannot create LUKS filesystem. Giving up."; return nullptr; } fs->createInnerFileSystem( fsType ); fs->setPassphrase( passphrase ); Partition* p = new Partition( parent, device, PartitionRole( newRoles ), fs, fs->firstSector(), fs->lastSector(), QString() /* path */, PartitionTable::FlagNone /* availableFlags */, QString() /* mountPoint */, false /* mounted */, flags /* activeFlags */, Partition::StateNew ); return p; } Partition* clonePartition( Device* device, Partition* partition ) { FileSystem* fs = FileSystemFactory::create( partition->fileSystem().type(), partition->firstSector(), partition->lastSector() #ifdef WITH_KPMCORE22 ,device->logicalSize() #endif ); return new Partition( partition->parent(), *device, partition->roles(), fs, fs->firstSector(), fs->lastSector(), partition->partitionPath(), partition->activeFlags() ); } QString prettyNameForFileSystemType( FileSystem::Type t ) { switch ( t ) { case FileSystem::Unknown: return QObject::tr( "unknown" ); case FileSystem::Extended: return QObject::tr( "extended" ); case FileSystem::Unformatted: return QObject::tr( "unformatted" ); case FileSystem::LinuxSwap: return QObject::tr( "swap" ); case FileSystem::Fat16: case FileSystem::Fat32: case FileSystem::Ntfs: case FileSystem::Xfs: case FileSystem::Jfs: case FileSystem::Hfs: case FileSystem::Ufs: case FileSystem::Hpfs: case FileSystem::Luks: case FileSystem::Ocfs2: case FileSystem::Zfs: case FileSystem::Nilfs2: return FileSystem::nameForType( t ).toUpper(); case FileSystem::ReiserFS: return "ReiserFS"; case FileSystem::Reiser4: return "Reiser4"; case FileSystem::HfsPlus: return "HFS+"; case FileSystem::Btrfs: return "Btrfs"; case FileSystem::Exfat: return "exFAT"; case FileSystem::Lvm2_PV: return "LVM PV"; default: return FileSystem::nameForType( t ); } } } // namespace calamares-3.1.12/src/modules/partition/core/KPMHelpers.h000066400000000000000000000076421322271446000230630ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef KPMHELPERS_H #define KPMHELPERS_H // KPMcore #include #include // Qt #include #include class Device; class Partition; class PartitionNode; class PartitionRole; /** * Helper functions to manipulate partitions */ namespace KPMHelpers { /** * Thin wrapper on top of CoreBackendManager. Hides things like initializing the * Config instance or instantiating the backend. * * Initialize PartitionManager Config object and load a PartitionManager * backend. It loads the "libparted" plugin by default, but this can be * overloaded by settings the environment variable KPMCORE_BACKEND. Setting it to * "dummy" will load the dummy plugin instead. * * @return true if initialization was successful. */ bool initKPMcore(); bool isPartitionFreeSpace( Partition* ); /** * Returns true if the partition is planned to be created by the installer as * opposed to already existing on the disk. */ bool isPartitionNew( Partition* ); /** * Iterates on all devices and return the first partition which is associated * with mountPoint. This uses PartitionInfo::mountPoint(), not Partition::mountPoint() */ Partition* findPartitionByMountPoint( const QList< Device* >& devices, const QString& mountPoint ); /** * Iterates on all devices and partitions and returns a pointer to the Partition object * for the given path, or nullptr if a Partition for the given path cannot be found. */ Partition* findPartitionByPath( const QList< Device* >& devices, const QString& path ); /** * Iterates on all devices and partitions and returns a list of pointers to the Partition * objects that satisfy the conditions defined in the criterion function. */ QList< Partition* > findPartitions( const QList< Device* >& devices, std::function< bool ( Partition* ) > criterionFunction ); /** * Helper function to create a new Partition object (does not create anything * on the disk) associated with a FileSystem. */ Partition* createNewPartition( PartitionNode* parent, const Device& device, const PartitionRole& role, FileSystem::Type fsType, qint64 firstSector, qint64 lastSector, PartitionTable::Flags flags = PartitionTable::FlagNone ); Partition* createNewEncryptedPartition( PartitionNode* parent, const Device& device, const PartitionRole& role, FileSystem::Type fsType, qint64 firstSector, qint64 lastSector, const QString& passphrase, PartitionTable::Flags flags = PartitionTable::FlagNone ); Partition* clonePartition( Device* device, Partition* partition ); QString prettyNameForFileSystemType( FileSystem::Type t ); } #endif /* KPMHELPERS_H */ calamares-3.1.12/src/modules/partition/core/OsproberEntry.h000066400000000000000000000024401322271446000237150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef OSPROBERENTRY_H #define OSPROBERENTRY_H #include struct FstabEntry { QString partitionNode; QString mountPoint; QString fsType; QString options; int dump; int pass; }; typedef QList< FstabEntry > FstabEntryList; struct OsproberEntry { QString prettyName; QString path; QString uuid; bool canBeResized; QStringList line; FstabEntryList fstab; QString homePath; }; typedef QList< OsproberEntry > OsproberEntryList; #endif // OSPROBERENTRY_H calamares-3.1.12/src/modules/partition/core/PartUtils.cpp000066400000000000000000000266141322271446000233730ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PartUtils.h" #include "PartitionCoreModule.h" #include "core/DeviceModel.h" #include "core/KPMHelpers.h" #include "core/PartitionIterator.h" #include #include #include #include #include #include #include #include #include namespace PartUtils { bool canBeReplaced( Partition* candidate ) { if ( !candidate ) return false; if ( candidate->isMounted() ) return false; bool ok = false; double requiredStorageGB = Calamares::JobQueue::instance() ->globalStorage() ->value( "requiredStorageGB" ) .toDouble( &ok ); qint64 availableStorageB = candidate->capacity(); qint64 requiredStorageB = ( requiredStorageGB + 0.5 ) * 1024 * 1024 * 1024; cDebug() << "Required storage B:" << requiredStorageB << QString( "(%1GB)" ).arg( requiredStorageB / 1024 / 1024 / 1024 ); cDebug() << "Storage capacity B:" << availableStorageB << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 ) << "for" << candidate->partitionPath() << " length:" << candidate->length(); if ( ok && availableStorageB > requiredStorageB ) { cDebug() << "Partition" << candidate->partitionPath() << "authorized for replace install."; return true; } return false; } bool canBeResized( Partition* candidate ) { if ( !candidate ) return false; if ( !candidate->fileSystem().supportGrow() || !candidate->fileSystem().supportShrink() ) return false; if ( KPMHelpers::isPartitionFreeSpace( candidate ) ) return false; if ( candidate->isMounted() ) return false; if ( candidate->roles().has( PartitionRole::Primary ) ) { PartitionTable* table = dynamic_cast< PartitionTable* >( candidate->parent() ); if ( !table ) return false; if ( table->numPrimaries() >= table->maxPrimaries() ) return false; } bool ok = false; double requiredStorageGB = Calamares::JobQueue::instance() ->globalStorage() ->value( "requiredStorageGB" ) .toDouble( &ok ); double advisedStorageGB = requiredStorageGB + 0.5 + 2.0; qint64 availableStorageB = candidate->available(); // We require a little more for partitioning overhead and swap file // TODO: maybe make this configurable? qint64 advisedStorageB = advisedStorageGB * 1024 * 1024 * 1024; cDebug() << "Required storage B:" << advisedStorageB << QString( "(%1GB)" ).arg( advisedStorageGB ); cDebug() << "Available storage B:" << availableStorageB << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 ) << "for" << candidate->partitionPath() << " length:" << candidate->length() << " sectorsUsed:" << candidate->sectorsUsed() << " fsType:" << candidate->fileSystem().name(); if ( ok && availableStorageB > advisedStorageB ) { cDebug() << "Partition" << candidate->partitionPath() << "authorized for resize + autopartition install."; return true; } return false; } bool canBeResized( PartitionCoreModule* core, const QString& partitionPath ) { //FIXME: check for max partitions count on DOS MBR cDebug() << "checking if" << partitionPath << "can be resized."; QString partitionWithOs = partitionPath; if ( partitionWithOs.startsWith( "/dev/" ) ) { cDebug() << partitionWithOs << "seems like a good path"; bool canResize = false; DeviceModel* dm = core->deviceModel(); for ( int i = 0; i < dm->rowCount(); ++i ) { Device* dev = dm->deviceForIndex( dm->index( i ) ); Partition* candidate = KPMHelpers::findPartitionByPath( { dev }, partitionWithOs ); if ( candidate ) { cDebug() << "found Partition* for" << partitionWithOs; return canBeResized( candidate ); } } } cDebug() << "Partition" << partitionWithOs << "CANNOT BE RESIZED FOR AUTOINSTALL."; return false; } static FstabEntryList lookForFstabEntries( const QString& partitionPath ) { FstabEntryList fstabEntries; QTemporaryDir mountsDir; int exit = QProcess::execute( "mount", { partitionPath, mountsDir.path() } ); if ( !exit ) // if all is well { QFile fstabFile( mountsDir.path() + "/etc/fstab" ); if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { const QStringList fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ) .split( '\n' ); for ( const QString& rawLine : fstabLines ) { QString line = rawLine.simplified(); if ( line.startsWith( '#' ) ) continue; QStringList splitLine = line.split( ' ' ); if ( splitLine.length() != 6 ) continue; fstabEntries.append( { splitLine.at( 0 ), // path, or UUID, or LABEL, etc. splitLine.at( 1 ), // mount point splitLine.at( 2 ), // fs type splitLine.at( 3 ), // options splitLine.at( 4 ).toInt(), //dump splitLine.at( 5 ).toInt() //pass } ); } fstabFile.close(); } QProcess::execute( "umount", { "-R", mountsDir.path() } ); } return fstabEntries; } static QString findPartitionPathForMountPoint( const FstabEntryList& fstab, const QString& mountPoint ) { if ( fstab.isEmpty() ) return QString(); for ( const FstabEntry& entry : fstab ) { if ( entry.mountPoint == mountPoint ) { QProcess readlink; QString partPath; if ( entry.partitionNode.startsWith( "/dev" ) ) // plain dev node { partPath = entry.partitionNode; } else if ( entry.partitionNode.startsWith( "LABEL=" ) ) { partPath = entry.partitionNode.mid( 6 ); partPath.remove( "\"" ); partPath.replace( "\\040", "\\ " ); partPath.prepend( "/dev/disk/by-label/" ); } else if ( entry.partitionNode.startsWith( "UUID=" ) ) { partPath = entry.partitionNode.mid( 5 ); partPath.remove( "\"" ); partPath = partPath.toLower(); partPath.prepend( "/dev/disk/by-uuid/" ); } else if ( entry.partitionNode.startsWith( "PARTLABEL=" ) ) { partPath = entry.partitionNode.mid( 10 ); partPath.remove( "\"" ); partPath.replace( "\\040", "\\ " ); partPath.prepend( "/dev/disk/by-partlabel/" ); } else if ( entry.partitionNode.startsWith( "PARTUUID=" ) ) { partPath = entry.partitionNode.mid( 9 ); partPath.remove( "\"" ); partPath = partPath.toLower(); partPath.prepend( "/dev/disk/by-partuuid/" ); } // At this point we either have /dev/sda1, or /dev/disk/by-something/... if ( partPath.startsWith( "/dev/disk/by-" ) ) // we got a fancy node { readlink.start( "readlink", { "-en", partPath }); if ( !readlink.waitForStarted( 1000 ) ) return QString(); if ( !readlink.waitForFinished( 1000 ) ) return QString(); if ( readlink.exitCode() != 0 || readlink.exitStatus() != QProcess::NormalExit ) return QString(); partPath = QString::fromLocal8Bit( readlink.readAllStandardOutput() ).trimmed(); } return partPath; } } return QString(); } OsproberEntryList runOsprober( PartitionCoreModule* core ) { QString osproberOutput; QProcess osprober; osprober.setProgram( "os-prober" ); osprober.setProcessChannelMode( QProcess::SeparateChannels ); osprober.start(); if ( !osprober.waitForStarted() ) { cDebug() << "ERROR: os-prober cannot start."; } else if ( !osprober.waitForFinished( 60000 ) ) { cDebug() << "ERROR: os-prober timed out."; } else { osproberOutput.append( QString::fromLocal8Bit( osprober.readAllStandardOutput() ).trimmed() ); } QString osProberReport( "Osprober lines, clean:\n" ); QStringList osproberCleanLines; OsproberEntryList osproberEntries; const auto lines = osproberOutput.split( '\n' ); for ( const QString& line : lines ) { if ( !line.simplified().isEmpty() ) { QStringList lineColumns = line.split( ':' ); QString prettyName; if ( !lineColumns.value( 1 ).simplified().isEmpty() ) prettyName = lineColumns.value( 1 ).simplified(); else if ( !lineColumns.value( 2 ).simplified().isEmpty() ) prettyName = lineColumns.value( 2 ).simplified(); QString path = lineColumns.value( 0 ).simplified(); if ( !path.startsWith( "/dev/" ) ) //basic sanity check continue; FstabEntryList fstabEntries = lookForFstabEntries( path ); QString homePath = findPartitionPathForMountPoint( fstabEntries, "/home" ); osproberEntries.append( { prettyName, path, QString(), canBeResized( core, path ), lineColumns, fstabEntries, homePath } ); osproberCleanLines.append( line ); } } osProberReport.append( osproberCleanLines.join( '\n' ) ); cDebug() << osProberReport; Calamares::JobQueue::instance()->globalStorage()->insert( "osproberLines", osproberCleanLines ); return osproberEntries; } bool isEfiSystem() { return QDir( "/sys/firmware/efi/efivars" ).exists(); } } // nmamespace PartUtils calamares-3.1.12/src/modules/partition/core/PartUtils.h000066400000000000000000000044601322271446000230330ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTUTILS_H #define PARTUTILS_H #include "OsproberEntry.h" #include class PartitionCoreModule; class Partition; namespace PartUtils { /** * @brief canBeReplaced checks whether the given Partition satisfies the criteria * for replacing it with the new OS. * @param candidate the candidate partition to replace. * @return true if the criteria are met, otherwise false. */ bool canBeReplaced( Partition* candidate ); /** * @brief canBeReplaced checks whether the given Partition satisfies the criteria * for resizing (shrinking) it to make room for a new OS. * @param candidate the candidate partition to resize. * @return true if the criteria are met, otherwise false. */ bool canBeResized( Partition* candidate ); /** * @brief canBeReplaced checks whether the given Partition satisfies the criteria * for resizing (shrinking) it to make room for a new OS. * @param core the PartitionCoreModule instance. * @param partitionPath the device path of the candidate partition to resize. * @return true if the criteria are met, otherwise false. */ bool canBeResized( PartitionCoreModule* core, const QString& partitionPath ); /** * @brief runOsprober executes os-prober, parses the output and writes relevant * data to GlobalStorage. * @param core the PartitionCoreModule instance. * @return a list of os-prober entries, parsed. */ OsproberEntryList runOsprober( PartitionCoreModule* core ); /** * @brief Is this system EFI-enabled? Decides based on /sys/firmware/efi */ bool isEfiSystem(); } #endif // PARTUTILS_H calamares-3.1.12/src/modules/partition/core/PartitionActions.cpp000066400000000000000000000241261322271446000247320ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PartitionActions.h" #include "core/KPMHelpers.h" #include "core/PartitionInfo.h" #include "core/PartitionCoreModule.h" #include "core/PartUtils.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Units.h" #include "JobQueue.h" #include "utils/Logger.h" #include "GlobalStorage.h" #include #include #include namespace PartitionActions { using CalamaresUtils::GiBtoBytes; using CalamaresUtils::MiBtoBytes; using CalamaresUtils::operator""_GiB; using CalamaresUtils::operator""_MiB; qint64 swapSuggestion( const qint64 availableSpaceB ) { /* If suspend-to-disk is demanded, then we always need enough * swap to write the whole memory to disk -- between 2GB and 8GB * RAM give proportionally more swap, and from 8GB RAM keep * swap = RAM. * * If suspend-to-disk is not demanded, then ramp up more slowly, * to 8GB swap at 16GB memory, and then drop to 4GB for "large * memory" machines, on the assumption that those don't need swap * because they have tons of memory (or whatever they are doing, * had better not run into swap). */ qint64 suggestedSwapSizeB = 0; auto memory = CalamaresUtils::System::instance()->getTotalMemoryB(); qint64 availableRamB = memory.first; qreal overestimationFactor = memory.second; bool ensureSuspendToDisk = Calamares::JobQueue::instance()->globalStorage()-> value( "ensureSuspendToDisk" ).toBool(); if ( ensureSuspendToDisk ) { if ( availableRamB < 4_GiB ) suggestedSwapSizeB = qMax( 2_GiB, availableRamB * 2 ); else if ( availableRamB >= 4_GiB && availableRamB < 8_GiB ) suggestedSwapSizeB = 8_GiB; else suggestedSwapSizeB = availableRamB; suggestedSwapSizeB *= overestimationFactor; } else //if we don't care about suspend to disk { if ( availableRamB < 2_GiB ) suggestedSwapSizeB = qMax( 2_GiB, availableRamB * 2 ); else if ( availableRamB >= 2_GiB && availableRamB < 8_GiB ) suggestedSwapSizeB = availableRamB; else if ( availableRamB >= 8_GiB && availableRamB < 16_GiB ) suggestedSwapSizeB = 8_GiB; else suggestedSwapSizeB = 4_GiB; suggestedSwapSizeB *= overestimationFactor; // don't use more than 10% of available space qreal maxSwapDiskRatio = 1.10; qint64 maxSwapSizeB = availableSpaceB * maxSwapDiskRatio; if ( suggestedSwapSizeB > maxSwapSizeB ) suggestedSwapSizeB = maxSwapSizeB; } cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. /1024. << "GiB"; return suggestedSwapSizeB; } void doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase ) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); bool isEfi = PartUtils::isEfiSystem(); QString defaultFsType = gs->value( "defaultFileSystemType" ).toString(); if ( FileSystem::typeForName( defaultFsType ) == FileSystem::Unknown ) defaultFsType = "ext4"; // Partition sizes are expressed in MiB, should be multiples of // the logical sector size (usually 512B). int uefisys_part_size = 0; int empty_space_size = 0; if ( isEfi ) { uefisys_part_size = 300; empty_space_size = 2; } else { // we start with a 1MiB offset before the first partition empty_space_size = 1; } qint64 firstFreeSector = MiBtoBytes(empty_space_size) / dev->logicalSize() + 1; if ( isEfi ) { qint64 lastSector = firstFreeSector + ( MiBtoBytes(uefisys_part_size) / dev->logicalSize() ); core->createPartitionTable( dev, PartitionTable::gpt ); Partition* efiPartition = KPMHelpers::createNewPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::Fat32, firstFreeSector, lastSector, PartitionTable::FlagEsp ); PartitionInfo::setFormat( efiPartition, true ); PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ) .toString() ); core->createPartition( dev, efiPartition, PartitionTable::FlagEsp | PartitionTable::FlagBoot ); firstFreeSector = lastSector + 1; } else { core->createPartitionTable( dev, PartitionTable::msdos ); } const bool mayCreateSwap = !gs->value( "neverCreateSwap" ).toBool(); bool shouldCreateSwap = false; qint64 suggestedSwapSizeB = 0; if ( mayCreateSwap ) { qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize(); suggestedSwapSizeB = swapSuggestion( availableSpaceB ); qint64 requiredSpaceB = GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) + suggestedSwapSizeB; // If there is enough room for ESP + root + swap, create swap, otherwise don't. shouldCreateSwap = availableSpaceB > requiredSpaceB; } qint64 lastSectorForRoot = dev->totalLogical() - 1; //last sector of the device if ( shouldCreateSwap ) { lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSize() + 1; } Partition* rootPartition = nullptr; if ( luksPassphrase.isEmpty() ) { rootPartition = KPMHelpers::createNewPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::typeForName( defaultFsType ), firstFreeSector, lastSectorForRoot ); } else { rootPartition = KPMHelpers::createNewEncryptedPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::typeForName( defaultFsType ), firstFreeSector, lastSectorForRoot, luksPassphrase ); } PartitionInfo::setFormat( rootPartition, true ); PartitionInfo::setMountPoint( rootPartition, "/" ); core->createPartition( dev, rootPartition ); if ( shouldCreateSwap ) { Partition* swapPartition = nullptr; if ( luksPassphrase.isEmpty() ) { swapPartition = KPMHelpers::createNewPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::LinuxSwap, lastSectorForRoot + 1, dev->totalLogical() - 1 ); } else { swapPartition = KPMHelpers::createNewEncryptedPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::LinuxSwap, lastSectorForRoot + 1, dev->totalLogical() - 1, luksPassphrase ); } PartitionInfo::setFormat( swapPartition, true ); core->createPartition( dev, swapPartition ); } core->dumpQueue(); } void doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, const QString& luksPassphrase ) { cDebug() << "doReplacePartition for device" << partition->partitionPath(); QString defaultFsType = Calamares::JobQueue::instance()-> globalStorage()-> value( "defaultFileSystemType" ).toString(); if ( FileSystem::typeForName( defaultFsType ) == FileSystem::Unknown ) defaultFsType = "ext4"; PartitionRole newRoles( partition->roles() ); if ( partition->roles().has( PartitionRole::Extended ) ) newRoles = PartitionRole( PartitionRole::Primary ); if ( partition->roles().has( PartitionRole::Unallocated ) ) { newRoles = PartitionRole( PartitionRole::Primary ); cDebug() << "WARNING: selected partition is free space"; if ( partition->parent() ) { Partition* parent = dynamic_cast< Partition* >( partition->parent() ); if ( parent && parent->roles().has( PartitionRole::Extended ) ) newRoles = PartitionRole( PartitionRole::Logical ); } } Partition* newPartition = nullptr; if ( luksPassphrase.isEmpty() ) { newPartition = KPMHelpers::createNewPartition( partition->parent(), *dev, newRoles, FileSystem::typeForName( defaultFsType ), partition->firstSector(), partition->lastSector() ); } else { newPartition = KPMHelpers::createNewEncryptedPartition( partition->parent(), *dev, newRoles, FileSystem::typeForName( defaultFsType ), partition->firstSector(), partition->lastSector(), luksPassphrase ); } PartitionInfo::setMountPoint( newPartition, "/" ); PartitionInfo::setFormat( newPartition, true ); if ( !partition->roles().has( PartitionRole::Unallocated ) ) core->deletePartition( dev, partition ); core->createPartition( dev, newPartition ); core->dumpQueue(); } } calamares-3.1.12/src/modules/partition/core/PartitionActions.h000066400000000000000000000040471322271446000243770ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONACTIONS_H #define PARTITIONACTIONS_H #include class PartitionCoreModule; class Device; class Partition; namespace PartitionActions { /** * @brief doAutopartition sets up an autopartitioning operation on the given Device. * @param core a pointer to the PartitionCoreModule instance. * @param dev the device to wipe. * @param luksPassphrase the passphrase for LUKS encryption (optional, default is empty). */ void doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase = QString() ); /** * @brief doReplacePartition sets up replace-partitioning with the given partition. * @param core a pointer to the PartitionCoreModule instance. * @param dev a pointer to the Device on which to replace a partition. * @param partition a pointer to the Partition to be replaced. * @param luksPassphrase the passphrase for LUKS encryption (optional, default is empty). * @note this function also takes care of requesting PCM to delete the partition. */ void doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, const QString& luksPassphrase = QString() ); } #endif // PARTITIONACTIONS_H calamares-3.1.12/src/modules/partition/core/PartitionCoreModule.cpp000066400000000000000000000461011322271446000253650ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/PartitionCoreModule.h" #include "core/BootLoaderModel.h" #include "core/ColorUtils.h" #include "core/DeviceList.h" #include "core/DeviceModel.h" #include "core/PartitionInfo.h" #include "core/PartitionIterator.h" #include "core/PartitionModel.h" #include "core/KPMHelpers.h" #include "core/PartUtils.h" #include "jobs/ClearMountsJob.h" #include "jobs/ClearTempMountsJob.h" #include "jobs/CreatePartitionJob.h" #include "jobs/CreatePartitionTableJob.h" #include "jobs/DeletePartitionJob.h" #include "jobs/FillGlobalStorageJob.h" #include "jobs/FormatPartitionJob.h" #include "jobs/ResizePartitionJob.h" #include "jobs/SetPartitionFlagsJob.h" #include "Typedefs.h" #include "utils/Logger.h" // KPMcore #include #include #include #include #include // Qt #include #include #include #include #include //- DeviceInfo --------------------------------------------- PartitionCoreModule::DeviceInfo::DeviceInfo( Device* _device ) : device( _device ) , partitionModel( new PartitionModel ) , immutableDevice( new Device( *_device ) ) {} PartitionCoreModule::DeviceInfo::~DeviceInfo() { } void PartitionCoreModule::DeviceInfo::forgetChanges() { jobs.clear(); for ( auto it = PartitionIterator::begin( device.data() ); it != PartitionIterator::end( device.data() ); ++it ) PartitionInfo::reset( *it ); partitionModel->revert(); } bool PartitionCoreModule::DeviceInfo::isDirty() const { if ( !jobs.isEmpty() ) return true; for ( auto it = PartitionIterator::begin( device.data() ); it != PartitionIterator::end( device.data() ); ++it ) if ( PartitionInfo::isDirty( *it ) ) return true; return false; } //- PartitionCoreModule ------------------------------------ PartitionCoreModule::PartitionCoreModule( QObject* parent ) : QObject( parent ) , m_deviceModel( new DeviceModel( this ) ) , m_bootLoaderModel( new BootLoaderModel( this ) ) { if ( !KPMHelpers::initKPMcore() ) qFatal( "Failed to initialize KPMcore backend" ); } void PartitionCoreModule::init() { QMutexLocker locker( &m_revertMutex ); doInit(); } void PartitionCoreModule::doInit() { FileSystemFactory::init(); using DeviceList = QList< Device* >; DeviceList devices = PartUtils::getDevices( PartUtils::DeviceType::WritableOnly ); cDebug() << "LIST OF DETECTED DEVICES:"; cDebug() << "node\tcapacity\tname\tprettyName"; for ( auto device : devices ) { // Gives ownership of the Device* to the DeviceInfo object auto deviceInfo = new DeviceInfo( device ); m_deviceInfos << deviceInfo; cDebug() << device->deviceNode() << device->capacity() << device->name() << device->prettyName(); } cDebug() << ".." << devices.count() << "devices detected."; m_deviceModel->init( devices ); // The following PartUtils::runOsprober call in turn calls PartUtils::canBeResized, // which relies on a working DeviceModel. m_osproberLines = PartUtils::runOsprober( this ); // We perform a best effort of filling out filesystem UUIDs in m_osproberLines // because we will need them later on in PartitionModel if partition paths // change. // It is a known fact that /dev/sda1-style device paths aren't persistent // across reboots (and this doesn't affect us), but partition numbers can also // change at runtime against our will just for shits and giggles. // But why would that ever happen? What system could possibly be so poorly // designed that it requires a partition path rearrangement at runtime? // Logical partitions on an MSDOS disklabel of course. // See DeletePartitionJob::updatePreview. for ( auto deviceInfo : m_deviceInfos ) { for ( auto it = PartitionIterator::begin( deviceInfo->device.data() ); it != PartitionIterator::end( deviceInfo->device.data() ); ++it ) { Partition* partition = *it; for ( auto jt = m_osproberLines.begin(); jt != m_osproberLines.end(); ++jt ) { if ( jt->path == partition->partitionPath() && partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() ) jt->uuid = partition->fileSystem().uuid(); } } } for ( auto deviceInfo : m_deviceInfos ) deviceInfo->partitionModel->init( deviceInfo->device.data(), m_osproberLines ); m_bootLoaderModel->init( devices ); //FIXME: this should be removed in favor of // proper KPM support for EFI if ( PartUtils::isEfiSystem() ) scanForEfiSystemPartitions(); } PartitionCoreModule::~PartitionCoreModule() { qDeleteAll( m_deviceInfos ); } DeviceModel* PartitionCoreModule::deviceModel() const { return m_deviceModel; } QAbstractItemModel* PartitionCoreModule::bootLoaderModel() const { return m_bootLoaderModel; } PartitionModel* PartitionCoreModule::partitionModelForDevice( const Device* device ) const { DeviceInfo* info = infoForDevice( device ); Q_ASSERT( info ); return info->partitionModel.data(); } Device* PartitionCoreModule::immutableDeviceCopy( const Device* device ) { Q_ASSERT( device ); DeviceInfo* info = infoForDevice( device ); if ( !info ) return nullptr; return info->immutableDevice.data(); } void PartitionCoreModule::createPartitionTable( Device* device, PartitionTable::TableType type ) { DeviceInfo* info = infoForDevice( device ); if ( info ) { // Creating a partition table wipes all the disk, so there is no need to // keep previous changes info->forgetChanges(); PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); CreatePartitionTableJob* job = new CreatePartitionTableJob( device, type ); job->updatePreview(); info->jobs << Calamares::job_ptr( job ); } refresh(); } void PartitionCoreModule::createPartition( Device* device, Partition* partition, PartitionTable::Flags flags ) { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); CreatePartitionJob* job = new CreatePartitionJob( device, partition ); job->updatePreview(); deviceInfo->jobs << Calamares::job_ptr( job ); if ( flags != PartitionTable::FlagNone ) { SetPartFlagsJob* fJob = new SetPartFlagsJob( device, partition, flags ); deviceInfo->jobs << Calamares::job_ptr( fJob ); } refresh(); } void PartitionCoreModule::deletePartition( Device* device, Partition* partition ) { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); if ( partition->roles().has( PartitionRole::Extended ) ) { // Delete all logical partitions first // I am not sure if we can iterate on Partition::children() while // deleting them, so let's play it safe and keep our own list. QList< Partition* > lst; for ( auto childPartition : partition->children() ) if ( !KPMHelpers::isPartitionFreeSpace( childPartition ) ) lst << childPartition; for ( auto childPartition : lst ) deletePartition( device, childPartition ); } QList< Calamares::job_ptr >& jobs = deviceInfo->jobs; if ( partition->state() == Partition::StateNew ) { // First remove matching SetPartFlagsJobs for ( auto it = jobs.begin(); it != jobs.end(); ) { SetPartFlagsJob* job = qobject_cast< SetPartFlagsJob* >( it->data() ); if ( job && job->partition() == partition ) it = jobs.erase( it ); else ++it; } // Find matching CreatePartitionJob auto it = std::find_if( jobs.begin(), jobs.end(), [ partition ]( Calamares::job_ptr job ) { CreatePartitionJob* createJob = qobject_cast< CreatePartitionJob* >( job.data() ); return createJob && createJob->partition() == partition; } ); if ( it == jobs.end() ) { cDebug() << "Failed to find a CreatePartitionJob matching the partition to remove"; return; } // Remove it if ( ! partition->parent()->remove( partition ) ) { cDebug() << "Failed to remove partition from preview"; return; } device->partitionTable()->updateUnallocated( *device ); jobs.erase( it ); // The partition is no longer referenced by either a job or the device // partition list, so we have to delete it delete partition; } else { // Remove any PartitionJob on this partition for ( auto it = jobs.begin(); it != jobs.end(); ) { PartitionJob* job = qobject_cast< PartitionJob* >( it->data() ); if ( job && job->partition() == partition ) it = jobs.erase( it ); else ++it; } DeletePartitionJob* job = new DeletePartitionJob( device, partition ); job->updatePreview(); jobs << Calamares::job_ptr( job ); } refresh(); } void PartitionCoreModule::formatPartition( Device* device, Partition* partition ) { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); FormatPartitionJob* job = new FormatPartitionJob( device, partition ); deviceInfo->jobs << Calamares::job_ptr( job ); refresh(); } void PartitionCoreModule::resizePartition( Device* device, Partition* partition, qint64 first, qint64 last ) { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); ResizePartitionJob* job = new ResizePartitionJob( device, partition, first, last ); job->updatePreview(); deviceInfo->jobs << Calamares::job_ptr( job ); refresh(); } void PartitionCoreModule::setPartitionFlags( Device* device, Partition* partition, PartitionTable::Flags flags ) { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); PartitionModel::ResetHelper( partitionModelForDevice( device ) ); SetPartFlagsJob* job = new SetPartFlagsJob( device, partition, flags ); deviceInfo->jobs << Calamares::job_ptr( job ); refresh(); } QList< Calamares::job_ptr > PartitionCoreModule::jobs() const { QList< Calamares::job_ptr > lst; QList< Device* > devices; lst << Calamares::job_ptr( new ClearTempMountsJob() ); for ( auto info : m_deviceInfos ) { if ( info->isDirty() ) lst << Calamares::job_ptr( new ClearMountsJob( info->device.data() ) ); } for ( auto info : m_deviceInfos ) { lst << info->jobs; devices << info->device.data(); } cDebug() << "Creating FillGlobalStorageJob with bootLoader path" << m_bootLoaderInstallPath; lst << Calamares::job_ptr( new FillGlobalStorageJob( devices, m_bootLoaderInstallPath ) ); QStringList jobsDebug; foreach ( auto job, lst ) jobsDebug.append( job->prettyName() ); cDebug() << "PartitionCodeModule has been asked for jobs. About to return:" << jobsDebug.join( "\n" ); return lst; } bool PartitionCoreModule::hasRootMountPoint() const { return m_hasRootMountPoint; } QList< Partition* > PartitionCoreModule::efiSystemPartitions() const { return m_efiSystemPartitions; } void PartitionCoreModule::dumpQueue() const { cDebug() << "# Queue:"; for ( auto info : m_deviceInfos ) { cDebug() << "## Device:" << info->device->name(); for ( auto job : info->jobs ) cDebug() << "-" << job->prettyName(); } } const OsproberEntryList PartitionCoreModule::osproberEntries() const { return m_osproberLines; } void PartitionCoreModule::refreshPartition( Device* device, Partition* ) { // Keep it simple for now: reset the model. This can be improved to cause // the model to emit dataChanged() for the affected row instead, avoiding // the loss of the current selection. auto model = partitionModelForDevice( device ); Q_ASSERT( model ); PartitionModel::ResetHelper helper( model ); refresh(); } void PartitionCoreModule::refresh() { updateHasRootMountPoint(); updateIsDirty(); m_bootLoaderModel->update(); //FIXME: this should be removed in favor of // proper KPM support for EFI if ( PartUtils::isEfiSystem() ) scanForEfiSystemPartitions(); } void PartitionCoreModule::updateHasRootMountPoint() { bool oldValue = m_hasRootMountPoint; m_hasRootMountPoint = findPartitionByMountPoint( "/" ); if ( oldValue != m_hasRootMountPoint ) hasRootMountPointChanged( m_hasRootMountPoint ); } void PartitionCoreModule::updateIsDirty() { bool oldValue = m_isDirty; m_isDirty = false; for ( auto info : m_deviceInfos ) if ( info->isDirty() ) { m_isDirty = true; break; } if ( oldValue != m_isDirty ) isDirtyChanged( m_isDirty ); } void PartitionCoreModule::scanForEfiSystemPartitions() { m_efiSystemPartitions.clear(); QList< Device* > devices; for ( int row = 0; row < deviceModel()->rowCount(); ++row ) { Device* device = deviceModel()->deviceForIndex( deviceModel()->index( row ) ); devices.append( device ); } QList< Partition* > efiSystemPartitions = KPMHelpers::findPartitions( devices, []( Partition* partition ) -> bool { if ( partition->activeFlags().testFlag( PartitionTable::FlagEsp ) ) { cDebug() << "Found EFI system partition at" << partition->partitionPath(); return true; } return false; } ); if ( efiSystemPartitions.isEmpty() ) cDebug() << "WARNING: system is EFI but no EFI system partitions found."; m_efiSystemPartitions = efiSystemPartitions; } PartitionCoreModule::DeviceInfo* PartitionCoreModule::infoForDevice( const Device* device ) const { for ( auto it = m_deviceInfos.constBegin(); it != m_deviceInfos.constEnd(); ++it ) { if ( ( *it )->device.data() == device ) return *it; if ( ( *it )->immutableDevice.data() == device ) return *it; } return nullptr; } Partition* PartitionCoreModule::findPartitionByMountPoint( const QString& mountPoint ) const { for ( auto deviceInfo : m_deviceInfos ) { Device* device = deviceInfo->device.data(); for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) if ( PartitionInfo::mountPoint( *it ) == mountPoint ) return *it; } return nullptr; } void PartitionCoreModule::setBootLoaderInstallPath( const QString& path ) { cDebug() << "PCM::setBootLoaderInstallPath" << path; m_bootLoaderInstallPath = path; } void PartitionCoreModule::revert() { QMutexLocker locker( &m_revertMutex ); qDeleteAll( m_deviceInfos ); m_deviceInfos.clear(); doInit(); updateIsDirty(); emit reverted(); } void PartitionCoreModule::revertAllDevices() { foreach ( DeviceInfo* devInfo, m_deviceInfos ) revertDevice( devInfo->device.data() ); refresh(); } void PartitionCoreModule::revertDevice( Device* dev ) { QMutexLocker locker( &m_revertMutex ); DeviceInfo* devInfo = infoForDevice( dev ); if ( !devInfo ) return; devInfo->forgetChanges(); CoreBackend* backend = CoreBackendManager::self()->backend(); Device* newDev = backend->scanDevice( devInfo->device->deviceNode() ); devInfo->device.reset( newDev ); devInfo->partitionModel->init( newDev, m_osproberLines ); m_deviceModel->swapDevice( dev, newDev ); QList< Device* > devices; foreach ( auto info, m_deviceInfos ) devices.append( info->device.data() ); m_bootLoaderModel->init( devices ); refresh(); emit deviceReverted( newDev ); } void PartitionCoreModule::asyncRevertDevice( Device* dev, std::function< void() > callback ) { QFutureWatcher< void >* watcher = new QFutureWatcher< void >(); connect( watcher, &QFutureWatcher< void >::finished, this, [ watcher, callback ] { callback(); watcher->deleteLater(); } ); QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev ); watcher->setFuture( future ); } void PartitionCoreModule::clearJobs() { foreach ( DeviceInfo* deviceInfo, m_deviceInfos ) deviceInfo->forgetChanges(); updateIsDirty(); } bool PartitionCoreModule::isDirty() { return m_isDirty; } QList< PartitionCoreModule::SummaryInfo > PartitionCoreModule::createSummaryInfo() const { QList< SummaryInfo > lst; for ( auto deviceInfo : m_deviceInfos ) { if ( !deviceInfo->isDirty() ) continue; SummaryInfo summaryInfo; summaryInfo.deviceName = deviceInfo->device->name(); summaryInfo.deviceNode = deviceInfo->device->deviceNode(); Device* deviceBefore = deviceInfo->immutableDevice.data(); summaryInfo.partitionModelBefore = new PartitionModel; summaryInfo.partitionModelBefore->init( deviceBefore, m_osproberLines ); // Make deviceBefore a child of partitionModelBefore so that it is not // leaked (as long as partitionModelBefore is deleted) deviceBefore->setParent( summaryInfo.partitionModelBefore ); summaryInfo.partitionModelAfter = new PartitionModel; summaryInfo.partitionModelAfter->init( deviceInfo->device.data(), m_osproberLines ); lst << summaryInfo; } return lst; } calamares-3.1.12/src/modules/partition/core/PartitionCoreModule.h000066400000000000000000000157721322271446000250440ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONCOREMODULE_H #define PARTITIONCOREMODULE_H #include "core/PartitionModel.h" #include "Typedefs.h" // KPMcore #include // Qt #include #include #include #include class BootLoaderModel; class CreatePartitionJob; class Device; class DeviceModel; class FileSystem; class Partition; class QStandardItemModel; /** * The core of the module. * * It has two responsibilities: * - Listing the devices and partitions, creating Qt models for them. * - Creating jobs for any changes requested by the user interface. */ class PartitionCoreModule : public QObject { Q_OBJECT public: /** * @brief The SummaryInfo struct is a wrapper for PartitionModel instances for * a given Device. * Each Device gets a mutable "after" model and an immutable "before" model. */ struct SummaryInfo { QString deviceName; QString deviceNode; PartitionModel* partitionModelBefore; PartitionModel* partitionModelAfter; }; PartitionCoreModule( QObject* parent = nullptr ); ~PartitionCoreModule(); /** * @brief init performs a devices scan and initializes all KPMcore data * structures. * This function is thread safe. */ void init(); /** * @brief deviceModel returns a model which exposes a list of available * storage devices. * @return the device model. */ DeviceModel* deviceModel() const; /** * @brief partitionModelForDevice returns the PartitionModel for the given device. * @param device the device for which to get a model. * @return a PartitionModel which represents the partitions of a device. */ PartitionModel* partitionModelForDevice( const Device* device ) const; //HACK: all devices change over time, and together make up the state of the CoreModule. // However this makes it hard to show the *original* state of a device. // For each DeviceInfo we keep a second Device object that contains the // current state of a disk regardless of subsequent changes. // -- Teo 4/2015 //FIXME: make this horrible method private. -- Teo 12/2015 Device* immutableDeviceCopy( const Device* device ); /** * @brief bootLoaderModel returns a model which represents the available boot * loader locations. * The single BootLoaderModel instance belongs to the PCM. * @return the BootLoaderModel. */ QAbstractItemModel* bootLoaderModel() const; void createPartitionTable( Device* device, PartitionTable::TableType type ); void createPartition( Device* device, Partition* partition, PartitionTable::Flags flags = PartitionTable::FlagNone ); void deletePartition( Device* device, Partition* partition ); void formatPartition( Device* device, Partition* partition ); void resizePartition( Device* device, Partition* partition, qint64 first, qint64 last ); void setPartitionFlags( Device* device, Partition* partition, PartitionTable::Flags flags ); void setBootLoaderInstallPath( const QString& path ); /** * @brief jobs creates and returns a list of jobs which can then apply the changes * requested by the user. * @return a list of jobs. */ QList< Calamares::job_ptr > jobs() const; bool hasRootMountPoint() const; QList< Partition* > efiSystemPartitions() const; /** * @brief findPartitionByMountPoint returns a Partition* for a given mount point. * @param mountPoint the mount point to find a partition for. * @return a pointer to a Partition object. * Note that this function looks for partitions in live devices (the "proposed" * state), not the immutable copies. Comparisons with Partition* objects that * refer to immutable Device*s will fail. */ Partition* findPartitionByMountPoint( const QString& mountPoint ) const; void revert(); // full revert, thread safe, calls doInit void revertAllDevices(); // convenience function, calls revertDevice void revertDevice( Device* dev ); // rescans a single Device and updates DeviceInfo void asyncRevertDevice( Device* dev, std::function< void() > callback ); //like revertDevice, but asynchronous void clearJobs(); // only clear jobs, the Device* states are preserved bool isDirty(); // true if there are pending changes, otherwise false /** * To be called when a partition has been altered, but only for changes * which do not affect its size, because changes which affect the partition size * affect the size of other partitions as well. */ void refreshPartition( Device* device, Partition* partition ); /** * Returns a list of SummaryInfo for devices which have pending changes. * Caller is responsible for deleting the partition models */ QList< SummaryInfo > createSummaryInfo() const; void dumpQueue() const; // debug output const OsproberEntryList osproberEntries() const; // os-prober data structure, cached Q_SIGNALS: void hasRootMountPointChanged( bool value ); void isDirtyChanged( bool value ); void reverted(); void deviceReverted( Device* device ); private: void refresh(); /** * Owns the Device, PartitionModel and the jobs */ struct DeviceInfo { DeviceInfo( Device* ); ~DeviceInfo(); QScopedPointer< Device > device; QScopedPointer< PartitionModel > partitionModel; const QScopedPointer< Device > immutableDevice; QList< Calamares::job_ptr > jobs; void forgetChanges(); bool isDirty() const; }; QList< DeviceInfo* > m_deviceInfos; QList< Partition* > m_efiSystemPartitions; DeviceModel* m_deviceModel; BootLoaderModel* m_bootLoaderModel; bool m_hasRootMountPoint = false; bool m_isDirty = false; QString m_bootLoaderInstallPath; void doInit(); void updateHasRootMountPoint(); void updateIsDirty(); void scanForEfiSystemPartitions(); DeviceInfo* infoForDevice( const Device* ) const; OsproberEntryList m_osproberLines; QMutex m_revertMutex; }; #endif /* PARTITIONCOREMODULE_H */ calamares-3.1.12/src/modules/partition/core/PartitionInfo.cpp000066400000000000000000000034261322271446000242250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/PartitionInfo.h" // KPMcore #include // Qt #include namespace PartitionInfo { static const char* MOUNT_POINT_PROPERTY = "_calamares_mountPoint"; static const char* FORMAT_PROPERTY = "_calamares_format"; QString mountPoint( Partition* partition ) { return partition->property( MOUNT_POINT_PROPERTY ).toString(); } void setMountPoint( Partition* partition, const QString& value ) { partition->setProperty( MOUNT_POINT_PROPERTY, value ); } bool format( Partition* partition ) { return partition->property( FORMAT_PROPERTY ).toBool(); } void setFormat( Partition* partition, bool value ) { partition->setProperty( FORMAT_PROPERTY, value ); } void reset( Partition* partition ) { partition->setProperty( MOUNT_POINT_PROPERTY, QVariant() ); partition->setProperty( FORMAT_PROPERTY, QVariant() ); } bool isDirty( Partition* partition ) { return !mountPoint( partition ).isEmpty() || format( partition ); } } // namespace calamares-3.1.12/src/modules/partition/core/PartitionInfo.h000066400000000000000000000035661322271446000236770ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONINFO_H #define PARTITIONINFO_H #include #include class Partition; /** * Functions to store Calamares-specific information in the Qt properties of a * Partition object. * * See README.md for the rational behind this design. * * Properties: * - mountPoint: which directory will a partition be mounted on the installed * system. This is different from Partition::mountPoint, which is the * directory on which a partition is *currently* mounted while the installer * is running. * - format: whether this partition should be formatted at install time. */ namespace PartitionInfo { QString mountPoint( Partition* partition ); void setMountPoint( Partition* partition, const QString& value ); bool format( Partition* partition ); void setFormat( Partition* partition, bool value ); void reset( Partition* partition ); /** * Returns true if one of the property has been set. This information is used * by the UI to decide whether the "Revert" button should be enabled or * disabled. */ bool isDirty( Partition* partition ); }; #endif /* PARTITIONINFO_H */ calamares-3.1.12/src/modules/partition/core/PartitionIterator.cpp000066400000000000000000000066341322271446000251270ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include // KPMcore #include #include #include PartitionIterator::PartitionIterator( PartitionTable* table ) : m_table( table ) {} Partition* PartitionIterator::operator*() const { return m_current; } void PartitionIterator::operator++() { if ( !m_current ) return; if ( m_current->hasChildren() ) { // Go to the first child m_current = static_cast< Partition* >( m_current->children().first() ); return; } PartitionNode* parent = m_current->parent(); Partition* successor = parent->successor( *m_current ); if ( successor ) { // Go to the next sibling m_current = successor; return; } if ( parent->isRoot() ) { // We reached the end m_current = nullptr; return; } // Try to go to the next sibling of our parent PartitionNode* grandParent = parent->parent(); Q_ASSERT( grandParent ); // If parent is not root, then it's not a PartitionTable but a // Partition, we can static_cast it. m_current = grandParent->successor( *static_cast< Partition* >( parent ) ); } bool PartitionIterator::operator==( const PartitionIterator& other ) const { return m_table == other.m_table && m_current == other.m_current; } bool PartitionIterator::operator!=( const PartitionIterator& other ) const { return ! ( *this == other ); } PartitionIterator PartitionIterator::begin( Device* device ) { if ( !device ) return PartitionIterator( nullptr ); Q_ASSERT(device); PartitionTable* table = device->partitionTable(); if ( !table ) return PartitionIterator( nullptr ); return PartitionIterator::begin( table ); } PartitionIterator PartitionIterator::begin( PartitionTable* table ) { auto it = PartitionIterator( table ); QList< Partition* > children = table->children(); // Does not usually happen, but it did happen on a 10MB disk with an MBR // partition table. if ( children.isEmpty() ) return it; it.m_current = children.first(); return it; } PartitionIterator PartitionIterator::end( Device* device ) { if ( !device ) return PartitionIterator( nullptr ); PartitionTable* table = device->partitionTable(); if ( !table ) return PartitionIterator( nullptr ); return PartitionIterator::end( table ); } PartitionIterator PartitionIterator::end( PartitionTable* table ) { return PartitionIterator( table ); } calamares-3.1.12/src/modules/partition/core/PartitionIterator.h000066400000000000000000000032471322271446000245710ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONITERATOR_H #define PARTITIONITERATOR_H class Device; class Partition; class PartitionTable; /** * A forward-only iterator to go through the partitions of a device, * independently of whether they are primary, logical or extended. */ class PartitionIterator { public: Partition* operator*() const; void operator++(); bool operator==( const PartitionIterator& other ) const; bool operator!=( const PartitionIterator& other ) const; static PartitionIterator begin( Device* device ); static PartitionIterator begin( PartitionTable* table ); static PartitionIterator end( Device* device ); static PartitionIterator end( PartitionTable* table ); private: PartitionIterator( PartitionTable* table ); PartitionTable* m_table; Partition* m_current = nullptr; }; #endif /* PARTITIONITERATOR_H */ calamares-3.1.12/src/modules/partition/core/PartitionModel.cpp000066400000000000000000000223661322271446000243760ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "core/PartitionModel.h" #include "core/ColorUtils.h" #include "core/PartitionInfo.h" #include "core/KPMHelpers.h" #include "utils/Logger.h" // CalaPM #include #include #include #include // KF5 #include // Qt #include //- ResetHelper -------------------------------------------- PartitionModel::ResetHelper::ResetHelper( PartitionModel* model ) : m_model( model ) { m_model->beginResetModel(); } PartitionModel::ResetHelper::~ResetHelper() { m_model->endResetModel(); } //- PartitionModel ----------------------------------------- PartitionModel::PartitionModel( QObject* parent ) : QAbstractItemModel( parent ) , m_device( nullptr ) { } void PartitionModel::init( Device* device , const OsproberEntryList& osproberEntries ) { beginResetModel(); m_device = device; m_osproberEntries = osproberEntries; endResetModel(); } int PartitionModel::columnCount( const QModelIndex& parent ) const { return ColumnCount; } int PartitionModel::rowCount( const QModelIndex& parent ) const { Partition* parentPartition = partitionForIndex( parent ); if ( parentPartition ) return parentPartition->children().count(); PartitionTable* table = m_device->partitionTable(); return table ? table->children().count() : 0; } QModelIndex PartitionModel::index( int row, int column, const QModelIndex& parent ) const { PartitionNode* parentPartition = parent.isValid() ? static_cast< PartitionNode* >( partitionForIndex( parent ) ) : static_cast< PartitionNode* >( m_device->partitionTable() ); if ( !parentPartition ) return QModelIndex(); auto lst = parentPartition->children(); if ( row < 0 || row >= lst.count() ) return QModelIndex(); if ( column < 0 || column >= ColumnCount ) return QModelIndex(); Partition* partition = parentPartition->children().at( row ); return createIndex( row, column, partition ); } QModelIndex PartitionModel::parent( const QModelIndex& child ) const { if ( !child.isValid() ) return QModelIndex(); Partition* partition = partitionForIndex( child ); if ( !partition ) return QModelIndex(); PartitionNode* parentNode = partition->parent(); if ( parentNode == m_device->partitionTable() ) return QModelIndex(); int row = 0; for ( auto p : m_device->partitionTable()->children() ) { if ( parentNode == p ) return createIndex( row, 0, parentNode ); ++row; } cLog() << "No parent found!"; return QModelIndex(); } QVariant PartitionModel::data( const QModelIndex& index, int role ) const { Partition* partition = partitionForIndex( index ); if ( !partition ) return QVariant(); switch ( role ) { case Qt::DisplayRole: { int col = index.column(); if ( col == NameColumn ) { if ( KPMHelpers::isPartitionFreeSpace( partition ) ) return tr( "Free Space" ); else { return KPMHelpers::isPartitionNew( partition ) ? tr( "New partition" ) : partition->partitionPath(); } } if ( col == FileSystemColumn ) return KPMHelpers::prettyNameForFileSystemType( partition->fileSystem().type() ); if ( col == MountPointColumn ) return PartitionInfo::mountPoint( partition ); if ( col == SizeColumn ) { qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize(); return KFormat().formatByteSize( size ); } cDebug() << "Unknown column" << col; return QVariant(); } case Qt::DecorationRole: if ( index.column() == NameColumn ) return ColorUtils::colorForPartition( partition ); else return QVariant(); case Qt::ToolTipRole: { int col = index.column(); QString name; if ( col == NameColumn ) { if ( KPMHelpers::isPartitionFreeSpace( partition ) ) name = tr( "Free Space" ); else { name = KPMHelpers::isPartitionNew( partition ) ? tr( "New partition" ) : partition->partitionPath(); } } QString prettyFileSystem = KPMHelpers::prettyNameForFileSystemType( partition->fileSystem().type() ); qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize(); QString prettySize = KFormat().formatByteSize( size ); return QVariant(name + " " + prettyFileSystem + " " + prettySize); } case SizeRole: return ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize(); case IsFreeSpaceRole: return KPMHelpers::isPartitionFreeSpace( partition ); case IsPartitionNewRole: return KPMHelpers::isPartitionNew( partition ); case FileSystemLabelRole: if ( partition->fileSystem().supportGetLabel() != FileSystem::cmdSupportNone && !partition->fileSystem().label().isEmpty() ) return partition->fileSystem().label(); return QVariant(); case FileSystemTypeRole: return partition->fileSystem().type(); case PartitionPathRole: return partition->partitionPath(); case PartitionPtrRole: return qVariantFromValue( (void*)partition ); // Osprober roles: case OsproberNameRole: foreach ( const OsproberEntry& osproberEntry, m_osproberEntries ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && osproberEntry.uuid == partition->fileSystem().uuid() ) return osproberEntry.prettyName; return QVariant(); case OsproberPathRole: foreach ( const OsproberEntry& osproberEntry, m_osproberEntries ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && osproberEntry.uuid == partition->fileSystem().uuid() ) return osproberEntry.path; return QVariant(); case OsproberCanBeResizedRole: foreach ( const OsproberEntry& osproberEntry, m_osproberEntries ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && osproberEntry.uuid == partition->fileSystem().uuid() ) return osproberEntry.canBeResized; return QVariant(); case OsproberRawLineRole: foreach ( const OsproberEntry& osproberEntry, m_osproberEntries ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && osproberEntry.uuid == partition->fileSystem().uuid() ) return osproberEntry.line; return QVariant(); case OsproberHomePartitionPathRole: foreach ( const OsproberEntry& osproberEntry, m_osproberEntries ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() && osproberEntry.uuid == partition->fileSystem().uuid() ) return osproberEntry.homePath; return QVariant(); // end Osprober roles. default: return QVariant(); } } QVariant PartitionModel::headerData( int section, Qt::Orientation orientation, int role ) const { if ( role != Qt::DisplayRole ) return QVariant(); switch ( section ) { case NameColumn: return tr( "Name" ); case FileSystemColumn: return tr( "File System" ); case MountPointColumn: return tr( "Mount Point" ); case SizeColumn: return tr( "Size" ); default: cDebug() << "Unknown column" << section; return QVariant(); } } Partition* PartitionModel::partitionForIndex( const QModelIndex& index ) const { if ( !index.isValid() ) return nullptr; return reinterpret_cast< Partition* >( index.internalPointer() ); } void PartitionModel::update() { emit dataChanged( index( 0, 0 ), index( rowCount() - 1, columnCount() - 1 ) ); } calamares-3.1.12/src/modules/partition/core/PartitionModel.h000066400000000000000000000074551322271446000240450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONMODEL_H #define PARTITIONMODEL_H #include "OsproberEntry.h" // Qt #include class Device; class Partition; class PartitionNode; /** * A Qt tree model which exposes the partitions of a device. * * Its depth is only more than 1 if the device has extended partitions. * * Note on updating: * * The Device class does not notify the outside world of changes on the * Partition objects it owns. Since a Qt model must notify its views *before* * and *after* making changes, it is important to make use of * the PartitionModel::ResetHelper class to wrap changes. * * This is what PartitionCoreModule does when it create jobs. */ class PartitionModel : public QAbstractItemModel { Q_OBJECT public: /** * This helper class must be instantiated on the stack *before* making * changes to the device represented by this model. It will cause the model * to emit modelAboutToBeReset() when instantiated and modelReset() when * destructed. */ class ResetHelper { public: ResetHelper( PartitionModel* model ); ~ResetHelper(); ResetHelper( const ResetHelper& ) = delete; ResetHelper& operator=( const ResetHelper& ) = delete; private: PartitionModel* m_model; }; enum { // The raw size, as a qlonglong. This is different from the DisplayRole of // SizeColumn, which is a human-readable string. SizeRole = Qt::UserRole + 1, IsFreeSpaceRole, IsPartitionNewRole, FileSystemLabelRole, FileSystemTypeRole, PartitionPathRole, PartitionPtrRole, // passed as void*, use sparingly OsproberNameRole, OsproberPathRole, OsproberCanBeResizedRole, OsproberRawLineRole, OsproberHomePartitionPathRole }; enum Column { NameColumn, FileSystemColumn, MountPointColumn, SizeColumn, ColumnCount // Must remain last }; PartitionModel( QObject* parent = nullptr ); /** * device must remain alive for the life of PartitionModel */ void init( Device* device, const OsproberEntryList& osproberEntries ); // QAbstractItemModel API QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const override; QModelIndex parent( const QModelIndex& child ) const override; int columnCount( const QModelIndex& parent = QModelIndex() ) const override; int rowCount( const QModelIndex& parent = QModelIndex() ) const override; QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override; Partition* partitionForIndex( const QModelIndex& index ) const; Device* device() const { return m_device; } void update(); private: Device* m_device; OsproberEntryList m_osproberEntries; }; #endif /* PARTITIONMODEL_H */ calamares-3.1.12/src/modules/partition/gui/000077500000000000000000000000001322271446000205635ustar00rootroot00000000000000calamares-3.1.12/src/modules/partition/gui/BootInfoWidget.cpp000066400000000000000000000102711322271446000241530ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "BootInfoWidget.h" #include "core/PartUtils.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include #include #include BootInfoWidget::BootInfoWidget( QWidget* parent ) : QWidget( parent ) , m_bootIcon( new QLabel ) , m_bootLabel( new QLabel ) { QHBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); CalamaresUtils::unmarginLayout( mainLayout ); mainLayout->addWidget( m_bootIcon ); mainLayout->addWidget( m_bootLabel ); QSize iconSize = CalamaresUtils::defaultIconSize(); m_bootIcon->setMargin( 0 ); m_bootIcon->setFixedSize( iconSize ); m_bootIcon->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::BootEnvironment, CalamaresUtils::Original, iconSize ) ); QFontMetrics fm = QFontMetrics( QFont() ); m_bootLabel->setMinimumWidth( fm.boundingRect( "BIOS" ).width() + CalamaresUtils::defaultFontHeight() / 2 ); m_bootLabel->setAlignment( Qt::AlignCenter ); QPalette palette; palette.setBrush( QPalette::Foreground, QColor( "#4D4D4D" ) ); //dark grey m_bootIcon->setAutoFillBackground( true ); m_bootLabel->setAutoFillBackground( true ); m_bootIcon->setPalette( palette ); m_bootLabel->setPalette( palette ); CALAMARES_RETRANSLATE( retranslateUi(); ) } void BootInfoWidget::retranslateUi() { m_bootIcon->setToolTip( tr( "The boot environment of this system.

" "Older x86 systems only support BIOS.
" "Modern systems usually use EFI, but " "may also show up as BIOS if started in compatibility " "mode." ) ); QString bootToolTip; if ( PartUtils::isEfiSystem() ) { m_bootLabel->setText( "EFI " ); bootToolTip = tr( "This system was started with an EFI " "boot environment.

" "To configure startup from an EFI environment, this installer " "must deploy a boot loader application, like GRUB" " or systemd-boot on an " "EFI System Partition. This is automatic, unless " "you choose manual partitioning, in which case you must " "choose it or create it on your own." ); } else { m_bootLabel->setText( "BIOS" ); bootToolTip = tr( "This system was started with a BIOS " "boot environment.

" "To configure startup from a BIOS environment, this installer " "must install a boot loader, like GRUB" ", either at the beginning of a partition or " "on the Master Boot Record near the " "beginning of the partition table (preferred). " "This is automatic, unless " "you choose manual partitioning, in which case you must " "set it up on your own." ); } m_bootLabel->setToolTip( bootToolTip ); } calamares-3.1.12/src/modules/partition/gui/BootInfoWidget.h000066400000000000000000000021521322271446000236170ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef BOOTINFOWIDGET_H #define BOOTINFOWIDGET_H #include class QLabel; class BootInfoWidget : public QWidget { Q_OBJECT public: explicit BootInfoWidget( QWidget* parent = nullptr ); public slots: void retranslateUi(); private: QLabel* m_bootIcon; QLabel* m_bootLabel; }; #endif // BOOTINFOWIDGET_H calamares-3.1.12/src/modules/partition/gui/ChoicePage.cpp000066400000000000000000001443741322271446000232730ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ChoicePage.h" #include "core/BootLoaderModel.h" #include "core/PartitionActions.h" #include "core/PartitionCoreModule.h" #include "core/DeviceModel.h" #include "core/PartitionModel.h" #include "core/OsproberEntry.h" #include "core/PartUtils.h" #include "core/PartitionIterator.h" #include "ReplaceWidget.h" #include "PrettyRadioButton.h" #include "PartitionBarsView.h" #include "PartitionLabelsView.h" #include "PartitionSplitterWidget.h" #include "BootInfoWidget.h" #include "DeviceInfoWidget.h" #include "ScanningDialog.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "Branding.h" #include "core/KPMHelpers.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "core/PartitionInfo.h" #include #include #include #include #include #include #include #include #include #include /** * @brief ChoicePage::ChoicePage is the default constructor. Called on startup as part of * the module loading code path. * @param compactMode if true, the drive selector will be a combo box on top, otherwise it * will show up as a list view. * @param parent the QWidget parent. */ ChoicePage::ChoicePage( QWidget* parent ) : QWidget( parent ) , m_nextEnabled( false ) , m_core( nullptr ) , m_choice( NoChoice ) , m_isEfi( false ) , m_grp( nullptr ) , m_alongsideButton( nullptr ) , m_eraseButton( nullptr ) , m_replaceButton( nullptr ) , m_somethingElseButton( nullptr ) , m_deviceInfoWidget( nullptr ) , m_beforePartitionBarsView( nullptr ) , m_beforePartitionLabelsView( nullptr ) , m_bootloaderComboBox( nullptr ) , m_lastSelectedDeviceIndex( -1 ) , m_enableEncryptionWidget( true ) { setupUi( this ); m_defaultFsType = Calamares::JobQueue::instance()-> globalStorage()-> value( "defaultFileSystemType" ).toString(); m_enableEncryptionWidget = Calamares::JobQueue::instance()-> globalStorage()-> value( "enableLuksAutomatedPartitioning" ).toBool(); if ( FileSystem::typeForName( m_defaultFsType ) == FileSystem::Unknown ) m_defaultFsType = "ext4"; // Set up drives combo m_mainLayout->setDirection( QBoxLayout::TopToBottom ); m_drivesLayout->setDirection( QBoxLayout::LeftToRight ); BootInfoWidget* bootInfoWidget = new BootInfoWidget( this ); m_drivesLayout->insertWidget( 0, bootInfoWidget ); m_drivesLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() / 2 ); m_drivesCombo = new QComboBox( this ); m_mainLayout->setStretchFactor( m_drivesLayout, 0 ); m_mainLayout->setStretchFactor( m_rightLayout, 1 ); m_drivesLabel->setBuddy( m_drivesCombo ); m_drivesLayout->addWidget( m_drivesCombo ); m_deviceInfoWidget = new DeviceInfoWidget; m_drivesLayout->addWidget( m_deviceInfoWidget ); m_drivesLayout->addStretch(); m_messageLabel->setWordWrap( true ); m_messageLabel->hide(); CalamaresUtils::unmarginLayout( m_itemsLayout ); // Drive selector + preview CALAMARES_RETRANSLATE( retranslateUi( this ); m_drivesLabel->setText( tr( "Select storage de&vice:" ) ); m_previewBeforeLabel->setText( tr( "Current:" ) ); m_previewAfterLabel->setText( tr( "After:" ) ); ) m_previewBeforeFrame->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); m_previewAfterFrame->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); m_previewAfterLabel->hide(); m_previewAfterFrame->hide(); m_encryptWidget->hide(); m_reuseHomeCheckBox->hide(); Calamares::JobQueue::instance()->globalStorage()->insert( "reuseHome", false ); } ChoicePage::~ChoicePage() {} void ChoicePage::init( PartitionCoreModule* core ) { m_core = core; m_isEfi = PartUtils::isEfiSystem(); setupChoices(); // We need to do this because a PCM revert invalidates the deviceModel. connect( core, &PartitionCoreModule::reverted, this, [=] { m_drivesCombo->setModel( core->deviceModel() ); m_drivesCombo->setCurrentIndex( m_lastSelectedDeviceIndex ); } ); m_drivesCombo->setModel( core->deviceModel() ); connect( m_drivesCombo, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice ); connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged ); connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged ); ChoicePage::applyDeviceChoice(); } /** * @brief ChoicePage::setupChoices creates PrettyRadioButton objects for the action * choices. * @warning This must only run ONCE because it creates signal-slot connections for the * actions. When an action is triggered, it runs action-specific code that may * change the internal state of the PCM, and it updates the bottom preview (or * split) widget. * Synchronous loading ends here. */ void ChoicePage::setupChoices() { // sample os-prober output: // /dev/sda2:Windows 7 (loader):Windows:chain // /dev/sda6::Arch:linux // // There are three possibilities we have to consider: // - There are no operating systems present // - There is one operating system present // - There are multiple operating systems present // // There are three outcomes we have to provide: // 1) Wipe+autopartition // 2) Resize+autopartition // 3) Manual // TBD: upgrade option? QSize iconSize( CalamaresUtils::defaultIconSize().width() * 2, CalamaresUtils::defaultIconSize().height() * 2 ); m_grp = new QButtonGroup( this ); m_alongsideButton = new PrettyRadioButton; m_alongsideButton->setIconSize( iconSize ); m_alongsideButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionAlongside, CalamaresUtils::Original, iconSize ) ); m_grp->addButton( m_alongsideButton->buttonWidget(), Alongside ); m_eraseButton = new PrettyRadioButton; m_eraseButton->setIconSize( iconSize ); m_eraseButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionEraseAuto, CalamaresUtils::Original, iconSize ) ); m_grp->addButton( m_eraseButton->buttonWidget(), Erase ); m_replaceButton = new PrettyRadioButton; m_replaceButton->setIconSize( iconSize ); m_replaceButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionReplaceOs, CalamaresUtils::Original, iconSize ) ); m_grp->addButton( m_replaceButton->buttonWidget(), Replace ); m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); m_itemsLayout->addWidget( m_eraseButton ); m_somethingElseButton = new PrettyRadioButton; CALAMARES_RETRANSLATE( m_somethingElseButton->setText( tr( "Manual partitioning
" "You can create or resize partitions yourself." ) ); ) m_somethingElseButton->setIconSize( iconSize ); m_somethingElseButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionManual, CalamaresUtils::Original, iconSize ) ); m_itemsLayout->addWidget( m_somethingElseButton ); m_grp->addButton( m_somethingElseButton->buttonWidget(), Manual ); m_itemsLayout->addStretch(); connect( m_grp, static_cast< void( QButtonGroup::* )( int, bool ) >( &QButtonGroup::buttonToggled ), this, [ this ]( int id, bool checked ) { if ( checked ) // An action was picked. { m_choice = static_cast< Choice >( id ); updateNextEnabled(); emit actionChosen(); } else // An action was unpicked, either on its own or because of another selection. { if ( m_grp->checkedButton() == nullptr ) // If no other action is chosen, we must { // set m_choice to NoChoice and reset previews. m_choice = NoChoice; updateNextEnabled(); emit actionChosen(); } } } ); m_rightLayout->setStretchFactor( m_itemsLayout, 1 ); m_rightLayout->setStretchFactor( m_previewBeforeFrame, 0 ); m_rightLayout->setStretchFactor( m_previewAfterFrame, 0 ); connect( this, &ChoicePage::actionChosen, this, [=] { Device* currd = selectedDevice(); if ( currd ) { applyActionChoice( currentChoice() ); } } ); } /** * @brief ChoicePage::selectedDevice queries the device picker (which may be a combo or * a list view) to get a pointer to the currently selected Device. * @return a Device pointer, valid in the current state of the PCM, or nullptr if * something goes wrong. */ Device* ChoicePage::selectedDevice() { Device* currentDevice = nullptr; currentDevice = m_core->deviceModel()->deviceForIndex( m_core->deviceModel()->index( m_drivesCombo->currentIndex() ) ); return currentDevice; } /** * @brief ChoicePage::applyDeviceChoice handler for the selected event of the device * picker. Calls ChoicePage::selectedDevice() to get the current Device*, then * updates the preview widget for the on-disk state (calls ChoicePage:: * updateDeviceStatePreview()) and finally sets up the available actions and their * text by calling ChoicePage::setupActions(). */ void ChoicePage::applyDeviceChoice() { if ( !selectedDevice() ) return; if ( m_core->isDirty() ) { ScanningDialog::run( QtConcurrent::run( [ = ] { QMutexLocker locker( &m_coreMutex ); m_core->revertAllDevices(); } ), [ this ] { continueApplyDeviceChoice(); }, this ); } else { continueApplyDeviceChoice(); } } void ChoicePage::continueApplyDeviceChoice() { Device* currd = selectedDevice(); // The device should only be nullptr immediately after a PCM reset. // applyDeviceChoice() will be called again momentarily as soon as we handle the // PartitionCoreModule::reverted signal. if ( !currd ) return; updateDeviceStatePreview(); // Preview setup done. Now we show/hide choices as needed. setupActions(); m_lastSelectedDeviceIndex = m_drivesCombo->currentIndex(); emit actionChosen(); emit deviceChosen(); } void ChoicePage::applyActionChoice( ChoicePage::Choice choice ) { m_beforePartitionBarsView->selectionModel()-> disconnect( SIGNAL( currentRowChanged( QModelIndex, QModelIndex ) ) ); m_beforePartitionBarsView->selectionModel()->clearSelection(); m_beforePartitionBarsView->selectionModel()->clearCurrentIndex(); switch ( choice ) { case Erase: if ( m_core->isDirty() ) { ScanningDialog::run( QtConcurrent::run( [ = ] { QMutexLocker locker( &m_coreMutex ); m_core->revertDevice( selectedDevice() ); } ), [ = ] { PartitionActions::doAutopartition( m_core, selectedDevice(), m_encryptWidget->passphrase() ); emit deviceChosen(); }, this ); } else { PartitionActions::doAutopartition( m_core, selectedDevice(), m_encryptWidget->passphrase() ); emit deviceChosen(); } break; case Replace: if ( m_core->isDirty() ) { ScanningDialog::run( QtConcurrent::run( [ = ] { QMutexLocker locker( &m_coreMutex ); m_core->revertDevice( selectedDevice() ); } ), []{}, this ); } updateNextEnabled(); connect( m_beforePartitionBarsView->selectionModel(), SIGNAL( currentRowChanged( QModelIndex, QModelIndex ) ), this, SLOT( onPartitionToReplaceSelected( QModelIndex, QModelIndex ) ), Qt::UniqueConnection ); break; case Alongside: if ( m_core->isDirty() ) { ScanningDialog::run( QtConcurrent::run( [ = ] { QMutexLocker locker( &m_coreMutex ); m_core->revertDevice( selectedDevice() ); } ), [this] { // We need to reupdate after reverting because the splitter widget is // not a true view. updateActionChoicePreview( currentChoice() ); updateNextEnabled(); }, this ); } updateNextEnabled(); connect( m_beforePartitionBarsView->selectionModel(), SIGNAL( currentRowChanged( QModelIndex, QModelIndex ) ), this, SLOT( doAlongsideSetupSplitter( QModelIndex, QModelIndex ) ), Qt::UniqueConnection ); break; case NoChoice: case Manual: break; } updateActionChoicePreview( currentChoice() ); } void ChoicePage::doAlongsideSetupSplitter( const QModelIndex& current, const QModelIndex& previous ) { Q_UNUSED( previous ); if ( !current.isValid() ) return; if ( !m_afterPartitionSplitterWidget ) return; const PartitionModel* modl = qobject_cast< const PartitionModel* >( current.model() ); if ( !modl ) return; Partition* part = modl->partitionForIndex( current ); if ( !part ) { cDebug() << Q_FUNC_INFO << "Partition not found for index" << current; return; } double requiredStorageGB = Calamares::JobQueue::instance() ->globalStorage() ->value( "requiredStorageGB" ) .toDouble(); qint64 requiredStorageB = qRound64( requiredStorageGB + 0.1 + 2.0 ) * 1024 * 1024 * 1024; m_afterPartitionSplitterWidget->setSplitPartition( part->partitionPath(), qRound64( part->used() * 1.1 ), part->capacity() - requiredStorageB, part->capacity() / 2 ); if ( m_isEfi ) setupEfiSystemPartitionSelector(); cDebug() << "Partition selected for Alongside."; updateNextEnabled(); } void ChoicePage::onEncryptWidgetStateChanged() { EncryptWidget::State state = m_encryptWidget->state(); if ( m_choice == Erase ) { if ( state == EncryptWidget::EncryptionConfirmed || state == EncryptWidget::EncryptionDisabled ) applyActionChoice( m_choice ); } else if ( m_choice == Replace ) { if ( m_beforePartitionBarsView && m_beforePartitionBarsView->selectionModel()->currentIndex().isValid() && ( state == EncryptWidget::EncryptionConfirmed || state == EncryptWidget::EncryptionDisabled ) ) { doReplaceSelectedPartition( m_beforePartitionBarsView-> selectionModel()-> currentIndex() ); } } updateNextEnabled(); } void ChoicePage::onHomeCheckBoxStateChanged() { if ( currentChoice() == Replace && m_beforePartitionBarsView->selectionModel()->currentIndex().isValid() ) { doReplaceSelectedPartition( m_beforePartitionBarsView-> selectionModel()-> currentIndex() ); } } void ChoicePage::onLeave() { if ( m_choice == Alongside ) doAlongsideApply(); if ( m_isEfi && ( m_choice == Alongside || m_choice == Replace ) ) { QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); if ( efiSystemPartitions.count() == 1 ) { PartitionInfo::setMountPoint( efiSystemPartitions.first(), Calamares::JobQueue::instance()-> globalStorage()-> value( "efiSystemPartition" ).toString() ); } else if ( efiSystemPartitions.count() > 1 && m_efiComboBox ) { PartitionInfo::setMountPoint( efiSystemPartitions.at( m_efiComboBox->currentIndex() ), Calamares::JobQueue::instance()-> globalStorage()-> value( "efiSystemPartition" ).toString() ); } else { cDebug() << "ERROR: cannot set up EFI system partition.\nESP count:" << efiSystemPartitions.count() << "\nm_efiComboBox:" << m_efiComboBox; } } else // installPath is then passed to the bootloader module for MBR setup { if ( !m_isEfi ) { if ( m_bootloaderComboBox.isNull() ) { m_core->setBootLoaderInstallPath( selectedDevice()->deviceNode() ); } else { QVariant var = m_bootloaderComboBox->currentData( BootLoaderModel::BootLoaderPathRole ); if ( !var.isValid() ) return; m_core->setBootLoaderInstallPath( var.toString() ); } } } } void ChoicePage::doAlongsideApply() { Q_ASSERT( m_afterPartitionSplitterWidget->splitPartitionSize() >= 0 ); Q_ASSERT( m_afterPartitionSplitterWidget->newPartitionSize() >= 0 ); QMutexLocker locker( &m_coreMutex ); QString path = m_beforePartitionBarsView-> selectionModel()-> currentIndex().data( PartitionModel::PartitionPathRole ).toString(); DeviceModel* dm = m_core->deviceModel(); for ( int i = 0; i < dm->rowCount(); ++i ) { Device* dev = dm->deviceForIndex( dm->index( i ) ); Partition* candidate = KPMHelpers::findPartitionByPath( { dev }, path ); if ( candidate ) { qint64 firstSector = candidate->firstSector(); qint64 oldLastSector = candidate->lastSector(); qint64 newLastSector = firstSector + m_afterPartitionSplitterWidget->splitPartitionSize() / dev->logicalSize(); m_core->resizePartition( dev, candidate, firstSector, newLastSector ); Partition* newPartition = nullptr; QString luksPassphrase = m_encryptWidget->passphrase(); if ( luksPassphrase.isEmpty() ) { newPartition = KPMHelpers::createNewPartition( candidate->parent(), *dev, candidate->roles(), FileSystem::typeForName( m_defaultFsType ), newLastSector + 2, // * oldLastSector ); } else { newPartition = KPMHelpers::createNewEncryptedPartition( candidate->parent(), *dev, candidate->roles(), FileSystem::typeForName( m_defaultFsType ), newLastSector + 2, // * oldLastSector, luksPassphrase ); } PartitionInfo::setMountPoint( newPartition, "/" ); PartitionInfo::setFormat( newPartition, true ); // * for some reason ped_disk_add_partition refuses to create a new partition // if it starts on the sector immediately after the last used sector, so we // have to push it one sector further, therefore + 2 instead of + 1. m_core->createPartition( dev, newPartition ); m_core->dumpQueue(); break; } } } void ChoicePage::onPartitionToReplaceSelected( const QModelIndex& current, const QModelIndex& previous ) { Q_UNUSED( previous ); if ( !current.isValid() ) return; // Reset state on selection regardless of whether this will be used. m_reuseHomeCheckBox->setChecked( false ); doReplaceSelectedPartition( current ); } void ChoicePage::doReplaceSelectedPartition( const QModelIndex& current ) { if ( !current.isValid() ) return; QString* homePartitionPath = new QString(); bool doReuseHomePartition = m_reuseHomeCheckBox->isChecked(); // NOTE: using by-ref captures because we need to write homePartitionPath and // doReuseHomePartition *after* the device revert, for later use. ScanningDialog::run( QtConcurrent::run( [ this, current ]( QString* homePartitionPath, bool doReuseHomePartition ) { QMutexLocker locker( &m_coreMutex ); if ( m_core->isDirty() ) { m_core->revertDevice( selectedDevice() ); } // if the partition is unallocated(free space), we don't replace it but create new one // with the same first and last sector Partition* selectedPartition = static_cast< Partition* >( current.data( PartitionModel::PartitionPtrRole ) .value< void* >() ); if ( KPMHelpers::isPartitionFreeSpace( selectedPartition ) ) { //NOTE: if the selected partition is free space, we don't deal with // a separate /home partition at all because there's no existing // rootfs to read it from. PartitionRole newRoles = PartitionRole( PartitionRole::Primary ); PartitionNode* newParent = selectedDevice()->partitionTable(); if ( selectedPartition->parent() ) { Partition* parent = dynamic_cast< Partition* >( selectedPartition->parent() ); if ( parent && parent->roles().has( PartitionRole::Extended ) ) { newRoles = PartitionRole( PartitionRole::Logical ); newParent = KPMHelpers::findPartitionByPath( { selectedDevice() }, parent->partitionPath() ); } } Partition* newPartition = nullptr; if ( m_encryptWidget->state() == EncryptWidget::EncryptionConfirmed ) { newPartition = KPMHelpers::createNewEncryptedPartition( newParent, *selectedDevice(), newRoles, FileSystem::typeForName( m_defaultFsType ), selectedPartition->firstSector(), selectedPartition->lastSector(), m_encryptWidget->passphrase() ); } else { newPartition = KPMHelpers::createNewPartition( newParent, *selectedDevice(), newRoles, FileSystem::typeForName( m_defaultFsType ), selectedPartition->firstSector(), selectedPartition->lastSector() ); } PartitionInfo::setMountPoint( newPartition, "/" ); PartitionInfo::setFormat( newPartition, true ); m_core->createPartition( selectedDevice(), newPartition); } else { // We can't use the PartitionPtrRole because we need to make changes to the // main DeviceModel, not the immutable copy. QString partPath = current.data( PartitionModel::PartitionPathRole ).toString(); selectedPartition = KPMHelpers::findPartitionByPath( { selectedDevice() }, partPath ); if ( selectedPartition ) { // Find out is the selected partition has a rootfs. If yes, then make the // m_reuseHomeCheckBox visible and set its text to something meaningful. homePartitionPath->clear(); for ( const OsproberEntry& osproberEntry : m_core->osproberEntries() ) if ( osproberEntry.path == partPath ) *homePartitionPath = osproberEntry.homePath; if ( homePartitionPath->isEmpty() ) doReuseHomePartition = false; PartitionActions::doReplacePartition( m_core, selectedDevice(), selectedPartition, m_encryptWidget->passphrase() ); Partition* homePartition = KPMHelpers::findPartitionByPath( { selectedDevice() }, *homePartitionPath ); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( homePartition && doReuseHomePartition ) { PartitionInfo::setMountPoint( homePartition, "/home" ); gs->insert( "reuseHome", true ); } else { gs->insert( "reuseHome", false ); } } } }, homePartitionPath, doReuseHomePartition ), [ = ] { m_reuseHomeCheckBox->setVisible( !homePartitionPath->isEmpty() ); if ( !homePartitionPath->isEmpty() ) m_reuseHomeCheckBox->setText( tr( "Reuse %1 as home partition for %2." ) .arg( *homePartitionPath ) .arg( *Calamares::Branding::ShortProductName ) ); delete homePartitionPath; if ( m_isEfi ) setupEfiSystemPartitionSelector(); updateNextEnabled(); if ( !m_bootloaderComboBox.isNull() && m_bootloaderComboBox->currentIndex() < 0 ) m_bootloaderComboBox->setCurrentIndex( m_lastSelectedDeviceIndex ); }, this ); } /** * @brief ChoicePage::updateDeviceStatePreview clears and rebuilds the contents of the * preview widget for the current on-disk state. This also triggers a rescan in the * PCM to get a Device* copy that's unaffected by subsequent PCM changes. * @param currentDevice a pointer to the selected Device. */ void ChoicePage::updateDeviceStatePreview() { //FIXME: this needs to be made async because the rescan can block the UI thread for // a while. --Teo 10/2015 Device* currentDevice = selectedDevice(); Q_ASSERT( currentDevice ); QMutexLocker locker( &m_previewsMutex ); cDebug() << "Updating partitioning state widgets."; qDeleteAll( m_previewBeforeFrame->children() ); auto layout = m_previewBeforeFrame->layout(); if ( layout ) layout->deleteLater(); // Doesn't like nullptr layout = new QVBoxLayout; m_previewBeforeFrame->setLayout( layout ); CalamaresUtils::unmarginLayout( layout ); layout->setSpacing( 6 ); PartitionBarsView::NestedPartitionsMode mode = Calamares::JobQueue::instance()->globalStorage()-> value( "drawNestedPartitions" ).toBool() ? PartitionBarsView::DrawNestedPartitions : PartitionBarsView::NoNestedPartitions; m_beforePartitionBarsView = new PartitionBarsView( m_previewBeforeFrame ); m_beforePartitionBarsView->setNestedPartitionsMode( mode ); m_beforePartitionLabelsView = new PartitionLabelsView( m_previewBeforeFrame ); m_beforePartitionLabelsView->setExtendedPartitionHidden( mode == PartitionBarsView::NoNestedPartitions ); Device* deviceBefore = m_core->immutableDeviceCopy( currentDevice ); PartitionModel* model = new PartitionModel( m_beforePartitionBarsView ); model->init( deviceBefore, m_core->osproberEntries() ); // The QObject parents tree is meaningful for memory management here, // see qDeleteAll above. deviceBefore->setParent( model ); // Can't reparent across threads model->setParent( m_beforePartitionBarsView ); m_beforePartitionBarsView->setModel( model ); m_beforePartitionLabelsView->setModel( model ); // Make the bars and labels view use the same selectionModel. auto sm = m_beforePartitionLabelsView->selectionModel(); m_beforePartitionLabelsView->setSelectionModel( m_beforePartitionBarsView->selectionModel() ); if ( sm ) sm->deleteLater(); switch ( m_choice ) { case Replace: case Alongside: m_beforePartitionBarsView->setSelectionMode( QAbstractItemView::SingleSelection ); m_beforePartitionLabelsView->setSelectionMode( QAbstractItemView::SingleSelection ); break; default: m_beforePartitionBarsView->setSelectionMode( QAbstractItemView::NoSelection ); m_beforePartitionLabelsView->setSelectionMode( QAbstractItemView::NoSelection ); } layout->addWidget( m_beforePartitionBarsView ); layout->addWidget( m_beforePartitionLabelsView ); } /** * @brief ChoicePage::updateActionChoicePreview clears and rebuilds the contents of the * preview widget for the current PCM-proposed state. No rescans here, this should * be immediate. * @param currentDevice a pointer to the selected Device. * @param choice the chosen partitioning action. */ void ChoicePage::updateActionChoicePreview( ChoicePage::Choice choice ) { Device* currentDevice = selectedDevice(); Q_ASSERT( currentDevice ); QMutexLocker locker( &m_previewsMutex ); cDebug() << "Updating partitioning preview widgets."; qDeleteAll( m_previewAfterFrame->children() ); auto oldlayout = m_previewAfterFrame->layout(); if ( oldlayout ) oldlayout->deleteLater(); QVBoxLayout* layout = new QVBoxLayout; m_previewAfterFrame->setLayout( layout ); CalamaresUtils::unmarginLayout( layout ); layout->setSpacing( 6 ); PartitionBarsView::NestedPartitionsMode mode = Calamares::JobQueue::instance()->globalStorage()-> value( "drawNestedPartitions" ).toBool() ? PartitionBarsView::DrawNestedPartitions : PartitionBarsView::NoNestedPartitions; m_reuseHomeCheckBox->hide(); Calamares::JobQueue::instance()->globalStorage()->insert( "reuseHome", false ); switch ( choice ) { case Alongside: { if ( m_enableEncryptionWidget ) m_encryptWidget->show(); m_previewBeforeLabel->setText( tr( "Current:" ) ); m_selectLabel->setText( tr( "Select a partition to shrink, " "then drag the bottom bar to resize" ) ); m_selectLabel->show(); m_afterPartitionSplitterWidget = new PartitionSplitterWidget( m_previewAfterFrame ); m_afterPartitionSplitterWidget->init( selectedDevice(), mode == PartitionBarsView::DrawNestedPartitions ); layout->addWidget( m_afterPartitionSplitterWidget ); QLabel* sizeLabel = new QLabel( m_previewAfterFrame ); layout->addWidget( sizeLabel ); sizeLabel->setWordWrap( true ); connect( m_afterPartitionSplitterWidget, &PartitionSplitterWidget::partitionResized, this, [ this, sizeLabel ]( const QString& path, qint64 size, qint64 sizeNext ) { Q_UNUSED( path ) sizeLabel->setText( tr( "%1 will be shrunk to %2MB and a new " "%3MB partition will be created for %4." ) .arg( m_beforePartitionBarsView->selectionModel()->currentIndex().data().toString() ) .arg( size / ( 1024 * 1024 ) ) .arg( sizeNext / ( 1024 * 1024 ) ) .arg( *Calamares::Branding::ShortProductName ) ); } ); m_previewAfterFrame->show(); m_previewAfterLabel->show(); SelectionFilter filter = [ this ]( const QModelIndex& index ) { return PartUtils::canBeResized( static_cast< Partition* >( index.data( PartitionModel::PartitionPtrRole ) .value< void* >() ) ); }; m_beforePartitionBarsView->setSelectionFilter( filter ); m_beforePartitionLabelsView->setSelectionFilter( filter ); break; } case Erase: case Replace: { if ( m_enableEncryptionWidget ) m_encryptWidget->show(); m_previewBeforeLabel->setText( tr( "Current:" ) ); m_afterPartitionBarsView = new PartitionBarsView( m_previewAfterFrame ); m_afterPartitionBarsView->setNestedPartitionsMode( mode ); m_afterPartitionLabelsView = new PartitionLabelsView( m_previewAfterFrame ); m_afterPartitionLabelsView->setExtendedPartitionHidden( mode == PartitionBarsView::NoNestedPartitions ); m_afterPartitionLabelsView->setCustomNewRootLabel( *Calamares::Branding::BootloaderEntryName ); PartitionModel* model = m_core->partitionModelForDevice( selectedDevice() ); // The QObject parents tree is meaningful for memory management here, // see qDeleteAll above. m_afterPartitionBarsView->setModel( model ); m_afterPartitionLabelsView->setModel( model ); m_afterPartitionBarsView->setSelectionMode( QAbstractItemView::NoSelection ); m_afterPartitionLabelsView->setSelectionMode( QAbstractItemView::NoSelection ); layout->addWidget( m_afterPartitionBarsView ); layout->addWidget( m_afterPartitionLabelsView ); if ( !m_isEfi ) { QWidget* eraseWidget = new QWidget; QHBoxLayout* eraseLayout = new QHBoxLayout; eraseWidget->setLayout( eraseLayout ); eraseLayout->setContentsMargins( 0, 0, 0, 0 ); QLabel* eraseBootloaderLabel = new QLabel( eraseWidget ); eraseLayout->addWidget( eraseBootloaderLabel ); eraseBootloaderLabel->setText( tr( "Boot loader location:" ) ); m_bootloaderComboBox = createBootloaderComboBox( eraseWidget ); connect( m_core, &PartitionCoreModule::deviceReverted, this, [ this ]( Device* dev ) { Q_UNUSED( dev ) if ( !m_bootloaderComboBox.isNull() ) { if ( m_bootloaderComboBox->model() != m_core->bootLoaderModel() ) m_bootloaderComboBox->setModel( m_core->bootLoaderModel() ); m_bootloaderComboBox->setCurrentIndex( m_lastSelectedDeviceIndex ); } }, Qt::QueuedConnection ); // ^ Must be Queued so it's sure to run when the widget is already visible. eraseLayout->addWidget( m_bootloaderComboBox ); eraseBootloaderLabel->setBuddy( m_bootloaderComboBox ); eraseLayout->addStretch(); layout->addWidget( eraseWidget ); } m_previewAfterFrame->show(); m_previewAfterLabel->show(); if ( m_choice == Erase ) m_selectLabel->hide(); else { SelectionFilter filter = [ this ]( const QModelIndex& index ) { return PartUtils::canBeReplaced( static_cast< Partition* >( index.data( PartitionModel::PartitionPtrRole ) .value< void* >() ) ); }; m_beforePartitionBarsView->setSelectionFilter( filter ); m_beforePartitionLabelsView->setSelectionFilter( filter ); m_selectLabel->show(); m_selectLabel->setText( tr( "Select a partition to install on" ) ); } break; } case NoChoice: case Manual: m_selectLabel->hide(); m_previewAfterFrame->hide(); m_previewBeforeLabel->setText( tr( "Current:" ) ); m_previewAfterLabel->hide(); m_encryptWidget->hide(); break; } if ( m_isEfi && ( m_choice == Alongside || m_choice == Replace ) ) { QHBoxLayout* efiLayout = new QHBoxLayout; layout->addLayout( efiLayout ); m_efiLabel = new QLabel( m_previewAfterFrame ); efiLayout->addWidget( m_efiLabel ); m_efiComboBox = new QComboBox( m_previewAfterFrame ); efiLayout->addWidget( m_efiComboBox ); m_efiLabel->setBuddy( m_efiComboBox ); m_efiComboBox->hide(); efiLayout->addStretch(); } // Also handle selection behavior on beforeFrame. QAbstractItemView::SelectionMode previewSelectionMode; switch ( m_choice ) { case Replace: case Alongside: previewSelectionMode = QAbstractItemView::SingleSelection; break; default: previewSelectionMode = QAbstractItemView::NoSelection; } m_beforePartitionBarsView->setSelectionMode( previewSelectionMode ); m_beforePartitionLabelsView->setSelectionMode( previewSelectionMode ); } void ChoicePage::setupEfiSystemPartitionSelector() { Q_ASSERT( m_isEfi ); // Only the already existing ones: QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); if ( efiSystemPartitions.count() == 0 ) //should never happen { m_efiLabel->setText( tr( "An EFI system partition cannot be found anywhere " "on this system. Please go back and use manual " "partitioning to set up %1." ) .arg( *Calamares::Branding::ShortProductName ) ); updateNextEnabled(); } else if ( efiSystemPartitions.count() == 1 ) //probably most usual situation { m_efiLabel->setText( tr( "The EFI system partition at %1 will be used for " "starting %2." ) .arg( efiSystemPartitions.first()->partitionPath() ) .arg( *Calamares::Branding::ShortProductName ) ); } else { m_efiComboBox->show(); m_efiLabel->setText( tr( "EFI system partition:" ) ); for ( int i = 0; i < efiSystemPartitions.count(); ++i ) { Partition* efiPartition = efiSystemPartitions.at( i ); m_efiComboBox->addItem( efiPartition->partitionPath(), i ); // We pick an ESP on the currently selected device, if possible if ( efiPartition->devicePath() == selectedDevice()->deviceNode() && efiPartition->number() == 1 ) m_efiComboBox->setCurrentIndex( i ); } } } QComboBox* ChoicePage::createBootloaderComboBox( QWidget* parent ) { QComboBox* bcb = new QComboBox( parent ); bcb->setModel( m_core->bootLoaderModel() ); // When the chosen bootloader device changes, we update the choice in the PCM connect( bcb, static_cast< void (QComboBox::*)(int) >( &QComboBox::currentIndexChanged ), this, [this]( int newIndex ) { QComboBox* bcb = qobject_cast< QComboBox* >( sender() ); if ( bcb ) { QVariant var = bcb->itemData( newIndex, BootLoaderModel::BootLoaderPathRole ); if ( !var.isValid() ) return; m_core->setBootLoaderInstallPath( var.toString() ); } } ); return bcb; } static inline void force_uncheck(QButtonGroup* grp, PrettyRadioButton* button) { button->hide(); grp->setExclusive( false ); button->buttonWidget()->setChecked( false ); grp->setExclusive( true ); } /** * @brief ChoicePage::setupActions happens every time a new Device* is selected in the * device picker. Sets up the text and visibility of the partitioning actions based * on the currently selected Device*, bootloader and os-prober output. * @param currentDevice */ void ChoicePage::setupActions() { Device* currentDevice = selectedDevice(); OsproberEntryList osproberEntriesForCurrentDevice = getOsproberEntriesForDevice( currentDevice ); if ( currentDevice->partitionTable() ) m_deviceInfoWidget->setPartitionTableType( currentDevice->partitionTable()->type() ); else m_deviceInfoWidget->setPartitionTableType( PartitionTable::unknownTableType ); bool atLeastOneCanBeResized = false; bool atLeastOneCanBeReplaced = false; bool atLeastOneIsMounted = false; // Suppress 'erase' if so for ( auto it = PartitionIterator::begin( currentDevice ); it != PartitionIterator::end( currentDevice ); ++it ) { if ( PartUtils::canBeResized( *it ) ) atLeastOneCanBeResized = true; if ( PartUtils::canBeReplaced( *it ) ) atLeastOneCanBeReplaced = true; if ( (*it)->isMounted() ) atLeastOneIsMounted = true; } if ( osproberEntriesForCurrentDevice.count() == 0 ) { CALAMARES_RETRANSLATE( m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " "What would you like to do?
" "You will be able to review and confirm your choices " "before any change is made to the storage device." ) ); m_eraseButton->setText( tr( "Erase disk
" "This will delete all data " "currently present on the selected storage device." ) ); m_alongsideButton->setText( tr( "Install alongside
" "The installer will shrink a partition to make room for %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); m_replaceButton->setText( tr( "Replace a partition
" "Replaces a partition with %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) m_replaceButton->hide(); m_alongsideButton->hide(); m_grp->setExclusive( false ); m_replaceButton->buttonWidget()->setChecked( false ); m_alongsideButton->buttonWidget()->setChecked( false ); m_grp->setExclusive( true ); } else if ( osproberEntriesForCurrentDevice.count() == 1 ) { QString osName = osproberEntriesForCurrentDevice.first().prettyName; if ( !osName.isEmpty() ) { CALAMARES_RETRANSLATE( m_messageLabel->setText( tr( "This storage device has %1 on it. " "What would you like to do?
" "You will be able to review and confirm your choices " "before any change is made to the storage device." ) .arg( osName ) ); m_alongsideButton->setText( tr( "Install alongside
" "The installer will shrink a partition to make room for %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); m_eraseButton->setText( tr( "Erase disk
" "This will delete all data " "currently present on the selected storage device." ) ); m_replaceButton->setText( tr( "Replace a partition
" "Replaces a partition with %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) } else { CALAMARES_RETRANSLATE( m_messageLabel->setText( tr( "This storage device already has an operating system on it. " "What would you like to do?
" "You will be able to review and confirm your choices " "before any change is made to the storage device." ) ); m_alongsideButton->setText( tr( "Install alongside
" "The installer will shrink a partition to make room for %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); m_eraseButton->setText( tr( "Erase disk
" "This will delete all data " "currently present on the selected storage device." ) ); m_replaceButton->setText( tr( "Replace a partition
" "Replaces a partition with %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) } } else { // osproberEntriesForCurrentDevice has at least 2 items. CALAMARES_RETRANSLATE( m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " "What would you like to do?
" "You will be able to review and confirm your choices " "before any change is made to the storage device." ) ); m_alongsideButton->setText( tr( "Install alongside
" "The installer will shrink a partition to make room for %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); m_eraseButton->setText( tr( "Erase disk
" "This will delete all data " "currently present on the selected storage device." ) ); m_replaceButton->setText( tr( "Replace a partition
" "Replaces a partition with %1." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) } if ( atLeastOneCanBeReplaced ) m_replaceButton->show(); else force_uncheck( m_grp, m_replaceButton ); if ( atLeastOneCanBeResized ) m_alongsideButton->show(); else force_uncheck( m_grp, m_alongsideButton ); if ( !atLeastOneIsMounted ) m_eraseButton->show(); // None mounted else force_uncheck( m_grp, m_eraseButton ); bool isEfi = PartUtils::isEfiSystem(); bool efiSystemPartitionFound = !m_core->efiSystemPartitions().isEmpty(); if ( isEfi && !efiSystemPartitionFound ) { cDebug() << "WARNING: system is EFI but there's no EFI system partition, " "DISABLING alongside and replace features."; m_alongsideButton->hide(); m_replaceButton->hide(); } } OsproberEntryList ChoicePage::getOsproberEntriesForDevice( Device* device ) const { OsproberEntryList eList; for ( const OsproberEntry& entry : m_core->osproberEntries() ) { if ( entry.path.startsWith( device->deviceNode() ) ) eList.append( entry ); } return eList; } bool ChoicePage::isNextEnabled() const { return m_nextEnabled; } ChoicePage::Choice ChoicePage::currentChoice() const { return m_choice; } void ChoicePage::updateNextEnabled() { bool enabled = false; switch ( m_choice ) { case NoChoice: enabled = false; break; case Replace: enabled = m_beforePartitionBarsView->selectionModel()-> currentIndex().isValid(); break; case Alongside: enabled = m_beforePartitionBarsView->selectionModel()-> currentIndex().isValid(); break; case Erase: case Manual: enabled = true; } if ( m_isEfi && ( m_choice == Alongside || m_choice == Replace ) ) { if ( m_core->efiSystemPartitions().count() == 0 ) enabled = false; } if ( m_choice != Manual && m_encryptWidget->isVisible() && m_encryptWidget->state() == EncryptWidget::EncryptionUnconfirmed ) enabled = false; if ( enabled == m_nextEnabled ) return; m_nextEnabled = enabled; emit nextStatusChanged( enabled ); } calamares-3.1.12/src/modules/partition/gui/ChoicePage.h000066400000000000000000000111731322271446000227260ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CHOICEPAGE_H #define CHOICEPAGE_H #include "ui_ChoicePage.h" #include #include "core/OsproberEntry.h" #include #include class QBoxLayout; class QComboBox; class QLabel; class QListView; class PartitionBarsView; class PartitionSplitterWidget; class PartitionLabelsView; class PartitionCoreModule; class PrettyRadioButton; class DeviceInfoWidget; class Device; /** * @brief The ChoicePage class is the first page of the partitioning interface. * It offers a choice between partitioning operations and initiates all automated * partitioning modes. For manual partitioning, see PartitionPage. */ class ChoicePage : public QWidget, private Ui::ChoicePage { Q_OBJECT public: enum Choice { NoChoice, Alongside, Erase, Replace, Manual }; explicit ChoicePage( QWidget* parent = nullptr ); virtual ~ChoicePage(); /** * @brief init runs when the PartitionViewStep and the PartitionCoreModule are * ready. Sets up the rest of the UI based on os-prober output. * @param core the PartitionCoreModule pointer. */ void init( PartitionCoreModule* core ); /** * @brief isNextEnabled answers whether the current state of the page is such * that progressing to the next page should be allowed. * @return true if next is allowed, otherwise false. */ bool isNextEnabled() const; /** * @brief currentChoice returns the enum Choice value corresponding to the * currently selected partitioning mode (with a PrettyRadioButton). * @return the enum Choice value. */ Choice currentChoice() const; /** * @brief onLeave runs when control passes from this page to another one. */ void onLeave(); /** * @brief applyActionChoice reacts to a choice of partitioning mode. * @param choice the partitioning action choice. */ void applyActionChoice( ChoicePage::Choice choice ); signals: void nextStatusChanged( bool ); void actionChosen(); void deviceChosen(); private slots: void onPartitionToReplaceSelected( const QModelIndex& current, const QModelIndex& previous ); void doReplaceSelectedPartition( const QModelIndex& current ); void doAlongsideSetupSplitter( const QModelIndex& current, const QModelIndex& previous ); void onEncryptWidgetStateChanged(); void onHomeCheckBoxStateChanged(); private: void updateNextEnabled(); void setupChoices(); QComboBox* createBootloaderComboBox( QWidget* parentButton ); Device* selectedDevice(); void applyDeviceChoice(); void continueApplyDeviceChoice(); void updateDeviceStatePreview(); void updateActionChoicePreview( ChoicePage::Choice choice ); void setupActions(); OsproberEntryList getOsproberEntriesForDevice( Device* device ) const; void doAlongsideApply(); void setupEfiSystemPartitionSelector(); bool m_nextEnabled; PartitionCoreModule* m_core; QMutex m_previewsMutex; Choice m_choice; bool m_isEfi; QComboBox* m_drivesCombo; QButtonGroup* m_grp; PrettyRadioButton* m_alongsideButton; PrettyRadioButton* m_eraseButton; PrettyRadioButton* m_replaceButton; PrettyRadioButton* m_somethingElseButton; DeviceInfoWidget* m_deviceInfoWidget; QPointer< PartitionBarsView > m_beforePartitionBarsView; QPointer< PartitionLabelsView > m_beforePartitionLabelsView; QPointer< PartitionBarsView > m_afterPartitionBarsView; QPointer< PartitionLabelsView > m_afterPartitionLabelsView; QPointer< PartitionSplitterWidget > m_afterPartitionSplitterWidget; QPointer< QComboBox > m_bootloaderComboBox; QPointer< QLabel > m_efiLabel; QPointer< QComboBox > m_efiComboBox; int m_lastSelectedDeviceIndex; QString m_defaultFsType; bool m_enableEncryptionWidget; QMutex m_coreMutex; }; #endif // CHOICEPAGE_H calamares-3.1.12/src/modules/partition/gui/ChoicePage.ui000066400000000000000000000144001322271446000231100ustar00rootroot00000000000000 ChoicePage 0 0 743 512 Form 0 <m_drivesLabel> <m_messageLabel> QFrame::NoFrame QFrame::Plain 0 true 0 0 729 233 0 0 0 0 QFrame::HLine QFrame::Raised <m_reuseHomeCheckBox> 0 0 Qt::Vertical QSizePolicy::Fixed 20 8 After: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 Qt::Vertical QSizePolicy::Fixed 20 8 Before: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 0 0 EncryptWidget QWidget

gui/EncryptWidget.h
1 calamares-3.1.12/src/modules/partition/gui/CreatePartitionDialog.cpp000066400000000000000000000233541322271446000255130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "gui/CreatePartitionDialog.h" #include "core/ColorUtils.h" #include "core/PartitionInfo.h" #include "core/PartUtils.h" #include "core/KPMHelpers.h" #include "gui/PartitionSizeController.h" #include "ui_CreatePartitionDialog.h" #include "utils/Logger.h" #include "GlobalStorage.h" #include "JobQueue.h" // KPMcore #include #include #include #include #include // Qt #include #include #include #include #include static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted, FileSystem::LinuxSwap, FileSystem::Extended, FileSystem::Unknown, FileSystem::Lvm2_PV } ); CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* parentPartition, const QStringList& usedMountPoints, QWidget* parentWidget ) : QDialog( parentWidget ) , m_ui( new Ui_CreatePartitionDialog ) , m_partitionSizeController( new PartitionSizeController( this ) ) , m_device( device ) , m_parent( parentPartition ) , m_usedMountPoints( usedMountPoints ) { m_ui->setupUi( this ); m_ui->encryptWidget->setText( tr( "En&crypt" ) ); m_ui->encryptWidget->hide(); QStringList mountPoints = { "/", "/boot", "/home", "/opt", "/usr", "/var" }; if ( PartUtils::isEfiSystem() ) mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); mountPoints.removeDuplicates(); mountPoints.sort(); m_ui->mountPointComboBox->addItems( mountPoints ); if ( device->partitionTable()->type() == PartitionTable::msdos || device->partitionTable()->type() == PartitionTable::msdos_sectorbased ) initMbrPartitionTypeUi(); else initGptPartitionTypeUi(); // File system FileSystem::Type defaultFsType = FileSystem::typeForName( Calamares::JobQueue::instance()-> globalStorage()-> value( "defaultFileSystemType" ).toString() ); int defaultFsIndex = -1; int fsCounter = 0; QStringList fsNames; for ( auto fs : FileSystemFactory::map() ) { if ( fs->supportCreate() != FileSystem::cmdSupportNone && fs->type() != FileSystem::Extended ) { fsNames << fs->name(); if ( fs->type() == defaultFsType ) defaultFsIndex = fsCounter; fsCounter++; } } m_ui->fsComboBox->addItems( fsNames ); // Connections connect( m_ui->fsComboBox, SIGNAL( activated( int ) ), SLOT( updateMountPointUi() ) ); connect( m_ui->extendedRadioButton, SIGNAL( toggled( bool ) ), SLOT( updateMountPointUi() ) ); connect( m_ui->mountPointComboBox, &QComboBox::currentTextChanged, this, &CreatePartitionDialog::checkMountPointSelection ); // Select a default m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); updateMountPointUi(); setupFlagsList(); // Checks the initial selection. checkMountPointSelection(); } CreatePartitionDialog::~CreatePartitionDialog() {} PartitionTable::Flags CreatePartitionDialog::newFlags() const { PartitionTable::Flags flags; for ( int i = 0; i < m_ui->m_listFlags->count(); i++ ) if ( m_ui->m_listFlags->item( i )->checkState() == Qt::Checked ) flags |= static_cast< PartitionTable::Flag >( m_ui->m_listFlags->item( i )->data( Qt::UserRole ).toInt() ); return flags; } void CreatePartitionDialog::setupFlagsList() { int f = 1; QString s; while ( !( s = PartitionTable::flagName( static_cast< PartitionTable::Flag >( f ) ) ).isEmpty() ) { QListWidgetItem* item = new QListWidgetItem( s ); m_ui->m_listFlags->addItem( item ); item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); item->setData( Qt::UserRole, f ); item->setCheckState( Qt::Unchecked ); f <<= 1; } } void CreatePartitionDialog::initMbrPartitionTypeUi() { QString fixedPartitionString; bool parentIsPartitionTable = m_parent->isRoot(); if ( !parentIsPartitionTable ) { m_role = PartitionRole( PartitionRole::Logical ); fixedPartitionString = tr( "Logical" ); } else if ( m_device->partitionTable()->hasExtended() ) { m_role = PartitionRole( PartitionRole::Primary ); fixedPartitionString = tr( "Primary" ); } if ( fixedPartitionString.isEmpty() ) m_ui->fixedPartitionLabel->hide(); else { m_ui->fixedPartitionLabel->setText( fixedPartitionString ); m_ui->primaryRadioButton->hide(); m_ui->extendedRadioButton->hide(); } } void CreatePartitionDialog::initGptPartitionTypeUi() { m_role = PartitionRole( PartitionRole::Primary ); m_ui->fixedPartitionLabel->setText( tr( "GPT" ) ); m_ui->primaryRadioButton->hide(); m_ui->extendedRadioButton->hide(); } Partition* CreatePartitionDialog::createPartition() { if ( m_role.roles() == PartitionRole::None ) { m_role = PartitionRole( m_ui->extendedRadioButton->isChecked() ? PartitionRole::Extended : PartitionRole::Primary ); } qint64 first = m_partitionSizeController->firstSector(); qint64 last = m_partitionSizeController->lastSector(); FileSystem::Type fsType = m_role.has( PartitionRole::Extended ) ? FileSystem::Extended : FileSystem::typeForName( m_ui->fsComboBox->currentText() ); Partition* partition = nullptr; QString luksPassphrase = m_ui->encryptWidget->passphrase(); if ( m_ui->encryptWidget->state() == EncryptWidget::EncryptionConfirmed && !luksPassphrase.isEmpty() ) { partition = KPMHelpers::createNewEncryptedPartition( m_parent, *m_device, m_role, fsType, first, last, luksPassphrase, newFlags() ); } else { partition = KPMHelpers::createNewPartition( m_parent, *m_device, m_role, fsType, first, last, newFlags() ); } PartitionInfo::setMountPoint( partition, m_ui->mountPointComboBox->currentText() ); PartitionInfo::setFormat( partition, true ); return partition; } void CreatePartitionDialog::updateMountPointUi() { bool enabled = m_ui->primaryRadioButton->isChecked(); if ( enabled ) { FileSystem::Type type = FileSystem::typeForName( m_ui->fsComboBox->currentText() ); enabled = !s_unmountableFS.contains( type ); if ( FS::luks::canEncryptType( type ) ) { m_ui->encryptWidget->show(); m_ui->encryptWidget->reset(); } else { m_ui->encryptWidget->reset(); m_ui->encryptWidget->hide(); } } m_ui->mountPointLabel->setEnabled( enabled ); m_ui->mountPointComboBox->setEnabled( enabled ); if ( !enabled ) m_ui->mountPointComboBox->setCurrentText( QString() ); } void CreatePartitionDialog::checkMountPointSelection() { const QString& selection = m_ui->mountPointComboBox->currentText(); if ( m_usedMountPoints.contains( selection ) ) { m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false ); } else { m_ui->labelMountPoint->setText( QString() ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true ); } } void CreatePartitionDialog::initPartResizerWidget( Partition* partition ) { QColor color = KPMHelpers::isPartitionFreeSpace( partition ) ? ColorUtils::colorForPartitionInFreeSpace( partition ) : ColorUtils::colorForPartition( partition ); m_partitionSizeController->init( m_device, partition, color ); m_partitionSizeController->setPartResizerWidget( m_ui->partResizerWidget ); m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox ); } void CreatePartitionDialog::initFromFreeSpace( Partition* freeSpacePartition ) { initPartResizerWidget( freeSpacePartition ); } void CreatePartitionDialog::initFromPartitionToCreate( Partition* partition ) { Q_ASSERT( partition ); bool isExtended = partition->roles().has( PartitionRole::Extended ); Q_ASSERT( !isExtended ); if ( isExtended ) { cDebug() << "Editing extended partitions is not supported for now"; return; } initPartResizerWidget( partition ); // File System FileSystem::Type fsType = partition->fileSystem().type(); m_ui->fsComboBox->setCurrentText( FileSystem::nameForType( fsType ) ); // Mount point m_ui->mountPointComboBox->setCurrentText( PartitionInfo::mountPoint( partition ) ); updateMountPointUi(); } calamares-3.1.12/src/modules/partition/gui/CreatePartitionDialog.h000066400000000000000000000046241322271446000251570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CREATEPARTITIONDIALOG_H #define CREATEPARTITIONDIALOG_H // KPMcore #include #include #include #include class Device; class Partition; class PartitionNode; class PartitionSizeController; class Ui_CreatePartitionDialog; /** * The dialog which is shown to create a new partition or to edit a * to-be-created partition. */ class CreatePartitionDialog : public QDialog { Q_OBJECT public: CreatePartitionDialog( Device* device, PartitionNode* parentPartition, const QStringList& usedMountPoints, QWidget* parentWidget = nullptr ); ~CreatePartitionDialog(); /** * Must be called when user wants to create a partition in * freeSpacePartition. */ void initFromFreeSpace( Partition* freeSpacePartition ); /** * Must be called when user wants to edit a to-be-created partition. */ void initFromPartitionToCreate( Partition* partition ); Partition* createPartition(); PartitionTable::Flags newFlags() const; private Q_SLOTS: void updateMountPointUi(); void checkMountPointSelection(); private: void setupFlagsList(); QScopedPointer< Ui_CreatePartitionDialog > m_ui; PartitionSizeController* m_partitionSizeController; Device* m_device; PartitionNode* m_parent; PartitionRole m_role = PartitionRole( PartitionRole::None ); QStringList m_usedMountPoints; void initGptPartitionTypeUi(); void initMbrPartitionTypeUi(); void initPartResizerWidget( Partition* ); }; #endif /* CREATEPARTITIONDIALOG_H */ calamares-3.1.12/src/modules/partition/gui/CreatePartitionDialog.ui000066400000000000000000000176541322271446000253540ustar00rootroot00000000000000 CreatePartitionDialog 0 0 763 689 Create a Partition 0 0 0 59 Si&ze: sizeSpinBox MiB Partition &Type: primaryRadioButton &Primary true E&xtended [fixed-partition-label] Qt::Horizontal 40 20 Qt::Vertical 20 13 Fi&le System: fsComboBox Qt::Vertical QSizePolicy::Fixed 20 13 &Mount Point: mountPointComboBox true -1 Flags: true QAbstractItemView::NoSelection true Qt::Vertical 17 13 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok PartResizerWidget QWidget
kpmcore/gui/partresizerwidget.h
1
EncryptWidget QWidget
gui/EncryptWidget.h
1
primaryRadioButton fsComboBox buttonBox accepted() CreatePartitionDialog accept() 185 203 157 178 buttonBox rejected() CreatePartitionDialog reject() 185 203 243 178 extendedRadioButton toggled(bool) fsComboBox setDisabled(bool) 131 36 134 66 extendedRadioButton toggled(bool) label_2 setDisabled(bool) 109 43 79 64
calamares-3.1.12/src/modules/partition/gui/CreatePartitionTableDialog.ui000066400000000000000000000065461322271446000263220ustar00rootroot00000000000000 CreatePartitionTableDialog 0 0 297 182 0 0 Create Partition Table 75 true [are-you-sure-message] Creating a new partition table will delete all existing data on the disk. true Qt::Vertical QSizePolicy::Fixed 20 24 What kind of partition table do you want to create? Master Boot Record (MBR) true GUID Partition Table (GPT) Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok mbrRadioButton gptRadioButton buttonBox buttonBox accepted() CreatePartitionTableDialog accept() 222 141 157 155 buttonBox rejected() CreatePartitionTableDialog reject() 290 147 286 155 calamares-3.1.12/src/modules/partition/gui/DeviceInfoWidget.cpp000066400000000000000000000140101322271446000244420ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "DeviceInfoWidget.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "JobQueue.h" #include "GlobalStorage.h" #include #include #include DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) : QWidget( parent ) , m_ptIcon( new QLabel ) , m_ptLabel( new QLabel ) , m_tableType( PartitionTable::unknownTableType ) { QHBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); CalamaresUtils::unmarginLayout( mainLayout ); mainLayout->addWidget( m_ptIcon ); mainLayout->addWidget( m_ptLabel ); QSize iconSize = CalamaresUtils::defaultIconSize(); m_ptIcon->setMargin( 0 ); m_ptIcon->setFixedSize( iconSize ); m_ptIcon->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionTable, CalamaresUtils::Original, iconSize ) ); QFontMetrics fm = QFontMetrics( QFont() ); m_ptLabel->setMinimumWidth( fm.boundingRect( "Amiga" ).width() + CalamaresUtils::defaultFontHeight() / 2 ); m_ptLabel->setAlignment( Qt::AlignCenter ); QPalette palette; palette.setBrush( QPalette::Foreground, QColor( "#4D4D4D" ) ); //dark grey m_ptIcon->setAutoFillBackground( true ); m_ptLabel->setAutoFillBackground( true ); m_ptIcon->setPalette( palette ); m_ptLabel->setPalette( palette ); CALAMARES_RETRANSLATE( retranslateUi(); ) } void DeviceInfoWidget::setPartitionTableType( PartitionTable::TableType type ) { m_tableType = type; retranslateUi(); } void DeviceInfoWidget::retranslateUi() { QString typeString = PartitionTable::tableTypeToName( m_tableType ).toUpper(); // fix up if the name shouldn't be uppercase: switch ( m_tableType ) { case PartitionTable::msdos: case PartitionTable::msdos_sectorbased: typeString = "MBR"; break; case PartitionTable::loop: typeString = "loop"; break; case PartitionTable::mac: typeString = "Mac"; break; case PartitionTable::amiga: typeString = "Amiga"; break; case PartitionTable::sun: typeString = "Sun"; break; case PartitionTable::unknownTableType: typeString = " ? "; } QString toolTipString = tr( "This device has a %1 partition " "table." ) .arg( typeString ); switch ( m_tableType ) { case PartitionTable::loop: toolTipString = tr( "This is a loop " "device.

" "It is a pseudo-device with no partition table " "that makes a file accessible as a block device. " "This kind of setup usually only contains a single filesystem." ); break; case PartitionTable::unknownTableType: toolTipString = tr( "This installer cannot detect a partition table on the " "selected storage device.

" "The device either has no partition " "table, or the partition table is corrupted or of an unknown " "type.
" "This installer can create a new partition table for you, " "either automatically, or through the manual partitioning " "page." ); break; case PartitionTable::gpt: toolTipString += tr( "

This is the recommended partition table type for modern " "systems which start from an EFI boot " "environment." ); break; case PartitionTable::msdos: case PartitionTable::msdos_sectorbased: toolTipString += tr( "

This partition table type is only advisable on older " "systems which start from a BIOS boot " "environment. GPT is recommended in most other cases.

" "Warning: the MBR partition table " "is an obsolete MS-DOS era standard.
" "Only 4 primary partitions may be created, and of " "those 4, one can be an extended partition, which " "may in turn contain many logical partitions." ); } m_ptLabel->setText( typeString ); m_ptLabel->setToolTip( toolTipString ); m_ptIcon->setToolTip( tr( "The type of partition table on the " "selected storage device.

" "The only way to change the partition table type is to " "erase and recreate the partition table from scratch, " "which destroys all data on the storage device.
" "This installer will keep the current partition table " "unless you explicitly choose otherwise.
" "If unsure, on modern systems GPT is preferred." ) ); } calamares-3.1.12/src/modules/partition/gui/DeviceInfoWidget.h000066400000000000000000000024101322271446000241100ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DEVICEINFOWIDGET_H #define DEVICEINFOWIDGET_H #include #include class QLabel; class DeviceInfoWidget : public QWidget { Q_OBJECT public: explicit DeviceInfoWidget( QWidget* parent = nullptr ); void setPartitionTableType( PartitionTable::TableType type ); public slots: void retranslateUi(); private: QLabel* m_ptIcon; QLabel* m_ptLabel; PartitionTable::TableType m_tableType; }; #endif // DEVICEINFOWIDGET_H calamares-3.1.12/src/modules/partition/gui/EditExistingPartitionDialog.cpp000066400000000000000000000264341322271446000267120ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Flags handling originally from KDE Partition Manager, * Copyright 2008-2009, Volker Lanz * Copyright 2016, Andrius Štikonas * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include #include #include #include "core/PartUtils.h" #include #include #include #include #include "GlobalStorage.h" #include "JobQueue.h" // KPMcore #include #include #include // Qt #include #include #include EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, Partition* partition, const QStringList& usedMountPoints, QWidget* parentWidget ) : QDialog( parentWidget ) , m_ui( new Ui_EditExistingPartitionDialog ) , m_device( device ) , m_partition( partition ) , m_partitionSizeController( new PartitionSizeController( this ) ) , m_usedMountPoints( usedMountPoints ) { m_ui->setupUi( this ); QStringList mountPoints = { "/", "/boot", "/home", "/opt", "/usr", "/var" }; if ( PartUtils::isEfiSystem() ) mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); mountPoints.removeDuplicates(); mountPoints.sort(); m_ui->mountPointComboBox->addItems( mountPoints ); QColor color = ColorUtils::colorForPartition( m_partition ); m_partitionSizeController->init( m_device, m_partition, color ); m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox ); m_ui->mountPointComboBox->setCurrentText( PartitionInfo::mountPoint( partition ) ); connect( m_ui->mountPointComboBox, &QComboBox::currentTextChanged, this, &EditExistingPartitionDialog::checkMountPointSelection ); replacePartResizerWidget(); connect( m_ui->formatRadioButton, &QAbstractButton::toggled, [ this ]( bool doFormat ) { replacePartResizerWidget(); m_ui->fileSystemLabel->setEnabled( doFormat ); m_ui->fileSystemComboBox->setEnabled( doFormat ); if ( !doFormat ) m_ui->fileSystemComboBox->setCurrentText( m_partition->fileSystem().name() ); updateMountPointPicker(); } ); connect( m_ui->fileSystemComboBox, &QComboBox::currentTextChanged, [ this ]( QString ) { updateMountPointPicker(); } ); // File system QStringList fsNames; for ( auto fs : FileSystemFactory::map() ) { if ( fs->supportCreate() != FileSystem::cmdSupportNone && fs->type() != FileSystem::Extended ) fsNames << fs->name(); } m_ui->fileSystemComboBox->addItems( fsNames ); if ( fsNames.contains( m_partition->fileSystem().name() ) ) m_ui->fileSystemComboBox->setCurrentText( m_partition->fileSystem().name() ); else m_ui->fileSystemComboBox->setCurrentText( Calamares::JobQueue::instance()-> globalStorage()-> value( "defaultFileSystemType" ).toString() ); m_ui->fileSystemLabel->setEnabled( m_ui->formatRadioButton->isChecked() ); m_ui->fileSystemComboBox->setEnabled( m_ui->formatRadioButton->isChecked() ); setupFlagsList(); } EditExistingPartitionDialog::~EditExistingPartitionDialog() {} PartitionTable::Flags EditExistingPartitionDialog::newFlags() const { PartitionTable::Flags flags; for ( int i = 0; i < m_ui->m_listFlags->count(); i++ ) if ( m_ui->m_listFlags->item( i )->checkState() == Qt::Checked ) flags |= static_cast< PartitionTable::Flag >( m_ui->m_listFlags->item( i )->data( Qt::UserRole ).toInt() ); return flags; } void EditExistingPartitionDialog::setupFlagsList() { int f = 1; QString s; while ( !( s = PartitionTable::flagName( static_cast< PartitionTable::Flag >( f ) ) ).isEmpty() ) { if ( m_partition->availableFlags() & f ) { QListWidgetItem* item = new QListWidgetItem( s ); m_ui->m_listFlags->addItem( item ); item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); item->setData( Qt::UserRole, f ); item->setCheckState( ( m_partition->activeFlags() & f ) ? Qt::Checked : Qt::Unchecked ); } f <<= 1; } } void EditExistingPartitionDialog::applyChanges( PartitionCoreModule* core ) { PartitionInfo::setMountPoint( m_partition, m_ui->mountPointComboBox->currentText() ); qint64 newFirstSector = m_partitionSizeController->firstSector(); qint64 newLastSector = m_partitionSizeController->lastSector(); bool partResizedMoved = newFirstSector != m_partition->firstSector() || newLastSector != m_partition->lastSector(); cDebug() << "old boundaries:" << m_partition->firstSector() << m_partition->lastSector() << m_partition->length(); cDebug() << "new boundaries:" << newFirstSector << newLastSector; cDebug() << "dirty status:" << m_partitionSizeController->isDirty(); FileSystem::Type fsType = FileSystem::Unknown; if ( m_ui->formatRadioButton->isChecked() ) { fsType = m_partition->roles().has( PartitionRole::Extended ) ? FileSystem::Extended : FileSystem::typeForName( m_ui->fileSystemComboBox->currentText() ); } if ( partResizedMoved ) { if ( m_ui->formatRadioButton->isChecked() ) { Partition* newPartition = KPMHelpers::createNewPartition( m_partition->parent(), *m_device, m_partition->roles(), fsType, newFirstSector, newLastSector, newFlags() ); PartitionInfo::setMountPoint( newPartition, PartitionInfo::mountPoint( m_partition ) ); PartitionInfo::setFormat( newPartition, true ); core->deletePartition( m_device, m_partition ); core->createPartition( m_device, newPartition ); core->setPartitionFlags( m_device, newPartition, newFlags() ); } else { core->resizePartition( m_device, m_partition, newFirstSector, newLastSector ); if ( m_partition->activeFlags() != newFlags() ) core->setPartitionFlags( m_device, m_partition, newFlags() ); } } else { // No size changes if ( m_ui->formatRadioButton->isChecked() ) { // if the FS type is unchanged, we just format if ( m_partition->fileSystem().type() == fsType ) { core->formatPartition( m_device, m_partition ); if ( m_partition->activeFlags() != newFlags() ) core->setPartitionFlags( m_device, m_partition, newFlags() ); } else // otherwise, we delete and recreate the partition with new fs type { Partition* newPartition = KPMHelpers::createNewPartition( m_partition->parent(), *m_device, m_partition->roles(), fsType, m_partition->firstSector(), m_partition->lastSector(), newFlags() ); PartitionInfo::setMountPoint( newPartition, PartitionInfo::mountPoint( m_partition ) ); PartitionInfo::setFormat( newPartition, true ); core->deletePartition( m_device, m_partition ); core->createPartition( m_device, newPartition ); core->setPartitionFlags( m_device, newPartition, newFlags() ); } } else { core->refreshPartition( m_device, m_partition ); if ( m_partition->activeFlags() != newFlags() ) core->setPartitionFlags( m_device, m_partition, newFlags() ); } } } void EditExistingPartitionDialog::replacePartResizerWidget() { /* * There is no way to reliably update the partition used by * PartResizerWidget, which is necessary when we switch between "format" and * "keep". This is a hack which replaces the existing PartResizerWidget * with a new one. */ PartResizerWidget* widget = new PartResizerWidget( this ); layout()->replaceWidget( m_ui->partResizerWidget, widget ); delete m_ui->partResizerWidget; m_ui->partResizerWidget = widget; m_partitionSizeController->setPartResizerWidget( widget, m_ui->formatRadioButton->isChecked() ); } void EditExistingPartitionDialog::updateMountPointPicker() { bool doFormat = m_ui->formatRadioButton->isChecked(); FileSystem::Type fsType = FileSystem::Unknown; if ( doFormat ) { fsType = FileSystem::typeForName( m_ui->fileSystemComboBox->currentText() ); } else { fsType = m_partition->fileSystem().type(); } bool canMount = true; if ( fsType == FileSystem::Extended || fsType == FileSystem::LinuxSwap || fsType == FileSystem::Unformatted || fsType == FileSystem::Unknown || fsType == FileSystem::Lvm2_PV ) { canMount = false; } m_ui->mountPointLabel->setEnabled( canMount ); m_ui->mountPointComboBox->setEnabled( canMount ); if ( !canMount ) m_ui->mountPointComboBox->setCurrentText( QString() ); } void EditExistingPartitionDialog::checkMountPointSelection() { const QString& selection = m_ui->mountPointComboBox->currentText(); if ( m_usedMountPoints.contains( selection ) ) { m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false ); } else { m_ui->labelMountPoint->setText( QString() ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true ); } } calamares-3.1.12/src/modules/partition/gui/EditExistingPartitionDialog.h000066400000000000000000000040501322271446000263450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef EDITEXISTINGPARTITIONDIALOG_H #define EDITEXISTINGPARTITIONDIALOG_H #include #include #include class PartitionCoreModule; class Device; class Partition; class PartitionSizeController; class Ui_EditExistingPartitionDialog; /** * The dialog which is shown to edit a partition which already existed when the installer started. * * It lets you decide how to reuse the partition: whether to keep its content * or reformat it, whether to resize or move it. */ class EditExistingPartitionDialog : public QDialog { Q_OBJECT public: EditExistingPartitionDialog( Device* device, Partition* partition, const QStringList& usedMountPoints, QWidget* parentWidget = nullptr ); ~EditExistingPartitionDialog(); void applyChanges( PartitionCoreModule* module ); private slots: void checkMountPointSelection(); private: QScopedPointer< Ui_EditExistingPartitionDialog > m_ui; Device* m_device; Partition* m_partition; PartitionSizeController* m_partitionSizeController; QStringList m_usedMountPoints; PartitionTable::Flags newFlags() const; void setupFlagsList(); void replacePartResizerWidget(); void updateMountPointPicker(); }; #endif /* EDITEXISTINGPARTITIONDIALOG_H */ calamares-3.1.12/src/modules/partition/gui/EditExistingPartitionDialog.ui000066400000000000000000000145641322271446000265460ustar00rootroot00000000000000 EditExistingPartitionDialog 0 0 450 579 0 0 Edit Existing Partition QLayout::SetMinimumSize 0 0 0 59 QFormLayout::ExpandingFieldsGrow Content: keepRadioButton &Keep true Format 0 0 300 0 Warning: Formatting the partition will erase all existing data. true &Mount Point: mountPointComboBox true -1 Si&ze: sizeSpinBox MiB Fi&le System: fileSystemComboBox Flags: true QAbstractItemView::NoSelection true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok PartResizerWidget QWidget
kpmcore/gui/partresizerwidget.h
1
sizeSpinBox keepRadioButton formatRadioButton mountPointComboBox buttonBox buttonBox accepted() EditExistingPartitionDialog accept() 248 254 157 274 buttonBox rejected() EditExistingPartitionDialog reject() 316 260 286 274
calamares-3.1.12/src/modules/partition/gui/EncryptWidget.cpp000066400000000000000000000103051322271446000240560ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "EncryptWidget.h" #include EncryptWidget::EncryptWidget( QWidget* parent ) : QWidget( parent ) , m_state( EncryptionDisabled ) { setupUi( this ); m_iconLabel->setFixedWidth( m_iconLabel->height() ); m_passphraseLineEdit->hide(); m_confirmLineEdit->hide(); m_iconLabel->hide(); connect( m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged ); connect( m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); connect( m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); setFixedHeight( m_passphraseLineEdit->height() ); // Avoid jumping up and down updateState(); } void EncryptWidget::reset() { m_passphraseLineEdit->clear(); m_confirmLineEdit->clear(); m_encryptCheckBox->setChecked( false ); } EncryptWidget::State EncryptWidget::state() const { return m_state; } void EncryptWidget::setText( const QString& text ) { m_encryptCheckBox->setText( text ); } QString EncryptWidget::passphrase() const { if ( m_state == EncryptionConfirmed ) return m_passphraseLineEdit->text(); return QString(); } void EncryptWidget::changeEvent( QEvent* e ) { QWidget::changeEvent( e ); switch ( e->type() ) { case QEvent::LanguageChange: retranslateUi( this ); break; default: break; } } void EncryptWidget::updateState() { State newState; if ( m_encryptCheckBox->isChecked() ) { if ( !m_passphraseLineEdit->text().isEmpty() && m_passphraseLineEdit->text() == m_confirmLineEdit->text() ) { newState = EncryptionConfirmed; } else { newState = EncryptionUnconfirmed; } } else { newState = EncryptionDisabled; } if ( newState != m_state ) { m_state = newState; emit stateChanged( m_state ); } } void EncryptWidget::onPassphraseEdited() { if ( !m_iconLabel->isVisible() ) m_iconLabel->show(); QString p1 = m_passphraseLineEdit->text(); QString p2 = m_confirmLineEdit->text(); m_iconLabel->setToolTip( QString() ); if ( p1.isEmpty() && p2.isEmpty() ) { m_iconLabel->clear(); } else if ( p1 == p2 ) { m_iconLabel->setFixedWidth( m_iconLabel->height() ); m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, m_iconLabel->size() ) ); } else { m_iconLabel->setFixedWidth( m_iconLabel->height() ); m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No, CalamaresUtils::Original, m_iconLabel->size() ) ); m_iconLabel->setToolTip( tr( "Please enter the same passphrase in both boxes." ) ); } updateState(); } void EncryptWidget::onCheckBoxStateChanged( int state ) { m_passphraseLineEdit->setVisible( state ); m_confirmLineEdit->setVisible( state ); m_iconLabel->setVisible( state ); m_passphraseLineEdit->clear(); m_confirmLineEdit->clear(); m_iconLabel->clear(); updateState(); } calamares-3.1.12/src/modules/partition/gui/EncryptWidget.h000066400000000000000000000027601322271446000235310ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef ENCRYPTWIDGET_H #define ENCRYPTWIDGET_H #include "ui_EncryptWidget.h" class EncryptWidget : public QWidget, private Ui::EncryptWidget { Q_OBJECT public: enum State : unsigned short { EncryptionDisabled = 0, EncryptionUnconfirmed, EncryptionConfirmed }; explicit EncryptWidget( QWidget* parent = nullptr ); void reset(); State state() const; void setText( const QString& text ); QString passphrase() const; signals: void stateChanged( State ); protected: void changeEvent( QEvent* e ); private: void updateState(); void onPassphraseEdited(); void onCheckBoxStateChanged( int state ); State m_state; }; #endif // ENCRYPTWIDGET_H calamares-3.1.12/src/modules/partition/gui/EncryptWidget.ui000066400000000000000000000032351322271446000237150ustar00rootroot00000000000000 EncryptWidget 0 0 822 59 Form 0 0 0 0 En&crypt system QLineEdit::Password Passphrase QLineEdit::Password Confirm passphrase Qt::AlignCenter calamares-3.1.12/src/modules/partition/gui/PartitionBarsView.cpp000066400000000000000000000413001322271446000247010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "gui/PartitionBarsView.h" #include #include #include #include #include // Qt #include #include #include #include static const int VIEW_HEIGHT = qMax( CalamaresUtils::defaultFontHeight() + 8, // wins out with big fonts int( CalamaresUtils::defaultFontHeight() * 0.6 ) + 22 ); // wins out with small fonts static constexpr int CORNER_RADIUS = 3; static const int EXTENDED_PARTITION_MARGIN = qMax( 4, VIEW_HEIGHT / 6 ); // The SELECTION_MARGIN is applied within a hardcoded 2px padding anyway, so // we start from EXTENDED_PARTITION_MARGIN - 2 in all cases. // Then we try to ensure the selection rectangle fits exactly between the extended // rectangle and the outer frame (the "/ 2" part), unless that's not possible, and in // that case we at least make sure we have a 1px gap between the selection rectangle // and the extended partition box (the "- 2" part). // At worst, on low DPI systems, this will mean in order: // 1px outer rect, 1 px gap, 1px selection rect, 1px gap, 1px extended partition rect. static const int SELECTION_MARGIN = qMin( ( EXTENDED_PARTITION_MARGIN - 2 ) / 2, ( EXTENDED_PARTITION_MARGIN - 2 ) - 2 ); PartitionBarsView::PartitionBarsView( QWidget* parent ) : QAbstractItemView( parent ) , m_nestedPartitionsMode( NoNestedPartitions ) , canBeSelected( []( const QModelIndex& ) { return true; } ) , m_hoveredIndex( QModelIndex() ) { setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setFrameStyle( QFrame::NoFrame ); setSelectionBehavior( QAbstractItemView::SelectRows ); setSelectionMode( QAbstractItemView::SingleSelection ); // Debug connect( this, &PartitionBarsView::clicked, this, [=]( const QModelIndex& index ) { cDebug() << "Clicked row" << index.row(); } ); setMouseTracking( true ); } PartitionBarsView::~PartitionBarsView() { } void PartitionBarsView::setNestedPartitionsMode( PartitionBarsView::NestedPartitionsMode mode ) { m_nestedPartitionsMode = mode; viewport()->repaint(); } QSize PartitionBarsView::minimumSizeHint() const { return sizeHint(); } QSize PartitionBarsView::sizeHint() const { return QSize( -1, VIEW_HEIGHT ); } void PartitionBarsView::paintEvent( QPaintEvent* event ) { QPainter painter( viewport() ); painter.fillRect( rect(), palette().window() ); painter.setRenderHint( QPainter::Antialiasing ); QRect partitionsRect = rect(); partitionsRect.setHeight( VIEW_HEIGHT ); painter.save(); drawPartitions( &painter, partitionsRect, QModelIndex() ); painter.restore(); } void PartitionBarsView::drawSection( QPainter* painter, const QRect& rect_, int x, int width, const QModelIndex& index ) { QColor color = index.isValid() ? index.data( Qt::DecorationRole ).value< QColor >() : ColorUtils::unknownDisklabelColor(); bool isFreeSpace = index.isValid() ? index.data( PartitionModel::IsFreeSpaceRole ).toBool() : true; QRect rect = rect_; const int y = rect.y(); const int height = rect.height(); const int radius = qMax( 1, CORNER_RADIUS - ( VIEW_HEIGHT - height ) / 2 ); painter->setClipRect( x, y, width, height ); painter->translate( 0.5, 0.5 ); rect.adjust( 0, 0, -1, -1 ); if ( selectionMode() != QAbstractItemView::NoSelection && // no hover without selection m_hoveredIndex.isValid() && index == m_hoveredIndex ) { if ( canBeSelected( index ) ) painter->setBrush( color.lighter( 115 ) ); else painter->setBrush( color ); } else { painter->setBrush( color ); } QColor borderColor = color.darker(); painter->setPen( borderColor ); painter->drawRoundedRect( rect, radius, radius ); // Draw shade if ( !isFreeSpace ) rect.adjust( 2, 2, -2, -2 ); QLinearGradient gradient( 0, 0, 0, height / 2 ); qreal c = isFreeSpace ? 0 : 1; gradient.setColorAt( 0, QColor::fromRgbF( c, c, c, 0.3 ) ); gradient.setColorAt( 1, QColor::fromRgbF( c, c, c, 0 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( gradient ); painter->drawRoundedRect( rect, radius, radius ); if ( selectionMode() != QAbstractItemView::NoSelection && index.isValid() && selectionModel() && !selectionModel()->selectedIndexes().isEmpty() && selectionModel()->selectedIndexes().first() == index ) { painter->setPen( QPen( borderColor, 1 ) ); QColor highlightColor = QPalette().highlight().color(); highlightColor = highlightColor.lighter( 500 ); highlightColor.setAlpha( 120 ); painter->setBrush( highlightColor ); QRect selectionRect = rect; selectionRect.setX( x + 1 ); selectionRect.setWidth( width - 3 ); //account for the previous rect.adjust if ( rect.x() > selectionRect.x() ) //hack for first item selectionRect.adjust( rect.x() - selectionRect.x(), 0, 0, 0 ); if ( rect.right() < selectionRect.right() ) //hack for last item selectionRect.adjust( 0, 0, - ( selectionRect.right() - rect.right() ), 0 ); selectionRect.adjust( SELECTION_MARGIN, SELECTION_MARGIN, -SELECTION_MARGIN, -SELECTION_MARGIN ); painter->drawRoundedRect( selectionRect, radius - 1, radius - 1 ); } painter->translate( -0.5, -0.5 ); } void PartitionBarsView::drawPartitions( QPainter* painter, const QRect& rect, const QModelIndex& parent ) { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return; const int totalWidth = rect.width(); auto pair = computeItemsVector( parent ); QVector< PartitionBarsView::Item >& items = pair.first; qreal& total = pair.second; int x = rect.x(); for ( int row = 0; row < items.count(); ++row ) { const auto& item = items[ row ]; int width; if ( row < items.count() - 1 ) width = totalWidth * ( item.size / total ); else // Make sure we fill the last pixel column width = rect.right() - x + 1; drawSection( painter, rect, x, width, item.index ); if ( m_nestedPartitionsMode == DrawNestedPartitions && modl->hasChildren( item.index ) ) { QRect subRect( x + EXTENDED_PARTITION_MARGIN, rect.y() + EXTENDED_PARTITION_MARGIN, width - 2 * EXTENDED_PARTITION_MARGIN, rect.height() - 2 * EXTENDED_PARTITION_MARGIN ); drawPartitions( painter, subRect, item.index ); } x += width; } if ( !items.count() && !modl->device()->partitionTable() ) // No disklabel or unknown { int width = rect.right() - rect.x() + 1; drawSection( painter, rect, rect.x(), width, QModelIndex() ); } } QModelIndex PartitionBarsView::indexAt( const QPoint& point ) const { return indexAt( point, rect(), QModelIndex() ); } QModelIndex PartitionBarsView::indexAt( const QPoint &point, const QRect &rect, const QModelIndex& parent ) const { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return QModelIndex(); const int totalWidth = rect.width(); auto pair = computeItemsVector( parent ); QVector< PartitionBarsView::Item >& items = pair.first; qreal& total = pair.second; int x = rect.x(); for ( int row = 0; row < items.count(); ++row ) { const auto& item = items[ row ]; int width; if ( row < items.count() - 1 ) width = totalWidth * ( item.size / total ); else // Make sure we fill the last pixel column width = rect.right() - x + 1; QRect thisItemRect( x, rect.y(), width, rect.height() ); if ( thisItemRect.contains( point ) ) { if ( m_nestedPartitionsMode == DrawNestedPartitions && modl->hasChildren( item.index ) ) { QRect subRect( x + EXTENDED_PARTITION_MARGIN, rect.y() + EXTENDED_PARTITION_MARGIN, width - 2 * EXTENDED_PARTITION_MARGIN, rect.height() - 2 * EXTENDED_PARTITION_MARGIN ); if ( subRect.contains( point ) ) { return indexAt( point, subRect, item.index ); } return item.index; } else // contains but no children, we win { return item.index; } } x += width; } return QModelIndex(); } QRect PartitionBarsView::visualRect( const QModelIndex& index ) const { return visualRect( index, rect(), QModelIndex() ); } QRect PartitionBarsView::visualRect( const QModelIndex& index, const QRect& rect, const QModelIndex& parent ) const { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return QRect(); const int totalWidth = rect.width(); auto pair = computeItemsVector( parent ); QVector< PartitionBarsView::Item >& items = pair.first; qreal& total = pair.second; int x = rect.x(); for ( int row = 0; row < items.count(); ++row ) { const auto& item = items[ row ]; int width; if ( row < items.count() - 1 ) width = totalWidth * ( item.size / total ); else // Make sure we fill the last pixel column width = rect.right() - x + 1; QRect thisItemRect( x, rect.y(), width, rect.height() ); if ( item.index == index ) return thisItemRect; if ( m_nestedPartitionsMode == DrawNestedPartitions && modl->hasChildren( item.index ) && index.parent() == item.index ) { QRect subRect( x + EXTENDED_PARTITION_MARGIN, rect.y() + EXTENDED_PARTITION_MARGIN, width - 2 * EXTENDED_PARTITION_MARGIN, rect.height() - 2 * EXTENDED_PARTITION_MARGIN ); QRect candidateVisualRect = visualRect( index, subRect, item.index ); if ( !candidateVisualRect.isNull() ) return candidateVisualRect; } x += width; } return QRect(); } QRegion PartitionBarsView::visualRegionForSelection( const QItemSelection& selection ) const { return QRegion(); } int PartitionBarsView::horizontalOffset() const { return 0; } int PartitionBarsView::verticalOffset() const { return 0; } void PartitionBarsView::scrollTo( const QModelIndex& index, ScrollHint hint ) { Q_UNUSED( index ) Q_UNUSED( hint ) } void PartitionBarsView::setSelectionModel( QItemSelectionModel* selectionModel ) { QAbstractItemView::setSelectionModel( selectionModel ); connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [=] { viewport()->repaint(); } ); } void PartitionBarsView::setSelectionFilter( std::function< bool ( const QModelIndex& ) > canBeSelected ) { this->canBeSelected = canBeSelected; } QModelIndex PartitionBarsView::moveCursor( CursorAction, Qt::KeyboardModifiers ) { return QModelIndex(); } bool PartitionBarsView::isIndexHidden( const QModelIndex& ) const { return false; } void PartitionBarsView::setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) { //HACK: this is an utterly awful workaround, which is unfortunately necessary. // QAbstractItemView::mousePressedEvent calls setSelection, but before that, // for some mental reason, it works under the assumption that every item is a // rectangle. This rectangle is provided by visualRect, and the idea mostly // works, except when the item is an extended partition item, which is of course // a rectangle with a rectangular hole in the middle. // QAbstractItemView::mousePressEvent builds a QRect with x1, y1 in the center // of said visualRect, and x2, y2 in the real QMouseEvent position. // This may very well yield a QRect with negative size, which is meaningless. // Therefore the QRect we get here is totally bogus, and its topLeft is outside // the actual area of the item we need. // What we need are the real coordinates of the QMouseEvent, and the only way to // get them is by fetching the private x2, y2 from the rect. // TL;DR: this sucks, look away. -- Teo 12/2015 int x1, y1, x2, y2; rect.getCoords( &x1, &y1, &x2, &y2 ); QModelIndex eventIndex = indexAt( QPoint( x2, y2 ) ); if ( canBeSelected( eventIndex ) ) selectionModel()->select( eventIndex, flags ); viewport()->repaint(); } void PartitionBarsView::mouseMoveEvent( QMouseEvent* event ) { QModelIndex candidateIndex = indexAt( event->pos() ); QPersistentModelIndex oldHoveredIndex = m_hoveredIndex; if ( candidateIndex.isValid() ) { m_hoveredIndex = candidateIndex; } else { m_hoveredIndex = QModelIndex(); QGuiApplication::restoreOverrideCursor(); } if ( oldHoveredIndex != m_hoveredIndex ) { if ( m_hoveredIndex.isValid() && !canBeSelected( m_hoveredIndex ) ) QGuiApplication::setOverrideCursor( Qt::ForbiddenCursor ); else QGuiApplication::restoreOverrideCursor(); viewport()->repaint(); } } void PartitionBarsView::leaveEvent( QEvent* ) { QGuiApplication::restoreOverrideCursor(); if ( m_hoveredIndex.isValid() ) { m_hoveredIndex = QModelIndex(); viewport()->repaint(); } } void PartitionBarsView::mousePressEvent( QMouseEvent* event ) { QModelIndex candidateIndex = indexAt( event->pos() ); if ( canBeSelected( candidateIndex ) ) QAbstractItemView::mousePressEvent( event ); else event->accept(); } void PartitionBarsView::updateGeometries() { updateGeometry(); //get a new rect() for redrawing all the labels } QPair< QVector< PartitionBarsView::Item >, qreal > PartitionBarsView::computeItemsVector( const QModelIndex& parent ) const { int count = model()->rowCount( parent ); QVector< PartitionBarsView::Item > items; qreal total = 0; for ( int row = 0; row < count; ++row ) { QModelIndex index = model()->index( row, 0, parent ); if ( m_nestedPartitionsMode == NoNestedPartitions && model()->hasChildren( index ) ) { QPair< QVector< PartitionBarsView::Item >, qreal > childVect = computeItemsVector( index ); items += childVect.first; total += childVect.second; } else { qreal size = index.data( PartitionModel::SizeRole ).toLongLong(); total += size; items.append( { size, index } ); } } count = items.count(); // The sizes we have are perfect, but now we have to hardcode a minimum size for small // partitions and compensate for it in the total. qreal adjustedTotal = total; for ( int row = 0; row < count; ++row ) { if ( items[ row ].size < 0.01 * total ) // If this item is smaller than 1% of everything, { // force its width to 1%. adjustedTotal -= items[ row ].size; items[ row ].size = 0.01 * total; adjustedTotal += items[ row ].size; } } return qMakePair( items, adjustedTotal ); } calamares-3.1.12/src/modules/partition/gui/PartitionBarsView.h000066400000000000000000000071231322271446000243530ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONPREVIEW_H #define PARTITIONPREVIEW_H #include "PartitionViewSelectionFilter.h" #include /** * A Qt model view which displays the partitions inside a device as a colored bar. * * It has been created to be used with a PartitionModel instance, but does not * call any PartitionModel-specific methods: it should be usable with other * models as long as they provide the same roles PartitionModel provides. */ class PartitionBarsView : public QAbstractItemView { Q_OBJECT public: enum NestedPartitionsMode { NoNestedPartitions = 0, DrawNestedPartitions }; explicit PartitionBarsView( QWidget* parent = nullptr ); virtual ~PartitionBarsView() override; void setNestedPartitionsMode( NestedPartitionsMode mode ); QSize minimumSizeHint() const override; QSize sizeHint() const override; void paintEvent( QPaintEvent* event ) override; // QAbstractItemView API QModelIndex indexAt( const QPoint& point ) const override; QRect visualRect( const QModelIndex& index ) const override; void scrollTo( const QModelIndex& index, ScrollHint hint = EnsureVisible ) override; void setSelectionModel( QItemSelectionModel* selectionModel ) override; void setSelectionFilter( SelectionFilter canBeSelected ); protected: // QAbstractItemView API QRegion visualRegionForSelection( const QItemSelection& selection ) const override; int horizontalOffset() const override; int verticalOffset() const override; bool isIndexHidden( const QModelIndex& index ) const override; QModelIndex moveCursor( CursorAction cursorAction, Qt::KeyboardModifiers modifiers ) override; void setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) override; void mouseMoveEvent( QMouseEvent* event ) override; void leaveEvent( QEvent* event ) override; void mousePressEvent( QMouseEvent* event ) override; protected slots: void updateGeometries() override; private: void drawPartitions( QPainter* painter, const QRect& rect, const QModelIndex& parent ); void drawSection( QPainter* painter, const QRect& rect_, int x, int width, const QModelIndex& index ); QModelIndex indexAt( const QPoint& point, const QRect& rect, const QModelIndex& parent ) const; QRect visualRect( const QModelIndex& index, const QRect& rect, const QModelIndex& parent ) const; NestedPartitionsMode m_nestedPartitionsMode; SelectionFilter canBeSelected; struct Item { qreal size; QModelIndex index; }; inline QPair< QVector< Item >, qreal > computeItemsVector( const QModelIndex& parent ) const; QPersistentModelIndex m_hoveredIndex; }; #endif /* PARTITIONPREVIEW_H */ calamares-3.1.12/src/modules/partition/gui/PartitionLabelsView.cpp000066400000000000000000000424101322271446000252170ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PartitionLabelsView.h" #include #include #include #include #include #include #include // Qt #include #include #include static const int LAYOUT_MARGIN = 4; static const int LABEL_PARTITION_SQUARE_MARGIN = qMax( QFontMetrics( CalamaresUtils::defaultFont() ).ascent() - 2, 18 ); static const int LABELS_MARGIN = LABEL_PARTITION_SQUARE_MARGIN; static const int CORNER_RADIUS = 2; static QStringList buildUnknownDisklabelTexts( Device* dev ) { QStringList texts = { QObject::tr( "Unpartitioned space or unknown partition table" ), KFormat().formatByteSize( dev->totalLogical() * dev->logicalSize() ) }; return texts; } PartitionLabelsView::PartitionLabelsView( QWidget* parent ) : QAbstractItemView( parent ) , m_canBeSelected( []( const QModelIndex& ) { return true; } ) , m_extendedPartitionHidden( false ) { setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setFrameStyle( QFrame::NoFrame ); setSelectionBehavior( QAbstractItemView::SelectRows ); setSelectionMode( QAbstractItemView::SingleSelection ); // Debug connect( this, &PartitionLabelsView::clicked, this, [=]( const QModelIndex& index ) { cDebug() << "Clicked row" << index.row(); } ); setMouseTracking( true ); } PartitionLabelsView::~PartitionLabelsView() { } QSize PartitionLabelsView::minimumSizeHint() const { return sizeHint(); } QSize PartitionLabelsView::sizeHint() const { QAbstractItemModel* modl = model(); if ( modl ) { return QSize( -1, LAYOUT_MARGIN + sizeForAllLabels( rect().width() ).height() ); } return QSize(); } void PartitionLabelsView::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QPainter painter( viewport() ); painter.fillRect( rect(), palette().window() ); painter.setRenderHint( QPainter::Antialiasing ); QRect lRect = labelsRect(); drawLabels( &painter, lRect, QModelIndex() ); } QRect PartitionLabelsView::labelsRect() const { return rect().adjusted( 0, LAYOUT_MARGIN, 0, 0 ); } static void drawPartitionSquare( QPainter* painter, const QRect& rect, const QBrush& brush ) { painter->fillRect( rect.adjusted( 1, 1, -1, -1 ), brush ); painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( QPalette().shadow().color() ); painter->translate( .5, .5 ); painter->drawRoundedRect( rect.adjusted( 0, 0, -1, -1 ), CORNER_RADIUS, CORNER_RADIUS ); painter->translate( -.5, -.5 ); } static void drawSelectionSquare( QPainter* painter, const QRect& rect, const QBrush& brush ) { painter->save(); painter->setPen( QPen( brush.color().darker(), 1 ) ); QColor highlightColor = QPalette().highlight().color(); highlightColor = highlightColor.lighter( 500 ); highlightColor.setAlpha( 120 ); painter->setBrush( highlightColor ); painter->translate( .5, .5 ); painter->drawRoundedRect( rect.adjusted( 0, 0, -1, -1 ), CORNER_RADIUS, CORNER_RADIUS ); painter->translate( -.5, -.5 ); painter->restore(); } QModelIndexList PartitionLabelsView::getIndexesToDraw( const QModelIndex& parent ) const { QModelIndexList list; QAbstractItemModel* modl = model(); if ( !modl ) return list; for ( int row = 0; row < modl->rowCount( parent ); ++row ) { QModelIndex index = modl->index( row, 0, parent ); //HACK: horrible special casing follows. // To save vertical space, we choose to hide short instances of free space. // Arbitrary limit: 10MB. const qint64 maxHiddenB = 10000000; if ( index.data( PartitionModel::IsFreeSpaceRole ).toBool() && index.data( PartitionModel::SizeRole ).toLongLong() < maxHiddenB ) continue; if ( !modl->hasChildren( index ) || !m_extendedPartitionHidden ) list.append( index ); if ( modl->hasChildren( index ) ) list.append( getIndexesToDraw( index ) ); } return list; } QStringList PartitionLabelsView::buildTexts( const QModelIndex& index ) const { QString firstLine, secondLine; if ( index.data( PartitionModel::IsPartitionNewRole ).toBool() ) { QString mountPoint = index.sibling( index.row(), PartitionModel::MountPointColumn ) .data().toString(); if ( mountPoint == "/" ) firstLine = m_customNewRootLabel.isEmpty() ? tr( "Root" ) : m_customNewRootLabel; else if ( mountPoint == "/home" ) firstLine = tr( "Home" ); else if ( mountPoint == "/boot" ) firstLine = tr( "Boot" ); else if ( mountPoint.contains( "/efi" ) && index.data( PartitionModel::FileSystemTypeRole ).toInt() == FileSystem::Fat32 ) firstLine = tr( "EFI system" ); else if ( index.data( PartitionModel::FileSystemTypeRole ).toInt() == FileSystem::LinuxSwap ) firstLine = tr( "Swap" ); else if ( !mountPoint.isEmpty() ) firstLine = tr( "New partition for %1" ).arg( mountPoint ); else firstLine = tr( "New partition" ); } else if ( index.data( PartitionModel::OsproberNameRole ).toString().isEmpty() ) { firstLine = index.data().toString(); if ( firstLine.startsWith( "/dev/" ) ) firstLine.remove( 0, 5 ); // "/dev/" } else firstLine = index.data( PartitionModel::OsproberNameRole ).toString(); if ( index.data( PartitionModel::IsFreeSpaceRole ).toBool() || index.data( PartitionModel::FileSystemTypeRole ).toInt() == FileSystem::Extended ) secondLine = index.sibling( index.row(), PartitionModel::SizeColumn ) .data().toString(); else secondLine = tr( "%1 %2" ) .arg( index.sibling( index.row(), PartitionModel::SizeColumn ) .data().toString() ) .arg( index.sibling( index.row(), PartitionModel::FileSystemColumn ) .data().toString() ); return { firstLine, secondLine }; } void PartitionLabelsView::drawLabels( QPainter* painter, const QRect& rect, const QModelIndex& parent ) { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return; const QModelIndexList indexesToDraw = getIndexesToDraw( parent ); int label_x = rect.x(); int label_y = rect.y(); for ( const QModelIndex& index : indexesToDraw ) { QStringList texts = buildTexts( index ); QSize labelSize = sizeForLabel( texts ); QColor labelColor = index.data( Qt::DecorationRole ).value< QColor >(); if ( label_x + labelSize.width() > rect.width() ) //wrap to new line if overflow { label_x = rect.x(); label_y += labelSize.height() + labelSize.height() / 4; } // Draw hover if ( selectionMode() != QAbstractItemView::NoSelection && // no hover without selection m_hoveredIndex.isValid() && index == m_hoveredIndex ) { painter->save(); QRect labelRect( QPoint( label_x, label_y ), labelSize ); labelRect.adjust( 0, -LAYOUT_MARGIN, 0, -2*LAYOUT_MARGIN ); painter->translate( 0.5, 0.5 ); QRect hoverRect = labelRect.adjusted( 0, 0, -1, -1 ); painter->setBrush( QPalette().background().color().lighter( 102 ) ); painter->setPen( Qt::NoPen ); painter->drawRoundedRect( hoverRect, CORNER_RADIUS, CORNER_RADIUS ); painter->translate( -0.5, -0.5 ); painter->restore(); } // Is this element the selected one? bool sel = selectionMode() != QAbstractItemView::NoSelection && index.isValid() && selectionModel() && !selectionModel()->selectedIndexes().isEmpty() && selectionModel()->selectedIndexes().first() == index; drawLabel( painter, texts, labelColor, QPoint( label_x, label_y ), sel ); label_x += labelSize.width() + LABELS_MARGIN; } if ( !modl->rowCount() && !modl->device()->partitionTable() ) // No disklabel or unknown { QStringList texts = buildUnknownDisklabelTexts( modl->device() ); QColor labelColor = ColorUtils::unknownDisklabelColor(); drawLabel( painter, texts, labelColor, QPoint( rect.x(), rect.y() ), false /*can't be selected*/ ); } } QSize PartitionLabelsView::sizeForAllLabels( int maxLineWidth ) const { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return QSize(); const QModelIndexList indexesToDraw = getIndexesToDraw( QModelIndex() ); int lineLength = 0; int numLines = 1; int singleLabelHeight = 0; for ( const QModelIndex& index : indexesToDraw ) { QStringList texts = buildTexts( index ); QSize labelSize = sizeForLabel( texts ); if ( lineLength + labelSize.width() > maxLineWidth ) { numLines++; lineLength = labelSize.width(); } else { lineLength += LABELS_MARGIN + labelSize.width(); } singleLabelHeight = qMax( singleLabelHeight, labelSize.height() ); } if ( !modl->rowCount() && !modl->device()->partitionTable() ) // Unknown or no disklabel { singleLabelHeight = sizeForLabel( buildUnknownDisklabelTexts( modl->device() ) ) .height(); } int totalHeight = numLines * singleLabelHeight + ( numLines - 1 ) * singleLabelHeight / 4; //spacings return QSize( maxLineWidth, totalHeight ); } QSize PartitionLabelsView::sizeForLabel( const QStringList& text ) const { int vertOffset = 0; int width = 0; for ( const QString& textLine : text ) { QSize textSize = fontMetrics().size( Qt::TextSingleLine, textLine ); vertOffset += textSize.height(); width = qMax( width, textSize.width() ); } width += LABEL_PARTITION_SQUARE_MARGIN; //for the color square return QSize( width, vertOffset ); } void PartitionLabelsView::drawLabel( QPainter* painter, const QStringList& text, const QColor& color, const QPoint& pos, bool selected ) { painter->setPen( Qt::black ); int vertOffset = 0; int width = 0; for ( const QString& textLine : text ) { QSize textSize = painter->fontMetrics().size( Qt::TextSingleLine, textLine ); painter->drawText( pos.x()+LABEL_PARTITION_SQUARE_MARGIN, pos.y() + vertOffset + textSize.height() / 2, textLine ); vertOffset += textSize.height(); painter->setPen( Qt::gray ); width = qMax( width, textSize.width() ); } QRect partitionSquareRect( pos.x(), pos.y() - 3, LABEL_PARTITION_SQUARE_MARGIN - 5, LABEL_PARTITION_SQUARE_MARGIN - 5 ); drawPartitionSquare( painter, partitionSquareRect, color ); if ( selected ) drawSelectionSquare( painter, partitionSquareRect.adjusted( 2, 2, -2, -2 ), color ); painter->setPen( Qt::black ); } QModelIndex PartitionLabelsView::indexAt( const QPoint& point ) const { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return QModelIndex(); const QModelIndexList indexesToDraw = getIndexesToDraw( QModelIndex() ); QRect rect = this->rect(); int label_x = rect.x(); int label_y = rect.y(); for ( const QModelIndex& index : indexesToDraw ) { QStringList texts = buildTexts( index ); QSize labelSize = sizeForLabel( texts ); if ( label_x + labelSize.width() > rect.width() ) //wrap to new line if overflow { label_x = rect.x(); label_y += labelSize.height() + labelSize.height() / 4; } QRect labelRect( QPoint( label_x, label_y ), labelSize ); if ( labelRect.contains( point ) ) return index; label_x += labelSize.width() + LABELS_MARGIN; } return QModelIndex(); } QRect PartitionLabelsView::visualRect( const QModelIndex& idx ) const { PartitionModel* modl = qobject_cast< PartitionModel* >( model() ); if ( !modl ) return QRect(); const QModelIndexList indexesToDraw = getIndexesToDraw( QModelIndex() ); QRect rect = this->rect(); int label_x = rect.x(); int label_y = rect.y(); for ( const QModelIndex& index : indexesToDraw ) { QStringList texts = buildTexts( index ); QSize labelSize = sizeForLabel( texts ); if ( label_x + labelSize.width() > rect.width() ) //wrap to new line if overflow { label_x = rect.x(); label_y += labelSize.height() + labelSize.height() / 4; } if ( idx.isValid() && idx == index ) return QRect( QPoint( label_x, label_y ), labelSize ); label_x += labelSize.width() + LABELS_MARGIN; } return QRect(); } QRegion PartitionLabelsView::visualRegionForSelection( const QItemSelection& selection ) const { Q_UNUSED( selection ); return QRegion(); } int PartitionLabelsView::horizontalOffset() const { return 0; } int PartitionLabelsView::verticalOffset() const { return 0; } void PartitionLabelsView::scrollTo( const QModelIndex& index, ScrollHint hint ) { Q_UNUSED( index ) Q_UNUSED( hint ) } void PartitionLabelsView::setCustomNewRootLabel( const QString& text ) { m_customNewRootLabel = text; viewport()->repaint(); } void PartitionLabelsView::setSelectionModel( QItemSelectionModel* selectionModel ) { QAbstractItemView::setSelectionModel( selectionModel ); connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [=] { viewport()->repaint(); } ); } void PartitionLabelsView::setSelectionFilter( SelectionFilter canBeSelected ) { m_canBeSelected = canBeSelected; } void PartitionLabelsView::setExtendedPartitionHidden( bool hidden ) { m_extendedPartitionHidden = hidden; } QModelIndex PartitionLabelsView::moveCursor( CursorAction cursorAction, Qt::KeyboardModifiers modifiers ) { Q_UNUSED( cursorAction ); Q_UNUSED( modifiers ); return QModelIndex(); } bool PartitionLabelsView::isIndexHidden( const QModelIndex& index ) const { Q_UNUSED( index ); return false; } void PartitionLabelsView::setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) { QModelIndex eventIndex = indexAt( rect.topLeft() ); if ( m_canBeSelected( eventIndex ) ) selectionModel()->select( eventIndex, flags ); } void PartitionLabelsView::mouseMoveEvent( QMouseEvent* event ) { QModelIndex candidateIndex = indexAt( event->pos() ); QPersistentModelIndex oldHoveredIndex = m_hoveredIndex; if ( candidateIndex.isValid() ) { m_hoveredIndex = candidateIndex; } else { m_hoveredIndex = QModelIndex(); QGuiApplication::restoreOverrideCursor(); } if ( oldHoveredIndex != m_hoveredIndex ) { if ( m_hoveredIndex.isValid() && !m_canBeSelected( m_hoveredIndex ) ) QGuiApplication::setOverrideCursor( Qt::ForbiddenCursor ); else QGuiApplication::restoreOverrideCursor(); viewport()->repaint(); } } void PartitionLabelsView::leaveEvent( QEvent* event ) { Q_UNUSED( event ); QGuiApplication::restoreOverrideCursor(); if ( m_hoveredIndex.isValid() ) { m_hoveredIndex = QModelIndex(); viewport()->repaint(); } } void PartitionLabelsView::mousePressEvent( QMouseEvent* event ) { QModelIndex candidateIndex = indexAt( event->pos() ); if ( m_canBeSelected( candidateIndex ) ) QAbstractItemView::mousePressEvent( event ); else event->accept(); } void PartitionLabelsView::updateGeometries() { updateGeometry(); //get a new rect() for redrawing all the labels } calamares-3.1.12/src/modules/partition/gui/PartitionLabelsView.h000066400000000000000000000067401322271446000246720ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONLABELSVIEW_H #define PARTITIONLABELSVIEW_H #include "PartitionViewSelectionFilter.h" #include /** * A Qt model view which displays colored labels for partitions. * * It has been created to be used with a PartitionModel instance, but does not * call any PartitionModel-specific methods: it should be usable with other * models as long as they provide the same roles PartitionModel provides. */ class PartitionLabelsView : public QAbstractItemView { Q_OBJECT public: explicit PartitionLabelsView( QWidget* parent = nullptr ); virtual ~PartitionLabelsView() override; QSize minimumSizeHint() const override; QSize sizeHint() const override; void paintEvent( QPaintEvent* event ) override; // QAbstractItemView API QModelIndex indexAt( const QPoint& point ) const override; QRect visualRect( const QModelIndex& idx ) const override; void scrollTo( const QModelIndex& index, ScrollHint hint = EnsureVisible ) override; void setCustomNewRootLabel( const QString& text ); void setSelectionModel( QItemSelectionModel* selectionModel ) override; void setSelectionFilter( SelectionFilter canBeSelected ); void setExtendedPartitionHidden( bool hidden ); protected: // QAbstractItemView API QRegion visualRegionForSelection( const QItemSelection& selection ) const override; int horizontalOffset() const override; int verticalOffset() const override; bool isIndexHidden( const QModelIndex& index ) const override; QModelIndex moveCursor( CursorAction cursorAction, Qt::KeyboardModifiers modifiers ) override; void setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) override; void mouseMoveEvent( QMouseEvent* event ) override; void leaveEvent( QEvent* event ) override; void mousePressEvent( QMouseEvent* event ) override; protected slots: void updateGeometries() override; private: QRect labelsRect() const; void drawLabels( QPainter* painter, const QRect& rect, const QModelIndex& parent ); QSize sizeForAllLabels( int maxLineWidth ) const; QSize sizeForLabel( const QStringList& text ) const; void drawLabel( QPainter* painter, const QStringList& text, const QColor& color, const QPoint& pos , bool selected ); QModelIndexList getIndexesToDraw( const QModelIndex& parent ) const; QStringList buildTexts( const QModelIndex& index ) const; SelectionFilter m_canBeSelected; bool m_extendedPartitionHidden; QString m_customNewRootLabel; QPersistentModelIndex m_hoveredIndex; }; #endif // PARTITIONLABELSVIEW_H calamares-3.1.12/src/modules/partition/gui/PartitionPage.cpp000066400000000000000000000360541322271446000240450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PartitionPage.h" // Local #include "core/BootLoaderModel.h" #include "core/DeviceModel.h" #include "core/PartitionCoreModule.h" #include "core/PartitionInfo.h" #include "core/PartitionModel.h" #include "core/PartUtils.h" #include "core/KPMHelpers.h" #include "gui/CreatePartitionDialog.h" #include "gui/EditExistingPartitionDialog.h" #include "gui/ScanningDialog.h" #include "ui_PartitionPage.h" #include "ui_CreatePartitionTableDialog.h" #include "utils/Retranslator.h" #include "Branding.h" #include "JobQueue.h" #include "GlobalStorage.h" // KPMcore #include #include // Qt #include #include #include #include #include #include #include #include PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent ) : QWidget( parent ) , m_ui( new Ui_PartitionPage ) , m_core( core ) , m_lastSelectedBootLoaderIndex(-1) , m_isEfi( false ) { m_isEfi = PartUtils::isEfiSystem(); m_ui->setupUi( this ); m_ui->partitionLabelsView->setVisible( Calamares::JobQueue::instance()->globalStorage()-> value( "alwaysShowPartitionLabels" ).toBool() ); m_ui->deviceComboBox->setModel( m_core->deviceModel() ); m_ui->bootLoaderComboBox->setModel( m_core->bootLoaderModel() ); PartitionBarsView::NestedPartitionsMode mode = Calamares::JobQueue::instance()->globalStorage()-> value( "drawNestedPartitions" ).toBool() ? PartitionBarsView::DrawNestedPartitions : PartitionBarsView::NoNestedPartitions; m_ui->partitionBarsView->setNestedPartitionsMode( mode ); updateButtons(); updateBootLoaderInstallPath(); updateFromCurrentDevice(); connect( m_ui->deviceComboBox, &QComboBox::currentTextChanged, [ this ]( const QString& /* text */ ) { updateFromCurrentDevice(); } ); connect( m_ui->bootLoaderComboBox, static_cast(&QComboBox::activated), [ this ]( const QString& /* text */ ) { m_lastSelectedBootLoaderIndex = m_ui->bootLoaderComboBox->currentIndex(); } ); connect( m_ui->bootLoaderComboBox, &QComboBox::currentTextChanged, [ this ]( const QString& /* text */ ) { updateBootLoaderInstallPath(); } ); connect( m_core, &PartitionCoreModule::isDirtyChanged, m_ui->revertButton, &QWidget::setEnabled ); connect( m_ui->partitionTreeView, &QAbstractItemView::doubleClicked, this, &PartitionPage::onPartitionViewActivated ); connect( m_ui->revertButton, &QAbstractButton::clicked, this, &PartitionPage::onRevertClicked ); connect( m_ui->newPartitionTableButton, &QAbstractButton::clicked, this, &PartitionPage::onNewPartitionTableClicked ); connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked ); connect( m_ui->editButton, &QAbstractButton::clicked, this, &PartitionPage::onEditClicked ); connect( m_ui->deleteButton, &QAbstractButton::clicked, this, &PartitionPage::onDeleteClicked ); if ( m_isEfi ) { m_ui->bootLoaderComboBox->hide(); m_ui->label_3->hide(); } CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); ) } PartitionPage::~PartitionPage() { } void PartitionPage::updateButtons() { bool create = false, edit = false, del = false; QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( index.isValid() ) { const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Q_ASSERT( model ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); bool isFree = KPMHelpers::isPartitionFreeSpace( partition ); bool isExtended = partition->roles().has( PartitionRole::Extended ); create = isFree; // Keep it simple for now: do not support editing extended partitions as // it does not work with our current edit implementation which is // actually remove + add. This would not work with extended partitions // because they need to be created *before* creating logical partitions // inside them, so an edit must be applied without altering the job // order. edit = !isFree && !isExtended; del = !isFree; } m_ui->createButton->setEnabled( create ); m_ui->editButton->setEnabled( edit ); m_ui->deleteButton->setEnabled( del ); m_ui->newPartitionTableButton->setEnabled( m_ui->deviceComboBox->currentIndex() >= 0 ); } void PartitionPage::onNewPartitionTableClicked() { QModelIndex index = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); Q_ASSERT( index.isValid() ); Device* device = m_core->deviceModel()->deviceForIndex( index ); QPointer dlg = new QDialog( this ); Ui_CreatePartitionTableDialog ui; ui.setupUi( dlg.data() ); QString areYouSure = tr( "Are you sure you want to create a new partition table on %1?" ).arg( device->name() ); ui.areYouSureLabel->setText( areYouSure ); if ( dlg->exec() == QDialog::Accepted ) { PartitionTable::TableType type = ui.mbrRadioButton->isChecked() ? PartitionTable::msdos : PartitionTable::gpt; m_core->createPartitionTable( device, type ); } delete dlg; // PartionModelReset isn't emmited after createPartitionTable, so we have to manually update // the bootLoader index after the reset. updateBootLoaderIndex(); } void PartitionPage::onCreateClicked() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); Q_ASSERT( index.isValid() ); const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( model->device(), partition->parent(), getCurrentUsedMountpoints(), this ); dlg->initFromFreeSpace( partition ); if ( dlg->exec() == QDialog::Accepted ) { Partition* newPart = dlg->createPartition(); m_core->createPartition( model->device(), newPart, dlg->newFlags() ); } delete dlg; } void PartitionPage::onEditClicked() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); Q_ASSERT( index.isValid() ); const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); if ( KPMHelpers::isPartitionNew( partition ) ) updatePartitionToCreate( model->device(), partition ); else editExistingPartition( model->device(), partition ); } void PartitionPage::onDeleteClicked() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); Q_ASSERT( index.isValid() ); const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); m_core->deletePartition( model->device(), partition ); } void PartitionPage::onRevertClicked() { ScanningDialog::run( QtConcurrent::run( [ this ] { QMutexLocker locker( &m_revertMutex ); int oldIndex = m_ui->deviceComboBox->currentIndex(); m_core->revertAllDevices(); m_ui->deviceComboBox->setCurrentIndex( oldIndex ); updateFromCurrentDevice(); } ), [ this ]{ m_lastSelectedBootLoaderIndex = -1; if( m_ui->bootLoaderComboBox->currentIndex() < 0 ) { m_ui->bootLoaderComboBox->setCurrentIndex( 0 ); } }, this ); } void PartitionPage::onPartitionViewActivated() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( !index.isValid() ) return; const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Q_ASSERT( model ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); // Use the buttons to trigger the actions so that they do nothing if they // are disabled. Alternatively, the code could use QAction to centralize, // but I don't expect there will be other occurences of triggering the same // action from multiple UI elements in this page, so it does not feel worth // the price. if ( KPMHelpers::isPartitionFreeSpace( partition ) ) m_ui->createButton->click(); else m_ui->editButton->click(); } void PartitionPage::updatePartitionToCreate( Device* device, Partition* partition ) { QStringList mountPoints = getCurrentUsedMountpoints(); mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( device, partition->parent(), mountPoints, this ); dlg->initFromPartitionToCreate( partition ); if ( dlg->exec() == QDialog::Accepted ) { Partition* newPartition = dlg->createPartition(); m_core->deletePartition( device, partition ); m_core->createPartition( device, newPartition, dlg->newFlags() ); } delete dlg; } void PartitionPage::editExistingPartition( Device* device, Partition* partition ) { QStringList mountPoints = getCurrentUsedMountpoints(); mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); QPointer dlg = new EditExistingPartitionDialog( device, partition, mountPoints, this ); if ( dlg->exec() == QDialog::Accepted ) dlg->applyChanges( m_core ); delete dlg; } void PartitionPage::updateBootLoaderInstallPath() { if ( m_isEfi || !m_ui->bootLoaderComboBox->isVisible() ) return; QVariant var = m_ui->bootLoaderComboBox->currentData( BootLoaderModel::BootLoaderPathRole ); if ( !var.isValid() ) return; qDebug() << "PartitionPage::updateBootLoaderInstallPath" << var.toString(); m_core->setBootLoaderInstallPath( var.toString() ); } void PartitionPage::updateFromCurrentDevice() { QModelIndex index = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); if ( !index.isValid() ) return; Device* device = m_core->deviceModel()->deviceForIndex( index ); QAbstractItemModel* oldModel = m_ui->partitionTreeView->model(); if ( oldModel ) disconnect( oldModel, 0, this, 0 ); PartitionModel* model = m_core->partitionModelForDevice( device ); m_ui->partitionBarsView->setModel( model ); m_ui->partitionLabelsView->setModel( model ); m_ui->partitionTreeView->setModel( model ); m_ui->partitionTreeView->expandAll(); // Make all views use the same selection model. if ( m_ui->partitionBarsView->selectionModel() != m_ui->partitionTreeView->selectionModel() || m_ui->partitionBarsView->selectionModel() != m_ui->partitionLabelsView->selectionModel() ) { // Tree view QItemSelectionModel* selectionModel = m_ui->partitionTreeView->selectionModel(); m_ui->partitionTreeView->setSelectionModel( m_ui->partitionBarsView->selectionModel() ); selectionModel->deleteLater(); // Labels view selectionModel = m_ui->partitionLabelsView->selectionModel(); m_ui->partitionLabelsView->setSelectionModel( m_ui->partitionBarsView->selectionModel() ); selectionModel->deleteLater(); } // This is necessary because even with the same selection model it might happen that // a !=0 column is selected in the tree view, which for some reason doesn't trigger a // timely repaint in the bars view. connect( m_ui->partitionBarsView->selectionModel(), &QItemSelectionModel::currentChanged, this, [=] { QModelIndex selectedIndex = m_ui->partitionBarsView->selectionModel()->currentIndex(); selectedIndex = selectedIndex.sibling( selectedIndex.row(), 0 ); m_ui->partitionBarsView->setCurrentIndex( selectedIndex ); m_ui->partitionLabelsView->setCurrentIndex( selectedIndex ); }, Qt::UniqueConnection ); // Must be done here because we need to have a model set to define // individual column resize mode QHeaderView* header = m_ui->partitionTreeView->header(); header->setSectionResizeMode( QHeaderView::ResizeToContents ); header->setSectionResizeMode( 0, QHeaderView::Stretch ); updateButtons(); // Establish connection here because selection model is destroyed when // model changes connect( m_ui->partitionTreeView->selectionModel(), &QItemSelectionModel::currentChanged, [ this ]( const QModelIndex&, const QModelIndex& ) { updateButtons(); } ); connect( model, &QAbstractItemModel::modelReset, this, &PartitionPage::onPartitionModelReset ); } void PartitionPage::onPartitionModelReset() { m_ui->partitionTreeView->expandAll(); updateButtons(); updateBootLoaderIndex(); } void PartitionPage::updateBootLoaderIndex() { // set bootloader back to user selected index if ( m_lastSelectedBootLoaderIndex >= 0 && m_ui->bootLoaderComboBox->count() ) { m_ui->bootLoaderComboBox->setCurrentIndex( m_lastSelectedBootLoaderIndex ); } } QStringList PartitionPage::getCurrentUsedMountpoints() { QModelIndex index = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); if ( !index.isValid() ) return QStringList(); Device* device = m_core->deviceModel()->deviceForIndex( index ); QStringList mountPoints; for ( Partition* partition : device->partitionTable()->children() ) { const QString& mountPoint = PartitionInfo::mountPoint( partition ); if ( !mountPoint.isEmpty() ) mountPoints << mountPoint; } return mountPoints; } calamares-3.1.12/src/modules/partition/gui/PartitionPage.h000066400000000000000000000040221322271446000235000ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONPAGE_H #define PARTITIONPAGE_H #include #include #include class PartitionCoreModule; class Ui_PartitionPage; class Device; class DeviceModel; class Partition; /** * The user interface for the module. * * Shows the information exposed by PartitionCoreModule and asks it to schedule * jobs according to user actions. */ class PartitionPage : public QWidget { Q_OBJECT public: explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr ); ~PartitionPage(); void onRevertClicked(); private: QScopedPointer< Ui_PartitionPage > m_ui; PartitionCoreModule* m_core; void updateButtons(); void onNewPartitionTableClicked(); void onCreateClicked(); void onEditClicked(); void onDeleteClicked(); void onPartitionViewActivated(); void onPartitionModelReset(); void updatePartitionToCreate( Device*, Partition* ); void editExistingPartition( Device*, Partition* ); void updateBootLoaderInstallPath(); void updateFromCurrentDevice(); void updateBootLoaderIndex(); QStringList getCurrentUsedMountpoints(); QMutex m_revertMutex; int m_lastSelectedBootLoaderIndex; bool m_isEfi; }; #endif // PARTITIONPAGE_H calamares-3.1.12/src/modules/partition/gui/PartitionPage.ui000066400000000000000000000124421322271446000236730ustar00rootroot00000000000000 PartitionPage 0 0 655 304 Form Storage de&vice: deviceComboBox Qt::Horizontal 40 20 false &Revert All Changes QAbstractItemView::NoEditTriggers false true false false New Partition &Table Qt::Horizontal 40 20 &Create &Edit &Delete Qt::Vertical QSizePolicy::Fixed 20 24 Install boot &loader on: bootLoaderComboBox QComboBox::AdjustToContents Qt::Horizontal 40 1 PartitionBarsView QFrame
gui/PartitionBarsView.h
1
PartitionLabelsView QFrame
gui/PartitionLabelsView.h
1
deviceComboBox revertButton partitionTreeView newPartitionTableButton createButton editButton deleteButton bootLoaderComboBox
calamares-3.1.12/src/modules/partition/gui/PartitionSizeController.cpp000066400000000000000000000151711322271446000261440ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "gui/PartitionSizeController.h" #include "core/ColorUtils.h" #include "core/KPMHelpers.h" #include "utils/Units.h" // Qt #include // KPMcore #include #include // stdc++ #include PartitionSizeController::PartitionSizeController( QObject* parent ) : QObject( parent ) {} void PartitionSizeController::init( Device* device, Partition* partition, const QColor& color ) { m_device = device; m_originalPartition = partition; // PartResizerWidget stores its changes directly in the partition it is // initialized with. We don't want the changes to be committed that way, // because it means we would have to revert them if the user cancel the // dialog the widget is in. Therefore we init PartResizerWidget with a clone // of the original partition. m_partition.reset( KPMHelpers::clonePartition( m_device, partition ) ); m_partitionColor = color; } void PartitionSizeController::setPartResizerWidget( PartResizerWidget* widget, bool format ) { Q_ASSERT( m_device ); if ( m_partResizerWidget ) disconnect( m_partResizerWidget, nullptr, this, nullptr ); m_dirty = false; m_currentSpinBoxValue = -1; // Update partition filesystem. This must be done *before* the call to // PartResizerWidget::init() otherwise it will be ignored by the widget. // This is why this method accept a `format` boolean. qint64 used = format ? 0 : m_originalPartition->fileSystem().sectorsUsed(); m_partition->fileSystem().setSectorsUsed( used ); // Init PartResizerWidget m_partResizerWidget = widget; PartitionTable* table = m_device->partitionTable(); qint64 minFirstSector = m_originalPartition->firstSector() - table->freeSectorsBefore( *m_originalPartition ); qint64 maxLastSector = m_originalPartition->lastSector() + table->freeSectorsAfter( *m_originalPartition ); m_partResizerWidget->init( *m_device, *m_partition.data(), minFirstSector, maxLastSector ); // FIXME: Should be set by PartResizerWidget itself m_partResizerWidget->setFixedHeight( PartResizerWidget::handleHeight() ); QPalette pal = widget->palette(); pal.setColor( QPalette::Base, ColorUtils::freeSpaceColor() ); pal.setColor( QPalette::Button, m_partitionColor ); m_partResizerWidget->setPalette( pal ); connectWidgets(); if ( !format ) { // If we are not formatting, update the widget to make sure the space // between the first and last sectors is big enough to fit the existing // content. m_updating = true; qint64 firstSector = m_partition->firstSector(); qint64 lastSector = m_partition->lastSector(); // This first time we call doAAUPRW with real first/last sector, // all further calls will come from updatePartResizerWidget, and // will therefore use values calculated from the SpinBox. doAlignAndUpdatePartResizerWidget( firstSector, lastSector ); m_updating = false; } } void PartitionSizeController::setSpinBox( QSpinBox* spinBox ) { if ( m_spinBox ) disconnect( m_spinBox, nullptr, this, nullptr ); m_spinBox = spinBox; m_spinBox->setMaximum( std::numeric_limits< int >::max() ); connectWidgets(); } void PartitionSizeController::connectWidgets() { if ( !m_spinBox || !m_partResizerWidget ) return; connect( m_spinBox, SIGNAL( editingFinished() ), SLOT( updatePartResizerWidget() ) ); connect( m_partResizerWidget, SIGNAL( firstSectorChanged( qint64 ) ), SLOT( updateSpinBox() ) ); connect( m_partResizerWidget, SIGNAL( lastSectorChanged( qint64 ) ), SLOT( updateSpinBox() ) ); // Init m_spinBox from m_partResizerWidget updateSpinBox(); } void PartitionSizeController::updatePartResizerWidget() { if ( m_updating ) return; if ( m_spinBox->value() == m_currentSpinBoxValue ) return; m_updating = true; qint64 sectorSize = qint64( m_spinBox->value() ) * 1024 * 1024 / m_device->logicalSize(); qint64 firstSector = m_partition->firstSector(); qint64 lastSector = firstSector + sectorSize - 1; doAlignAndUpdatePartResizerWidget( firstSector, lastSector ); m_updating = false; } void PartitionSizeController::doAlignAndUpdatePartResizerWidget( qint64 firstSector, qint64 lastSector ) { if ( lastSector > m_partResizerWidget->maximumLastSector() ) { qint64 delta = lastSector - m_partResizerWidget->maximumLastSector(); firstSector -= delta; lastSector -= delta; } if ( lastSector != m_partition->lastSector() ) { m_partResizerWidget->updateLastSector( lastSector ); m_dirty = true; } if ( firstSector != m_partition->firstSector() ) { m_partResizerWidget->updateFirstSector( firstSector ); m_dirty = true; } // Update spinbox value in case it was an impossible value doUpdateSpinBox(); } void PartitionSizeController::updateSpinBox() { if ( m_updating ) return; m_updating = true; doUpdateSpinBox(); m_updating = false; } void PartitionSizeController::doUpdateSpinBox() { if ( !m_spinBox ) return; int mbSize = CalamaresUtils::BytesToMiB( m_partition->length() * m_device->logicalSize() ); m_spinBox->setValue( mbSize ); if ( m_currentSpinBoxValue != -1 && //if it's not the first time we're setting it m_currentSpinBoxValue != mbSize ) //and the operation changes the SB value m_dirty = true; m_currentSpinBoxValue = mbSize; } qint64 PartitionSizeController::firstSector() const { return m_partition->firstSector(); } qint64 PartitionSizeController::lastSector() const { return m_partition->lastSector(); } bool PartitionSizeController::isDirty() const { return m_dirty; } calamares-3.1.12/src/modules/partition/gui/PartitionSizeController.h000066400000000000000000000045651322271446000256160ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONSIZECONTROLLER_H #define PARTITIONSIZECONTROLLER_H // KPMcore #include // Qt #include #include #include #include class QSpinBox; class Device; class Partition; class PartResizerWidget; /** * Synchronizes a PartResizerWidget and a QSpinBox, making sure any change made * to one is reflected in the other. * * It does not touch the partition it works on: changes are exposed through the * firstSector() and lastSector() getters. */ class PartitionSizeController : public QObject { Q_OBJECT public: explicit PartitionSizeController( QObject* parent = nullptr ); void init( Device* device, Partition* partition, const QColor& color ); void setPartResizerWidget( PartResizerWidget* widget, bool format = true ); void setSpinBox( QSpinBox* spinBox ); qint64 firstSector() const; qint64 lastSector() const; bool isDirty() const; private: QPointer< PartResizerWidget > m_partResizerWidget; QPointer< QSpinBox > m_spinBox; Device* m_device = nullptr; const Partition* m_originalPartition = nullptr; QScopedPointer< Partition > m_partition; QColor m_partitionColor; bool m_updating = false; void connectWidgets(); void doUpdateSpinBox(); void doAlignAndUpdatePartResizerWidget( qint64 fistSector, qint64 lastSector ); bool m_dirty = false; qint64 m_currentSpinBoxValue = -1; private Q_SLOTS: void updatePartResizerWidget(); void updateSpinBox(); }; #endif /* PARTITIONSIZECONTROLLER_H */ calamares-3.1.12/src/modules/partition/gui/PartitionSplitterWidget.cpp000066400000000000000000000473511322271446000261450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PartitionSplitterWidget.h" #include "core/ColorUtils.h" #include "core/PartitionIterator.h" #include "core/KPMHelpers.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include #include #include #include #include #include static const int VIEW_HEIGHT = qMax( CalamaresUtils::defaultFontHeight() + 8, // wins out with big fonts int( CalamaresUtils::defaultFontHeight() * 0.6 ) + 22 ); // wins out with small fonts static const int CORNER_RADIUS = 3; static const int EXTENDED_PARTITION_MARGIN = qMax( 4, VIEW_HEIGHT / 6 ); PartitionSplitterWidget::PartitionSplitterWidget( QWidget* parent ) : QWidget( parent ) , m_itemToResize( PartitionSplitterItem::null() ) , m_itemToResizeNext( PartitionSplitterItem::null() ) , m_itemMinSize( 0 ) , m_itemMaxSize( 0 ) , m_itemPrefSize( 0 ) , m_resizing( false ) , m_resizeHandleX( 0 ) , HANDLE_SNAP( QApplication::startDragDistance() ) , m_drawNestedPartitions( false ) { setMouseTracking( true ); } void PartitionSplitterWidget::init( Device* dev, bool drawNestedPartitions ) { m_drawNestedPartitions = drawNestedPartitions; QVector< PartitionSplitterItem > allPartitionItems; PartitionSplitterItem* extendedPartitionItem = nullptr; for ( auto it = PartitionIterator::begin( dev ); it != PartitionIterator::end( dev ); ++it ) { PartitionSplitterItem newItem = { ( *it )->partitionPath(), ColorUtils::colorForPartition( *it ), KPMHelpers::isPartitionFreeSpace( *it ), ( *it )->capacity(), PartitionSplitterItem::Normal, {} }; // If we don't draw child partitions of a partitions as child partitions, we // need to flatten the items tree into an items list if ( drawNestedPartitions ) { if ( ( *it )->roles().has( PartitionRole::Logical ) && extendedPartitionItem ) extendedPartitionItem->children.append( newItem ); else { allPartitionItems.append( newItem ); if ( ( *it )->roles().has( PartitionRole::Extended ) ) extendedPartitionItem = &allPartitionItems.last(); } } else { if ( !( *it )->roles().has( PartitionRole::Extended ) ) allPartitionItems.append( newItem ); } } setupItems( allPartitionItems ); } void PartitionSplitterWidget::setupItems( const QVector& items ) { m_itemToResize = PartitionSplitterItem::null(); m_itemToResizeNext = PartitionSplitterItem::null(); m_itemToResizePath.clear(); m_items.clear(); m_items = items; repaint(); for ( const PartitionSplitterItem& item : items ) cDebug() << "PSI added item" << item.itemPath << "size" << item.size; } void PartitionSplitterWidget::setSplitPartition( const QString& path, qint64 minSize, qint64 maxSize, qint64 preferredSize ) { cDebug() << Q_FUNC_INFO << "path:" << path << "\nminSize:" << minSize << "\nmaxSize:" << maxSize << "\nprfSize:" << preferredSize; if ( m_itemToResize && m_itemToResizeNext ) { cDebug() << "NOTICE: trying to split partition but partition to split is already set."; // We need to remove the itemToResizeNext from wherever it is for ( int i = 0; i < m_items.count(); ++i ) { if ( m_items[ i ].itemPath == m_itemToResize.itemPath && m_items[ i ].status == PartitionSplitterItem::Resizing && i + 1 < m_items.count() ) { m_items[ i ].size = m_items[ i ].size + m_itemToResizeNext.size; m_items[ i ].status = PartitionSplitterItem::Normal; m_items.removeAt( i + 1 ); m_itemToResizeNext = PartitionSplitterItem::null(); break; } else if ( !m_items[ i ].children.isEmpty() ) { for ( int j = 0; j < m_items[ i ].children.count(); ++j ) { if ( m_items[ i ].children[ j ].itemPath == m_itemToResize.itemPath && j + 1 < m_items[ i ].children.count() ) { m_items[ i ].children[ j ].size = m_items[ i ].children[ j ].size + m_itemToResizeNext.size; m_items[ i ].children[ j ].status = PartitionSplitterItem::Normal; m_items[ i ].children.removeAt( j + 1 ); m_itemToResizeNext = PartitionSplitterItem::null(); break; } } if ( m_itemToResizeNext.isNull() ) break; } } m_itemToResize = PartitionSplitterItem::null(); m_itemToResizePath.clear(); } PartitionSplitterItem itemToResize = _findItem( m_items, [ path ]( PartitionSplitterItem& item ) -> bool { if ( path == item.itemPath ) { item.status = PartitionSplitterItem::Resizing; return true; } return false; } ); if ( itemToResize.isNull() ) return; cDebug() << "itemToResize:" << itemToResize.itemPath; m_itemToResize = itemToResize; m_itemToResizePath = path; if ( preferredSize > maxSize ) preferredSize = maxSize; qint64 newSize = m_itemToResize.size - preferredSize; m_itemToResize.size = preferredSize; int opCount = _eachItem( m_items, [ preferredSize ]( PartitionSplitterItem& item ) -> bool { if ( item.status == PartitionSplitterItem::Resizing ) { item.size = preferredSize; return true; } return false; } ); cDebug() << "each splitter item opcount:" << opCount; m_itemMinSize = minSize; m_itemMaxSize = maxSize; m_itemPrefSize = preferredSize; for ( int i = 0; i < m_items.count(); ++i ) { if ( m_items[ i ].itemPath == itemToResize.itemPath ) { m_items.insert( i+1, { "", QColor( "#c0392b" ), false, newSize, PartitionSplitterItem::ResizingNext, {} } ); m_itemToResizeNext = m_items[ i+1 ]; break; } else if ( !m_items[ i ].children.isEmpty() ) { for ( int j = 0; j < m_items[ i ].children.count(); ++j ) { if ( m_items[ i ].children[ j ].itemPath == itemToResize.itemPath ) { m_items[ i ].children.insert( j+1, { "", QColor( "#c0392b" ), false, newSize, PartitionSplitterItem::ResizingNext, {} } ); m_itemToResizeNext = m_items[ i ].children[ j+1 ]; break; } } if ( !m_itemToResizeNext.isNull() ) break; } } emit partitionResized( m_itemToResize.itemPath, m_itemToResize.size, m_itemToResizeNext.size ); cDebug() << "Items updated. Status:"; foreach ( const PartitionSplitterItem& item, m_items ) cDebug() << "item" << item.itemPath << "size" << item.size << "status:" << item.status; cDebug() << "m_itemToResize: " << !m_itemToResize.isNull() << m_itemToResize.itemPath; cDebug() << "m_itemToResizeNext:" << !m_itemToResizeNext.isNull() << m_itemToResizeNext.itemPath; repaint(); } qint64 PartitionSplitterWidget::splitPartitionSize() const { if ( !m_itemToResize ) return -1; return m_itemToResize.size; } qint64 PartitionSplitterWidget::newPartitionSize() const { if ( !m_itemToResizeNext ) return -1; return m_itemToResizeNext.size; } QSize PartitionSplitterWidget::sizeHint() const { return QSize( -1, VIEW_HEIGHT ); } QSize PartitionSplitterWidget::minimumSizeHint() const { return sizeHint(); } void PartitionSplitterWidget::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QPainter painter( this ); painter.fillRect( rect(), palette().window() ); painter.setRenderHint( QPainter::Antialiasing ); drawPartitions( &painter, rect(), m_items ); } void PartitionSplitterWidget::mousePressEvent( QMouseEvent* event ) { if ( m_itemToResize && m_itemToResizeNext && event->button() == Qt::LeftButton ) { if ( qAbs( event->x() - m_resizeHandleX ) < HANDLE_SNAP ) m_resizing = true; } } void PartitionSplitterWidget::mouseMoveEvent( QMouseEvent* event ) { if ( m_resizing ) { qint64 start = 0; QString itemPath = m_itemToResize.itemPath; for ( auto it = m_items.constBegin(); it != m_items.constEnd(); ++it ) { if ( it->itemPath == itemPath ) break; else if ( !it->children.isEmpty() ) { bool done = false; for ( auto jt = it->children.constBegin(); jt != it->children.constEnd(); ++jt ) { if ( jt->itemPath == itemPath ) { done = true; break; } start += jt->size; } if ( done ) break; } else start += it->size; } qint64 total = 0; for ( auto it = m_items.constBegin(); it != m_items.constEnd(); ++it ) { total += it->size; } int ew = rect().width(); //effective width qreal bpp = total / static_cast< qreal >( ew ); //bytes per pixel qreal mx = event->x() * bpp - start; // make sure we are within resize range mx = qBound( static_cast< qreal >( m_itemMinSize ), mx, static_cast< qreal >( m_itemMaxSize ) ); qint64 span = m_itemPrefSize; qreal percent = mx / span; qint64 oldsize = m_itemToResize.size; m_itemToResize.size = qRound64( span * percent ); m_itemToResizeNext.size -= m_itemToResize.size - oldsize; _eachItem( m_items, [ this ]( PartitionSplitterItem& item ) -> bool { if ( item.status == PartitionSplitterItem::Resizing ) { item.size = m_itemToResize.size; return true; } else if ( item.status == PartitionSplitterItem::ResizingNext ) { item.size = m_itemToResizeNext.size; return true; } return false; } ); repaint(); emit partitionResized( itemPath, m_itemToResize.size, m_itemToResizeNext.size ); } else { if ( m_itemToResize && m_itemToResizeNext ) { if ( qAbs( event->x() - m_resizeHandleX ) < HANDLE_SNAP ) setCursor( Qt::SplitHCursor ); else if ( cursor().shape() != Qt::ArrowCursor ) setCursor( Qt::ArrowCursor ); } } } void PartitionSplitterWidget::mouseReleaseEvent( QMouseEvent* event ) { Q_UNUSED( event ); m_resizing = false; } void PartitionSplitterWidget::drawSection( QPainter* painter, const QRect& rect_, int x, int width, const PartitionSplitterItem& item ) { QColor color = item.color; bool isFreeSpace = item.isFreeSpace; QRect rect = rect_; const int y = rect.y(); const int rectHeight = rect.height(); const int radius = qMax( 1, CORNER_RADIUS - ( height() - rectHeight ) / 2 ); painter->setClipRect( x, y, width, rectHeight ); painter->translate( 0.5, 0.5 ); rect.adjust( 0, 0, -1, -1 ); const QColor borderColor = color.darker(); painter->setPen( borderColor ); painter->setBrush( color ); painter->drawRoundedRect( rect, radius, radius ); // Draw shade if ( !isFreeSpace ) rect.adjust( 2, 2, -2, -2 ); QLinearGradient gradient( 0, 0, 0, rectHeight / 2 ); qreal c = isFreeSpace ? 0 : 1; gradient.setColorAt( 0, QColor::fromRgbF( c, c, c, 0.3 ) ); gradient.setColorAt( 1, QColor::fromRgbF( c, c, c, 0 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( gradient ); painter->drawRoundedRect( rect, radius, radius ); painter->translate( -0.5, -0.5 ); } void PartitionSplitterWidget::drawResizeHandle( QPainter* painter, const QRect& rect_, int x ) { if ( !m_itemToResize ) return; painter->setPen( Qt::NoPen ); painter->setBrush( Qt::black ); painter->setClipRect( rect_ ); painter->setRenderHint( QPainter::Antialiasing, true ); qreal h = VIEW_HEIGHT; // Put the arrow in the center regardless of inner box height int scaleFactor = qRound( height() / static_cast< qreal >( VIEW_HEIGHT ) ); QList< QPair< qreal, qreal > > arrow_offsets = { qMakePair( 0, h / 2 - 1 ), qMakePair( 4, h / 2 - 1 ), qMakePair( 4, h / 2 - 3 ), qMakePair( 8, h / 2 ), qMakePair( 4, h / 2 + 3 ), qMakePair( 4, h / 2 + 1 ), qMakePair( 0, h / 2 + 1 ) }; for ( int i = 0; i < arrow_offsets.count(); ++i ) { arrow_offsets[ i ] = qMakePair( arrow_offsets[ i ].first * scaleFactor, ( arrow_offsets[ i ].second - h/2 ) * scaleFactor + h/2 ); } auto p1 = arrow_offsets[ 0 ]; if ( m_itemToResize.size > m_itemMinSize ) { auto arrow = QPainterPath( QPointF( x + -1 * p1.first, p1.second ) ); for ( auto p : arrow_offsets ) arrow.lineTo( x + -1 * p.first + 1, p.second ); painter->drawPath( arrow ); } if ( m_itemToResize.size < m_itemMaxSize ) { auto arrow = QPainterPath( QPointF( x + p1.first, p1.second ) ); for ( auto p : arrow_offsets ) arrow.lineTo( x + p.first, p.second ); painter->drawPath( arrow ); } painter->setRenderHint( QPainter::Antialiasing, false ); painter->setPen( Qt::black ); painter->drawLine( x, 0, x, int(h) - 1 ); } void PartitionSplitterWidget::drawPartitions( QPainter* painter, const QRect& rect, const QVector< PartitionSplitterItem >& itemList ) { const int count = itemList.count(); const int totalWidth = rect.width(); auto pair = computeItemsVector( itemList ); QVector< PartitionSplitterItem >& items = pair.first; qreal total = pair.second; int x = rect.x(); for ( int row = 0; row < count; ++row ) { const PartitionSplitterItem& item = items[ row ]; qreal width; if ( row < count - 1 ) width = totalWidth * ( item.size / total ); else // Make sure we fill the last pixel column width = rect.right() - x + 1; drawSection( painter, rect, x, int(width), item ); if ( !item.children.isEmpty() ) { QRect subRect( x + EXTENDED_PARTITION_MARGIN, rect.y() + EXTENDED_PARTITION_MARGIN, int(width) - 2 * EXTENDED_PARTITION_MARGIN, rect.height() - 2 * EXTENDED_PARTITION_MARGIN ); drawPartitions( painter, subRect, item.children ); } // If an item to resize and the following new item both exist, // and this is not the very first partition, // and the partition preceding this one is the item to resize... if ( m_itemToResize && m_itemToResizeNext && row > 0 && !items[ row - 1 ].isFreeSpace && !items[ row - 1 ].itemPath.isEmpty() && items[ row - 1 ].itemPath == m_itemToResize.itemPath ) { m_resizeHandleX = x; drawResizeHandle( painter, rect, m_resizeHandleX ); } x += width; } } PartitionSplitterItem PartitionSplitterWidget::_findItem( QVector< PartitionSplitterItem >& items, std::function< bool ( PartitionSplitterItem& ) > condition ) const { for ( auto it = items.begin(); it != items.end(); ++it) { if ( condition( *it ) ) return *it; PartitionSplitterItem candidate = _findItem( it->children, condition ); if ( !candidate.isNull() ) return candidate; } return PartitionSplitterItem::null(); } int PartitionSplitterWidget::_eachItem( QVector< PartitionSplitterItem >& items, std::function< bool ( PartitionSplitterItem& ) > operation ) const { int opCount = 0; for ( auto it = items.begin(); it != items.end(); ++it) { if ( operation( *it ) ) opCount++; opCount += _eachItem( it->children, operation ); } return opCount; } QPair< QVector< PartitionSplitterItem >, qreal > PartitionSplitterWidget::computeItemsVector( const QVector< PartitionSplitterItem >& originalItems ) const { QVector< PartitionSplitterItem > items; qreal total = 0; for ( int row = 0; row < originalItems.count(); ++row ) { if ( originalItems[ row ].children.isEmpty() ) { items += originalItems[ row ]; total += originalItems[ row ].size; } else { PartitionSplitterItem thisItem = originalItems[ row ]; QPair< QVector< PartitionSplitterItem >, qreal > pair = computeItemsVector( thisItem.children ); thisItem.children = pair.first; thisItem.size = qint64(pair.second); items += thisItem; total += thisItem.size; } } // The sizes we have are perfect, but now we have to hardcode a minimum size for small // partitions and compensate for it in the total. qreal adjustedTotal = total; for ( int row = 0; row < items.count(); ++row ) { if ( items[ row ].size < 0.01 * total ) // If this item is smaller than 1% of everything, { // force its width to 1%. adjustedTotal -= items[ row ].size; items[ row ].size = qint64(0.01 * total); adjustedTotal += items[ row ].size; } } return qMakePair( items, adjustedTotal ); } calamares-3.1.12/src/modules/partition/gui/PartitionSplitterWidget.h000066400000000000000000000071721322271446000256070ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONSPLITTERWIDGET_H #define PARTITIONSPLITTERWIDGET_H #include #include class Device; struct PartitionSplitterItem { enum Status { Normal = 0, Resizing, ResizingNext }; QString itemPath; QColor color; bool isFreeSpace; qint64 size; Status status; using ChildVector = QVector< PartitionSplitterItem >; ChildVector children; static PartitionSplitterItem null() { return { QString(), QColor(), false, 0, Normal, ChildVector() }; } bool isNull() const { return itemPath.isEmpty() && size == 0 && status == Normal; } operator bool() const { return !isNull(); } }; class PartitionSplitterWidget : public QWidget { Q_OBJECT public: explicit PartitionSplitterWidget( QWidget* parent = nullptr ); void init( Device* dev, bool drawNestedPartitions ); void setSplitPartition( const QString& path, qint64 minSize, qint64 maxSize, qint64 preferredSize ); qint64 splitPartitionSize() const; qint64 newPartitionSize() const; QSize sizeHint() const override; QSize minimumSizeHint() const override; signals: void partitionResized( const QString&, qint64, qint64 ); protected: void paintEvent( QPaintEvent* event ) override; void mousePressEvent( QMouseEvent* event ) override; void mouseMoveEvent( QMouseEvent* event ) override; void mouseReleaseEvent( QMouseEvent* event ) override; private: void setupItems( const QVector< PartitionSplitterItem >& items ); void drawPartitions( QPainter* painter, const QRect& rect, const QVector< PartitionSplitterItem >& itemList ); void drawSection( QPainter* painter, const QRect& rect_, int x, int width, const PartitionSplitterItem& item ); void drawResizeHandle( QPainter* painter, const QRect& rect_, int x ); PartitionSplitterItem _findItem( QVector< PartitionSplitterItem >& items, std::function< bool ( PartitionSplitterItem& ) > condition ) const; int _eachItem( QVector< PartitionSplitterItem >& items, std::function< bool ( PartitionSplitterItem& ) > operation ) const; QPair< QVector< PartitionSplitterItem >, qreal > computeItemsVector( const QVector< PartitionSplitterItem >& originalItems ) const; QVector< PartitionSplitterItem > m_items; QString m_itemToResizePath; PartitionSplitterItem m_itemToResize; PartitionSplitterItem m_itemToResizeNext; qint64 m_itemMinSize; qint64 m_itemMaxSize; qint64 m_itemPrefSize; bool m_resizing; int m_resizeHandleX; const int HANDLE_SNAP; bool m_drawNestedPartitions; }; #endif // PARTITIONSPLITTERWIDGET_H calamares-3.1.12/src/modules/partition/gui/PartitionViewSelectionFilter.h000066400000000000000000000020011322271446000265450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONVIEWSELECTIONFILTER_H #define PARTITIONVIEWSELECTIONFILTER_H #include #include typedef std::function< bool( const QModelIndex& ) > SelectionFilter; #endif // PARTITIONVIEWSELECTIONFILTER_H calamares-3.1.12/src/modules/partition/gui/PartitionViewStep.cpp000066400000000000000000000513771322271446000247440ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2017, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "gui/PartitionViewStep.h" #include "core/DeviceModel.h" #include "core/PartitionCoreModule.h" #include "core/PartitionModel.h" #include "core/KPMHelpers.h" #include "core/OsproberEntry.h" #include "core/PartUtils.h" #include "gui/ChoicePage.h" #include "gui/PartitionPage.h" #include "gui/PartitionBarsView.h" #include "gui/PartitionLabelsView.h" #include "CalamaresVersion.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "widgets/WaitingWidget.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "Job.h" #include "Branding.h" #include #include #include // Qt #include #include #include #include #include #include #include #include #include #include PartitionViewStep::PartitionViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_core( nullptr ) , m_widget( new QStackedWidget() ) , m_choicePage( nullptr ) , m_manualPartitionPage( nullptr ) { m_widget->setContentsMargins( 0, 0, 0, 0 ); m_waitingWidget = new WaitingWidget( QString() ); m_widget->addWidget( m_waitingWidget ); CALAMARES_RETRANSLATE( qobject_cast< WaitingWidget* >( m_waitingWidget )->setText( tr( "Gathering system information..." ) ); ) m_core = new PartitionCoreModule( this ); // Unusable before init is complete! // We're not done loading, but we need the configuration map first. } void PartitionViewStep::initPartitionCoreModule() { Q_ASSERT( m_core ); m_core->init(); } void PartitionViewStep::continueLoading() { Q_ASSERT( !m_choicePage ); Q_ASSERT( !m_manualPartitionPage ); m_manualPartitionPage = new PartitionPage( m_core ); m_choicePage = new ChoicePage(); m_choicePage->init( m_core ); m_widget->addWidget( m_choicePage ); m_widget->addWidget( m_manualPartitionPage ); m_widget->removeWidget( m_waitingWidget ); m_waitingWidget->deleteLater(); m_waitingWidget = nullptr; connect( m_core, &PartitionCoreModule::hasRootMountPointChanged, this, &PartitionViewStep::nextStatusChanged ); connect( m_choicePage, &ChoicePage::nextStatusChanged, this, &PartitionViewStep::nextStatusChanged ); } PartitionViewStep::~PartitionViewStep() { if ( m_choicePage && m_choicePage->parent() == nullptr ) m_choicePage->deleteLater(); if ( m_manualPartitionPage && m_manualPartitionPage->parent() == nullptr ) m_manualPartitionPage->deleteLater(); } QString PartitionViewStep::prettyName() const { return tr( "Partitions" ); } QWidget* PartitionViewStep::widget() { return m_widget; } QWidget* PartitionViewStep::createSummaryWidget() const { QWidget* widget = new QWidget; QVBoxLayout* mainLayout = new QVBoxLayout; widget->setLayout( mainLayout ); mainLayout->setMargin( 0 ); ChoicePage::Choice choice = m_choicePage->currentChoice(); QFormLayout* formLayout = new QFormLayout( widget ); const int MARGIN = CalamaresUtils::defaultFontHeight() / 2; formLayout->setContentsMargins( MARGIN, 0, MARGIN, MARGIN ); mainLayout->addLayout( formLayout ); QList< PartitionCoreModule::SummaryInfo > list = m_core->createSummaryInfo(); if ( list.length() > 1 ) // There are changes on more than one disk { //NOTE: all of this should only happen when Manual partitioning is active. // Any other choice should result in a list.length() == 1. QLabel* modeLabel = new QLabel; formLayout->addRow( modeLabel ); QString modeText; switch ( choice ) { case ChoicePage::Alongside: modeText = tr( "Install %1 alongside another operating system." ) .arg( *Calamares::Branding::ShortVersionedName ); break; case ChoicePage::Erase: modeText = tr( "Erase disk and install %1." ) .arg( *Calamares::Branding::ShortVersionedName ); break; case ChoicePage::Replace: modeText = tr( "Replace a partition with %1." ) .arg( *Calamares::Branding::ShortVersionedName ); break; case ChoicePage::NoChoice: case ChoicePage::Manual: modeText = tr( "Manual partitioning." ); } modeLabel->setText( modeText ); } for ( const auto& info : list ) { QLabel* diskInfoLabel = new QLabel; if ( list.length() == 1 ) // this is the only disk preview { QString modeText; switch ( choice ) { case ChoicePage::Alongside: modeText = tr( "Install %1 alongside another operating system on disk %2 (%3)." ) .arg( *Calamares::Branding::ShortVersionedName ) .arg( info.deviceNode ) .arg( info.deviceName ); break; case ChoicePage::Erase: modeText = tr( "Erase disk %2 (%3) and install %1." ) .arg( *Calamares::Branding::ShortVersionedName ) .arg( info.deviceNode ) .arg( info.deviceName ); break; case ChoicePage::Replace: modeText = tr( "Replace a partition on disk %2 (%3) with %1." ) .arg( *Calamares::Branding::ShortVersionedName ) .arg( info.deviceNode ) .arg( info.deviceName ); break; case ChoicePage::NoChoice: case ChoicePage::Manual: modeText = tr( "Manual partitioning on disk %1 (%2)." ) .arg( info.deviceNode ) .arg( info.deviceName ); } diskInfoLabel->setText( modeText ); } else // multiple disk previews! { diskInfoLabel->setText( tr( "Disk %1 (%2)" ) .arg( info.deviceNode ) .arg( info.deviceName ) ); } formLayout->addRow( diskInfoLabel ); PartitionBarsView* preview; PartitionLabelsView* previewLabels; QVBoxLayout* field; PartitionBarsView::NestedPartitionsMode mode = Calamares::JobQueue::instance()->globalStorage()-> value( "drawNestedPartitions" ).toBool() ? PartitionBarsView::DrawNestedPartitions : PartitionBarsView::NoNestedPartitions; preview = new PartitionBarsView; preview->setNestedPartitionsMode( mode ); previewLabels = new PartitionLabelsView; previewLabels->setExtendedPartitionHidden( mode == PartitionBarsView::NoNestedPartitions ); preview->setModel( info.partitionModelBefore ); previewLabels->setModel( info.partitionModelBefore ); preview->setSelectionMode( QAbstractItemView::NoSelection ); previewLabels->setSelectionMode( QAbstractItemView::NoSelection ); info.partitionModelBefore->setParent( widget ); field = new QVBoxLayout; CalamaresUtils::unmarginLayout( field ); field->setSpacing( 6 ); field->addWidget( preview ); field->addWidget( previewLabels ); formLayout->addRow( tr( "Current:" ), field ); preview = new PartitionBarsView; preview->setNestedPartitionsMode( mode ); previewLabels = new PartitionLabelsView; previewLabels->setExtendedPartitionHidden( mode == PartitionBarsView::NoNestedPartitions ); preview->setModel( info.partitionModelAfter ); previewLabels->setModel( info.partitionModelAfter ); preview->setSelectionMode( QAbstractItemView::NoSelection ); previewLabels->setSelectionMode( QAbstractItemView::NoSelection ); previewLabels->setCustomNewRootLabel( *Calamares::Branding::BootloaderEntryName ); info.partitionModelAfter->setParent( widget ); field = new QVBoxLayout; CalamaresUtils::unmarginLayout( field ); field->setSpacing( 6 ); field->addWidget( preview ); field->addWidget( previewLabels ); formLayout->addRow( tr( "After:" ), field ); } QStringList jobsLines; foreach ( const Calamares::job_ptr& job, jobs() ) { if ( !job->prettyDescription().isEmpty() ) jobsLines.append( job->prettyDescription() ); } if ( !jobsLines.isEmpty() ) { QLabel* jobsLabel = new QLabel( widget ); mainLayout->addWidget( jobsLabel ); jobsLabel->setText( jobsLines.join( "
" ) ); jobsLabel->setMargin( CalamaresUtils::defaultFontHeight() / 2 ); QPalette pal; pal.setColor( QPalette::Background, pal.background().color().lighter( 108 ) ); jobsLabel->setAutoFillBackground( true ); jobsLabel->setPalette( pal ); } return widget; } void PartitionViewStep::next() { if ( m_choicePage == m_widget->currentWidget() ) { if ( m_choicePage->currentChoice() == ChoicePage::Manual ) { m_widget->setCurrentWidget( m_manualPartitionPage ); if ( m_core->isDirty() ) m_manualPartitionPage->onRevertClicked(); } else if ( m_choicePage->currentChoice() == ChoicePage::Erase ) { emit done(); return; } else if ( m_choicePage->currentChoice() == ChoicePage::Alongside ) { emit done(); return; } else if ( m_choicePage->currentChoice() == ChoicePage::Replace ) { emit done(); return; } cDebug() << "Choice applied: " << m_choicePage->currentChoice(); return; } emit done(); } void PartitionViewStep::back() { if ( m_widget->currentWidget() != m_choicePage ) m_widget->setCurrentWidget( m_choicePage ); } bool PartitionViewStep::isNextEnabled() const { if ( m_choicePage && m_choicePage == m_widget->currentWidget() ) return m_choicePage->isNextEnabled(); if ( m_manualPartitionPage && m_manualPartitionPage == m_widget->currentWidget() ) return m_core->hasRootMountPoint(); return false; } bool PartitionViewStep::isBackEnabled() const { return true; } bool PartitionViewStep::isAtBeginning() const { if ( m_widget->currentWidget() == m_manualPartitionPage ) return false; return true; } bool PartitionViewStep::isAtEnd() const { if ( m_choicePage == m_widget->currentWidget() ) { if ( m_choicePage->currentChoice() == ChoicePage::Erase || m_choicePage->currentChoice() == ChoicePage::Replace || m_choicePage->currentChoice() == ChoicePage::Alongside ) return true; return false; } return true; } void PartitionViewStep::onActivate() { // if we're coming back to PVS from the next VS if ( m_widget->currentWidget() == m_choicePage && m_choicePage->currentChoice() == ChoicePage::Alongside ) { m_choicePage->applyActionChoice( ChoicePage::Alongside ); // m_choicePage->reset(); //FIXME: ReplaceWidget should be reset maybe? } } void PartitionViewStep::onLeave() { if ( m_widget->currentWidget() == m_choicePage ) { m_choicePage->onLeave(); return; } if ( m_widget->currentWidget() == m_manualPartitionPage ) { if ( PartUtils::isEfiSystem() ) { QString espMountPoint = Calamares::JobQueue::instance()->globalStorage()-> value( "efiSystemPartition").toString(); Partition* esp = m_core->findPartitionByMountPoint( espMountPoint ); QString message; QString description; if ( !esp ) { message = tr( "No EFI system partition configured" ); description = tr( "An EFI system partition is necessary to start %1." "

" "To configure an EFI system partition, go back and " "select or create a FAT32 filesystem with the " "esp flag enabled and mount point " "%2.

" "You can continue without setting up an EFI system " "partition but your system may fail to start." ) .arg( *Calamares::Branding::ShortProductName ) .arg( espMountPoint ); } else if ( esp && !esp->activeFlags().testFlag( PartitionTable::FlagEsp ) ) { message = tr( "EFI system partition flag not set" ); description = tr( "An EFI system partition is necessary to start %1." "

" "A partition was configured with mount point " "%2 but its esp " "flag is not set.
" "To set the flag, go back and edit the partition." "

" "You can continue without setting the flag but your " "system may fail to start." ) .arg( *Calamares::Branding::ShortProductName ) .arg( espMountPoint ); } if ( !message.isEmpty() ) { QMessageBox::warning( m_manualPartitionPage, message, description ); } } Partition* root_p = m_core->findPartitionByMountPoint( "/" ); Partition* boot_p = m_core->findPartitionByMountPoint( "/boot" ); if ( root_p and boot_p ) { QString message; QString description; // If the root partition is encrypted, and there's a separate boot // partition which is not encrypted if ( root_p->fileSystem().type() == FileSystem::Luks && boot_p->fileSystem().type() != FileSystem::Luks ) { message = tr( "Boot partition not encrypted" ); description = tr( "A separate boot partition was set up together with " "an encrypted root partition, but the boot partition " "is not encrypted." "

" "There are security concerns with this kind of " "setup, because important system files are kept " "on an unencrypted partition.
" "You may continue if you wish, but filesystem " "unlocking will happen later during system startup." "
To encrypt the boot partition, go back and " "recreate it, selecting Encrypt " "in the partition creation window." ); QMessageBox::warning( m_manualPartitionPage, message, description ); } } } } void PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { // Copy the efiSystemPartition setting to the global storage. It is needed not only in // the EraseDiskPage, but also in the bootloader configuration modules (grub, bootloader). Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( configurationMap.contains( "efiSystemPartition" ) && configurationMap.value( "efiSystemPartition" ).type() == QVariant::String && !configurationMap.value( "efiSystemPartition" ).toString().isEmpty() ) { gs->insert( "efiSystemPartition", configurationMap.value( "efiSystemPartition" ).toString() ); } else { gs->insert( "efiSystemPartition", QStringLiteral( "/boot/efi" ) ); } if ( configurationMap.contains( "ensureSuspendToDisk" ) && configurationMap.value( "ensureSuspendToDisk" ).type() == QVariant::Bool ) { gs->insert( "ensureSuspendToDisk", configurationMap.value( "ensureSuspendToDisk" ).toBool() ); } else { gs->insert( "ensureSuspendToDisk", true ); } if ( configurationMap.contains( "neverCreateSwap" ) && configurationMap.value( "neverCreateSwap" ).type() == QVariant::Bool ) { gs->insert( "neverCreateSwap", configurationMap.value( "neverCreateSwap" ).toBool() ); } else { gs->insert( "neverCreateSwap", false ); } if ( configurationMap.contains( "drawNestedPartitions" ) && configurationMap.value( "drawNestedPartitions" ).type() == QVariant::Bool ) { gs->insert( "drawNestedPartitions", configurationMap.value( "drawNestedPartitions", false ).toBool() ); } else { gs->insert( "drawNestedPartitions", false ); } if ( configurationMap.contains( "alwaysShowPartitionLabels" ) && configurationMap.value( "alwaysShowPartitionLabels" ).type() == QVariant::Bool ) { gs->insert( "alwaysShowPartitionLabels", configurationMap.value( "alwaysShowPartitionLabels", true ).toBool() ); } else { gs->insert( "alwaysShowPartitionLabels", true ); } if ( configurationMap.contains( "defaultFileSystemType" ) && configurationMap.value( "defaultFileSystemType" ).type() == QVariant::String && !configurationMap.value( "defaultFileSystemType" ).toString().isEmpty() ) { QString typeString = configurationMap.value( "defaultFileSystemType" ).toString(); gs->insert( "defaultFileSystemType", typeString ); if ( FileSystem::typeForName( typeString ) == FileSystem::Unknown ) { cDebug() << "WARNING: bad default filesystem configuration for partition module. Reverting to ext4 as default."; gs->insert( "defaultFileSystemType", "ext4" ); } } else { gs->insert( "defaultFileSystemType", QStringLiteral( "ext4" ) ); } if ( configurationMap.contains( "enableLuksAutomatedPartitioning" ) && configurationMap.value( "enableLuksAutomatedPartitioning" ).type() == QVariant::Bool ) { gs->insert( "enableLuksAutomatedPartitioning", configurationMap.value( "enableLuksAutomatedPartitioning" ).toBool() ); } else { gs->insert( "enableLuksAutomatedPartitioning", true ); } // Now that we have the config, we load the PartitionCoreModule in the background // because it could take a while. Then when it's done, we can set up the widgets // and remove the spinner. QFutureWatcher< void >* watcher = new QFutureWatcher< void >(); connect( watcher, &QFutureWatcher< void >::finished, this, [ this, watcher ] { continueLoading(); watcher->deleteLater(); } ); QFuture< void > future = QtConcurrent::run( this, &PartitionViewStep::initPartitionCoreModule ); watcher->setFuture( future ); } QList< Calamares::job_ptr > PartitionViewStep::jobs() const { return m_core->jobs(); } CALAMARES_PLUGIN_FACTORY_DEFINITION( PartitionViewStepFactory, registerPlugin(); ) calamares-3.1.12/src/modules/partition/gui/PartitionViewStep.h000066400000000000000000000045271322271446000244040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONVIEWSTEP_H #define PARTITIONVIEWSTEP_H #include #include #include #include class ChoicePage; class PartitionPage; class PartitionCoreModule; class QStackedWidget; /** * The starting point of the module. Instantiates PartitionCoreModule, * ChoicePage and PartitionPage, then connects them. */ class PLUGINDLLEXPORT PartitionViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit PartitionViewStep( QObject* parent = nullptr ); virtual ~PartitionViewStep() override; QString prettyName() const override; QWidget* createSummaryWidget() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; void onActivate() override; void onLeave() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; QList< Calamares::job_ptr > jobs() const override; private: void initPartitionCoreModule(); void continueLoading(); PartitionCoreModule* m_core; QStackedWidget* m_widget; ChoicePage* m_choicePage; PartitionPage* m_manualPartitionPage; QWidget* m_waitingWidget; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( PartitionViewStepFactory ) #endif // PARTITIONVIEWSTEP_H calamares-3.1.12/src/modules/partition/gui/PrettyRadioButton.cpp000066400000000000000000000036611322271446000247370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PrettyRadioButton.h" #include "utils/CalamaresUtilsGui.h" #include "widgets/ClickableLabel.h" #include #include PrettyRadioButton::PrettyRadioButton( QWidget* parent ) : QWidget( parent ) { QHBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); m_radio = new QRadioButton; m_label = new ClickableLabel; connect( m_label, &ClickableLabel::clicked, m_radio, &QRadioButton::click ); m_label->setBuddy( m_radio ); m_label->setWordWrap( true ); m_label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); mainLayout->addWidget( m_radio ); mainLayout->addWidget( m_label ); mainLayout->setContentsMargins( 0, 0, 0, 0 ); } void PrettyRadioButton::setText( const QString& text ) { m_label->setText( text ); } void PrettyRadioButton::setIconSize( const QSize& size ) { m_radio->setIconSize( size ); } void PrettyRadioButton::setIcon( const QIcon& icon ) { m_radio->setIcon( icon ); } QSize PrettyRadioButton::iconSize() const { return m_radio->iconSize(); } QRadioButton* PrettyRadioButton::buttonWidget() const { return m_radio; } calamares-3.1.12/src/modules/partition/gui/PrettyRadioButton.h000066400000000000000000000025601322271446000244010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PRETTYRADIOBUTTON_H #define PRETTYRADIOBUTTON_H #include class ClickableLabel; class PrettyRadioButton : public QWidget { Q_OBJECT public: explicit PrettyRadioButton( QWidget* parent = nullptr ); virtual ~PrettyRadioButton() {} virtual void setText( const QString& text ); virtual void setIconSize( const QSize& size ); virtual void setIcon( const QIcon& icon ); virtual QSize iconSize() const; virtual QRadioButton* buttonWidget() const; protected: ClickableLabel* m_label; QRadioButton* m_radio; }; #endif // PRETTYRADIOBUTTON_H calamares-3.1.12/src/modules/partition/gui/ReplaceWidget.cpp000066400000000000000000000344231322271446000240140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ReplaceWidget.h" #include "ui_ReplaceWidget.h" #include "core/DeviceModel.h" #include "core/PartitionCoreModule.h" #include "core/PartitionActions.h" #include "core/PartitionInfo.h" #include "Branding.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include #include #include ReplaceWidget::ReplaceWidget( PartitionCoreModule* core, QComboBox* devicesComboBox, QWidget* parent ) : QWidget( parent ) , m_ui( new Ui_ReplaceWidget ) , m_core( core ) , m_isEfi( false ) { m_ui->setupUi( this ); m_ui->bootComboBox->hide(); m_ui->bootComboBox->clear(); m_ui->bootStatusLabel->hide(); m_ui->bootStatusLabel->clear(); updateFromCurrentDevice( devicesComboBox ); connect( devicesComboBox, &QComboBox::currentTextChanged, this, [=]( const QString& /* text */ ) { updateFromCurrentDevice( devicesComboBox ); } ); CALAMARES_RETRANSLATE( onPartitionSelected(); ) } ReplaceWidget::~ReplaceWidget() {} bool ReplaceWidget::isNextEnabled() const { return m_nextEnabled; } void ReplaceWidget::reset() { //moo; } void ReplaceWidget::applyChanges() { PartitionModel* model = qobject_cast< PartitionModel* >( m_ui->partitionTreeView->model() ); if ( model ) { Partition* partition = model->partitionForIndex( m_ui->partitionTreeView->currentIndex() ); if ( partition ) { Device* dev = model->device(); PartitionActions::doReplacePartition( m_core, dev, partition ); if ( m_isEfi ) { QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); if ( efiSystemPartitions.count() == 1 ) { PartitionInfo::setMountPoint( efiSystemPartitions.first(), Calamares::JobQueue::instance()-> globalStorage()-> value( "efiSystemPartition" ).toString() ); } else if ( efiSystemPartitions.count() > 1 ) { PartitionInfo::setMountPoint( efiSystemPartitions.at( m_ui->bootComboBox->currentIndex() ), Calamares::JobQueue::instance()-> globalStorage()-> value( "efiSystemPartition" ).toString() ); } } m_core->dumpQueue(); } } } void ReplaceWidget::onPartitionSelected() { if ( Calamares::JobQueue::instance()->globalStorage()->value( "firmwareType" ) == "efi" ) m_isEfi = true; if ( m_ui->partitionTreeView->currentIndex() == QModelIndex() ) { updateStatus( CalamaresUtils::PartitionPartition, tr( "Select where to install %1.
" "Warning: this will delete all files " "on the selected partition." ) .arg( *Calamares::Branding::VersionedName ) ); setNextEnabled( false ); return; } bool ok = false; double requiredSpaceB = Calamares::JobQueue::instance() ->globalStorage() ->value( "requiredStorageGB" ) .toDouble( &ok ) * 1024 * 1024 * 1024; PartitionModel* model = qobject_cast< PartitionModel* >( m_ui->partitionTreeView->model() ); if ( model && ok ) { const QStringList osproberLines = Calamares::JobQueue::instance() ->globalStorage() ->value( "osproberLines" ).toStringList(); Partition* partition = model->partitionForIndex( m_ui->partitionTreeView->currentIndex() ); if ( !partition || partition->state() != Partition::StateNone ) { updateStatus( CalamaresUtils::Fail, tr( "The selected item does not appear to be a valid partition." ) ); setNextEnabled( false ); return; } if ( partition->roles().has( PartitionRole::Unallocated ) ) { updateStatus( CalamaresUtils::Fail, tr( "%1 cannot be installed on empty space. Please select an " "existing partition." ) .arg( *Calamares::Branding::VersionedName ) ); setNextEnabled( false ); return; } if ( partition->roles().has( PartitionRole::Extended ) ) { updateStatus( CalamaresUtils::Fail, tr( "%1 cannot be installed on an extended partition. Please select an " "existing primary or logical partition." ) .arg( *Calamares::Branding::VersionedName ) ); setNextEnabled( false ); return; } if ( partition->partitionPath().isEmpty() ) { updateStatus( CalamaresUtils::Fail, tr( "%1 cannot be installed on this partition." ) .arg( *Calamares::Branding::VersionedName ) ); setNextEnabled( false ); return; } QString prettyName = tr( "Data partition (%1)" ) .arg( partition->fileSystem().name() ); for ( const QString& line : osproberLines ) { QStringList lineColumns = line.split( ':' ); QString path = lineColumns.value( 0 ).simplified(); if ( path == partition->partitionPath() ) { QString osName; if ( !lineColumns.value( 1 ).simplified().isEmpty() ) osName = lineColumns.value( 1 ).simplified(); else if ( !lineColumns.value( 2 ).simplified().isEmpty() ) osName = lineColumns.value( 2 ).simplified(); if ( osName.isEmpty() ) { prettyName = tr( "Unknown system partition (%1)" ) .arg( partition->fileSystem().name() ); } else { prettyName = tr ( "%1 system partition (%2)" ) .arg( osName.replace( 0, 1, osName.at( 0 ).toUpper() ) ) .arg( partition->fileSystem().name() ); } break; } } if ( partition->capacity() < requiredSpaceB ) { updateStatus( CalamaresUtils::Fail, tr( "%4

" "The partition %1 is too small for %2. Please select a partition " "with capacity at least %3 GiB." ) .arg( partition->partitionPath() ) .arg( *Calamares::Branding::VersionedName ) .arg( requiredSpaceB / ( 1024. * 1024. * 1024. ), 0, 'f', 1 ) .arg( prettyName ) ); setNextEnabled( false ); return; } m_ui->bootComboBox->hide(); m_ui->bootComboBox->clear(); m_ui->bootStatusLabel->hide(); m_ui->bootStatusLabel->clear(); if ( m_isEfi ) { QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); if ( efiSystemPartitions.count() == 0 ) { updateStatus( CalamaresUtils::Fail, tr( "%2

" "An EFI system partition cannot be found anywhere " "on this system. Please go back and use manual " "partitioning to set up %1." ) .arg( *Calamares::Branding::ShortProductName ) .arg( prettyName ) ); setNextEnabled( false ); } else if ( efiSystemPartitions.count() == 1 ) { updateStatus( CalamaresUtils::PartitionPartition, tr( "%3

" "%1 will be installed on %2.
" "Warning: all data on partition " "%2 will be lost.") .arg( *Calamares::Branding::VersionedName ) .arg( partition->partitionPath() ) .arg( prettyName ) ); m_ui->bootStatusLabel->show(); m_ui->bootStatusLabel->setText( tr( "The EFI system partition at %1 will be used for starting %2." ) .arg( efiSystemPartitions.first()->partitionPath() ) .arg( *Calamares::Branding::ShortProductName ) ); setNextEnabled( true ); } else { updateStatus( CalamaresUtils::PartitionPartition, tr( "%3

" "%1 will be installed on %2.
" "Warning: all data on partition " "%2 will be lost.") .arg( *Calamares::Branding::VersionedName ) .arg( partition->partitionPath() ) .arg( prettyName ) ); m_ui->bootStatusLabel->show(); m_ui->bootStatusLabel->setText( tr( "EFI system partition:" ) ); m_ui->bootComboBox->show(); for ( int i = 0; i < efiSystemPartitions.count(); ++i ) { Partition* efiPartition = efiSystemPartitions.at( i ); m_ui->bootComboBox->addItem( efiPartition->partitionPath(), i ); if ( efiPartition->devicePath() == partition->devicePath() && efiPartition->number() == 1 ) m_ui->bootComboBox->setCurrentIndex( i ); } setNextEnabled( true ); } } else { updateStatus( CalamaresUtils::PartitionPartition, tr( "%3

" "%1 will be installed on %2.
" "Warning: all data on partition " "%2 will be lost.") .arg( *Calamares::Branding::VersionedName ) .arg( partition->partitionPath() ) .arg( prettyName ) ); setNextEnabled( true ); } } } void ReplaceWidget::setNextEnabled( bool enabled ) { if ( enabled == m_nextEnabled ) return; m_nextEnabled = enabled; emit nextStatusChanged( enabled ); } void ReplaceWidget::updateStatus( CalamaresUtils::ImageType imageType, const QString& text ) { int iconSize = CalamaresUtils::defaultFontHeight() * 6; m_ui->selectedIconLabel->setPixmap( CalamaresUtils::defaultPixmap( imageType, CalamaresUtils::Original, QSize( iconSize, iconSize ) ) ); m_ui->selectedIconLabel->setFixedHeight( iconSize ); m_ui->selectedStatusLabel->setText( text ); } void ReplaceWidget::updateFromCurrentDevice( QComboBox* devicesComboBox ) { QModelIndex index = m_core->deviceModel()->index( devicesComboBox->currentIndex(), 0 ); if ( !index.isValid() ) return; Device* device = m_core->deviceModel()->deviceForIndex( index ); QAbstractItemModel* oldModel = m_ui->partitionTreeView->model(); if ( oldModel ) disconnect( oldModel, nullptr, this, nullptr ); PartitionModel* model = m_core->partitionModelForDevice( device ); m_ui->partitionTreeView->setModel( model ); m_ui->partitionTreeView->expandAll(); // Must be done here because we need to have a model set to define // individual column resize mode QHeaderView* header = m_ui->partitionTreeView->header(); header->setSectionResizeMode( QHeaderView::ResizeToContents ); header->setSectionResizeMode( 0, QHeaderView::Stretch ); //updateButtons(); // Establish connection here because selection model is destroyed when // model changes connect( m_ui->partitionTreeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &ReplaceWidget::onPartitionViewActivated ); connect( model, &QAbstractItemModel::modelReset, this, &ReplaceWidget::onPartitionModelReset ); } void ReplaceWidget::onPartitionViewActivated() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( !index.isValid() ) return; const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); Q_ASSERT( model ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); onPartitionSelected(); } void ReplaceWidget::onPartitionModelReset() { m_ui->partitionTreeView->expandAll(); onPartitionSelected(); } calamares-3.1.12/src/modules/partition/gui/ReplaceWidget.h000066400000000000000000000036211322271446000234550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef REPLACEWIDGET_H #define REPLACEWIDGET_H #include #include class Ui_ReplaceWidget; class QComboBox; class PartitionCoreModule; class Partition; namespace CalamaresUtils { enum ImageType : int; } class ReplaceWidget : public QWidget { Q_OBJECT public: explicit ReplaceWidget( PartitionCoreModule* core, QComboBox* devicesComboBox, QWidget* parent = nullptr ); virtual ~ReplaceWidget(); bool isNextEnabled() const; void reset(); void applyChanges(); signals: void nextStatusChanged( bool ); private slots: void onPartitionSelected(); private: QScopedPointer< Ui_ReplaceWidget > m_ui; void setNextEnabled( bool enabled ); void updateStatus( CalamaresUtils::ImageType imageType, const QString& text ); PartitionCoreModule* m_core; bool m_nextEnabled; bool m_isEfi; void updateFromCurrentDevice( QComboBox* devicesComboBox ); void onPartitionViewActivated(); void onPartitionModelReset(); }; #endif // REPLACEWIDGET_H calamares-3.1.12/src/modules/partition/gui/ReplaceWidget.ui000066400000000000000000000070071322271446000236450ustar00rootroot00000000000000 ReplaceWidget 0 0 643 187 Form 0 0 0 0 0 QAbstractItemView::NoEditTriggers false true false false Qt::AlignCenter true 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true Qt::Vertical 20 40 calamares-3.1.12/src/modules/partition/gui/ScanningDialog.cpp000066400000000000000000000055201322271446000241510ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ScanningDialog.h" #include "widgets/waitingspinnerwidget.h" #include #include #include #include ScanningDialog::ScanningDialog( const QString& text, const QString& windowTitle, QWidget* parent ) : QDialog( parent ) { setModal( true ); setWindowTitle( windowTitle ); QHBoxLayout* dialogLayout = new QHBoxLayout; setLayout( dialogLayout ); WaitingSpinnerWidget* spinner = new WaitingSpinnerWidget(); dialogLayout->addWidget( spinner ); spinner->start(); QLabel* rescanningLabel = new QLabel( text, this ); dialogLayout->addWidget( rescanningLabel ); } void ScanningDialog::run( const QFuture< void >& future, const QString& text, const QString& windowTitle, const std::function< void() >& callback, QWidget* parent ) { ScanningDialog* theDialog = new ScanningDialog( text, windowTitle, parent ); theDialog->show(); QFutureWatcher< void >* watcher = new QFutureWatcher< void >(); connect( watcher, &QFutureWatcher< void >::finished, theDialog, [ watcher, theDialog, callback ] { watcher->deleteLater(); theDialog->hide(); theDialog->deleteLater(); callback(); } ); watcher->setFuture( future ); } void ScanningDialog::run( const QFuture< void >& future, const std::function< void() >& callback, QWidget* parent ) { ScanningDialog::run( future, tr( "Scanning storage devices..." ), tr( "Partitioning" ), callback, parent ); } void ScanningDialog::setVisible(bool visible) { QDialog::setVisible( visible ); emit visibilityChanged(); } calamares-3.1.12/src/modules/partition/gui/ScanningDialog.h000066400000000000000000000032361322271446000236200ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SCANNINGDIALOG_H #define SCANNINGDIALOG_H #include #include #include class ScanningDialog : public QDialog { Q_OBJECT public: explicit ScanningDialog( const QString& text, const QString& windowTitle, QWidget* parent = nullptr ); static void run( const QFuture< void >& future, const QString& text, const QString& windowTitle, const std::function< void() >& callback = []{}, QWidget* parent = nullptr ); static void run( const QFuture< void >& future, const std::function< void() >& callback = []{}, QWidget* parent = nullptr ); public slots: void setVisible( bool visible ) override; signals: void visibilityChanged(); }; #endif // SCANNINGDIALOG_H calamares-3.1.12/src/modules/partition/jobs/000077500000000000000000000000001322271446000207345ustar00rootroot00000000000000calamares-3.1.12/src/modules/partition/jobs/ClearMountsJob.cpp000066400000000000000000000203471322271446000243350ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ClearMountsJob.h" #include "core/PartitionInfo.h" #include "core/PartitionIterator.h" #include "utils/Logger.h" // KPMcore #include #include #include #include #include #include ClearMountsJob::ClearMountsJob( Device* device ) : Calamares::Job() , m_device( device ) { } QString ClearMountsJob::prettyName() const { return tr( "Clear mounts for partitioning operations on %1" ) .arg( m_device->deviceNode() ); } QString ClearMountsJob::prettyStatusMessage() const { return tr( "Clearing mounts for partitioning operations on %1." ) .arg( m_device->deviceNode() ); } Calamares::JobResult ClearMountsJob::exec() { QStringList goodNews; QString deviceName = m_device->deviceNode().split( '/' ).last(); QProcess process; process.setProgram( "sh" ); process.setArguments( { "-c", QString( "echo $(awk '{print $4}' /proc/partitions | sed -e '/name/d' -e '/^$/d' -e '/[1-9]/!d' | grep %1)" ) .arg( deviceName ) } ); process.start(); process.waitForFinished(); const QString partitions = process.readAllStandardOutput(); const QStringList partitionsList = partitions.simplified().split( ' ' ); // Build a list of partitions of type 82 (Linux swap / Solaris). // We then need to clear them just in case they contain something resumable from a // previous suspend-to-disk. QStringList swapPartitions; process.start( "sfdisk", { "-d", m_device->deviceNode() } ); process.waitForFinished(); // Sample output: // % sudo sfdisk -d /dev/sda // label: dos // label-id: 0x000ced89 // device: /dev/sda // unit: sectors // /dev/sda1 : start= 63, size= 29329345, type=83, bootable // /dev/sda2 : start= 29331456, size= 2125824, type=82 swapPartitions = QString::fromLocal8Bit( process.readAllStandardOutput() ) .split( '\n' ); swapPartitions = swapPartitions.filter( "type=82" ); for ( QStringList::iterator it = swapPartitions.begin(); it != swapPartitions.end(); ++it ) { *it = (*it).simplified().split( ' ' ).first(); } const QStringList cryptoDevices = getCryptoDevices(); for ( const QString &mapperPath : cryptoDevices ) { tryUmount( mapperPath ); QString news = tryCryptoClose( mapperPath ); if ( !news.isEmpty() ) goodNews.append( news ); } // First we umount all LVM logical volumes we can find process.start( "lvscan", { "-a" } ); process.waitForFinished(); if ( process.exitCode() == 0 ) //means LVM2 tools are installed { const QStringList lvscanLines = QString::fromLocal8Bit( process.readAllStandardOutput() ).split( '\n' ); for ( const QString& lvscanLine : lvscanLines ) { QString lvPath = lvscanLine.simplified().split( ' ' ).value( 1 ); //second column lvPath = lvPath.replace( '\'', "" ); QString news = tryUmount( lvPath ); if ( !news.isEmpty() ) goodNews.append( news ); } } else cDebug() << "WARNING: this system does not seem to have LVM2 tools."; // Then we go looking for volume groups that use this device for physical volumes process.start( "pvdisplay", { "-C", "--noheadings" } ); process.waitForFinished(); if ( process.exitCode() == 0 ) //means LVM2 tools are installed { QString pvdisplayOutput = process.readAllStandardOutput(); if ( !pvdisplayOutput.simplified().isEmpty() ) //means there is at least one LVM PV { QSet< QString > vgSet; const QStringList pvdisplayLines = pvdisplayOutput.split( '\n' ); for ( const QString& pvdisplayLine : pvdisplayLines ) { QString pvPath = pvdisplayLine.simplified().split( ' ' ).value( 0 ); QString vgName = pvdisplayLine.simplified().split( ' ' ).value( 1 ); if ( !pvPath.contains( deviceName ) ) continue; vgSet.insert( vgName ); } foreach ( const QString& vgName, vgSet ) { process.start( "vgchange", { "-an", vgName } ); process.waitForFinished(); if ( process.exitCode() == 0 ) goodNews.append( QString( "Successfully disabled volume group %1." ).arg( vgName ) ); } } } else cDebug() << "WARNING: this system does not seem to have LVM2 tools."; const QStringList cryptoDevices2 = getCryptoDevices(); for ( const QString &mapperPath : cryptoDevices2 ) { tryUmount( mapperPath ); QString news = tryCryptoClose( mapperPath ); if ( !news.isEmpty() ) goodNews.append( news ); } for ( const QString &p : partitionsList ) { QString partPath = QString( "/dev/%1" ).arg( p ); QString news = tryUmount( partPath ); if ( !news.isEmpty() ) goodNews.append( news ); } foreach ( QString p, swapPartitions ) { QString news = tryClearSwap( p ); if ( !news.isEmpty() ) goodNews.append( news ); } Calamares::JobResult ok = Calamares::JobResult::ok(); ok.setMessage( tr( "Cleared all mounts for %1" ) .arg( m_device->deviceNode() ) ); ok.setDetails( goodNews.join( "\n" ) ); cDebug() << "ClearMountsJob finished. Here's what was done:\n" << goodNews.join( "\n" ); return ok; } QString ClearMountsJob::tryUmount( const QString& partPath ) { QProcess process; process.start( "umount", { partPath } ); process.waitForFinished(); if ( process.exitCode() == 0 ) return QString( "Successfully unmounted %1." ).arg( partPath ); process.start( "swapoff", { partPath } ); process.waitForFinished(); if ( process.exitCode() == 0 ) return QString( "Successfully disabled swap %1." ).arg( partPath ); return QString(); } QString ClearMountsJob::tryClearSwap( const QString& partPath ) { QProcess process; process.start( "blkid", { "-s", "UUID", "-o", "value", partPath } ); process.waitForFinished(); QString swapPartUuid = QString::fromLocal8Bit( process.readAllStandardOutput() ).simplified(); if ( process.exitCode() != 0 || swapPartUuid.isEmpty() ) return QString(); process.start( "mkswap", { "-U", swapPartUuid, partPath } ); process.waitForFinished(); if ( process.exitCode() != 0 ) return QString(); return QString( "Successfully cleared swap %1." ).arg( partPath ); } QString ClearMountsJob::tryCryptoClose( const QString& mapperPath ) { QProcess process; process.start( "cryptsetup", { "close", mapperPath } ); process.waitForFinished(); if ( process.exitCode() == 0 ) return QString( "Successfully closed mapper device %1." ).arg( mapperPath ); return QString(); } QStringList ClearMountsJob::getCryptoDevices() const { QDir mapperDir( "/dev/mapper" ); const QFileInfoList fiList = mapperDir.entryInfoList( QDir::Files ); QStringList list; QProcess process; for ( const QFileInfo &fi : fiList ) { if ( fi.baseName() == "control" ) continue; list.append( fi.absoluteFilePath() ); } return list; } calamares-3.1.12/src/modules/partition/jobs/ClearMountsJob.h000066400000000000000000000027331322271446000240010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CLEARMOUNTSJOB_H #define CLEARMOUNTSJOB_H #include class Device; /** * This job tries to free all mounts for the given device, so partitioning * operations can proceed. */ class ClearMountsJob : public Calamares::Job { Q_OBJECT public: explicit ClearMountsJob( Device* device ); QString prettyName() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: QString tryUmount( const QString& partPath ); QString tryClearSwap( const QString& partPath ); QString tryCryptoClose( const QString& mapperPath ); QStringList getCryptoDevices() const; Device* m_device; }; #endif // CLEARMOUNTSJOB_H calamares-3.1.12/src/modules/partition/jobs/ClearTempMountsJob.cpp000066400000000000000000000060471322271446000251640ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ClearTempMountsJob.h" #include "utils/Logger.h" #include // KPMcore #include #include #include #include ClearTempMountsJob::ClearTempMountsJob() : Calamares::Job() { } QString ClearTempMountsJob::prettyName() const { return tr( "Clear all temporary mounts." ); } QString ClearTempMountsJob::prettyStatusMessage() const { return tr( "Clearing all temporary mounts." ); } Calamares::JobResult ClearTempMountsJob::exec() { // Fetch a list of current mounts to Calamares temporary directories. QList< QPair < QString, QString > > lst; QFile mtab( "/etc/mtab" ); if ( !mtab.open( QFile::ReadOnly | QFile::Text ) ) return Calamares::JobResult::error( tr( "Cannot get list of temporary mounts." ) ); cDebug() << "Opened mtab. Lines:"; QTextStream in(&mtab); QString lineIn = in.readLine(); while ( !lineIn.isNull() ) { QStringList line = lineIn.split( ' ', QString::SkipEmptyParts ); cDebug() << line.join( ' ' ); QString device = line.at( 0 ); QString mountPoint = line.at( 1 ); if ( mountPoint.startsWith( "/tmp/calamares-" ) ) { cDebug() << "INSERTING pair (device, mountPoint)" << device << mountPoint; lst.append( qMakePair( device, mountPoint ) ); } lineIn = in.readLine(); } std::sort ( lst.begin(), lst.end(), []( const QPair< QString, QString >& a, const QPair< QString, QString >& b ) -> bool { return a.first > b.first; } ); QStringList goodNews; QProcess process; foreach ( auto line, lst ) { QString partPath = line.second; cDebug() << "Will try to umount path" << partPath; process.start( "umount", { "-lv", partPath } ); process.waitForFinished(); if ( process.exitCode() == 0 ) goodNews.append( QString( "Successfully unmounted %1." ).arg( partPath ) ); } Calamares::JobResult ok = Calamares::JobResult::ok(); ok.setMessage( tr( "Cleared all temporary mounts." ) ); ok.setDetails( goodNews.join( "\n" ) ); cDebug() << "ClearTempMountsJob finished. Here's what was done:\n" << goodNews.join( "\n" ); return ok; } calamares-3.1.12/src/modules/partition/jobs/ClearTempMountsJob.h000066400000000000000000000023751322271446000246310ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CLEARTEMPMOUNTSJOB_H #define CLEARTEMPMOUNTSJOB_H #include class Device; /** * This job tries to free all temporary mounts used by Calamares, so partitioning * operations can proceed. */ class ClearTempMountsJob : public Calamares::Job { Q_OBJECT public: explicit ClearTempMountsJob(); QString prettyName() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; }; #endif // CLEARTEMPMOUNTSJOB_H calamares-3.1.12/src/modules/partition/jobs/CreatePartitionJob.cpp000066400000000000000000000116521322271446000251750ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/CreatePartitionJob.h" #include "utils/Logger.h" #include "utils/Units.h" // KPMcore #include #include #include #include #include #include #include #include #include #include // Qt #include CreatePartitionJob::CreatePartitionJob( Device* device, Partition* partition ) : PartitionJob( partition ) , m_device( device ) { } QString CreatePartitionJob::prettyName() const { return tr( "Create new %2MB partition on %4 (%3) with file system %1." ) .arg( m_partition->fileSystem().name() ) .arg( CalamaresUtils::BytesToMiB( m_partition->capacity() ) ) .arg( m_device->name() ) .arg( m_device->deviceNode() ); } QString CreatePartitionJob::prettyDescription() const { return tr( "Create new %2MB partition on %4 " "(%3) with file system %1." ) .arg( m_partition->fileSystem().name() ) .arg( CalamaresUtils::BytesToMiB( m_partition->capacity() ) ) .arg( m_device->name() ) .arg( m_device->deviceNode() ); } QString CreatePartitionJob::prettyStatusMessage() const { return tr( "Creating new %1 partition on %2." ) .arg( m_partition->fileSystem().name() ) .arg( m_device->deviceNode() ); } Calamares::JobResult CreatePartitionJob::exec() { int step = 0; const qreal stepCount = 4; Report report( nullptr ); QString message = tr( "The installer failed to create partition on disk '%1'." ).arg( m_device->name() ); progress( step++ / stepCount ); CoreBackend* backend = CoreBackendManager::self()->backend(); QScopedPointer backendDevice( backend->openDevice( m_device->deviceNode() ) ); if ( !backendDevice.data() ) { return Calamares::JobResult::error( message, tr( "Could not open device '%1'." ).arg( m_device->deviceNode() ) ); } progress( step++ / stepCount ); QScopedPointer backendPartitionTable( backendDevice->openPartitionTable() ); if ( !backendPartitionTable.data() ) { return Calamares::JobResult::error( message, tr( "Could not open partition table." ) ); } progress( step++ / stepCount ); QString partitionPath = backendPartitionTable->createPartition( report, *m_partition ); if ( partitionPath.isEmpty() ) { return Calamares::JobResult::error( message, report.toText() ); } m_partition->setPartitionPath( partitionPath ); backendPartitionTable->commit(); progress( step++ / stepCount ); FileSystem& fs = m_partition->fileSystem(); if ( fs.type() == FileSystem::Unformatted || fs.type() == FileSystem::Extended ) return Calamares::JobResult::ok(); if ( !fs.create( report, partitionPath ) ) { return Calamares::JobResult::error( tr( "The installer failed to create file system on partition %1." ).arg( partitionPath ), report.toText() ); } if ( !backendPartitionTable->setPartitionSystemType( report, *m_partition ) ) { return Calamares::JobResult::error( tr( "The installer failed to update partition table on disk '%1'." ).arg( m_device->name() ), report.toText() ); } backendPartitionTable->commit(); return Calamares::JobResult::ok(); } void CreatePartitionJob::updatePreview() { m_device->partitionTable()->removeUnallocated(); m_partition->parent()->insert( m_partition ); m_device->partitionTable()->updateUnallocated( *m_device ); } calamares-3.1.12/src/modules/partition/jobs/CreatePartitionJob.h000066400000000000000000000031121322271446000246320ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CREATEPARTITIONJOB_H #define CREATEPARTITIONJOB_H #include class Device; class Partition; class FileSystem; /** * Creates a partition on a device. * * This job does two things: * 1. Create the partition * 2. Create the filesystem on the partition */ class CreatePartitionJob : public PartitionJob { Q_OBJECT public: CreatePartitionJob( Device* device, Partition* partition ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; void updatePreview(); Device* device() const { return m_device; } private: Device* m_device; }; #endif /* CREATEPARTITIONJOB_H */ calamares-3.1.12/src/modules/partition/jobs/CreatePartitionTableJob.cpp000066400000000000000000000114131322271446000261400ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/CreatePartitionTableJob.h" #include "utils/Logger.h" // KPMcore #include #include #include #include #include #include #include #include #include #include // Qt #include #include CreatePartitionTableJob::CreatePartitionTableJob( Device* device, PartitionTable::TableType type ) : m_device( device ) , m_type( type ) { } QString CreatePartitionTableJob::prettyName() const { return tr( "Create new %1 partition table on %2." ) .arg( PartitionTable::tableTypeToName( m_type ) ) .arg( m_device->deviceNode() ); } QString CreatePartitionTableJob::prettyDescription() const { return tr( "Create new %1 partition table on %2 (%3)." ) .arg( PartitionTable::tableTypeToName( m_type ).toUpper() ) .arg( m_device->deviceNode() ) .arg( m_device->name() ); } QString CreatePartitionTableJob::prettyStatusMessage() const { return tr( "Creating new %1 partition table on %2." ) .arg( PartitionTable::tableTypeToName( m_type ).toUpper() ) .arg( m_device->deviceNode() ); } Calamares::JobResult CreatePartitionTableJob::exec() { Report report( nullptr ); QString message = tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() ); CoreBackend* backend = CoreBackendManager::self()->backend(); QScopedPointer< CoreBackendDevice > backendDevice( backend->openDevice( m_device->deviceNode() ) ); if ( !backendDevice.data() ) { return Calamares::JobResult::error( message, tr( "Could not open device %1." ).arg( m_device->deviceNode() ) ); } QScopedPointer< PartitionTable > table( createTable() ); cDebug() << "Creating new partition table of type" << table->typeName() << ", uncommitted yet:\n" << table; QProcess lsblk; lsblk.setProgram( "lsblk" ); lsblk.setProcessChannelMode( QProcess::MergedChannels ); lsblk.start(); lsblk.waitForFinished(); cDebug() << "lsblk:\n" << lsblk.readAllStandardOutput(); QProcess mount; mount.setProgram( "mount" ); mount.setProcessChannelMode( QProcess::MergedChannels ); mount.start(); mount.waitForFinished(); cDebug() << "mount:\n" << mount.readAllStandardOutput(); bool ok = backendDevice->createPartitionTable( report, *table ); if ( !ok ) { return Calamares::JobResult::error( message, QString( "Text: %1\nCommand: %2\nOutput: %3\nStatus: %4" ) .arg( report.toText() ) .arg( report.command() ) .arg( report.output() ) .arg( report.status() ) ); } return Calamares::JobResult::ok(); } void CreatePartitionTableJob::updatePreview() { // Device takes ownership of its table, but does not destroy the current // one when setPartitionTable() is called, so do it ourself delete m_device->partitionTable(); m_device->setPartitionTable( createTable() ); m_device->partitionTable()->updateUnallocated( *m_device ); } PartitionTable* CreatePartitionTableJob::createTable() { cDebug() << "CreatePartitionTableJob::createTable trying to make table for device" << m_device->deviceNode(); return new PartitionTable( m_type, PartitionTable::defaultFirstUsable( *m_device, m_type ), PartitionTable::defaultLastUsable( *m_device, m_type ) ); } calamares-3.1.12/src/modules/partition/jobs/CreatePartitionTableJob.h000066400000000000000000000032661322271446000256140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CREATEPARTITIONTABLEJOB_H #define CREATEPARTITIONTABLEJOB_H #include // KPMcore #include class Device; /** * Creates a partition table on a device. It supports MBR and GPT partition * tables. * * This wipes all the data from the device. */ class CreatePartitionTableJob : public Calamares::Job { Q_OBJECT public: CreatePartitionTableJob( Device* device, PartitionTable::TableType type ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; void updatePreview(); Device* device() const { return m_device; } private: Device* m_device; PartitionTable::TableType m_type; PartitionTable* createTable(); }; #endif /* CREATEPARTITIONTABLEJOB_H */ calamares-3.1.12/src/modules/partition/jobs/DeletePartitionJob.cpp000066400000000000000000000103031322271446000251640ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/DeletePartitionJob.h" // KPMcore #include #include #include #include #include #include #include #include #include DeletePartitionJob::DeletePartitionJob( Device* device, Partition* partition ) : PartitionJob( partition ) , m_device( device ) { } QString DeletePartitionJob::prettyName() const { return tr( "Delete partition %1." ) .arg( m_partition->partitionPath() ); } QString DeletePartitionJob::prettyDescription() const { return tr( "Delete partition %1." ) .arg( m_partition->partitionPath() ); } QString DeletePartitionJob::prettyStatusMessage() const { return tr( "Deleting partition %1." ) .arg( m_partition->partitionPath() ); } Calamares::JobResult DeletePartitionJob::exec() { Report report( nullptr ); QString message = tr( "The installer failed to delete partition %1." ).arg( m_partition->devicePath() ); if ( m_device->deviceNode() != m_partition->devicePath() ) { return Calamares::JobResult::error( message, tr( "Partition (%1) and device (%2) do not match." ) .arg( m_partition->devicePath() ) .arg( m_device->deviceNode() ) ); } CoreBackend* backend = CoreBackendManager::self()->backend(); QScopedPointer backendDevice( backend->openDevice( m_device->deviceNode() ) ); if ( !backendDevice.data() ) { return Calamares::JobResult::error( message, tr( "Could not open device %1." ).arg( m_device->deviceNode() ) ); } QScopedPointer backendPartitionTable( backendDevice->openPartitionTable() ); if ( !backendPartitionTable.data() ) { return Calamares::JobResult::error( message, tr( "Could not open partition table." ) ); } bool ok = backendPartitionTable->deletePartition( report, *m_partition ); if ( !ok ) { return Calamares::JobResult::error( message, report.toText() ); } backendPartitionTable->commit(); return Calamares::JobResult::ok(); } void DeletePartitionJob::updatePreview() { m_partition->parent()->remove( m_partition ); m_device->partitionTable()->updateUnallocated( *m_device ); // Copied from PM DeleteOperation::checkAdjustLogicalNumbers(): // // If the deleted partition is a logical one, we need to adjust the numbers // of the other logical partitions in the extended one, if there are any, // because the OS will do that, too: Logicals must be numbered without gaps, // i.e., a numbering like sda5, sda6, sda8 (after sda7 is deleted) will // become sda5, sda6, sda7 Partition* parentPartition = dynamic_cast< Partition* >( m_partition->parent() ); if ( parentPartition && parentPartition->roles().has( PartitionRole::Extended ) ) parentPartition->adjustLogicalNumbers( m_partition->number(), -1 ); } calamares-3.1.12/src/modules/partition/jobs/DeletePartitionJob.h000066400000000000000000000032241322271446000246350ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef DELETEPARTITIONJOB_H #define DELETEPARTITIONJOB_H #include class Device; class Partition; class FileSystem; /** * Deletes an existing partition. * * This is only used for partitions which already existed before the installer * was started: partitions created within the installer and then removed are * simply forgotten. */ class DeletePartitionJob : public PartitionJob { Q_OBJECT public: DeletePartitionJob( Device* device, Partition* partition ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; void updatePreview(); Device* device() const { return m_device; } private: Device* m_device; }; #endif /* DELETEPARTITIONJOB_H */ calamares-3.1.12/src/modules/partition/jobs/FillGlobalStorageJob.cpp000066400000000000000000000213111322271446000254250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/FillGlobalStorageJob.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "core/PartitionInfo.h" #include "core/PartitionIterator.h" #include "core/KPMHelpers.h" #include "Branding.h" #include "utils/Logger.h" // CalaPM #include #include #include #include // Qt #include #include #include #include typedef QHash UuidForPartitionHash; static UuidForPartitionHash findPartitionUuids( QList < Device* > devices ) { cDebug() << "Gathering UUIDs for partitions that exist now."; UuidForPartitionHash hash; foreach ( Device* device, devices ) { for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) { Partition* p = *it; QString path = p->partitionPath(); QString uuid = p->fileSystem().readUUID( p->partitionPath() ); hash.insert( path, uuid ); } } cDebug() << hash; return hash; } static QString getLuksUuid( const QString& path ) { QProcess process; process.setProgram( "cryptsetup" ); process.setArguments( { "luksUUID", path } ); process.start(); process.waitForFinished(); if ( process.exitStatus() != QProcess::NormalExit || process.exitCode() ) return QString(); QString uuid = QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed(); return uuid; } // TODO: this will be available from KPMCore soon static const char* filesystem_labels[] = { "unknown", "extended", "ext2", "ext3", "ext4", "linuxswap", "fat16", "fat32", "ntfs", "reiser", "reiser4", "xfs", "jfs", "hfs", "hfsplus", "ufs", "unformatted", "btrfs", "hpfs", "luks", "ocfs2", "zfs", "exfat", "nilfs2", "lvm2 pv", "f2fs", "udf", "iso9660", }; Q_STATIC_ASSERT_X((sizeof(filesystem_labels) / sizeof(char *)) >= FileSystem::__lastType, "Mismatch in filesystem labels"); static QString untranslatedTypeName(FileSystem::Type t) { Q_ASSERT( t >= 0 ); Q_ASSERT( t <= FileSystem::__lastType ); return QLatin1String(filesystem_labels[t]); } static QVariant mapForPartition( Partition* partition, const QString& uuid ) { QVariantMap map; map[ "device" ] = partition->partitionPath(); map[ "mountPoint" ] = PartitionInfo::mountPoint( partition ); map[ "fsName" ] = partition->fileSystem().name(); map[ "fs" ] = untranslatedTypeName( partition->fileSystem().type() ); if ( partition->fileSystem().type() == FileSystem::Luks && dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() ) map[ "fs" ] = dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS()->name(); map[ "uuid" ] = uuid; cDebug() << partition->partitionPath() << "mtpoint:" << PartitionInfo::mountPoint( partition ) << "fs:" << map[ "fs" ] << '(' << map[ "fsName" ] << ')' << uuid; if ( partition->roles().has( PartitionRole::Luks ) ) { const FileSystem& fsRef = partition->fileSystem(); const FS::luks* luksFs = dynamic_cast< const FS::luks* >( &fsRef ); if ( luksFs ) { map[ "luksMapperName" ] = luksFs->mapperName().split( "/" ).last(); map[ "luksUuid" ] = getLuksUuid( partition->partitionPath() ); map[ "luksPassphrase" ] = luksFs->passphrase(); cDebug() << "luksMapperName:" << map[ "luksMapperName" ]; } } return map; } FillGlobalStorageJob::FillGlobalStorageJob( QList< Device* > devices, const QString& bootLoaderPath ) : m_devices( devices ) , m_bootLoaderPath( bootLoaderPath ) { } QString FillGlobalStorageJob::prettyName() const { return tr( "Set partition information" ); } QString FillGlobalStorageJob::prettyDescription() const { QStringList lines; const auto partitionList = createPartitionList().toList(); for ( const QVariant &partitionItem : partitionList ) { if ( partitionItem.type() == QVariant::Map ) { QVariantMap partitionMap = partitionItem.toMap(); QString path = partitionMap.value( "device" ).toString(); QString mountPoint = partitionMap.value( "mountPoint" ).toString(); QString fsType = partitionMap.value( "fs" ).toString(); qDebug() << partitionMap.value( "uuid" ) << path << mountPoint << fsType; if ( mountPoint.isEmpty() || fsType.isEmpty() ) continue; if ( path.isEmpty() ) { if ( mountPoint == "/" ) lines.append( tr( "Install %1 on new %2 system partition." ) .arg( *Calamares::Branding::ShortProductName ) .arg( fsType ) ); else lines.append( tr( "Set up new %2 partition with mount point " "%1." ) .arg( mountPoint ) .arg( fsType ) ); } else { if ( mountPoint == "/" ) lines.append( tr( "Install %2 on %3 system partition %1." ) .arg( path ) .arg( *Calamares::Branding::ShortProductName ) .arg( fsType ) ); else lines.append( tr( "Set up %3 partition %1 with mount point " "%2." ) .arg( path ) .arg( mountPoint ) .arg( fsType ) ); } } } QVariant bootloaderMap = createBootLoaderMap(); if ( !m_bootLoaderPath.isEmpty() ) { lines.append( tr( "Install boot loader on %1." ) .arg( m_bootLoaderPath ) ); } return lines.join( "
" ); } QString FillGlobalStorageJob::prettyStatusMessage() const { return tr( "Setting up mount points." ); } Calamares::JobResult FillGlobalStorageJob::exec() { Calamares::GlobalStorage* storage = Calamares::JobQueue::instance()->globalStorage(); storage->insert( "partitions", createPartitionList() ); if ( !m_bootLoaderPath.isEmpty() ) { QVariant var = createBootLoaderMap(); if ( !var.isValid() ) cDebug() << "Failed to find path for boot loader"; cDebug() << "FillGlobalStorageJob writing bootLoader path:" << var; storage->insert( "bootLoader", var ); } else { cDebug() << "FillGlobalStorageJob writing empty bootLoader value"; storage->insert( "bootLoader", QVariant() ); } return Calamares::JobResult::ok(); } QVariant FillGlobalStorageJob::createPartitionList() const { UuidForPartitionHash hash = findPartitionUuids( m_devices ); QVariantList lst; cDebug() << "Writing to GlobalStorage[\"partitions\"]"; for ( auto device : m_devices ) { for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) { lst << mapForPartition( *it, hash.value( ( *it )->partitionPath() ) ); } } return lst; } QVariant FillGlobalStorageJob::createBootLoaderMap() const { QVariantMap map; QString path = m_bootLoaderPath; if ( !path.startsWith( "/dev/" ) ) { Partition* partition = KPMHelpers::findPartitionByMountPoint( m_devices, path ); if ( !partition ) return QVariant(); path = partition->partitionPath(); } map[ "installPath" ] = path; return map; } calamares-3.1.12/src/modules/partition/jobs/FillGlobalStorageJob.h000066400000000000000000000033621322271446000251000ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef FILLGLOBALSTORAGEJOB_H #define FILLGLOBALSTORAGEJOB_H #include // Qt #include class Device; class Partition; /** * This job does not touch devices. It inserts in GlobalStorage the * partition-related keys (see hacking/GlobalStorage.md) * * Inserting the keys after partitioning makes it possible to access * information such as the partition path or the UUID. */ class FillGlobalStorageJob : public Calamares::Job { Q_OBJECT public: FillGlobalStorageJob( QList< Device* > devices, const QString& bootLoaderPath ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: QList< Device* > m_devices; QString m_bootLoaderPath; QVariant createPartitionList() const; QVariant createBootLoaderMap() const; }; #endif /* FILLGLOBALSTORAGEJOB_H */ calamares-3.1.12/src/modules/partition/jobs/FormatPartitionJob.cpp000066400000000000000000000110151322271446000252130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/FormatPartitionJob.h" #include "utils/Logger.h" // KPMcore #include #include #include #include #include #include #include #include #include #include // Qt #include #include FormatPartitionJob::FormatPartitionJob( Device* device, Partition* partition ) : PartitionJob( partition ) , m_device( device ) { } QString FormatPartitionJob::prettyName() const { return tr( "Format partition %1 (file system: %2, size: %3 MB) on %4." ) .arg( m_partition->partitionPath() ) .arg( m_partition->fileSystem().name() ) .arg( m_partition->capacity() / 1024 / 1024 ) .arg( m_device->name() ); } QString FormatPartitionJob::prettyDescription() const { return tr( "Format %3MB partition %1 with " "file system %2." ) .arg( m_partition->partitionPath() ) .arg( m_partition->fileSystem().name() ) .arg( m_partition->capacity() / 1024 / 1024 ); } QString FormatPartitionJob::prettyStatusMessage() const { return tr( "Formatting partition %1 with " "file system %2." ) .arg( m_partition->partitionPath() ) .arg( m_partition->fileSystem().name() ); } Calamares::JobResult FormatPartitionJob::exec() { Report report( nullptr ); // Root of the report tree, no parent QString partitionPath = m_partition->partitionPath(); QString message = tr( "The installer failed to format partition %1 on disk '%2'." ).arg( partitionPath, m_device->name() ); CoreBackend* backend = CoreBackendManager::self()->backend(); QScopedPointer backendDevice( backend->openDevice( m_device->deviceNode() ) ); if ( !backendDevice.data() ) { return Calamares::JobResult::error( message, tr( "Could not open device '%1'." ).arg( m_device->deviceNode() ) ); } QScopedPointer backendPartitionTable( backendDevice->openPartitionTable() ); if ( !backendPartitionTable.data() ) { return Calamares::JobResult::error( message, tr( "Could not open partition table." ) ); } FileSystem& fs = m_partition->fileSystem(); bool ok = fs.create( report, partitionPath ); int retries = 0; const int MAX_RETRIES = 10; while ( !ok ) { cDebug() << "Partition" << m_partition->partitionPath() << "might not be ready yet, retrying (" << ++retries << "/" << MAX_RETRIES << ") ..."; QThread::sleep( 2 /*seconds*/ ); ok = fs.create( report, partitionPath ); if ( retries == MAX_RETRIES ) break; } if ( !ok ) { return Calamares::JobResult::error( tr( "The installer failed to create file system on partition %1." ) .arg( partitionPath ), report.toText() ); } if ( !backendPartitionTable->setPartitionSystemType( report, *m_partition ) ) { return Calamares::JobResult::error( tr( "The installer failed to update partition table on disk '%1'." ).arg( m_device->name() ), report.toText() ); } backendPartitionTable->commit(); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/partition/jobs/FormatPartitionJob.h000066400000000000000000000031031322271446000246570ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef FORMATPARTITIONJOB_H #define FORMATPARTITIONJOB_H #include class Device; class Partition; class FileSystem; /** * This job formats an existing partition. * * It is only used for existing partitions: newly created partitions are * formatted by the CreatePartitionJob. */ class FormatPartitionJob : public PartitionJob { Q_OBJECT public: FormatPartitionJob( Device* device, Partition* partition ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; Device* device() const { return m_device; } private: Device* m_device; }; #endif /* FORMATPARTITIONJOB_H */ calamares-3.1.12/src/modules/partition/jobs/PartitionJob.cpp000066400000000000000000000016221322271446000240450ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include PartitionJob::PartitionJob( Partition* partition ) : m_partition( partition ) {} calamares-3.1.12/src/modules/partition/jobs/PartitionJob.h000066400000000000000000000022471322271446000235160ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONJOB_H #define PARTITIONJOB_H #include class Partition; /** * Base class for jobs which affect a partition. */ class PartitionJob : public Calamares::Job { Q_OBJECT public: PartitionJob( Partition* partition ); Partition* partition() const { return m_partition; } protected: Partition* m_partition; }; #endif /* PARTITIONJOB_H */ calamares-3.1.12/src/modules/partition/jobs/ResizePartitionJob.cpp000066400000000000000000000074431322271446000252360ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * Copyright 2017, Andrius Štikonas * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "jobs/ResizePartitionJob.h" // KPMcore #include #include #include //- ResizePartitionJob --------------------------------------------------------- ResizePartitionJob::ResizePartitionJob( Device* device, Partition* partition, qint64 firstSector, qint64 lastSector ) : PartitionJob( partition ) , m_device( device ) , m_oldFirstSector( partition->firstSector() ) // Keep a copy of old sectors because they will be overwritten in updatePreview() , m_oldLastSector( partition->lastSector() ) , m_newFirstSector( firstSector ) , m_newLastSector( lastSector ) { } QString ResizePartitionJob::prettyName() const { // FIXME: Copy PM ResizeOperation code which generates a description of the // operation return tr( "Resize partition %1." ).arg( partition()->partitionPath() ); } QString ResizePartitionJob::prettyDescription() const { return tr( "Resize %2MB partition %1 to " "%3MB." ) .arg( partition()->partitionPath() ) .arg( ( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ) .arg( ( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ); } QString ResizePartitionJob::prettyStatusMessage() const { return tr( "Resizing %2MB partition %1 to " "%3MB." ) .arg( partition()->partitionPath() ) .arg( ( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ) .arg( ( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ); } Calamares::JobResult ResizePartitionJob::exec() { Report report (nullptr); // Restore partition sectors that were modified for preview m_partition->setFirstSector( m_oldFirstSector ); m_partition->setLastSector( m_oldLastSector ); ResizeOperation op(*m_device, *m_partition, m_newFirstSector, m_newLastSector); op.setStatus(Operation::StatusRunning); connect(&op, &Operation::progress, [&](int percent) { emit progress(percent / 100.0); } ); QString errorMessage = tr( "The installer failed to resize partition %1 on disk '%2'." ) .arg( m_partition->partitionPath() ) .arg( m_device->name() ); if (op.execute(report)) return Calamares::JobResult::ok(); return Calamares::JobResult::error(errorMessage, report.toText()); } void ResizePartitionJob::updatePreview() { m_device->partitionTable()->removeUnallocated(); m_partition->parent()->remove( m_partition ); m_partition->setFirstSector( m_newFirstSector ); m_partition->setLastSector( m_newLastSector ); m_partition->parent()->insert( m_partition ); m_device->partitionTable()->updateUnallocated( *m_device ); } Device* ResizePartitionJob::device() const { return m_device; } calamares-3.1.12/src/modules/partition/jobs/ResizePartitionJob.h000066400000000000000000000032571322271446000247020ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef RESIZEPARTITIONJOB_H #define RESIZEPARTITIONJOB_H #include class Device; class Partition; class FileSystem; /** * This job resizes an existing partition. * * It can grow, shrink and/or move a partition while preserving its content. */ class ResizePartitionJob : public PartitionJob { Q_OBJECT public: ResizePartitionJob( Device* device, Partition* partition, qint64 firstSector, qint64 lastSector ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; void updatePreview(); Device* device() const; private: Device* m_device; qint64 m_oldFirstSector; qint64 m_oldLastSector; qint64 m_newFirstSector; qint64 m_newLastSector; }; #endif /* RESIZEPARTITIONJOB_H */ calamares-3.1.12/src/modules/partition/jobs/SetPartitionFlagsJob.cpp000066400000000000000000000170371322271446000255050ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Based on the SetPartFlagsJob class from KDE Partition Manager, * Copyright 2008, 2010, Volker Lanz * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "SetPartitionFlagsJob.h" #include "utils/Logger.h" #include #include #include #include #include #include #include #include SetPartFlagsJob::SetPartFlagsJob( Device* device, Partition* partition, PartitionTable::Flags flags ) : PartitionJob( partition ) , m_device( device ) , m_flags( flags ) {} QString SetPartFlagsJob::prettyName() const { if ( !partition()->partitionPath().isEmpty() ) return tr( "Set flags on partition %1." ).arg( partition()->partitionPath() ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Set flags on %1MB %2 partition." ) .arg( partition()->capacity() /1024 /1024) .arg( partition()->fileSystem().name() ); return tr( "Set flags on new partition." ); } QString SetPartFlagsJob::prettyDescription() const { QStringList flagsList = PartitionTable::flagNames( m_flags ); if ( flagsList.count() == 0 ) { if ( !partition()->partitionPath().isEmpty() ) return tr( "Clear flags on partition %1." ) .arg( partition()->partitionPath() ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Clear flags on %1MB %2 partition." ) .arg( partition()->capacity() /1024 /1024) .arg( partition()->fileSystem().name() ); return tr( "Clear flags on new partition." ); } if ( !partition()->partitionPath().isEmpty() ) return tr( "Flag partition %1 as " "%2." ) .arg( partition()->partitionPath() ) .arg( flagsList.join( ", " ) ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Flag %1MB %2 partition as " "%3." ) .arg( partition()->capacity() /1024 /1024) .arg( partition()->fileSystem().name() ) .arg( flagsList.join( ", " ) ); return tr( "Flag new partition as %1." ) .arg( flagsList.join( ", " ) ); } QString SetPartFlagsJob::prettyStatusMessage() const { QStringList flagsList = PartitionTable::flagNames( m_flags ); if ( flagsList.count() == 0 ) { if ( !partition()->partitionPath().isEmpty() ) return tr( "Clearing flags on partition %1." ) .arg( partition()->partitionPath() ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Clearing flags on %1MB %2 partition." ) .arg( partition()->capacity() /1024 /1024) .arg( partition()->fileSystem().name() ); return tr( "Clearing flags on new partition." ); } if ( !partition()->partitionPath().isEmpty() ) return tr( "Setting flags %2 on partition " "%1." ) .arg( partition()->partitionPath() ) .arg( flagsList.join( ", " ) ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Setting flags %3 on " "%1MB %2 partition." ) .arg( partition()->capacity() /1024 /1024) .arg( partition()->fileSystem().name() ) .arg( flagsList.join( ", " ) ); return tr( "Setting flags %1 on new partition." ) .arg( flagsList.join( ", " ) ); } Calamares::JobResult SetPartFlagsJob::exec() { PartitionTable::Flags oldFlags = partition()->availableFlags(); if ( oldFlags == m_flags ) return Calamares::JobResult::ok(); CoreBackend* backend = CoreBackendManager::self()->backend(); QString errorMessage = tr( "The installer failed to set flags on partition %1." ) .arg( m_partition->partitionPath() ); QScopedPointer< CoreBackendDevice > backendDevice( backend->openDevice( m_device->deviceNode() ) ); if ( !backendDevice.data() ) { return Calamares::JobResult::error( errorMessage, tr( "Could not open device '%1'." ).arg( m_device->deviceNode() ) ); } QScopedPointer< CoreBackendPartitionTable > backendPartitionTable( backendDevice->openPartitionTable() ); if ( !backendPartitionTable.data() ) { return Calamares::JobResult::error( errorMessage, tr( "Could not open partition table on device '%1'." ).arg( m_device->deviceNode() ) ); } QScopedPointer< CoreBackendPartition > backendPartition( ( partition()->roles().has( PartitionRole::Extended ) ) ? backendPartitionTable->getExtendedPartition() : backendPartitionTable->getPartitionBySector( partition()->firstSector() ) ); if ( !backendPartition.data() ) { return Calamares::JobResult::error( errorMessage, tr( "Could not find partition '%1'." ).arg( partition()->partitionPath() ) ); } quint32 count = 0; foreach( const PartitionTable::Flag& f, PartitionTable::flagList() ) { emit progress(++count); const bool state = ( m_flags & f ) ? true : false; Report report( nullptr ); if ( !backendPartition->setFlag( report, f, state ) ) { cDebug() << QStringLiteral( "WARNING: Could not set flag %2 on " "partition '%1'." ) .arg( partition()->partitionPath() ) .arg( PartitionTable::flagName( f ) ); } } // HACK: Partition (in KPMcore) declares SetPartFlagsJob as friend, but this actually // refers to an unrelated class SetPartFlagsJob which is in KPMcore but is not // exported. // Obviously here we are relying on having a class in Calamares with the same // name as a private one in KPMcore, which is awful, but it's the least evil // way to call Partition::setFlags (KPMcore's SetPartFlagsJob needs its friend // status for the very same reason). m_partition->setFlags( m_flags ); backendPartitionTable->commit(); return Calamares::JobResult::ok(); } #include "SetPartitionFlagsJob.moc" calamares-3.1.12/src/modules/partition/jobs/SetPartitionFlagsJob.h000066400000000000000000000031201322271446000251360ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac * * Based on the SetPartFlagsJob class from KDE Partition Manager, * Copyright 2008, 2010, Volker Lanz * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETPARTITIONFLAGSJOB_H #define SETPARTITIONFLAGSJOB_H #include #include class Device; class Partition; /** * This job changes the flags on an existing partition. */ class SetPartFlagsJob : public PartitionJob { Q_OBJECT public: SetPartFlagsJob( Device* device, Partition* partition, PartitionTable::Flags flags ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; Device* device() const; private: Device* m_device; PartitionTable::Flags m_flags; }; #endif // SETPARTITIONFLAGSJOB_H calamares-3.1.12/src/modules/partition/partition.conf000066400000000000000000000046731322271446000226710ustar00rootroot00000000000000# This setting specifies the mount point of the EFI system partition. Some # distributions (Fedora, Debian, Manjaro, etc.) use /boot/efi, others (KaOS, # etc.) use just /boot. efiSystemPartition: "/boot/efi" # Make sure an autogenerated swap partition is big enough for hibernation in # automated partitioning modes. Swap can be disabled through *neverCreateSwap*. # # When *ensureSuspendToDisk* is true, swap is never smaller than physical # memory, follows the guideline 2 * memory until swap reaches 8GiB. # When *ensureSuspendToDisk* is false, swap size scales up with memory # size until 8GiB, then at roughly half of memory size. # # # Default is true. ensureSuspendToDisk: true # Never create swap partitions in automated partitioning modes. # If this is true, ensureSuspendToDisk is ignored. # Default is false. neverCreateSwap: false # Correctly draw nested (e.g. logical) partitions as such. drawNestedPartitions: false # Show/hide partition labels on manual partitioning page. alwaysShowPartitionLabels: true # Default filesystem type, pre-selected in the "Create Partition" dialog. # The filesystem type selected here is also used for automated install # modes (Erase, Replace and Alongside). # Suggested values: ext2, ext3, ext4, reiser, xfs, jfs, btrfs # If nothing is specified, Calamares defaults to "ext4". defaultFileSystemType: "ext4" # Show/hide LUKS related functionality in automated partitioning modes. # Disable this if you choose not to deploy early unlocking support in GRUB2 # and/or your distribution's initramfs solution. # # BIG FAT WARNING: # # This option is unsupported, as it cuts out a crucial security feature. # Disabling LUKS and shipping Calamares without a correctly configured GRUB2 # and initramfs is considered suboptimal use of the Calamares software. The # Calamares team will not provide user support for any potential issue that # may arise as a consequence of setting this option to false. # It is strongly recommended that system integrators put in the work to support # LUKS unlocking support in GRUB2 and initramfs/dracut/mkinitcpio/etc. # Support is offered to system integrators that wish to do so, through the # Calamares bug tracker, as well as in #calamares on Freenode. # For more information on setting up GRUB2 for Calamares with LUKS, see # https://github.com/calamares/calamares/wiki/LUKS-Deployment # # If nothing is specified, LUKS is enabled in automated modes. #enableLuksAutomatedPartitioning: true calamares-3.1.12/src/modules/partition/tests/000077500000000000000000000000001322271446000211415ustar00rootroot00000000000000calamares-3.1.12/src/modules/partition/tests/CMakeLists.txt000066400000000000000000000021301322271446000236750ustar00rootroot00000000000000find_package( Qt5 COMPONENTS Gui Test REQUIRED ) find_package( KF5 COMPONENTS Service REQUIRED ) include( ECMAddTests ) set( PartitionModule_SOURCE_DIR .. ) set( partitionjobtests_SRCS ${PartitionModule_SOURCE_DIR}/core/KPMHelpers.cpp ${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp ${PartitionModule_SOURCE_DIR}/core/PartitionIterator.cpp ${PartitionModule_SOURCE_DIR}/jobs/CreatePartitionJob.cpp ${PartitionModule_SOURCE_DIR}/jobs/CreatePartitionTableJob.cpp ${PartitionModule_SOURCE_DIR}/jobs/DeletePartitionJob.cpp ${PartitionModule_SOURCE_DIR}/jobs/PartitionJob.cpp ${PartitionModule_SOURCE_DIR}/jobs/ResizePartitionJob.cpp PartitionJobTests.cpp ) include_directories( ${Qt5Gui_INCLUDE_DIRS} ${PartitionModule_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) ecm_add_test( ${partitionjobtests_SRCS} TEST_NAME partitionjobtests LINK_LIBRARIES ${CALAMARES_LIBRARIES} kpmcore Qt5::Core Qt5::Test KF5::Service ) set_target_properties( partitionjobtests PROPERTIES AUTOMOC TRUE ) calamares-3.1.12/src/modules/partition/tests/PartitionJobTests.cpp000066400000000000000000000324101322271446000252740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "utils/Units.h" #include #include #include #include // CalaPM #include #include #include // Qt #include #include #include QTEST_GUILESS_MAIN( PartitionJobTests ) using namespace Calamares; using CalamaresUtils::operator""_MiB; class PartitionMounter { public: PartitionMounter( const QString& devicePath ) : m_mountPointDir( "calamares-partitiontests-mountpoint" ) { QStringList args = QStringList() << devicePath << m_mountPointDir.path(); int ret = QProcess::execute( "mount", args ); m_mounted = ret == 0; QCOMPARE( ret, 0 ); } ~PartitionMounter() { if ( !m_mounted ) return; int ret = QProcess::execute( "umount", QStringList() << m_mountPointDir.path() ); QCOMPARE( ret, 0 ); } QString mountPoint() const { return m_mounted ? m_mountPointDir.path() : QString(); } private: QString m_devicePath; QTemporaryDir m_mountPointDir; bool m_mounted; }; static QByteArray generateTestData( qint64 size ) { QByteArray ba; ba.resize( size ); // Fill the array explicitly to keep Valgrind happy for ( auto it = ba.data() ; it < ba.data() + size ; ++it ) { *it = char( rand() & 0xff ); } return ba; } static void writeFile( const QString& path, const QByteArray data ) { QFile file( path ); QVERIFY( file.open( QIODevice::WriteOnly ) ); const char* ptr = data.constData(); const char* end = data.constData() + data.size(); const qint64 chunkSize = 16384; while ( ptr < end ) { qint64 count = file.write( ptr, chunkSize ); if ( count < 0 ) { QString msg = QString( "Writing file failed. Only %1 bytes written out of %2. Error: '%3'." ) .arg( ptr - data.constData() ) .arg( data.size() ) .arg( file.errorString() ); QFAIL( qPrintable( msg ) ); } ptr += count; } } static Partition* firstFreePartition( PartitionNode* parent ) { for( auto child : parent->children() ) if ( KPMHelpers::isPartitionFreeSpace( child ) ) return child; return nullptr; } //- QueueRunner --------------------------------------------------------------- QueueRunner::QueueRunner( JobQueue* queue ) : m_queue( queue ) , m_finished( false ) // Same initalizations as in ::run() , m_success( true ) { connect( m_queue, &JobQueue::finished, this, &QueueRunner::onFinished ); connect( m_queue, &JobQueue::failed, this, &QueueRunner::onFailed ); } bool QueueRunner::run() { m_finished = false; m_success = true; m_queue->start(); QEventLoop loop; while ( !m_finished ) loop.processEvents(); return m_success; } void QueueRunner::onFinished() { m_finished = true; } void QueueRunner::onFailed( const QString& message, const QString& details ) { m_success = false; QString msg = message + "\ndetails: " + details; QFAIL( qPrintable( msg ) ); } //- PartitionJobTests ------------------------------------------------------------------ PartitionJobTests::PartitionJobTests() : m_runner( &m_queue ) {} void PartitionJobTests::initTestCase() { QString devicePath = qgetenv( "CALAMARES_TEST_DISK" ); if ( devicePath.isEmpty() ) { QSKIP( "Skipping test, CALAMARES_TEST_DISK is not set. It should point to a disk which can be safely formatted" ); } QVERIFY( KPMHelpers::initKPMcore() ); FileSystemFactory::init(); refreshDevice(); } void PartitionJobTests::refreshDevice() { QString devicePath = qgetenv( "CALAMARES_TEST_DISK" ); CoreBackend* backend = CoreBackendManager::self()->backend(); m_device.reset( backend->scanDevice( devicePath ) ); QVERIFY( !m_device.isNull() ); } void PartitionJobTests::testPartitionTable() { queuePartitionTableCreation( PartitionTable::msdos ); QVERIFY( m_runner.run() ); QVERIFY( m_device->partitionTable() ); QVERIFY( firstFreePartition( m_device->partitionTable() ) ); queuePartitionTableCreation( PartitionTable::gpt ); QVERIFY( m_runner.run() ); QVERIFY( m_device->partitionTable() ); QVERIFY( firstFreePartition( m_device->partitionTable() ) ); } void PartitionJobTests::queuePartitionTableCreation( PartitionTable::TableType type) { auto job = new CreatePartitionTableJob( m_device.data(), type ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); } CreatePartitionJob* PartitionJobTests::newCreatePartitionJob( Partition* freeSpacePartition, PartitionRole role, FileSystem::Type type, qint64 size ) { Q_ASSERT( freeSpacePartition ); qint64 firstSector = freeSpacePartition->firstSector(); qint64 lastSector; if ( size > 0 ) lastSector = firstSector + size / m_device->logicalSize(); else lastSector = freeSpacePartition->lastSector(); FileSystem* fs = FileSystemFactory::create( type, firstSector, lastSector #ifdef WITH_KPMCORE22 ,m_device->logicalSize() #endif ); Partition* partition = new Partition( freeSpacePartition->parent(), *m_device, role, fs, firstSector, lastSector, QString() /* path */, PartitionTable::FlagNone /* availableFlags */, QString() /* mountPoint */, false /* mounted */, PartitionTable::FlagNone /* activeFlags */, Partition::StateNew ); return new CreatePartitionJob( m_device.data(), partition ); } void PartitionJobTests::testCreatePartition() { queuePartitionTableCreation( PartitionTable::gpt ); CreatePartitionJob* job; Partition* freePartition; freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Primary ), FileSystem::Ext4, 1_MiB); Partition* partition1 = job->partition(); QVERIFY( partition1 ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Primary ), FileSystem::LinuxSwap, 1_MiB); Partition* partition2 = job->partition(); QVERIFY( partition2 ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Primary ), FileSystem::Fat32, 1_MiB); Partition* partition3 = job->partition(); QVERIFY( partition3 ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); QVERIFY( m_runner.run() ); // Check partitionPath has been set. It is not known until the job has // executed. QString devicePath = m_device->deviceNode(); QCOMPARE( partition1->partitionPath(), devicePath + "1" ); QCOMPARE( partition2->partitionPath(), devicePath + "2" ); QCOMPARE( partition3->partitionPath(), devicePath + "3" ); } void PartitionJobTests::testCreatePartitionExtended() { queuePartitionTableCreation( PartitionTable::msdos ); CreatePartitionJob* job; Partition* freePartition; freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Primary ), FileSystem::Ext4, 10_MiB); Partition* partition1 = job->partition(); QVERIFY( partition1 ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Extended ), FileSystem::Extended, 10_MiB); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); Partition* extendedPartition = job->partition(); freePartition = firstFreePartition( extendedPartition ); QVERIFY( freePartition ); job = newCreatePartitionJob( freePartition, PartitionRole( PartitionRole::Logical ), FileSystem::Ext4, 0); Partition* partition2 = job->partition(); QVERIFY( partition2 ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); QVERIFY( m_runner.run() ); // Check partitionPath has been set. It is not known until the job has // executed. QString devicePath = m_device->deviceNode(); QCOMPARE( partition1->partitionPath(), devicePath + "1" ); QCOMPARE( extendedPartition->partitionPath(), devicePath + "2" ); QCOMPARE( partition2->partitionPath(), devicePath + "5" ); } void PartitionJobTests::testResizePartition_data() { QTest::addColumn< int >( "oldStartMB" ); QTest::addColumn< int >( "oldSizeMB" ); QTest::addColumn< int >( "newStartMB" ); QTest::addColumn< int >( "newSizeMB" ); QTest::newRow("grow") << 10 << 50 << 10 << 70; QTest::newRow("shrink") << 10 << 70 << 10 << 50; QTest::newRow("moveLeft") << 10 << 50 << 8 << 50; QTest::newRow("moveRight") << 10 << 50 << 12 << 50; } void PartitionJobTests::testResizePartition() { QFETCH( int, oldStartMB ); QFETCH( int, oldSizeMB ); QFETCH( int, newStartMB ); QFETCH( int, newSizeMB ); const qint64 sectorForMB = 1_MiB / m_device->logicalSize(); qint64 oldFirst = sectorForMB * oldStartMB; qint64 oldLast = oldFirst + sectorForMB * oldSizeMB - 1; qint64 newFirst = sectorForMB * newStartMB; qint64 newLast = newFirst + sectorForMB * newSizeMB - 1; // Make the test data file smaller than the full size of the partition to // accomodate for the file system overhead const QByteArray testData = generateTestData( CalamaresUtils::MiBtoBytes( qMin( oldSizeMB, newSizeMB ) ) * 3 / 4 ); const QString testName = "test.data"; // Setup: create the test partition { queuePartitionTableCreation( PartitionTable::msdos ); Partition* freePartition = firstFreePartition( m_device->partitionTable() ); QVERIFY( freePartition ); Partition* partition = KPMHelpers::createNewPartition( freePartition->parent(), *m_device, PartitionRole( PartitionRole::Primary ), FileSystem::Ext4, oldFirst, oldLast ); CreatePartitionJob* job = new CreatePartitionJob( m_device.data(), partition ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); QVERIFY( m_runner.run() ); } { // Write a test file in the partition refreshDevice(); QVERIFY( m_device->partitionTable() ); Partition* partition = m_device->partitionTable()->findPartitionBySector( oldFirst, PartitionRole( PartitionRole::Primary ) ); QVERIFY( partition ); QCOMPARE( partition->firstSector(), oldFirst ); QCOMPARE( partition->lastSector(), oldLast ); { PartitionMounter mounter( partition->partitionPath() ); QString mountPoint = mounter.mountPoint(); QVERIFY( !mountPoint.isEmpty() ); writeFile( mountPoint + '/' + testName, testData ); } // Resize ResizePartitionJob* job = new ResizePartitionJob( m_device.data(), partition, newFirst, newLast ); job->updatePreview(); m_queue.enqueue( job_ptr( job ) ); QVERIFY( m_runner.run() ); QCOMPARE( partition->firstSector(), newFirst ); QCOMPARE( partition->lastSector(), newLast ); } // Test { refreshDevice(); QVERIFY( m_device->partitionTable() ); Partition* partition = m_device->partitionTable()->findPartitionBySector( newFirst, PartitionRole( PartitionRole::Primary ) ); QVERIFY( partition ); QCOMPARE( partition->firstSector(), newFirst ); QCOMPARE( partition->lastSector(), newLast ); QCOMPARE( partition->fileSystem().firstSector(), newFirst ); QCOMPARE( partition->fileSystem().lastSector(), newLast ); PartitionMounter mounter( partition->partitionPath() ); QString mountPoint = mounter.mountPoint(); QVERIFY( !mountPoint.isEmpty() ); { QFile file( mountPoint + '/' + testName ); QVERIFY( file.open( QIODevice::ReadOnly ) ); QByteArray outData = file.readAll(); QCOMPARE( outData.size(), testData.size() ); QCOMPARE( outData, testData ); } } } calamares-3.1.12/src/modules/partition/tests/PartitionJobTests.h000066400000000000000000000041231322271446000247410ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTITIONJOBTESTS_H #define PARTITIONJOBTESTS_H #include // CalaPM #include #include #include #include #include // Qt #include #include class QueueRunner : public QObject { public: QueueRunner( Calamares::JobQueue* queue ); /** * Synchronously runs the queue. Returns true on success */ bool run(); private: void onFailed( const QString& message, const QString& details ); void onFinished(); Calamares::JobQueue* m_queue; bool m_finished; bool m_success; }; class PartitionJobTests : public QObject { Q_OBJECT public: PartitionJobTests(); private Q_SLOTS: void initTestCase(); void testPartitionTable(); void testCreatePartition(); void testCreatePartitionExtended(); void testResizePartition_data(); void testResizePartition(); private: QScopedPointer< Device > m_device; Calamares::JobQueue m_queue; QueueRunner m_runner; void queuePartitionTableCreation( PartitionTable::TableType type ); CreatePartitionJob* newCreatePartitionJob( Partition* freeSpacePartition, PartitionRole, FileSystem::Type type, qint64 size ); void refreshDevice(); }; #endif /* PARTITIONJOBTESTS_H */ calamares-3.1.12/src/modules/plasmalnf/000077500000000000000000000000001322271446000177435ustar00rootroot00000000000000calamares-3.1.12/src/modules/plasmalnf/CMakeLists.txt000066400000000000000000000021451322271446000225050ustar00rootroot00000000000000find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) # Requires a sufficiently recent Plasma framework, but also # needs a runtime support component (which we don't test for). set( lnf_ver 5.41 ) find_package( KF5Plasma ${lnf_ver} ) find_package( KF5Package ${lnf_ver} ) set_package_properties( KF5Plasma PROPERTIES PURPOSE "For Plasma Look-and-Feel selection" ) set_package_properties( KF5Package PROPERTIES PURPOSE "For Plasma Look-and-Feel selection" ) if ( KF5Plasma_FOUND AND KF5Package_FOUND ) find_package( KF5 ${lnf_ver} REQUIRED CoreAddons Plasma Package ) calamares_add_plugin( plasmalnf TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES PlasmaLnfViewStep.cpp PlasmaLnfPage.cpp PlasmaLnfJob.cpp ThemeWidget.cpp RESOURCES page_plasmalnf.qrc UI page_plasmalnf.ui LINK_PRIVATE_LIBRARIES calamaresui KF5::Package KF5::Plasma SHARED_LIB ) else() calamares_skip_module( "plasmalnf (missing requirements)" ) endif() calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfJob.cpp000066400000000000000000000040211322271446000227540ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PlasmaLnfJob.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" PlasmaLnfJob::PlasmaLnfJob( const QString& lnfPath, const QString& id ) : m_lnfPath( lnfPath ) , m_id( id ) { } PlasmaLnfJob::~PlasmaLnfJob() { } QString PlasmaLnfJob::prettyName() const { return tr( "Plasma Look-and-Feel Job" ); } QString PlasmaLnfJob::prettyDescription() const { return prettyName(); } QString PlasmaLnfJob::prettyStatusMessage() const { return prettyName(); } Calamares::JobResult PlasmaLnfJob::exec() { cDebug() << "Plasma Look-and-Feel Job"; auto system = CalamaresUtils::System::instance(); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QStringList command( { "sudo", "-E", "-H", "-u", gs->value( "username" ).toString(), m_lnfPath, "-platform", "minimal", "--resetLayout", "--apply", m_id } ); int r = system->targetEnvCall( command ); if ( r ) return Calamares::JobResult::error( tr( "Could not select KDE Plasma Look-and-Feel package" ), tr( "Could not select KDE Plasma Look-and-Feel package" ) ); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfJob.h000066400000000000000000000024761322271446000224350ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLASMALNFJOB_H #define PLASMALNFJOB_H #include #include #include class PlasmaLnfJob : public Calamares::Job { Q_OBJECT public: explicit PlasmaLnfJob( const QString& lnfPath, const QString& id ); virtual ~PlasmaLnfJob() override; QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: QString m_lnfPath; QString m_id; }; #endif // PLASMALNFJOB_H calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfPage.cpp000066400000000000000000000101121322271446000231140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PlasmaLnfPage.h" #include "ui_page_plasmalnf.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include #include ThemeInfo::ThemeInfo( const KPluginMetaData& data ) : id( data.pluginId() ) , name( data.name() ) , description( data.description() ) , widget( nullptr ) { } static ThemeInfoList plasma_themes() { ThemeInfoList packages; QList pkgs = KPackage::PackageLoader::self()->listPackages( "Plasma/LookAndFeel" ); for ( const KPluginMetaData& data : pkgs ) { if ( data.isValid() && !data.isHidden() && !data.name().isEmpty() ) { packages << ThemeInfo{ data }; } } return packages; } PlasmaLnfPage::PlasmaLnfPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::PlasmaLnfPage ) , m_buttonGroup( nullptr ) { ui->setupUi( this ); CALAMARES_RETRANSLATE( { ui->retranslateUi( this ); ui->generalExplanation->setText( tr( "Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed." ) ); updateThemeNames(); fillUi(); } ) } void PlasmaLnfPage::setLnfPath( const QString& path ) { m_lnfPath = path; } void PlasmaLnfPage::setEnabledThemes(const ThemeInfoList& themes) { m_enabledThemes = themes; updateThemeNames(); winnowThemes(); fillUi(); } void PlasmaLnfPage::setEnabledThemesAll() { setEnabledThemes( plasma_themes() ); } void PlasmaLnfPage::updateThemeNames() { auto plasmaThemes = plasma_themes(); for ( auto& enabled_theme : m_enabledThemes ) { ThemeInfo* t = plasmaThemes.findById( enabled_theme.id ); if ( t != nullptr ) { enabled_theme.name = t->name; enabled_theme.description = t->description; } } } void PlasmaLnfPage::winnowThemes() { auto plasmaThemes = plasma_themes(); bool winnowed = true; int winnow_index = 0; while ( winnowed ) { winnowed = false; winnow_index = 0; for ( auto& enabled_theme : m_enabledThemes ) { ThemeInfo* t = plasmaThemes.findById( enabled_theme.id ); if ( t == nullptr ) { cDebug() << "Removing" << enabled_theme.id; winnowed = true; break; } ++winnow_index; } if ( winnowed ) { m_enabledThemes.removeAt( winnow_index ); } } } void PlasmaLnfPage::fillUi() { if ( m_enabledThemes.isEmpty() ) { return; } if ( !m_buttonGroup ) { m_buttonGroup = new QButtonGroup( this ); m_buttonGroup->setExclusive( true ); } int c = 1; // After the general explanation for ( auto& theme : m_enabledThemes ) { if ( !theme.widget ) { ThemeWidget* w = new ThemeWidget( theme ); m_buttonGroup->addButton( w->button() ); ui->verticalLayout->insertWidget( c, w ); connect( w, &ThemeWidget::themeSelected, this, &PlasmaLnfPage::plasmaThemeSelected); theme.widget = w; } else { theme.widget->updateThemeName( theme ); } ++c; } } calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfPage.h000066400000000000000000000041641322271446000225730ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLASMALNFPAGE_H #define PLASMALNFPAGE_H #include #include #include #include #include #include "ThemeInfo.h" #include "ThemeWidget.h" namespace Ui { class PlasmaLnfPage; } /** @brief Page for selecting a Plasma Look-and-Feel theme. * * You must call setEnabledThemes -- either overload -- once * to get the selection widgets. Note that calling that with * an empty list will result in zero (0) selectable themes. */ class PlasmaLnfPage : public QWidget { Q_OBJECT public: explicit PlasmaLnfPage( QWidget* parent = nullptr ); void setLnfPath( const QString& path ); /** @brief enable only the listed themes. */ void setEnabledThemes( const ThemeInfoList& themes ); /** @brief enable all installed plasma themes. */ void setEnabledThemesAll(); signals: void plasmaThemeSelected( const QString& id ); private: /** @brief Intersect the list of enabled themes with the installed ones. */ void winnowThemes(); /** @brief Get the translated names for all enabled themes. */ void updateThemeNames(); /** @brief show enabled themes in the UI. */ void fillUi(); Ui::PlasmaLnfPage* ui; QString m_lnfPath; ThemeInfoList m_enabledThemes; QButtonGroup *m_buttonGroup; QList< ThemeWidget* > m_widgets; }; #endif //PLASMALNFPAGE_H calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfViewStep.cpp000066400000000000000000000120501322271446000240110ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "PlasmaLnfViewStep.h" #include "PlasmaLnfJob.h" #include "PlasmaLnfPage.h" #include "ThemeInfo.h" #include "utils/Logger.h" #include #include CALAMARES_PLUGIN_FACTORY_DEFINITION( PlasmaLnfViewStepFactory, registerPlugin(); ) PlasmaLnfViewStep::PlasmaLnfViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new PlasmaLnfPage ) { connect( m_widget, &PlasmaLnfPage::plasmaThemeSelected, this, &PlasmaLnfViewStep::themeSelected ); emit nextStatusChanged( false ); } PlasmaLnfViewStep::~PlasmaLnfViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString PlasmaLnfViewStep::prettyName() const { return tr( "Look-and-Feel" ); } QWidget* PlasmaLnfViewStep::widget() { return m_widget; } void PlasmaLnfViewStep::next() { emit done(); } void PlasmaLnfViewStep::back() {} bool PlasmaLnfViewStep::isNextEnabled() const { return true; } bool PlasmaLnfViewStep::isBackEnabled() const { return true; } bool PlasmaLnfViewStep::isAtBeginning() const { return true; } bool PlasmaLnfViewStep::isAtEnd() const { return true; } void PlasmaLnfViewStep::onLeave() { } QList PlasmaLnfViewStep::jobs() const { QList l; cDebug() << "Creating Plasma LNF jobs .."; if ( !m_themeId.isEmpty() ) { if ( !m_lnfPath.isEmpty() ) l.append( Calamares::job_ptr( new PlasmaLnfJob( m_lnfPath, m_themeId ) ) ); else cDebug() << "WARNING: no lnftool given for plasmalnf module."; } return l; } void PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { QString lnfPath; if ( configurationMap.contains( "lnftool" ) && configurationMap.value( "lnftool" ).type() == QVariant::String ) lnfPath = configurationMap.value( "lnftool" ).toString(); m_lnfPath = lnfPath; m_widget->setLnfPath( m_lnfPath ); if ( m_lnfPath.isEmpty() ) cDebug() << "WARNING: no lnftool given for plasmalnf module."; QString liveUser; if ( configurationMap.contains( "liveuser" ) && configurationMap.value( "liveuser" ).type() == QVariant::String ) liveUser = configurationMap.value( "liveuser" ).toString(); m_liveUser = liveUser; if ( configurationMap.contains( "themes" ) && configurationMap.value( "themes" ).type() == QVariant::List ) { ThemeInfoList allThemes; auto themeList = configurationMap.value( "themes" ).toList(); // Create the ThemInfo objects for the listed themes; information // about the themes from Plasma (e.g. human-readable name and description) // are filled in by update_names() in PlasmaLnfPage. for ( const auto& i : themeList ) if ( i.type() == QVariant::Map ) { auto iv = i.toMap(); allThemes.append( ThemeInfo( iv.value( "theme" ).toString(), iv.value( "image" ).toString() ) ); } else if ( i.type() == QVariant::String ) allThemes.append( ThemeInfo( i.toString() ) ); if ( allThemes.length() == 1 ) cDebug() << "WARNING: only one theme enabled in plasmalnf"; m_widget->setEnabledThemes( allThemes ); } else m_widget->setEnabledThemesAll(); // All of them } void PlasmaLnfViewStep::themeSelected( const QString& id ) { m_themeId = id; if ( m_lnfPath.isEmpty() ) { cDebug() << "WARNING: no lnftool given for plasmalnf module."; return; } QProcess lnftool; if ( !m_liveUser.isEmpty() ) lnftool.start( "sudo", {"-E", "-H", "-u", m_liveUser, m_lnfPath, "--resetLayout", "--apply", id} ); else lnftool.start( m_lnfPath, {"--resetLayout", "--apply", id} ); if ( !lnftool.waitForStarted( 1000 ) ) { cDebug() << "WARNING: could not start look-and-feel" << m_lnfPath; return; } if ( !lnftool.waitForFinished() ) { cDebug() << "WARNING:" << m_lnfPath << "timed out."; return; } if ( ( lnftool.exitCode() == 0 ) && ( lnftool.exitStatus() == QProcess::NormalExit ) ) cDebug() << "Plasma look-and-feel applied" << id; else cDebug() << "WARNING: could not apply look-and-feel" << id; } calamares-3.1.12/src/modules/plasmalnf/PlasmaLnfViewStep.h000066400000000000000000000036301322271446000234620ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLASMALNFVIEWSTEP_H #define PLASMALNFVIEWSTEP_H #include #include #include #include #include #include class PlasmaLnfPage; class PLUGINDLLEXPORT PlasmaLnfViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit PlasmaLnfViewStep( QObject* parent = nullptr ); virtual ~PlasmaLnfViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; void onLeave() override; QList jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; public slots: void themeSelected( const QString& id ); private: PlasmaLnfPage* m_widget; QString m_lnfPath; QString m_themeId; QString m_liveUser; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( PlasmaLnfViewStepFactory ) #endif // PLASMALNFVIEWSTEP_H calamares-3.1.12/src/modules/plasmalnf/ThemeInfo.h000066400000000000000000000051331322271446000217740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLASMALNF_THEMEINFO_H #define PLASMALNF_THEMEINFO_H #include #include class KPluginMetaData; class ThemeWidget; /** @brief describes a single plasma LnF theme. * * A theme description has an id, which is really the name of the desktop * file (e.g. org.kde.breeze.desktop), a name which is human-readable and * translated, and an optional image Page, which points to a local screenshot * of that theme. */ struct ThemeInfo { QString id; QString name; QString description; QString imagePath; ThemeWidget* widget; ThemeInfo() : widget( nullptr ) {} explicit ThemeInfo( const QString& _id ) : id( _id ) , widget( nullptr ) { } explicit ThemeInfo( const QString& _id, const QString& image ) : id( _id ) , imagePath( image ) , widget( nullptr ) {} // Defined in PlasmaLnfPage.cpp explicit ThemeInfo( const KPluginMetaData& ); bool isValid() const { return !id.isEmpty(); } } ; class ThemeInfoList : public QList< ThemeInfo > { public: /** @brief Looks for a given @p id in the list of themes, returns nullptr if not found. */ ThemeInfo* findById( const QString& id ) { for ( ThemeInfo& i : *this ) { if ( i.id == id ) return &i; } return nullptr; } /** @brief Looks for a given @p id in the list of themes, returns nullptr if not found. */ const ThemeInfo* findById( const QString& id ) const { for ( const ThemeInfo& i : *this ) { if ( i.id == id ) return &i; } return nullptr; } /** @brief Checks if a given @p id is in the list of themes. */ bool contains( const QString& id ) const { return findById( id ) != nullptr; } } ; #endif calamares-3.1.12/src/modules/plasmalnf/ThemeWidget.cpp000066400000000000000000000050131322271446000226540ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "ThemeWidget.h" #include "ThemeInfo.h" #include "utils/Logger.h" #include #include #include ThemeWidget::ThemeWidget(const ThemeInfo& info, QWidget* parent) : QWidget( parent ) , m_check( new QRadioButton( info.name.isEmpty() ? info.id : info.name, parent ) ) , m_description( new QLabel( info.description, parent ) ) , m_id( info.id ) { QHBoxLayout* layout = new QHBoxLayout( this ); this->setLayout( layout ); layout->addWidget( m_check, 1 ); constexpr QSize image_size{120, 80}; QPixmap image( info.imagePath ); if ( info.imagePath.isEmpty() ) { // Image can't possibly be valid image = QPixmap( ":/view-preview.png" ); } else if ( image.isNull() ) { // Not found or not specified, so convert the name into some (horrible, likely) // color instead. image = QPixmap( image_size ); uint hash_color = qHash( info.imagePath.isEmpty() ? info.id : info.imagePath ); cDebug() << "Theme image" << info.imagePath << "not found, hash" << hash_color; image.fill( QColor( QRgb( hash_color ) ) ); } else image.scaled( image_size ); QLabel* image_label = new QLabel( this ); image_label->setPixmap( image ); layout->addWidget( image_label, 1 ); layout->addWidget( m_description, 3 ); connect( m_check, &QRadioButton::clicked, this, &ThemeWidget::clicked ); } void ThemeWidget::clicked( bool checked ) { if ( checked ) emit themeSelected( m_id ); } QAbstractButton* ThemeWidget::button() const { return m_check; } void ThemeWidget::updateThemeName(const ThemeInfo& info) { m_check->setText( info.name ); m_description->setText( info.description ); } calamares-3.1.12/src/modules/plasmalnf/ThemeWidget.h000066400000000000000000000025351322271446000223270ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PLASMALNF_THEMEWIDGET_H #define PLASMALNF_THEMEWIDGET_H #include class QAbstractButton; class QLabel; class QRadioButton; struct ThemeInfo; class ThemeWidget : public QWidget { Q_OBJECT public: explicit ThemeWidget( const ThemeInfo& info, QWidget* parent = nullptr ); QAbstractButton* button() const; void updateThemeName( const ThemeInfo& info ); signals: void themeSelected( const QString& id ); public slots: void clicked( bool ); private: QString m_id; QRadioButton* m_check; QLabel* m_description; } ; #endif calamares-3.1.12/src/modules/plasmalnf/page_plasmalnf.qrc000066400000000000000000000001061322271446000234200ustar00rootroot00000000000000 view-preview.png calamares-3.1.12/src/modules/plasmalnf/page_plasmalnf.ui000066400000000000000000000020451322271446000232540ustar00rootroot00000000000000 PlasmaLnfPage 0 0 799 400 Form Placeholder true Qt::Vertical 20 40 calamares-3.1.12/src/modules/plasmalnf/plasmalnf.conf000066400000000000000000000022621322271446000225710ustar00rootroot00000000000000--- # Full path to the Plasma look-and-feel tool (CLI program # for querying and applying Plasma themes). If this is not # set, no LNF setting will happen. lnftool: "/usr/bin/lookandfeeltool" # For systems where the user Calamares runs as (usually root, # via either sudo or pkexec) has a clean environment, set this # to the originating username; the lnftool will be run through # "sudo -H -u " instead of directly. # # liveuser: "live" # You can limit the list of Plasma look-and-feel themes by listing ids # here. If this key is not present, all of the installed themes are listed. # If the key is present, only installed themes that are *also* included # in the list are shown (could be none!). # # Themes may be listed by id, (e.g. fluffy-bunny, below) or as a theme # and an image (e.g. breeze) which will be used to show a screenshot. # Themes with no image get a "missing screenshot" image; if the # image file is not found, they get a color swatch based on the image name. themes: - org.kde.fuzzy-pig.desktop - theme: org.kde.breeze.desktop image: "breeze.png" - theme: org.kde.breezedark.desktop image: "breeze-dark.png" - org.kde.fluffy-bunny.desktop calamares-3.1.12/src/modules/plasmalnf/view-preview.png000066400000000000000000000010601322271446000230770ustar00rootroot00000000000000PNG  IHDRxPқ pHYs+IDATxM@MCƂ;p"q&[&dA=tnsLUJ ~.;DQ9fyve^2|>dޱ]Lu1jV4+su,SJUU)eYl7:6(c%I"y$Q2.otܶft:~'sv~W*˹]tʲL,­ZeYZ}_eY%,˛IQd2Qi~XM\?1М[m[E$IT[_#|8vN~v¿~4kj:Zs%?[?ڹ0^]]8ӫwu.{#nsGy.88Lߏ7BK`# sIIENDB`calamares-3.1.12/src/modules/plasmalnf/view-preview.svg000066400000000000000000000010721322271446000231150ustar00rootroot00000000000000 calamares-3.1.12/src/modules/plymouthcfg/000077500000000000000000000000001322271446000203275ustar00rootroot00000000000000calamares-3.1.12/src/modules/plymouthcfg/main.py000066400000000000000000000040371322271446000216310ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2016, Artoo # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares from libcalamares.utils import debug, target_env_call class PlymouthController: def __init__(self): self.__root = libcalamares.globalstorage.value('rootMountPoint') @property def root(self): return self.__root def setTheme(self): plymouth_theme = libcalamares.job.configuration["plymouth_theme"] target_env_call(["sed", "-e", 's|^.*Theme=.*|Theme=' + plymouth_theme + '|', "-i", "/etc/plymouth/plymouthd.conf"]) def detect(self): isPlymouth = target_env_call(["which", "plymouth"]) debug("which plymouth exit code: {!s}".format(isPlymouth)) if isPlymouth == 0: libcalamares.globalstorage.insert("hasPlymouth", True) else: libcalamares.globalstorage.insert("hasPlymouth", False) return isPlymouth def run(self): if self.detect() == 0: if (("plymouth_theme" in libcalamares.job.configuration) and (libcalamares.job.configuration["plymouth_theme"] is not None)): self.setTheme() return None def run(): pc = PlymouthController() return pc.run() calamares-3.1.12/src/modules/plymouthcfg/module.desc000066400000000000000000000001331322271446000224510ustar00rootroot00000000000000--- type: "job" name: "plymouthcfg" interface: "python" script: "main.py" calamares-3.1.12/src/modules/plymouthcfg/plymouthcfg.conf000066400000000000000000000002311322271446000235330ustar00rootroot00000000000000--- # The plymouth theme to be set if plymouth binary is present # leave commented if packaged default theme should be used # plymouth_theme: spinfinity calamares-3.1.12/src/modules/removeuser/000077500000000000000000000000001322271446000201625ustar00rootroot00000000000000calamares-3.1.12/src/modules/removeuser/main.py000066400000000000000000000026271322271446000214670ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2015, Teo Mrnjavac # Copyright 2017. Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import subprocess import libcalamares def run(): """ Remove live user from target system """ username = libcalamares.job.configuration["username"] try: libcalamares.utils.check_target_env_call(["userdel", "-f", "-r", username]) except subprocess.CalledProcessError as e: libcalamares.utils.debug("Cannot remove user. " "'userdel' terminated with exit code " "{}.".format(e.returncode)) return None calamares-3.1.12/src/modules/removeuser/module.desc000066400000000000000000000001511322271446000223040ustar00rootroot00000000000000--- type: "job" name: "removeuser" interface: "python" requires: [] script: "main.py" calamares-3.1.12/src/modules/removeuser/removeuser.conf000066400000000000000000000000231322271446000232200ustar00rootroot00000000000000--- username: live calamares-3.1.12/src/modules/services/000077500000000000000000000000001322271446000176115ustar00rootroot00000000000000calamares-3.1.12/src/modules/services/main.py000066400000000000000000000073131322271446000211130ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Philip Müller # Copyright 2014, Teo Mrnjavac # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import libcalamares def run(): """ Setup systemd services """ services = libcalamares.job.configuration['services'] targets = libcalamares.job.configuration['targets'] disable = libcalamares.job.configuration['disable'] # note that the "systemctl enable" and "systemctl disable" commands used # here will work in a chroot; in fact, they are the only systemctl commands # that support that, see: # http://0pointer.de/blog/projects/changing-roots.html # enable services for svc in services: ec = libcalamares.utils.target_env_call( ['systemctl', 'enable', '{}.service'.format(svc['name'])] ) if ec != 0: if svc['mandatory']: return ("Cannot enable systemd service {}".format(svc['name']), "systemctl enable call in chroot returned error code " "{}".format(ec) ) else: libcalamares.utils.debug( "Cannot enable systemd service {}".format(svc['name']) ) libcalamares.utils.debug( "systemctl enable call in chroot returned error code " "{}".format(ec) ) # enable targets for tgt in targets: ec = libcalamares.utils.target_env_call( ['systemctl', 'enable', '{}.target'.format(tgt['name'])] ) if ec != 0: if tgt['mandatory']: return ("Cannot enable systemd target {}".format(tgt['name']), "systemctl enable call in chroot returned error code" "{}".format(ec) ) else: libcalamares.utils.debug( "Cannot enable systemd target {}".format(tgt['name']) ) libcalamares.utils.debug( "systemctl enable call in chroot returned error code " "{}".format(ec) ) for dbl in disable: ec = libcalamares.utils.target_env_call( ['systemctl', 'disable', '{}.service'.format(dbl['name'])] ) if ec != 0: if dbl['mandatory']: return ("Cannot disable systemd service" "{}".format(dbl['name']), "systemctl disable call in chroot returned error code" "{}".format(ec)) else: libcalamares.utils.debug( "Cannot disable systemd service {}".format(dbl['name']) ) libcalamares.utils.debug( "systemctl disable call in chroot returned error code " "{}".format(ec) ) return None calamares-3.1.12/src/modules/services/module.desc000066400000000000000000000001471322271446000217400ustar00rootroot00000000000000--- type: "job" name: "services" interface: "python" requires: [] script: "main.py" calamares-3.1.12/src/modules/services/services.conf000066400000000000000000000007761322271446000223150ustar00rootroot00000000000000--- #systemd services and targets are enabled in this precise order services: - name: "NetworkManager" #name of the service file mandatory: false #true=> if enabling fails the installer errors out and quits #false=>if enabling fails print warning to console and continue - name: "cups" mandatory: false targets: - name: "graphical" mandatory: true disable: - name: "pacman-init" mandatory: false # Example to express an empty list: # disable: [] calamares-3.1.12/src/modules/summary/000077500000000000000000000000001322271446000174635ustar00rootroot00000000000000calamares-3.1.12/src/modules/summary/CMakeLists.txt000066400000000000000000000004361322271446000222260ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( summary TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES SummaryViewStep.cpp SummaryPage.cpp UI LINK_PRIVATE_LIBRARIES calamaresui SHARED_LIB ) calamares-3.1.12/src/modules/summary/SummaryPage.cpp000066400000000000000000000135321322271446000224250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "SummaryPage.h" #include "SummaryViewStep.h" #include "ExecutionViewStep.h" #include "utils/Retranslator.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "ViewManager.h" #include #include #include static const int SECTION_SPACING = 12; SummaryPage::SummaryPage( const SummaryViewStep* thisViewStep, QWidget* parent ) : QWidget() , m_thisViewStep( thisViewStep ) , m_contentWidget( nullptr ) , m_scrollArea( new QScrollArea( this ) ) { Q_UNUSED( parent ); Q_ASSERT( m_thisViewStep ); QVBoxLayout* layout = new QVBoxLayout( this ); layout->setContentsMargins( 0, 0, 0, 0 ); QLabel* headerLabel = new QLabel( this ); CALAMARES_RETRANSLATE( headerLabel->setText( tr( "This is an overview of what will happen once you start " "the install procedure." ) ); ) layout->addWidget( headerLabel ); layout->addWidget( m_scrollArea ); m_scrollArea->setWidgetResizable( true ); m_scrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded ); m_scrollArea->setFrameStyle( QFrame::NoFrame ); m_scrollArea->setContentsMargins( 0, 0, 0, 0 ); } // Adds a widget for those ViewSteps that want a summary; // see SummaryPage documentation and also ViewStep docs. void SummaryPage::onActivate() { createContentWidget(); bool first = true; const Calamares::ViewStepList steps = stepsForSummary( Calamares::ViewManager::instance()->viewSteps() ); for ( Calamares::ViewStep* step : steps ) { QString text = step->prettyStatus(); QWidget* widget = step->createSummaryWidget(); if ( text.isEmpty() && !widget ) continue; if ( first ) first = false; else m_layout->addSpacing( SECTION_SPACING ); m_layout->addWidget( createTitleLabel( step->prettyName() ) ); QHBoxLayout* itemBodyLayout = new QHBoxLayout; m_layout->addSpacing( CalamaresUtils::defaultFontHeight() / 2 ); m_layout->addLayout( itemBodyLayout ); itemBodyLayout->addSpacing( CalamaresUtils::defaultFontHeight() * 2 ); QVBoxLayout* itemBodyCoreLayout = new QVBoxLayout; itemBodyLayout->addLayout( itemBodyCoreLayout ); CalamaresUtils::unmarginLayout( itemBodyLayout ); if ( !text.isEmpty() ) itemBodyCoreLayout->addWidget( createBodyLabel( text ) ); if ( widget ) itemBodyCoreLayout->addWidget( widget ); itemBodyLayout->addSpacing( CalamaresUtils::defaultFontHeight() * 2 ); } m_layout->addStretch(); m_scrollArea->setWidget( m_contentWidget ); auto summarySize = m_contentWidget->sizeHint(); if ( summarySize.height() > m_scrollArea->size().height() ) { auto enlarge = 2 + summarySize.height() - m_scrollArea->size().height(); auto widgetSize = this->size(); widgetSize.setHeight( widgetSize.height() + enlarge ); cDebug() << "Summary widget is larger than viewport, enlarge by" << enlarge << "to" << widgetSize; emit m_thisViewStep->enlarge( QSize( 0, enlarge ) ); // Only expand height } } Calamares::ViewStepList SummaryPage::stepsForSummary( const Calamares::ViewStepList& allSteps ) const { Calamares::ViewStepList steps; for ( Calamares::ViewStep* step : allSteps ) { // We start from the beginning of the complete steps list. If we encounter any // ExecutionViewStep, it means there was an execution phase in the past, and any // jobs from before that phase were already executed, so we can safely clear the // list of steps to summarize and start collecting from scratch. if ( qobject_cast< Calamares::ExecutionViewStep* >( step ) ) { steps.clear(); continue; } // If we reach the parent step of this page, we're done collecting the list of // steps to summarize. if ( m_thisViewStep == step ) break; steps.append( step ); } return steps; } void SummaryPage::createContentWidget() { delete m_contentWidget; m_contentWidget = new QWidget; m_layout = new QVBoxLayout( m_contentWidget ); CalamaresUtils::unmarginLayout( m_layout ); } QLabel* SummaryPage::createTitleLabel( const QString& text ) const { QLabel* label = new QLabel( text ); QFont fnt = font(); fnt.setWeight( QFont::Light ); fnt.setPointSize( CalamaresUtils::defaultFontSize() * 2 ); label->setFont( fnt ); label->setContentsMargins( 0, 0, 0, 0 ); return label; } QLabel* SummaryPage::createBodyLabel( const QString& text ) const { QLabel* label = new QLabel; label->setMargin( CalamaresUtils::defaultFontHeight() / 2 ); QPalette pal( palette() ); pal.setColor( QPalette::Background, palette().background().color().lighter( 108 ) ); label->setAutoFillBackground( true ); label->setPalette( pal ); label->setText( text ); return label; } calamares-3.1.12/src/modules/summary/SummaryPage.h000066400000000000000000000045711322271446000220750ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SUMMARYPAGE_H #define SUMMARYPAGE_H #include "Typedefs.h" #include class QLabel; class QScrollArea; class QVBoxLayout; class SummaryViewStep; /** @brief Provide a summary view with to-be-done action descriptions. * * Those steps that occur since the previous execution step (e.g. that * are queued for execution now; in the normal case where there is * only one execution step, this means everything that the installer * is going to do) are added to the summary view. Each view step * can provide one of the following things to display in the summary * view: * * - A string from ViewStep::prettyStatus(), which is formatted * and added as a QLabel to the view. Return an empty string * from prettyStatus() to avoid this. * - A QWidget from ViewStep::createSummaryWidget(). This is for * complicated displays not suitable for simple text representation. * Return a nullptr to avoid this. * * If neither a (non-empty) string nor a widget is returned, the * step is not named in the summary. */ class SummaryPage : public QWidget { Q_OBJECT public: explicit SummaryPage( const SummaryViewStep* thisViewStep, QWidget* parent = nullptr ); void onActivate(); void createContentWidget(); private: Calamares::ViewStepList stepsForSummary( const Calamares::ViewStepList& allSteps ) const; const SummaryViewStep* m_thisViewStep; QVBoxLayout* m_layout = nullptr; QWidget* m_contentWidget = nullptr; QLabel* createTitleLabel( const QString& text ) const; QLabel* createBodyLabel( const QString& text ) const; QScrollArea* m_scrollArea; }; #endif // SUMMARYPAGE_H calamares-3.1.12/src/modules/summary/SummaryViewStep.cpp000066400000000000000000000037011322271446000233140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "SummaryViewStep.h" #include "SummaryPage.h" CALAMARES_PLUGIN_FACTORY_DEFINITION( SummaryViewStepFactory, registerPlugin(); ) SummaryViewStep::SummaryViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new SummaryPage( this ) ) { emit nextStatusChanged( true ); } SummaryViewStep::~SummaryViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString SummaryViewStep::prettyName() const { return tr( "Summary" ); } QWidget* SummaryViewStep::widget() { return m_widget; } void SummaryViewStep::next() { emit done(); } void SummaryViewStep::back() {} bool SummaryViewStep::isNextEnabled() const { return true; } bool SummaryViewStep::isBackEnabled() const { return true; } bool SummaryViewStep::isAtBeginning() const { return true; } bool SummaryViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > SummaryViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void SummaryViewStep::onActivate() { m_widget->onActivate(); } void SummaryViewStep::onLeave() { m_widget->createContentWidget(); } calamares-3.1.12/src/modules/summary/SummaryViewStep.h000066400000000000000000000032651322271446000227660ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SUMMARYPAGEPLUGIN_H #define SUMMARYPAGEPLUGIN_H #include #include #include #include class SummaryPage; class PLUGINDLLEXPORT SummaryViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit SummaryViewStep( QObject* parent = nullptr ); virtual ~SummaryViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; void onLeave() override; private: SummaryPage* m_widget; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( SummaryViewStepFactory ) #endif // SUMMARYPAGEPLUGIN_H calamares-3.1.12/src/modules/test_conf.cpp000066400000000000000000000035571322271446000204700ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ /** * This is a test-application that just checks the YAML config-file * shipped with each module for correctness -- well, for parseability. */ #include #include using std::cerr; int main(int argc, char** argv) { if (argc != 2) { cerr << "Usage: test_conf \n"; return 1; } try { YAML::Node doc = YAML::LoadFile( argv[1] ); if ( doc.IsNull() ) { // Special case: empty config files are valid, // but aren't a map. For the example configs, // this is still an error. cerr << "WARNING:" << argv[1] << '\n'; cerr << "WARNING: empty YAML\n"; return 1; } if ( !doc.IsMap() ) { cerr << "WARNING:" << argv[1] << '\n'; cerr << "WARNING: not-a-YAML-map\n"; return 1; } } catch ( YAML::Exception& e ) { cerr << "WARNING:" << argv[1] << '\n'; cerr << "WARNING: YAML parser error " << e.what() << '\n'; return 1; } return 0; } calamares-3.1.12/src/modules/umount/000077500000000000000000000000001322271446000173155ustar00rootroot00000000000000calamares-3.1.12/src/modules/umount/README.md000066400000000000000000000016771322271446000206070ustar00rootroot00000000000000### Umount Module --------- This module represents the last part of the installation, the unmounting of partitions used for the install. It is also the last place where it is possible to copy files to the target system, thus the best place to copy an installation log. You can either use the default ```/root/.cache/Calamares/Calamares/Calamares.log``` to copy or if you want to use the full output of ```sudo calamares -d``` to create a log you will need to include a log creation to your launcher script or add it to the used calamares.desktop, example of a launcher script: ``` #!/bin/sh sudo /usr/bin/calamares -d > installation.log ``` Example desktop line: ``` Exec=sudo /usr/bin/calamares -d > installation.log ``` Set the source and destination path of your install log in umount.conf. If you do not wish to use the copy of an install log feature, no action needed, the default settings do not execute the copy of an install log in this module. calamares-3.1.12/src/modules/umount/main.py000066400000000000000000000053261322271446000206210ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Aurélien Gâteau # Copyright 2016, Anke Boersma # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import subprocess import shutil import libcalamares def list_mounts(root_mount_point): """ List mount points. :param root_mount_point: :return: """ lst = [] for line in open("/etc/mtab").readlines(): device, mount_point, _ = line.split(" ", 2) if mount_point.startswith(root_mount_point): lst.append((device, mount_point)) return lst def run(): """ Unmounts given mountpoints in decreasing order. :return: """ root_mount_point = libcalamares.globalstorage.value("rootMountPoint") if(libcalamares.job.configuration and "srcLog" in libcalamares.job.configuration and "destLog" in libcalamares.job.configuration): log_source = libcalamares.job.configuration["srcLog"] log_destination = libcalamares.job.configuration["destLog"] # copy installation log before umount if os.path.exists('{!s}'.format(log_source)): shutil.copy2('{!s}'.format(log_source), '{!s}/{!s}'.format( root_mount_point, log_destination)) if not root_mount_point: return ("No mount point for root partition in globalstorage", "globalstorage does not contain a \"rootMountPoint\" key, " "doing nothing") if not os.path.exists(root_mount_point): return ("Bad mount point for root partition in globalstorage", "globalstorage[\"rootMountPoint\"] is \"{}\", which does not " "exist, doing nothing".format(root_mount_point)) lst = list_mounts(root_mount_point) # Sort the list by mount point in decreasing order. This way we can be sure # we unmount deeper dirs first. lst.sort(key=lambda x: x[1], reverse=True) for device, mount_point in lst: subprocess.check_call(["umount", "-lv", mount_point]) os.rmdir(root_mount_point) return None calamares-3.1.12/src/modules/umount/module.desc000066400000000000000000000001261322271446000214410ustar00rootroot00000000000000--- type: "job" name: "umount" interface: "python" script: "main.py" calamares-3.1.12/src/modules/umount/umount.conf000066400000000000000000000005741322271446000215210ustar00rootroot00000000000000--- #srcLog: "/path/to/installation.log" #destLog: "/var/log/installation.log" # example when using the Calamares created log: #srcLog: "/root/.cache/Calamares/Calamares/Calamares.log" #destLog: "/var/log/Calamares.log" # example when creating with a sudo calamares -d log: #srcLog: "/home/live/installation.log" #destLog: "/var/log/installation.log" calamares-3.1.12/src/modules/unpackfs/000077500000000000000000000000001322271446000176005ustar00rootroot00000000000000calamares-3.1.12/src/modules/unpackfs/main.py000066400000000000000000000242201322271446000210760ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # === This file is part of Calamares - === # # Copyright 2014, Teo Mrnjavac # Copyright 2014, Daniel Hillenbrand # Copyright 2014, Philip Müller # Copyright 2017, Alf Gaida # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Calamares is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . import os import re import shutil import subprocess import sys import tempfile from libcalamares import * class UnpackEntry: """ Extraction routine using rsync. :param source: :param sourcefs: :param destination: """ __slots__ = ['source', 'sourcefs', 'destination', 'copied', 'total'] def __init__(self, source, sourcefs, destination): self.source = source self.sourcefs = sourcefs self.destination = destination self.copied = 0 self.total = 0 ON_POSIX = 'posix' in sys.builtin_module_names def list_excludes(destination): """ List excludes for rsync. :param destination: :return: """ lst = [] extra_mounts = globalstorage.value("extraMounts") for extra_mount in extra_mounts: mount_point = extra_mount["mountPoint"] if mount_point: lst.extend(['--exclude', mount_point + '/']) return lst def file_copy(source, dest, progress_cb): """ Extract given image using rsync. :param source: :param dest: :param progress_cb: :return: """ # Environment used for executing rsync properly # Setting locale to C (fix issue with tr_TR locale) at_env = os.environ at_env["LC_ALL"] = "C" # `source` *must* end with '/' otherwise a directory named after the source # will be created in `dest`: ie if `source` is "/foo/bar" and `dest` is # "/dest", then files will be copied in "/dest/bar". source += "/" args = ['rsync', '-aHAXr'] args.extend(list_excludes(dest)) args.extend(['--progress', source, dest]) process = subprocess.Popen( args, env=at_env, bufsize=1, stdout=subprocess.PIPE, close_fds=ON_POSIX ) for line in iter(process.stdout.readline, b''): # small comment on this regexp. # rsync outputs three parameters in the progress. # xfer#x => i try to interpret it as 'file copy try no. x' # to-check=x/y, where: # - x = number of files yet to be checked # - y = currently calculated total number of files. # but if you're copying directory with some links in it, the xfer# # might not be a reliable counter (for one increase of xfer, many # files may be created). # In case of manjaro, we pre-compute the total number of files. # therefore we can easily subtract x from y in order to get real files # copied / processed count. m = re.findall(r'xfr#(\d+), ir-chk=(\d+)/(\d+)', line.decode()) if m: # we've got a percentage update num_files_remaining = int(m[0][1]) num_files_total_local = int(m[0][2]) # adjusting the offset so that progressbar can be continuesly drawn num_files_copied = num_files_total_local - num_files_remaining # I guess we're updating every 100 files... if num_files_copied % 100 == 0: progress_cb(num_files_copied) process.wait() # 23 is the return code rsync returns if it cannot write extended # attributes (with -X) because the target file system does not support it, # e.g., the FAT EFI system partition. We need -X because distributions # using file system capabilities and/or SELinux require the extended # attributes. But distributions using SELinux may also have SELinux labels # set on files under /boot/efi, and rsync complains about those. The only # clean way would be to split the rsync into one with -X and # --exclude /boot/efi and a separate one without -X for /boot/efi, but only # if /boot/efi is actually an EFI system partition. For now, this hack will # have to do. See also: # https://bugzilla.redhat.com/show_bug.cgi?id=868755#c50 # for the same issue in Anaconda, which uses a similar workaround. if process.returncode != 0 and process.returncode != 23: return "rsync failed with error code {}.".format(process.returncode) return None class UnpackOperation: """ Extraction routine using unsquashfs. :param entries: """ def __init__(self, entries): self.entries = entries self.entry_for_source = dict((x.source, x) for x in self.entries) def report_progress(self): """ Pass progress to user interface """ progress = float(0) for entry in self.entries: if entry.total == 0: continue partialprogress = 0.05 # Having a total !=0 gives 5% partialprogress += 0.95 * (entry.copied / float(entry.total)) progress += partialprogress / len(self.entries) job.setprogress(progress) def run(self): """ Extract given image using unsquashfs. :return: """ source_mount_path = tempfile.mkdtemp() try: for entry in self.entries: imgbasename = os.path.splitext( os.path.basename(entry.source))[0] imgmountdir = os.path.join(source_mount_path, imgbasename) os.mkdir(imgmountdir) self.mount_image(entry, imgmountdir) fslist = "" if entry.sourcefs == "squashfs": if shutil.which("unsquashfs") is None: msg = ("Failed to find unsquashfs, make sure you have " "the squashfs-tools package installed") print(msg) return ("Failed to unpack image", msg) fslist = subprocess.check_output( ["unsquashfs", "-l", entry.source] ) if entry.sourcefs == "ext4": fslist = subprocess.check_output( ["find", imgmountdir, "-type", "f"] ) entry.total = len(fslist.splitlines()) self.report_progress() error_msg = self.unpack_image(entry, imgmountdir) if error_msg: return ("Failed to unpack image {}".format(entry.source), error_msg) return None finally: shutil.rmtree(source_mount_path) def mount_image(self, entry, imgmountdir): """ Mount given image as loop device. :param entry: :param imgmountdir: """ if os.path.isdir(entry.source): subprocess.check_call(["mount", "--bind", entry.source, imgmountdir]) else: subprocess.check_call(["mount", entry.source, imgmountdir, "-t", entry.sourcefs, "-o", "loop" ]) def unpack_image(self, entry, imgmountdir): """ Unpacks image. :param entry: :param imgmountdir: :return: """ def progress_cb(copied): """ Copies file to given destination target. :param copied: """ entry.copied = copied self.report_progress() try: return file_copy(imgmountdir, entry.destination, progress_cb) finally: subprocess.check_call(["umount", "-l", imgmountdir]) def run(): """ Unsquash filesystem. """ PATH_PROCFS = '/proc/filesystems' root_mount_point = globalstorage.value("rootMountPoint") if not root_mount_point: return ("No mount point for root partition in globalstorage", "globalstorage does not contain a \"rootMountPoint\" key, " "doing nothing") if not os.path.exists(root_mount_point): return ("Bad mount point for root partition in globalstorage", "globalstorage[\"rootMountPoint\"] is \"{}\", which does not " "exist, doing nothing".format(root_mount_point)) unpack = list() for entry in job.configuration["unpack"]: source = os.path.abspath(entry["source"]) sourcefs = entry["sourcefs"] # Get supported filesystems fs_is_supported = False if os.path.isfile(PATH_PROCFS) and os.access(PATH_PROCFS, os.R_OK): with open(PATH_PROCFS, 'r') as procfile: filesystems = procfile.read() filesystems = filesystems.replace( "nodev", "").replace("\t", "").splitlines() # Check if the source filesystem is supported for fs in filesystems: if fs == sourcefs: fs_is_supported = True if not fs_is_supported: return "Bad filesystem", "sourcefs=\"{}\"".format(sourcefs) destination = os.path.abspath(root_mount_point + entry["destination"]) if not os.path.exists(source): return "Bad source", "source=\"{}\"".format(source) if not os.path.isdir(destination): return "Bad destination", "destination=\"{}\"".format(destination) unpack.append(UnpackEntry(source, sourcefs, destination)) unpackop = UnpackOperation(unpack) return unpackop.run() calamares-3.1.12/src/modules/unpackfs/module.desc000066400000000000000000000001551322271446000217260ustar00rootroot00000000000000# Syntax is YAML 1.2 --- type: "job" name: "unpackfs" interface: "python" script: "main.py" calamares-3.1.12/src/modules/unpackfs/unpackfs.conf000066400000000000000000000024331322271446000222630ustar00rootroot00000000000000# Unsquash / unpack a filesystem. Multiple sources are supported, and # they may be squashed or plain filesystems. # # Configuration: # # from globalstorage: rootMountPoint # from job.configuration: the path to where to mount the source image(s) # for copying an ordered list of unpack mappings for image file <-> # target dir relative to rootMountPoint. --- unpack: # Each list item is unpacked, in order, to the target system. # Each list item has the following attributes: # source: path relative to the live / intstalling system to the image # sourcefs: ext4 or squashfs (may be others if mount supports it) # destination: path relative to rootMountPoint (so in the target # system) where this filesystem is unpacked. # Usually you list a filesystem image to unpack; you can use # squashfs or an ext4 image. # # - source: "/path/to/filesystem.sqfs" # sourcefs: "squashfs" # destination: "" # You can list more than one filesystem. # # - source: "/path/to/another/filesystem.img" # sourcefs: "ext4" # destination: "" # # You can list filesystem source paths relative to the Calamares run # directory, if you use -d (this is only useful for testing, though). - source: ./example.sqfs sourcefs: squashfs destination: "" calamares-3.1.12/src/modules/users/000077500000000000000000000000001322271446000171275ustar00rootroot00000000000000calamares-3.1.12/src/modules/users/CMakeLists.txt000066400000000000000000000017171322271446000216750ustar00rootroot00000000000000find_package(ECM ${ECM_VERSION} NO_MODULE) if( ECM_FOUND ) include( ECMAddTests ) endif() find_package( Qt5 COMPONENTS Core Test REQUIRED ) find_package( Crypt REQUIRED ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) calamares_add_plugin( users TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES CreateUserJob.cpp SetPasswordJob.cpp UsersViewStep.cpp UsersPage.cpp SetHostNameJob.cpp UI page_usersetup.ui RESOURCES users.qrc LINK_PRIVATE_LIBRARIES calamaresui ${CRYPT_LIBRARIES} SHARED_LIB ) if( ECM_FOUND ) ecm_add_test( PasswordTests.cpp SetPasswordJob.cpp TEST_NAME passwordtest LINK_LIBRARIES ${CALAMARES_LIBRARIES} Qt5::Core Qt5::Test ${CRYPT_LIBRARIES} ) set_target_properties( passwordtest PROPERTIES AUTOMOC TRUE ) endif() calamares-3.1.12/src/modules/users/CreateUserJob.cpp000066400000000000000000000161361322271446000223370ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" #include #include #include #include #include #include CreateUserJob::CreateUserJob( const QString& userName, const QString& fullName, bool autologin, const QStringList& defaultGroups ) : Calamares::Job() , m_userName( userName ) , m_fullName( fullName ) , m_autologin( autologin ) , m_defaultGroups( defaultGroups ) { } QString CreateUserJob::prettyName() const { return tr( "Create user %1" ).arg( m_userName ); } QString CreateUserJob::prettyDescription() const { return tr( "Create user %1." ).arg( m_userName ); } QString CreateUserJob::prettyStatusMessage() const { return tr( "Creating user %1." ).arg( m_userName ); } Calamares::JobResult CreateUserJob::exec() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QDir destDir( gs->value( "rootMountPoint" ).toString() ); if ( gs->contains( "sudoersGroup" ) && !gs->value( "sudoersGroup" ).toString().isEmpty() ) { QFileInfo sudoersFi( destDir.absoluteFilePath( "etc/sudoers.d/10-installer" ) ); if ( !sudoersFi.absoluteDir().exists() ) return Calamares::JobResult::error( tr( "Sudoers dir is not writable." ) ); QFile sudoersFile( sudoersFi.absoluteFilePath() ); if (!sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) return Calamares::JobResult::error( tr( "Cannot create sudoers file for writing." ) ); QString sudoersGroup = gs->value( "sudoersGroup" ).toString(); QTextStream sudoersOut( &sudoersFile ); sudoersOut << QString( "%%1 ALL=(ALL) ALL\n" ).arg( sudoersGroup ); if ( QProcess::execute( "chmod", { "440", sudoersFi.absoluteFilePath() } ) ) return Calamares::JobResult::error( tr( "Cannot chmod sudoers file." ) ); } QFileInfo groupsFi( destDir.absoluteFilePath( "etc/group" ) ); QFile groupsFile( groupsFi.absoluteFilePath() ); if ( !groupsFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) return Calamares::JobResult::error( tr( "Cannot open groups file for reading." ) ); QString groupsData = QString::fromLocal8Bit( groupsFile.readAll() ); QStringList groupsLines = groupsData.split( '\n' ); for ( QStringList::iterator it = groupsLines.begin(); it != groupsLines.end(); ++it ) { int indexOfFirstToDrop = it->indexOf( ':' ); it->truncate( indexOfFirstToDrop ); } foreach ( const QString& group, m_defaultGroups ) if ( !groupsLines.contains( group ) ) CalamaresUtils::System::instance()-> targetEnvCall( { "groupadd", group } ); QString defaultGroups = m_defaultGroups.join( ',' ); if ( m_autologin ) { QString autologinGroup; if ( gs->contains( "autologinGroup" ) && !gs->value( "autologinGroup" ).toString().isEmpty() ) { autologinGroup = gs->value( "autologinGroup" ).toString(); CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", autologinGroup } ); defaultGroups.append( QString( ",%1" ).arg( autologinGroup ) ); } } // If we're looking to reuse the contents of an existing /home if ( gs->value( "reuseHome" ).toBool() ) { QString shellFriendlyHome = "/home/" + m_userName; QDir existingHome( destDir.absolutePath() + shellFriendlyHome ); if ( existingHome.exists() ) { QString backupDirName = "dotfiles_backup_" + QDateTime::currentDateTime() .toString( "yyyy-MM-dd_HH-mm-ss" ); existingHome.mkdir( backupDirName ); CalamaresUtils::System::instance()-> targetEnvCall( { "sh", "-c", "mv -f " + shellFriendlyHome + "/.* " + shellFriendlyHome + "/" + backupDirName } ); } } int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "useradd", "-m", "-s", "/bin/bash", "-U", "-c", m_fullName, m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot create user %1." ) .arg( m_userName ), tr( "useradd terminated with error code %1." ) .arg( ec ) ); ec = CalamaresUtils::System::instance()-> targetEnvCall( { "usermod", "-aG", defaultGroups, m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot add user %1 to groups: %2." ) .arg( m_userName ) .arg( defaultGroups ), tr( "usermod terminated with error code %1." ) .arg( ec ) ); ec = CalamaresUtils::System::instance()-> targetEnvCall( { "chown", "-R", QString( "%1:%2" ).arg( m_userName ) .arg( m_userName ), QString( "/home/%1" ).arg( m_userName ) } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot set home directory ownership for user %1." ) .arg( m_userName ), tr( "chown terminated with error code %1." ) .arg( ec ) ); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/users/CreateUserJob.h000066400000000000000000000026601322271446000220010ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CREATEUSERJOB_H #define CREATEUSERJOB_H #include #include class CreateUserJob : public Calamares::Job { Q_OBJECT public: CreateUserJob( const QString& userName, const QString& fullName, bool autologin, const QStringList& defaultGroups ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: QString m_userName; QString m_fullName; bool m_autologin; QStringList m_defaultGroups; }; #endif /* CREATEUSERJOB_H */ calamares-3.1.12/src/modules/users/PasswordTests.cpp000066400000000000000000000027161322271446000224660ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "SetPasswordJob.h" #include "PasswordTests.h" #include QTEST_GUILESS_MAIN( PasswordTests ) PasswordTests::PasswordTests() { } PasswordTests::~PasswordTests() { } void PasswordTests::initTestCase() { } void PasswordTests::testSalt() { QString s = SetPasswordJob::make_salt( 8 ); QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $ QVERIFY( s.startsWith( "$6$" ) ); QVERIFY( s.endsWith( '$' ) ); qDebug() << "Obtained salt" << s; s = SetPasswordJob::make_salt( 11 ); QCOMPARE( s.length(), 4 + 11 ); QVERIFY( s.startsWith( "$6$" ) ); QVERIFY( s.endsWith( '$' ) ); qDebug() << "Obtained salt" << s; } calamares-3.1.12/src/modules/users/PasswordTests.h000066400000000000000000000020321322271446000221220ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PASSWORDTESTS_H #define PASSWORDTESTS_H #include class PasswordTests : public QObject { Q_OBJECT public: PasswordTests(); ~PasswordTests() override; private Q_SLOTS: void initTestCase(); void testSalt(); }; #endif calamares-3.1.12/src/modules/users/SetHostNameJob.cpp000066400000000000000000000061031322271446000224600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Rohan Garg * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "SetHostNameJob.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "JobQueue.h" #include #include SetHostNameJob::SetHostNameJob( const QString& hostname ) : Calamares::Job() , m_hostname( hostname ) { } QString SetHostNameJob::prettyName() const { return tr( "Set hostname %1" ).arg( m_hostname ); } QString SetHostNameJob::prettyDescription() const { return tr( "Set hostname %1." ).arg( m_hostname ); } QString SetHostNameJob::prettyStatusMessage() const { return tr( "Setting hostname %1." ).arg( m_hostname ); } Calamares::JobResult SetHostNameJob::exec() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( !gs || !gs->contains( "rootMountPoint" ) ) { cLog() << "No rootMountPoint in global storage"; return Calamares::JobResult::error( tr( "Internal Error" ) ); } QString destDir = gs->value( "rootMountPoint" ).toString(); if ( !QDir( destDir ).exists() ) { cLog() << "rootMountPoint points to a dir which does not exist"; return Calamares::JobResult::error( tr( "Internal Error" ) ); } QFile hostfile( destDir + "/etc/hostname" ); if ( !hostfile.open( QFile::WriteOnly ) ) { cLog() << "Can't write to hostname file"; return Calamares::JobResult::error( tr( "Cannot write hostname to target system" ) ); } QTextStream hostfileout( &hostfile ); hostfileout << m_hostname << "\n"; hostfile.close(); QFile hostsfile( destDir + "/etc/hosts" ); if ( !hostsfile.open( QFile::WriteOnly ) ) { cLog() << "Can't write to hosts file"; return Calamares::JobResult::error( tr( "Cannot write hostname to target system" ) ); } // We also need to write the appropriate entries for /etc/hosts QTextStream hostsfileout( &hostsfile ); // ipv4 support hostsfileout << "127.0.0.1" << "\t" << "localhost" << "\n"; hostsfileout << "127.0.1.1" << "\t" << m_hostname << "\n"; // ipv6 support hostsfileout << "::1" << "\t" << "localhost ip6-localhost ip6-loopback" << "\n"; hostsfileout << "ff02::1 ip6-allnodes" << "\n" << "ff02::2 ip6-allrouters" << "\n"; hostsfile.close(); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/users/SetHostNameJob.h000066400000000000000000000024041322271446000221250ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Rohan Garg * Copyright 2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETHOSTNAMEJOB_CPP_H #define SETHOSTNAMEJOB_CPP_H #include class SetHostNameJob : public Calamares::Job { Q_OBJECT public: SetHostNameJob( const QString& hostname ); QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; private: const QString m_hostname; }; #endif // SETHOSTNAMEJOB_CPP_H calamares-3.1.12/src/modules/users/SetPasswordJob.cpp000066400000000000000000000113561322271446000225520ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" #include #include #ifndef NO_CRYPT_H #include #endif #include SetPasswordJob::SetPasswordJob( const QString& userName, const QString& newPassword ) : Calamares::Job() , m_userName( userName ) , m_newPassword( newPassword ) { } QString SetPasswordJob::prettyName() const { return tr( "Set password for user %1" ).arg( m_userName ); } QString SetPasswordJob::prettyStatusMessage() const { return tr( "Setting password for user %1." ).arg( m_userName ); } /// Returns a modular hashing salt for method 6 (SHA512) with a 16 character random salt. QString SetPasswordJob::make_salt(int length) { Q_ASSERT(length >= 8); Q_ASSERT(length <= 128); static const char salt_chars[] = { '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; static_assert( sizeof(salt_chars) == 64, "Missing salt_chars"); std::random_device r; std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; std::mt19937_64 twister(seed); std::uint64_t next; int current_length = 0; QString salt_string; salt_string.reserve(length + 10); while ( current_length < length ) { next = twister(); // In 64 bits, we have 10 blocks of 6 bits; map each block of 6 bits // to a single salt character. for ( unsigned int char_count = 0; char_count < 10; ++char_count ) { char c = salt_chars[next & 0b0111111]; next >>= 6; salt_string.append( c ); if (++current_length >= length) break; } } salt_string.truncate( length ); salt_string.insert( 0, "$6$" ); salt_string.append( '$' ); return salt_string; } Calamares::JobResult SetPasswordJob::exec() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QDir destDir( gs->value( "rootMountPoint" ).toString() ); if ( !destDir.exists() ) return Calamares::JobResult::error( tr( "Bad destination system path." ), tr( "rootMountPoint is %1" ).arg( destDir.absolutePath() ) ); if ( m_userName == "root" && m_newPassword.isEmpty() ) //special case for disabling root account { int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "passwd", "-dl", m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot disable root account." ), tr( "passwd terminated with error code %1." ) .arg( ec ) ); return Calamares::JobResult::ok(); } QString encrypted = QString::fromLatin1( crypt( m_newPassword.toUtf8(), make_salt( 16 ).toUtf8() ) ); int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "usermod", "-p", encrypted, m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot set password for user %1." ) .arg( m_userName ), tr( "usermod terminated with error code %1." ) .arg( ec ) ); return Calamares::JobResult::ok(); } calamares-3.1.12/src/modules/users/SetPasswordJob.h000066400000000000000000000025071322271446000222150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef SETPASSWORDJOB_H #define SETPASSWORDJOB_H #include class SetPasswordJob : public Calamares::Job { Q_OBJECT public: SetPasswordJob( const QString& userName, const QString& newPassword ); QString prettyName() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; static QString make_salt(int length); private: QString m_userName; QString m_newPassword; }; #endif /* SETPASSWORDJOB_H */ calamares-3.1.12/src/modules/users/UsersPage.cpp000066400000000000000000000360471322271446000215430ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "UsersPage.h" #include "ui_page_usersetup.h" #include "CreateUserJob.h" #include "SetPasswordJob.h" #include "SetHostNameJob.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include #include #include #include #include /** Add an error message and pixmap to a label. */ static inline void labelError( QLabel* pix, QLabel* label, const QString& message ) { label->setText( message ); pix->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No, CalamaresUtils::Original, label->size() ) ); } /** Clear error, indicate OK on a label. */ static inline void labelOk( QLabel* pix, QLabel* label ) { label->clear(); pix->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, label->size() ) ); } UsersPage::UsersPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::Page_UserSetup ) , m_readyFullName( false ) , m_readyUsername( false ) , m_readyHostname( false ) , m_readyPassword( false ) , m_readyRootPassword( false ) , m_writeRootPassword( true ) { ui->setupUi( this ); // Connect signals and slots connect( ui->textBoxFullName, &QLineEdit::textEdited, this, &UsersPage::onFullNameTextEdited ); connect( ui->textBoxUsername, &QLineEdit::textEdited, this, &UsersPage::onUsernameTextEdited ); connect( ui->textBoxHostname, &QLineEdit::textEdited, this, &UsersPage::onHostnameTextEdited ); connect( ui->textBoxUserPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged ); connect( ui->textBoxUserVerifiedPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged ); connect( ui->textBoxRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged ); connect( ui->textBoxVerifiedRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged ); connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, [this]( int checked ) { ui->labelChooseRootPassword->setVisible( !checked ); ui->labelExtraRootPassword->setVisible( !checked ); ui->labelRootPassword->setVisible( !checked ); ui->labelRootPasswordError->setVisible( !checked ); ui->textBoxRootPassword->setVisible( !checked ); ui->textBoxVerifiedRootPassword->setVisible( !checked ); checkReady( isReady() ); } ); m_customUsername = false; m_customHostname = false; setWriteRootPassword( true ); ui->checkBoxReusePassword->setChecked( true ); CALAMARES_RETRANSLATE( ui->retranslateUi( this ); ) } UsersPage::~UsersPage() { delete ui; } bool UsersPage::isReady() { bool readyFields = m_readyFullName && m_readyHostname && m_readyPassword && m_readyUsername; if ( !m_writeRootPassword || ui->checkBoxReusePassword->isChecked() ) return readyFields; return readyFields && m_readyRootPassword; } QList< Calamares::job_ptr > UsersPage::createJobs( const QStringList& defaultGroupsList ) { QList< Calamares::job_ptr > list; if ( !isReady() ) return list; Calamares::Job* j; j = new CreateUserJob( ui->textBoxUsername->text(), ui->textBoxFullName->text().isEmpty() ? ui->textBoxUsername->text() : ui->textBoxFullName->text(), ui->checkBoxAutoLogin->isChecked(), defaultGroupsList ); list.append( Calamares::job_ptr( j ) ); j = new SetPasswordJob( ui->textBoxUsername->text(), ui->textBoxUserPassword->text() ); list.append( Calamares::job_ptr( j ) ); if ( m_writeRootPassword ) { if ( ui->checkBoxReusePassword->isChecked() ) j = new SetPasswordJob( "root", ui->textBoxUserPassword->text() ); else j = new SetPasswordJob( "root", ui->textBoxRootPassword->text() ); list.append( Calamares::job_ptr( j ) ); } else { j = new SetPasswordJob( "root", "" ); //explicitly disable root password list.append( Calamares::job_ptr( j ) ); } j = new SetHostNameJob( ui->textBoxHostname->text() ); list.append( Calamares::job_ptr( j ) ); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); gs->insert( "hostname", ui->textBoxHostname->text() ); if ( ui->checkBoxAutoLogin->isChecked() ) gs->insert( "autologinUser", ui->textBoxUsername->text() ); gs->insert( "username", ui->textBoxUsername->text() ); gs->insert( "password", CalamaresUtils::obscure( ui->textBoxUserPassword->text() ) ); return list; } void UsersPage::onActivate() { ui->textBoxFullName->setFocus(); } void UsersPage::setWriteRootPassword( bool write ) { ui->checkBoxReusePassword->setVisible( write ); m_writeRootPassword = write; } void UsersPage::onFullNameTextEdited( const QString& textRef ) { if ( textRef.isEmpty() ) { ui->labelFullNameError->clear(); ui->labelFullName->clear(); if ( !m_customUsername ) ui->textBoxUsername->clear(); if ( !m_customHostname ) ui->textBoxHostname->clear(); m_readyFullName = false; } else { ui->labelFullName->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, ui->labelFullName->size() ) ); m_readyFullName = true; fillSuggestions(); } checkReady( isReady() ); } void UsersPage::fillSuggestions() { QString fullName = ui->textBoxFullName->text(); QRegExp rx( "[^a-zA-Z0-9 ]", Qt::CaseInsensitive ); QString cleanName = CalamaresUtils::removeDiacritics( fullName ) .toLower().replace( rx, " " ).simplified(); QStringList cleanParts = cleanName.split( ' ' ); if ( !m_customUsername ) { if ( !cleanParts.isEmpty() && !cleanParts.first().isEmpty() ) { QString usernameSuggestion = cleanParts.first(); for ( int i = 1; i < cleanParts.length(); ++i ) { if ( !cleanParts.value( i ).isEmpty() ) usernameSuggestion.append( cleanParts.value( i ).at( 0 ) ); } if ( USERNAME_RX.indexIn( usernameSuggestion ) != -1 ) { ui->textBoxUsername->setText( usernameSuggestion ); validateUsernameText( usernameSuggestion ); m_customUsername = false; } } } if ( !m_customHostname ) { if ( !cleanParts.isEmpty() && !cleanParts.first().isEmpty() ) { QString hostnameSuggestion = QString( "%1-pc" ).arg( cleanParts.first() ); if ( HOSTNAME_RX.indexIn( hostnameSuggestion ) != -1 ) { ui->textBoxHostname->setText( hostnameSuggestion ); validateHostnameText( hostnameSuggestion ); m_customHostname = false; } } } } void UsersPage::onUsernameTextEdited( const QString& textRef ) { m_customUsername = true; validateUsernameText( textRef ); } void UsersPage::validateUsernameText( const QString& textRef ) { QString text( textRef ); QRegExp rx( USERNAME_RX ); QRegExpValidator val( rx ); int pos = -1; if ( text.isEmpty() ) { ui->labelUsernameError->clear(); ui->labelUsername->clear(); m_readyUsername = false; } else if ( text.length() > USERNAME_MAX_LENGTH ) { labelError( ui->labelUsername, ui->labelUsernameError, tr( "Your username is too long." ) ); m_readyUsername = false; } else if ( val.validate( text, pos ) == QValidator::Invalid ) { labelError( ui->labelUsername, ui->labelUsernameError, tr( "Your username contains invalid characters. Only lowercase letters and numbers are allowed." ) ); m_readyUsername = false; } else { labelOk( ui->labelUsername, ui->labelUsernameError ); m_readyUsername = true; } emit checkReady( isReady() ); } void UsersPage::onHostnameTextEdited( const QString& textRef ) { m_customHostname = true; validateHostnameText( textRef ); } void UsersPage::validateHostnameText( const QString& textRef ) { QString text = textRef; QRegExp rx( HOSTNAME_RX ); QRegExpValidator val( rx ); int pos = -1; if ( text.isEmpty() ) { ui->labelHostnameError->clear(); ui->labelHostname->clear(); m_readyHostname= false; } else if ( text.length() < HOSTNAME_MIN_LENGTH ) { labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too short." ) ); m_readyHostname = false; } else if ( text.length() > HOSTNAME_MAX_LENGTH ) { labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too long." ) ); m_readyHostname = false; } else if ( val.validate( text, pos ) == QValidator::Invalid ) { labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname contains invalid characters. Only letters, numbers and dashes are allowed." ) ); m_readyHostname = false; } else { labelOk( ui->labelHostname, ui->labelHostnameError ); m_readyHostname = true; } emit checkReady( isReady() ); } void UsersPage::onPasswordTextChanged( const QString& ) { QString pw1 = ui->textBoxUserPassword->text(); QString pw2 = ui->textBoxUserVerifiedPassword->text(); // TODO: 3.3: remove empty-check and leave it to passwordRequirements if ( pw1.isEmpty() && pw2.isEmpty() ) { ui->labelUserPasswordError->clear(); ui->labelUserPassword->clear(); m_readyPassword = false; } else if ( pw1 != pw2 ) { labelError( ui->labelUserPassword, ui->labelUserPasswordError, tr( "Your passwords do not match!" ) ); m_readyPassword = false; } else { bool ok = true; for ( auto pc : m_passwordChecks ) { QString s = pc.filter( pw1 ); if ( !s.isEmpty() ) { labelError( ui->labelUserPassword, ui->labelUserPasswordError, s ); ok = false; m_readyPassword = false; break; } } if ( ok ) { labelOk( ui->labelUserPassword, ui->labelUserPasswordError ); m_readyPassword = true; } } emit checkReady( isReady() ); } void UsersPage::onRootPasswordTextChanged( const QString& ) { QString pw1 = ui->textBoxRootPassword->text(); QString pw2 = ui->textBoxVerifiedRootPassword->text(); // TODO: 3.3: remove empty-check and leave it to passwordRequirements if ( pw1.isEmpty() && pw2.isEmpty() ) { ui->labelRootPasswordError->clear(); ui->labelRootPassword->clear(); m_readyRootPassword = false; } else if ( pw1 != pw2 ) { labelError( ui->labelRootPassword, ui->labelRootPasswordError, tr( "Your passwords do not match!" ) ); m_readyRootPassword = false; } else { bool ok = true; for ( auto pc : m_passwordChecks ) { QString s = pc.filter( pw1 ); if ( !s.isEmpty() ) { labelError( ui->labelRootPassword, ui->labelRootPasswordError, s ); ok = false; m_readyRootPassword = false; break; } } if ( ok ) { labelOk( ui->labelRootPassword, ui->labelRootPasswordError ); m_readyRootPassword = true; } } emit checkReady( isReady() ); } void UsersPage::setAutologinDefault( bool checked ) { ui->checkBoxAutoLogin->setChecked( checked ); emit checkReady( isReady() ); } void UsersPage::setReusePasswordDefault( bool checked ) { ui->checkBoxReusePassword->setChecked( checked ); emit checkReady( isReady() ); } UsersPage::PasswordCheck::PasswordCheck() : m_message() , m_accept( []( const QString& s ) { return true; } ) { } UsersPage::PasswordCheck::PasswordCheck( const QString& m, AcceptFunc a ) : m_message( [m](){ return m; } ) , m_accept( a ) { } UsersPage::PasswordCheck::PasswordCheck( MessageFunc m, AcceptFunc a ) : m_message( m ) , m_accept( a ) { } void UsersPage::addPasswordCheck( const QString& key, const QVariant& value ) { if ( key == "minLength" ) { int minLength = -1; if ( value.canConvert( QVariant::Int ) ) minLength = value.toInt(); if ( minLength > 0 ) { cDebug() << key << " .. set to" << minLength; m_passwordChecks.push_back( PasswordCheck( []() { return tr( "Password is too short" ); }, [minLength]( const QString& s ) { return s.length() >= minLength; } ) ); } } else if ( key == "maxLength" ) { int maxLength = -1; if ( value.canConvert( QVariant::Int ) ) maxLength = value.toInt(); if ( maxLength > 0 ) { cDebug() << key << " .. set to" << maxLength; m_passwordChecks.push_back( PasswordCheck( []() { return tr( "Password is too long" ); }, [maxLength]( const QString& s ) { return s.length() <= maxLength; } ) ); } } else cDebug() << "WARNING: Unknown password-check key" << '"' << key << '"'; } calamares-3.1.12/src/modules/users/UsersPage.h000066400000000000000000000075221322271446000212040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Portions from the Manjaro Installation Framework * by Roland Singer * Copyright (C) 2007 Free Software Foundation, Inc. * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef USERSPAGE_H #define USERSPAGE_H #include "Typedefs.h" #include #include namespace Ui { class Page_UserSetup; } class UsersPage : public QWidget { Q_OBJECT public: explicit UsersPage( QWidget* parent = nullptr ); virtual ~UsersPage(); bool isReady(); QList< Calamares::job_ptr > createJobs( const QStringList& defaultGroupsList ); void onActivate(); void setWriteRootPassword( bool show ); void setAutologinDefault( bool checked ); void setReusePasswordDefault( bool checked ); void addPasswordCheck( const QString& key, const QVariant& value ); protected slots: void onFullNameTextEdited( const QString& ); void fillSuggestions(); void onUsernameTextEdited( const QString& ); void validateUsernameText( const QString& ); void onHostnameTextEdited( const QString& ); void validateHostnameText( const QString& ); void onPasswordTextChanged( const QString& ); void onRootPasswordTextChanged( const QString& ); signals: void checkReady( bool ); private: Ui::Page_UserSetup* ui; /** * Support for (dynamic) checks on the password's validity. * This can be used to implement password requirements like * "at least 6 characters". Function addPasswordCheck() * instantiates these and adds them to the list of checks. */ class PasswordCheck { public: /** Return true if the string is acceptable. */ using AcceptFunc = std::function; using MessageFunc = std::function; /** Generate a @p message if @p filter returns true */ PasswordCheck( MessageFunc message, AcceptFunc filter ); /** Yields @p message if @p filter returns true */ PasswordCheck( const QString& message, AcceptFunc filter ); /** Null check, always returns empty */ PasswordCheck(); /** Applies this check to the given password string @p s * and returns an empty string if the password is ok * according to this filter. Returns a message describing * what is wrong if not. */ QString filter( const QString& s ) const { return m_accept( s ) ? QString() : m_message(); } private: MessageFunc m_message; AcceptFunc m_accept; } ; QVector m_passwordChecks; const QRegExp USERNAME_RX = QRegExp( "^[a-z_][a-z0-9_-]*[$]?$" ); const QRegExp HOSTNAME_RX = QRegExp( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" ); const int USERNAME_MAX_LENGTH = 31; const int HOSTNAME_MIN_LENGTH = 2; const int HOSTNAME_MAX_LENGTH = 63; bool m_readyFullName; bool m_readyUsername; bool m_customUsername; bool m_readyHostname; bool m_customHostname; bool m_readyPassword; bool m_readyRootPassword; bool m_writeRootPassword; }; #endif // USERSPAGE_H calamares-3.1.12/src/modules/users/UsersViewStep.cpp000066400000000000000000000110061322271446000224210ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "UsersViewStep.h" #include "UsersPage.h" #include "utils/Logger.h" #include "JobQueue.h" #include "GlobalStorage.h" CALAMARES_PLUGIN_FACTORY_DEFINITION( UsersViewStepFactory, registerPlugin(); ) UsersViewStep::UsersViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new UsersPage() ) { emit nextStatusChanged( true ); connect( m_widget, &UsersPage::checkReady, this, &UsersViewStep::nextStatusChanged ); } UsersViewStep::~UsersViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString UsersViewStep::prettyName() const { return tr( "Users" ); } QWidget* UsersViewStep::widget() { return m_widget; } void UsersViewStep::next() { emit done(); } void UsersViewStep::back() {} bool UsersViewStep::isNextEnabled() const { return m_widget->isReady(); } bool UsersViewStep::isBackEnabled() const { return true; } bool UsersViewStep::isAtBeginning() const { return true; } bool UsersViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > UsersViewStep::jobs() const { return m_jobs; } void UsersViewStep::onActivate() { m_widget->onActivate(); } void UsersViewStep::onLeave() { m_jobs.clear(); m_jobs.append( m_widget->createJobs( m_defaultGroups ) ); } void UsersViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains( "defaultGroups" ) && configurationMap.value( "defaultGroups" ).type() == QVariant::List ) { m_defaultGroups = configurationMap.value( "defaultGroups" ).toStringList(); } else { m_defaultGroups = QStringList{ "lp", "video", "network", "storage", "wheel", "audio" }; } if ( configurationMap.contains( "autologinGroup" ) && configurationMap.value( "autologinGroup" ).type() == QVariant::String ) { Calamares::JobQueue::instance()->globalStorage()->insert( "autologinGroup", configurationMap.value( "autologinGroup" ).toString() ); } if ( configurationMap.contains( "sudoersGroup" ) && configurationMap.value( "sudoersGroup" ).type() == QVariant::String ) { Calamares::JobQueue::instance()->globalStorage()->insert( "sudoersGroup", configurationMap.value( "sudoersGroup" ).toString() ); } if ( configurationMap.contains( "setRootPassword" ) && configurationMap.value( "setRootPassword" ).type() == QVariant::Bool ) { Calamares::JobQueue::instance()->globalStorage()->insert( "setRootPassword", configurationMap.value( "setRootPassword" ).toBool() ); m_widget->setWriteRootPassword( configurationMap.value( "setRootPassword" ).toBool() ); } if ( configurationMap.contains( "doAutologin" ) && configurationMap.value( "doAutologin" ).type() == QVariant::Bool ) { m_widget->setAutologinDefault( configurationMap.value( "doAutologin" ).toBool() ); } if ( configurationMap.contains( "doReusePassword" ) && configurationMap.value( "doReusePassword" ).type() == QVariant::Bool ) { m_widget->setReusePasswordDefault( configurationMap.value( "doReusePassword" ).toBool() ); } if ( configurationMap.contains( "passwordRequirements" ) && configurationMap.value( "passwordRequirements" ).type() == QVariant::Map ) { auto pr_checks( configurationMap.value( "passwordRequirements" ).toMap() ); for (decltype(pr_checks)::const_iterator i = pr_checks.constBegin(); i != pr_checks.constEnd(); ++i) { m_widget->addPasswordCheck( i.key(), i.value() ); } } } calamares-3.1.12/src/modules/users/UsersViewStep.h000066400000000000000000000036071322271446000220760ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef USERSPAGEPLUGIN_H #define USERSPAGEPLUGIN_H #include #include #include #include #include class UsersPage; class PLUGINDLLEXPORT UsersViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit UsersViewStep( QObject* parent = nullptr ); virtual ~UsersViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void onActivate() override; void onLeave() override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: UsersPage* m_widget; QList< Calamares::job_ptr > m_jobs; QStringList m_defaultGroups; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( UsersViewStepFactory ) #endif // USERSPAGEPLUGIN_H calamares-3.1.12/src/modules/users/images/000077500000000000000000000000001322271446000203745ustar00rootroot00000000000000calamares-3.1.12/src/modules/users/images/invalid.png000066400000000000000000000172161322271446000225370ustar00rootroot00000000000000PNG  IHDRifԿbKGD pHYs  tIME !,iTXtCommentCreated with GIMPd.eIDATxyp\}Ι}  C$%%+:x(ΖHfʎ7F@ʛıUN+\++ZIɒ*tX(/Fx ]}3B0`k7~4}>Mk"OJCml,4M72ẩAx| i6!D.1tNtFh fJ  8d2 94LA~Z*kgJ441-P@rRH r,Qu)ƬBz@3,'l-Z ZU /A@>@u5IwM40 ;{]]|"s|󿶵DBNU6v4D"דy--CC R\3I)1PmP) .|u#9aiGK}u55eK t)ϜR 體 $dYh`0őq`ByU  Vr]~c?ܼV /^(&4,c "DGE߮K=7Nū |ᆪʻoZ_#G鋮@YE HׅRQ`e J~/wW KX7~uWYu+um;6 8c U@`[EQMk*.@ciǒ_a~y:荍H!8͕( ceASXrnb۱Xc {K2ZփT#}}'))iWAePR2yo, A%_iU~=H$!SɫZMʊPRF¨mBGw^(WH]2zs uD!HD9NsFeVYSz{9eEnrkC5Dq(%ACaTx7$W_W/w9yqO7ԬhВz1({s@)PUp1>< ]W^;VYG  0(z(r8|;X۬CnKՅoo\,mAiߵHhDte.n*.AEZJ Յk[ŮB[fZAL]Ay)U і#iϬ(_x (MC3=xr ѕ`vŔ/Z8;66UVS }ㆅM7`P,"]τ%g Ҏ?scMuupz{Ƣפ%WBrbk|߯282b.fڟ. WΛ."ۓu8u\ H$aDXXRWzѢ!xꪢ&$."H&p=ĝR@*JfY}R"zHRH>T:Br05 C=AD(8;jklDnnj1t ]LPpD2 V7%7n?0 Y2DB` Ԅi!\P4 i`ӬG:.PA-R;\rkQ߿+{d JK`b%H)&'%S)T֭XìIKV,o blsJPsǝX+*Fc!BI(s |0a!lP)?F$iSEء?nYPf_< pn܈+W* Dc?R}I!08y [[\yz#m܈ 9Kק=NI縔J5:v;=iCz[5+<~xU]V X7jl'\QaĎ Z]M).OPi3[[ACߨ5Mո?4B$砆P 9N ;:muww_Wd+KB f˩+!!$c0kkǽ6[[A\zu(ˆf 7-A[[Am{kZ(u@z%׃a | lRE+ִHqR8χ rVHnĮ, y6lނAAiW*$tlނmƐXxz34,BQbF6/^:-Hhe+me#58T =tGcǑ%y P2m-z߼K& W^=[s0QeY6fZc盚ZlYv8htږp5?[7|:o^o/b'P<*k'<lEK)ѹ){Eغ}n `&|eߊF_2;jj7{*+ntsѽBlĠ|hiHoي9pnؚͤaAn mD bBHwUVB2 gei8GyӋ tr˕ -[Ѳ}{N:z> [`Pfl- BI%x'w.oH;_ )T >4نRȔ5RH.QN]HHlŲTHP$4h"zߎF)o*( srH&E):3PRb|mB: lv(pנL(PRHz>nŲ&1TV ,]̙q+p߇nb X?yԵ ].ĕH!> E)ՉA6o ,n,߶-7@;ݻaZ.jf\`2Jʗ)I]UUjKJ DqPl2z{1j2Wqc3q$(Rǂ-[GrN?$:vfBS*eH2ݯ$]g@E^^`#`US ޷ z8Q-E@%v"yAU}*3WP߹:-AAg[SO"QA'AL1IJ̄Y)eIwR6ue\1{,@ #7}xI޻:%\)aHYUR4Do/Wȏ[T(Lch߳]ȹC9gNB TP !Ց*s F7 pBklۑ̈́HPJ$d0ȬH2pQ2.7om۠MIr*)m۠7ހb TUwIf)1I{([8[4Pkmx@>J I)( (sf)]' wm)nl8խPJܛ!͗Q?HJ F)f70_:!hشk hD`R! ]) Cg2/ )qMBX AJJPBE/ \!S72{*O:$hش0)p|Ng&1W'\B!\:,QtA)% xq!TC) 04t(JpצAJ۵{dw\wW&t!ia 3FCf`&<᧧8Mq'-DIK4H@Ӏd Y sS{p>sJ;zsTpX~=h @mT U%Hy>.'Spۖ7$"v; 3ÉiK HЩ={ +T];1(@ pzz0XJPYA,@R8M Ry9QLc ihknEwm>@|HP` }GJQ;A(PJ)L%0{Mml3oK7PdZM$"A|)a!7.@Q mA씂fyz=P}ӻ&eUWT~`S>JW\Tq(Z2rCnފFVQR#:2g渒   zjLP ˎA}e ?\TK3D~cyMpM?LS(`WV=C ԟ=q"gE>#}?%&JB!/xU ttd"P0x 0lJiK/#v$J `g'bǏϝ;LJĜ]RoG,s^ݕMlbÀmwi3յ4Jsgu}$JWŸR)*Bsy{~h=qݼ|}Xی MHT>ylSpCCsy>C2zw-+흝]B?wTCa0K!w3 \!Z |\ǑσS}ZUBJF) l8:^: IH2+*ơK]ܕ}O:<%T~-Iz*.PlZ]GN P aiEt՜?|ĉ7<^Nc1gSUQRIb,%!†磣H_yߟuHf4zᶊ^V$ :8:t.R7az$8Q$omo9ʽҠ(aPݼ#RSm- I\Qk`] "k{ HT vP^w7bA!,͞wk~ç 7B4uqux!aUUN_~}B-[0%otJM[cn7)z5뫫a:>ŀB(u8+iF3ՠ軷WUUJ}V*J"4 W]y pCM ~}p}]mOxMnؠt6 ~0;'Qo啕CIxR".jkg,+VRB )a0A A"ceffB ЕHspAz?r)p[ k* *x(\h]a|['dCXB |8\ 2gj @б!C$\>_Hא3V Xe.%NJ " <*$3(1 I)J- u†ÅD ?Ps|3߱҇ !*W"yHP18l`Q{WUm-/(B1H GBF02 q!P騰-f^'\ʔ;g瞺x]cJ13o$UPHl=󩍀6$rU+#1)!0^DRυ>3nQ QhfB"݀g: ]K@h"~y,#ITFB`,1(8Z1ưUJHKK(-|a|NAN)La$l2FQҟKG$*2HqR*?D"{>XPF31R0"ҤfRi V  n-+[Pjk r6%@ $}ce &= @ 3'\K{Rοrh;oFѪFbThHǪOeClkpdѼpxic(% (acڃ<R!_Ņ+N}wdL';29ƙjpwO3V2dXrɠt2˹9އm)kTʞvSu IENDB`calamares-3.1.12/src/modules/users/images/valid.png000066400000000000000000000161641322271446000222110ustar00rootroot00000000000000PNG  IHDRii9 :bKGD pHYs  tIME "#fiTXtCommentCreated with GIMPd.eIDATxy]U{o<'@fP* Xe,ME]8UjKlŮ`( X.TB @ dt=%<^ޗ쬽]so;p.r.`ʍ\s{PWHAeE}iHDZLYdRgZaK)d˴8xRѨXZXK*)16qUVtTA 1LϵR E\ChbBYM-(jJ }ІQY싶*cqk3H4ʪp:Js=OLݷ:r9&ȧ2N OxH\\L0X,ž,wg1h1B舚)*tK,[=W"֓[w4\Oֱ my3ffODG'imeP6X=LXS+ MdBjBlBMH-F(pE#$KBHVbO/[wC=ǒ(D*HCaIOGi`4fgRpZʺ#6 R:/i pjRaoO'PwjnC}8噌 /9s ff&WuQ5et '` I$ d7VhSwvkӧ.Yv,c.nR$/}|'a)e-{JpuXշyUXy,pmÄٵDo:5sΕ +ZLѝtb>) K LJḮlݷ_w\>V~0!!]}WA;\qyY]6]NBSCj @Bg6]ݵ[ ꄁt]Ks˗N|Lgwq އfH*!>6l֗z~J|_wIw>Th|S&;ES&@t) veǢм)s9 ֶ=;u%d-՗S}SP$6ZH;)ZZ8[]q;{ꁸ|IҵP~sf^;e [LSX I9> ټk/x1iIfM歅]={vܩKy&4ZhkI;)Fy^%'5'4S-_6ky|i3U f=+Bc!-S >gvFy[ӧ9a>fRGk/Y J[H̫+@&W_0H+뮞s`2/긮^MRV#&s(U_%޳E;O0u]4O.eky7I !䫒˜8H2~/#ܮξ?9bGk]Jy.[6+Igpް!W5Q'0ҴF/>'Zc/up} us混/IQR/*9/imtuVVuY#(l[MO`=;Ro_0}*nͥ$`/tW&"r^ۥ8_w)T}ur+3R-"6 )axTh"@H1 &>z MD` Sf;vT'O;$we-mD:PX"02!@ņj%"I4E |2yFC(-A2^~q }vǕWNj39ȳ܍2GȣwS/qh(jg|*^K(TɷHG`EVkM>czU ¸9\[69E.=TQh+Y/-oarf [ujX ܆zZO" ]չ_{a!]pjjO`D1]jJ2+xYPgOZShcӡGǓ!HWR BZusGl/CQ XéWm]u@n!O_ ck& iڞtd}.)tӓ9z$9E=$.9rCm' c̵D|2Oܛ]xeMctEG^ϧ{֞BnY;J90mL1܍cX%d|\Zە0vH=gdJt c,}qr#(.\;2* ?!{J'4%T3𝣰I$ 6~zJT qRsѷFt`-?v#'hR |\9k'Y'_J=Cj=!N- k)o%߈X[t5~kiVڠ%yioFV[{Ӑ{xR R Ŝ".NR ۺw-?uc~ m-+!d)H2)6fBMbrCU=Nc9l?5 ҂0XOb Z e7hyh X'4V}j껭eTɡr>[ղ>zHׂ4( gonК: !=u."j*pU(OakU:tL SKɻБ[Ъe7$f|VDHOsd2xXE]mֻ`ZSu N7ϿL"]cT}$4{[^e$LjW1"BxRq|ԝ'!6k-B]pKc,V5Y;3흼cWl=xyFk6}7iC0"V-|ЀZ#[nĈzCyh-RRM*6hiz jK cڳ prA~z$MyºD0BV-_M!=~<INXd_"p QH+<$c[cƕYwdaZvɈiϸ tW p$Js[.h|#VX'DΏ%6 kL`N:Dʐq1ݏ@8R9_F+F@a=kH1XÉRX<#Qb@Ӎk1fgrL.H} )G:+/1){(.kypߣpx@Z2~@/ymMh8uǺfˆO=%0@4B+ gm(4h??yEFs/FG2UZ:}7n:> vajK5end5LsUX q0IydgX ;Yg(9oe0>FI\ʳTqQ6biem "Ej,<5&Hǵ2TM]2 v A-;UqE˝@jbPƌqm[}Yб͍x2R^ .]vԴ}e(jp-Ucۚ&҆×Y\PJM֓{(6Ɗ=OrӐY}=~/Aq5R=Gґ8Tk:GFF^UmJQ.sIFIyζ<'{yx $R'YkiK{H)Ƙnh˧R>Df[-Jkε& s IH{ȦHtTiIW*Dak#y[GtUabJQ @n3F}<}1zz=MOm%wˡR2yӖCWeJϐ*HqxR).k=L;M'%LIVy)_ Ūa0Z{쫒Q<}=0 ~7Āߋ!PQ| uŎ+eՒJEGo^)ɜS[eŖ!PۭbOU6 |;Yc2&~#GPu(PC{> \O,sIՠtP)"r>c%aGV=%Ir.&ȥ$=eΈPaypݐ< CHp)l%@pg`AG_/&]2-+@OJ20"EXyeb 2s|A>2ŧ%``1`1{Wjg6wC 򆸟 V@+$gm HU+>y>?%v]H! r= ɒ+uwXi۟'rF< jtJ[[g68 pMP@9 c>M'2os&or}1BJRwϚ.#Kg\G sA#-RH/UCC52T"]wJT1ڥ?>bv_7aL j4cAjPlAנ[I۟[6cwn}M6ǩ瓐\)p@JH\8x|PmIE[[_N 1 +vK^?|_V 03`6Xa+Ao0j$`7#oyg &qf -fJO)Z 1wEkl4}*]QE.u{&7<^N%c$0mB ~/cX\p1rF7vwޔ%ub1)w2~FddzqHYED"+ֹWo]t*[ICsf!TOf5k !ECboQ r<P/ps;Dd5m8q 4|g2i#܋m`3C}oF#|`9܁D:hHfo^(fFx9V1(VGvhPF6`lgbE< HS4Q@婰gSIENDB`calamares-3.1.12/src/modules/users/page_usersetup.ui000066400000000000000000000405651322271446000225330ustar00rootroot00000000000000 Page_UserSetup 0 0 862 683 Form Qt::Vertical QSizePolicy::Fixed 20 6 What is your name? 200 0 0 0 24 24 24 24 true 1 0 true Qt::Vertical QSizePolicy::Fixed 20 6 What name do you want to use to log in? false 0 0 200 0 0 0 24 24 24 24 true 1 0 200 0 Qt::AlignVCenter true font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> true Qt::Vertical QSizePolicy::Fixed 20 6 What is the name of this computer? false 0 0 200 0 0 0 24 24 24 24 true 1 0 200 0 Qt::AlignVCenter true font-weight: normal <small>This name will be used if you make the computer visible to others on a network.</small> false Qt::Vertical QSizePolicy::Fixed 20 6 Choose a password to keep your account safe. false 0 0 200 0 QLineEdit::Password 0 0 200 0 QLineEdit::Password 0 0 24 24 24 24 true 1 0 100 0 Qt::AlignVCenter true font-weight: normal <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> true Log in automatically without asking for the password. Use the same password for the administrator account. Qt::Vertical QSizePolicy::Fixed 20 6 Choose a password for the administrator account. false 0 0 200 0 QLineEdit::Password 0 0 200 0 QLineEdit::Password 0 0 24 24 24 24 true 1 0 100 0 Qt::AlignVCenter true font-weight: normal <small>Enter the same password twice, so that it can be checked for typing errors.</small> true Qt::Vertical 20 1 calamares-3.1.12/src/modules/users/users.conf000066400000000000000000000023751322271446000211460ustar00rootroot00000000000000# Configuration for the one-user-system user module. # # Besides these settings, the user module also places the following # keys into the globalconfig area, based on user input in the view step. # # - hostname # - username # - password (obscured) # - autologinUser (if enabled, set to username) # # These globalconfig keys are set when the jobs for this module # are created. --- defaultGroups: - users - lp - video - network - storage - wheel - audio autologinGroup: autologin doAutologin: true # remove the following line to avoid creating /etc/sudoers.d/10-installer sudoersGroup: wheel setRootPassword: true doReusePassword: true # These are optional password-requirements that a distro can enforce # on the user. The values given in this sample file disable each check, # as if the check was not listed at all. # # Checks may be listed multiple times; each is checked separately, # and no effort is done to ensure that the checks are consistent # (e.g. specifying a maximum length less than the minimum length # will annoy users). # # (additional checks may be implemented in UsersPage.cpp) passwordRequirements: minLength: -1 # Password at least this many characters maxLength: -1 # Password at most this many characters calamares-3.1.12/src/modules/users/users.qrc000066400000000000000000000002071322271446000207760ustar00rootroot00000000000000 images/invalid.png images/valid.png calamares-3.1.12/src/modules/webview/000077500000000000000000000000001322271446000174365ustar00rootroot00000000000000calamares-3.1.12/src/modules/webview/CMakeLists.txt000066400000000000000000000031051322271446000221750ustar00rootroot00000000000000list( APPEND CALA_WEBVIEW_INCLUDE_DIRECTORIES ${PROJECT_BINARY_DIR}/src/libcalamaresui ) list( APPEND CALA_WEBVIEW_LINK_LIBRARIES calamaresui ) option( WEBVIEW_FORCE_WEBKIT "Always build webview with WebKit instead of WebEngine regardless of Qt version." OFF) message( STATUS "Found Qt version ${Qt5Core_VERSION}") if ( Qt5Core_VERSION VERSION_LESS 5.6 OR WEBVIEW_FORCE_WEBKIT ) message( STATUS " .. using webkit") find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED WebKit WebKitWidgets ) list( APPEND CALA_WEBVIEW_INCLUDE_DIRECTORIES ${QT_QTWEBKIT_INCLUDE_DIR} ) list( APPEND CALA_WEBVIEW_LINK_LIBRARIES Qt5::WebKit Qt5::WebKitWidgets ) set( WEBVIEW_WITH_WEBKIT 1 ) else() message( STATUS " .. using webengine") find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED WebEngine WebEngineWidgets ) list( APPEND CALA_WEBVIEW_INCLUDE_DIRECTORIES ${QT_QTWEBENGINE_INCLUDE_DIR} ) list( APPEND CALA_WEBVIEW_LINK_LIBRARIES Qt5::WebEngine Qt5::WebEngineWidgets ) set( WEBVIEW_WITH_WEBENGINE 1 ) endif() include_directories( ${CALA_WEBVIEW_INCLUDE_DIRECTORIES} ) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/WebViewConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/WebViewConfig.h ) calamares_add_plugin( webview TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES WebViewStep.cpp LINK_PRIVATE_LIBRARIES ${CALA_WEBVIEW_LINK_LIBRARIES} SHARED_LIB ) calamares-3.1.12/src/modules/webview/WebViewConfig.h.in000066400000000000000000000002541322271446000227130ustar00rootroot00000000000000#ifndef CALAMARESWEBVIEWCONFIG_H #define CALAMARESWEBVIEWCONFIG_H #cmakedefine WEBVIEW_WITH_WEBENGINE #cmakedefine WEBVIEW_WITH_WEBKIT #endif // CALAMARESWEBVIEWCONFIG_H calamares-3.1.12/src/modules/webview/WebViewStep.cpp000066400000000000000000000057321322271446000223550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Rohan Garg * Copyright 2016, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "WebViewStep.h" #include #ifdef WEBVIEW_WITH_WEBKIT #include #else #include #include #endif CALAMARES_PLUGIN_FACTORY_DEFINITION( WebViewStepFactory, registerPlugin(); ) WebViewStep::WebViewStep( QObject* parent ) : Calamares::ViewStep( parent ) { emit nextStatusChanged( true ); #ifdef WEBVIEW_WITH_WEBENGINE QtWebEngine::initialize(); #endif m_view = new C_QWEBVIEW(); #ifdef WEBVIEW_WITH_WEBKIT m_view->settings()->setFontFamily( QWebSettings::StandardFont, m_view->settings()-> fontFamily( QWebSettings::SansSerifFont ) ); m_view->setRenderHints( QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing | QPainter::SmoothPixmapTransform | QPainter::NonCosmeticDefaultPen ); #endif } WebViewStep::~WebViewStep() { if ( m_view && m_view->parent() == nullptr ) m_view->deleteLater(); } QString WebViewStep::prettyName() const { return m_prettyName; } QWidget* WebViewStep::widget() { return m_view; } void WebViewStep::next() { emit done(); } void WebViewStep::back() {} bool WebViewStep::isNextEnabled() const { return true; } bool WebViewStep::isBackEnabled() const { return true; } bool WebViewStep::isAtBeginning() const { return true; } bool WebViewStep::isAtEnd() const { return true; } void WebViewStep::onActivate() { m_view->load(QUrl(m_url)); m_view->show(); } QList< Calamares::job_ptr > WebViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void WebViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { if ( configurationMap.contains("url") && configurationMap.value("url").type() == QVariant::String ) m_url = configurationMap.value("url").toString(); if ( configurationMap.contains("prettyName") && configurationMap.value("prettyName").type() == QVariant::String ) m_prettyName = configurationMap.value("prettyName").toString(); } calamares-3.1.12/src/modules/webview/WebViewStep.h000066400000000000000000000037331322271446000220210ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2015, Rohan Garg * Copyright 2016, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef WEBVIEWPLUGIN_H #define WEBVIEWPLUGIN_H #include "WebViewConfig.h" #include #include #include #include #ifdef WEBVIEW_WITH_WEBKIT #define C_QWEBVIEW QWebView #else #define C_QWEBVIEW QWebEngineView #endif class C_QWEBVIEW; class PLUGINDLLEXPORT WebViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit WebViewStep( QObject* parent = nullptr ); virtual ~WebViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; void onActivate() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: C_QWEBVIEW *m_view; QString m_url; QString m_prettyName; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( WebViewStepFactory ) #endif // WEBVIEWPLUGIN_H calamares-3.1.12/src/modules/webview/owncloud.conf000066400000000000000000000000761322271446000221420ustar00rootroot00000000000000--- prettyName: "OwnCloud" url: "https://owncloud.org" calamares-3.1.12/src/modules/webview/webview.conf000066400000000000000000000000751322271446000217570ustar00rootroot00000000000000--- prettyName: "Webview" url: "https://calamares.io" calamares-3.1.12/src/modules/welcome/000077500000000000000000000000001322271446000174215ustar00rootroot00000000000000calamares-3.1.12/src/modules/welcome/CMakeLists.txt000066400000000000000000000014021322271446000221560ustar00rootroot00000000000000include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) find_package( LIBPARTED REQUIRED ) find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED DBus Network ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) set( CHECKER_SOURCES checker/CheckItemWidget.cpp checker/CheckerWidget.cpp checker/RequirementsChecker.cpp checker/partman_devices.c ) set( CHECKER_LINK_LIBRARIES ${LIBPARTED_LIBS} Qt5::DBus Qt5::Network ) calamares_add_plugin( welcome TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES ${CHECKER_SOURCES} WelcomeViewStep.cpp WelcomePage.cpp UI WelcomePage.ui LINK_PRIVATE_LIBRARIES calamaresui ${CHECKER_LINK_LIBRARIES} SHARED_LIB ) calamares-3.1.12/src/modules/welcome/WelcomePage.cpp000066400000000000000000000261011322271446000223150ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2015, Anke Boersma * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "WelcomePage.h" #include "ui_WelcomePage.h" #include "CalamaresVersion.h" #include "checker/RequirementsChecker.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include "ViewManager.h" #include #include #include #include #include #include #include #include "Branding.h" WelcomePage::WelcomePage( RequirementsChecker* requirementsChecker, QWidget* parent ) : QWidget( parent ) , ui( new Ui::WelcomePage ) , m_requirementsChecker( requirementsChecker ) { ui->setupUi( this ); ui->verticalLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() * 2 ); initLanguages(); ui->mainText->setAlignment( Qt::AlignCenter ); ui->mainText->setWordWrap( true ); ui->mainText->setOpenExternalLinks( true ); cDebug() << "Welcome string" << Calamares::Branding::instance()->welcomeStyleCalamares() << *Calamares::Branding::VersionedName; CALAMARES_RETRANSLATE( ui->mainText->setText( (Calamares::Branding::instance()->welcomeStyleCalamares() ? tr( "

Welcome to the Calamares installer for %1.

" ) : tr( "

Welcome to the %1 installer.

" )) .arg( *Calamares::Branding::VersionedName ) ); ui->retranslateUi( this ); ) ui->aboutButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Information, CalamaresUtils::Original, 2*QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) ); connect( ui->aboutButton, &QPushButton::clicked, this, [ this ] { QMessageBox mb( QMessageBox::Information, tr( "About %1 installer" ) .arg( CALAMARES_APPLICATION_NAME ), tr( "

%1


" "%2
" "for %3


" "Copyright 2014-2017 Teo Mrnjavac <teo@kde.org>
" "Copyright 2017 Adriaan de Groot <groot@kde.org>
" "Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo," " Philip Müller, Pier Luigi Fiorini, Rohan Garg and the Calamares " "translators team.

" "Calamares " "development is sponsored by
" "Blue Systems - " "Liberating Software." ) .arg( CALAMARES_APPLICATION_NAME ) .arg( CALAMARES_VERSION ) .arg( *Calamares::Branding::VersionedName ), QMessageBox::Ok, this ); mb.setIconPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Squid, CalamaresUtils::Original, QSize( CalamaresUtils::defaultFontHeight() * 6, CalamaresUtils::defaultFontHeight() * 6 ) ) ); QGridLayout* layout = reinterpret_cast( mb.layout() ); if ( layout ) layout->setColumnMinimumWidth( 2, CalamaresUtils::defaultFontHeight() * 24 ); mb.exec(); } ); ui->verticalLayout->insertWidget( 3, m_requirementsChecker->widget() ); } void WelcomePage::initLanguages() { ui->languageWidget->setInsertPolicy( QComboBox::InsertAlphabetically ); QLocale defaultLocale = QLocale( QLocale::system().name() ); { bool isTranslationAvailable = false; const auto locales = QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';'); for ( const QString& locale : locales ) { QLocale thisLocale = QLocale( locale ); QString lang = QLocale::languageToString( thisLocale.language() ); if ( QLocale::countriesForLanguage( thisLocale.language() ).count() > 2 ) lang.append( QString( " (%1)" ) .arg( QLocale::countryToString( thisLocale.country() ) ) ); ui->languageWidget->addItem( lang, thisLocale ); if ( thisLocale.language() == defaultLocale.language() && thisLocale.country() == defaultLocale.country() ) { isTranslationAvailable = true; ui->languageWidget->setCurrentIndex( ui->languageWidget->count() - 1 ); cDebug() << "Initial locale " << thisLocale.name(); CalamaresUtils::installTranslator( thisLocale.name(), Calamares::Branding::instance()->translationsPathPrefix(), qApp ); } } if ( !isTranslationAvailable ) { for (int i = 0; i < ui->languageWidget->count(); i++) { QLocale thisLocale = ui->languageWidget->itemData( i, Qt::UserRole ).toLocale(); if ( thisLocale.language() == defaultLocale.language() ) { isTranslationAvailable = true; ui->languageWidget->setCurrentIndex( i ); cDebug() << "Initial locale " << thisLocale.name(); CalamaresUtils::installTranslator( thisLocale.name(), Calamares::Branding::instance()->translationsPathPrefix(), qApp ); break; } } } if ( !isTranslationAvailable ) { for (int i = 0; i < ui->languageWidget->count(); i++) { QLocale thisLocale = ui->languageWidget->itemData( i, Qt::UserRole ).toLocale(); if ( thisLocale == QLocale( QLocale::English, QLocale::UnitedStates ) ) { ui->languageWidget->setCurrentIndex( i ); cDebug() << "Translation unavailable, so initial locale set to " << thisLocale.name(); QLocale::setDefault( thisLocale ); CalamaresUtils::installTranslator( thisLocale.name(), Calamares::Branding::instance()->translationsPathPrefix(), qApp ); break; } } } connect( ui->languageWidget, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ), this, [ & ]( int newIndex ) { QLocale selectedLocale = ui->languageWidget->itemData( newIndex, Qt::UserRole ).toLocale(); cDebug() << "Selected locale" << selectedLocale.name(); QLocale::setDefault( selectedLocale ); CalamaresUtils::installTranslator( selectedLocale, Calamares::Branding::instance()->translationsPathPrefix(), qApp ); } ); } } void WelcomePage::setUpLinks( bool showSupportUrl, bool showKnownIssuesUrl, bool showReleaseNotesUrl ) { using namespace Calamares; if ( showSupportUrl && !( *Branding::SupportUrl ).isEmpty() ) { CALAMARES_RETRANSLATE( ui->supportButton->setText( tr( "%1 support" ) .arg( *Branding::ShortProductName ) ); ) ui->supportButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Help, CalamaresUtils::Original, 2*QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) ); connect( ui->supportButton, &QPushButton::clicked, [] { QDesktopServices::openUrl( *Branding::SupportUrl ); } ); } else { ui->supportButton->hide(); } if ( showKnownIssuesUrl && !( *Branding::KnownIssuesUrl ).isEmpty() ) { ui->knownIssuesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Bugs, CalamaresUtils::Original, 2*QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) ); connect( ui->knownIssuesButton, &QPushButton::clicked, [] { QDesktopServices::openUrl( *Branding::KnownIssuesUrl ); } ); } else { ui->knownIssuesButton->hide(); } if ( showReleaseNotesUrl && !( *Branding::ReleaseNotesUrl ).isEmpty() ) { ui->releaseNotesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Release, CalamaresUtils::Original, 2*QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) ); connect( ui->releaseNotesButton, &QPushButton::clicked, [] { QDesktopServices::openUrl( *Branding::ReleaseNotesUrl ); } ); } else { ui->releaseNotesButton->hide(); } } void WelcomePage::focusInEvent( QFocusEvent* e ) { if ( ui->languageWidget ) ui->languageWidget->setFocus(); e->accept(); } calamares-3.1.12/src/modules/welcome/WelcomePage.h000066400000000000000000000026771322271446000217760ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef WELCOMEPAGE_H #define WELCOMEPAGE_H #include namespace Ui { class WelcomePage; } class RequirementsChecker; class WelcomePage : public QWidget { Q_OBJECT public: explicit WelcomePage( RequirementsChecker* requirementsChecker, QWidget* parent = nullptr ); void setUpLinks( bool showSupportUrl, bool showKnownIssuesUrl, bool showReleaseNotesUrl ); protected: void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus private: void initLanguages(); Ui::WelcomePage* ui; RequirementsChecker* m_requirementsChecker; }; #endif // WELCOMEPAGE_H calamares-3.1.12/src/modules/welcome/WelcomePage.ui000066400000000000000000000142031322271446000221500ustar00rootroot00000000000000 WelcomePage 0 0 593 400 Form Qt::Vertical QSizePolicy::Fixed 20 40 3 0 <Calamares welcome text> Qt::Horizontal QSizePolicy::Maximum 40 20 1 0 &Language: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter languageWidget 2 0 Qt::Horizontal 40 20 Qt::Horizontal QSizePolicy::Maximum 40 20 Qt::Horizontal 40 20 &About true &Support true &Known issues true &Release notes true Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 20 20 calamares-3.1.12/src/modules/welcome/WelcomeViewStep.cpp000066400000000000000000000066111322271446000232130ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "WelcomeViewStep.h" #include "WelcomePage.h" #include "checker/RequirementsChecker.h" #include "utils/Logger.h" #include CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin(); ) WelcomeViewStep::WelcomeViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_requirementsChecker( new RequirementsChecker( this ) ) { emit nextStatusChanged( true ); m_widget = new WelcomePage( m_requirementsChecker ); connect( m_requirementsChecker, &RequirementsChecker::verdictChanged, this, &WelcomeViewStep::nextStatusChanged ); } WelcomeViewStep::~WelcomeViewStep() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QString WelcomeViewStep::prettyName() const { return tr( "Welcome" ); } QWidget* WelcomeViewStep::widget() { return m_widget; } void WelcomeViewStep::next() { emit done(); } void WelcomeViewStep::back() {} bool WelcomeViewStep::isNextEnabled() const { return m_requirementsChecker->verdict(); } bool WelcomeViewStep::isBackEnabled() const { return false; } bool WelcomeViewStep::isAtBeginning() const { return true; } bool WelcomeViewStep::isAtEnd() const { return true; } QList< Calamares::job_ptr > WelcomeViewStep::jobs() const { return QList< Calamares::job_ptr >(); } void WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { bool showSupportUrl = configurationMap.contains( "showSupportUrl" ) && configurationMap.value( "showSupportUrl" ).type() == QVariant::Bool && configurationMap.value( "showSupportUrl" ).toBool(); bool showKnownIssuesUrl = configurationMap.contains( "showKnownIssuesUrl" ) && configurationMap.value( "showKnownIssuesUrl" ).type() == QVariant::Bool && configurationMap.value( "showKnownIssuesUrl" ).toBool(); bool showReleaseNotesUrl = configurationMap.contains( "showReleaseNotesUrl" ) && configurationMap.value( "showReleaseNotesUrl" ).type() == QVariant::Bool && configurationMap.value( "showReleaseNotesUrl" ).toBool(); m_widget->setUpLinks( showSupportUrl, showKnownIssuesUrl, showReleaseNotesUrl ); if ( configurationMap.contains( "requirements" ) && configurationMap.value( "requirements" ).type() == QVariant::Map ) m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() ); else cDebug() << "WARNING: no valid requirements map found in welcome " "module configuration."; } calamares-3.1.12/src/modules/welcome/WelcomeViewStep.h000066400000000000000000000034521322271446000226600ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef WELCOMEPAGEPLUGIN_H #define WELCOMEPAGEPLUGIN_H #include #include #include #include #include class WelcomePage; class RequirementsChecker; class PLUGINDLLEXPORT WelcomeViewStep : public Calamares::ViewStep { Q_OBJECT public: explicit WelcomeViewStep( QObject* parent = nullptr ); virtual ~WelcomeViewStep() override; QString prettyName() const override; QWidget* widget() override; void next() override; void back() override; bool isNextEnabled() const override; bool isBackEnabled() const override; bool isAtBeginning() const override; bool isAtEnd() const override; QList< Calamares::job_ptr > jobs() const override; void setConfigurationMap( const QVariantMap& configurationMap ) override; private: WelcomePage* m_widget; RequirementsChecker* m_requirementsChecker; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( WelcomeViewStepFactory ) #endif // WELCOMEPAGEPLUGIN_H calamares-3.1.12/src/modules/welcome/checker/000077500000000000000000000000001322271446000210255ustar00rootroot00000000000000calamares-3.1.12/src/modules/welcome/checker/CheckItemWidget.cpp000066400000000000000000000043431322271446000245350ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CheckItemWidget.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include CheckItemWidget::CheckItemWidget( bool checked, QWidget* parent ) : QWidget( parent ) { QBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); m_iconLabel = new QLabel( this ); mainLayout->addWidget( m_iconLabel ); m_iconLabel->setFixedSize( CalamaresUtils::defaultIconSize() ); m_textLabel = new QLabel( this ); mainLayout->addWidget( m_textLabel ); m_textLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); if ( checked ) m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, QSize( m_iconLabel->height(), m_iconLabel->height() ) ) ); else m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No, CalamaresUtils::Original, QSize( m_iconLabel->height(), m_iconLabel->height() ) ) ); } void CheckItemWidget::setText( const QString& text ) { m_textLabel->setText( text ); } calamares-3.1.12/src/modules/welcome/checker/CheckItemWidget.h000066400000000000000000000022131322271446000241740ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CHECKITEMWIDGET_H #define CHECKITEMWIDGET_H #include class CheckItemWidget : public QWidget { Q_OBJECT public: explicit CheckItemWidget( bool checked, QWidget* parent = nullptr ); void setText( const QString& text ); private: QLabel* m_textLabel; QLabel* m_iconLabel; }; #endif // CHECKITEMWIDGET_H calamares-3.1.12/src/modules/welcome/checker/CheckerWidget.cpp000066400000000000000000000166111322271446000242460ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "CheckerWidget.h" #include "CheckItemWidget.h" #include "Branding.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Retranslator.h" #include "widgets/FixedAspectRatioLabel.h" #include #include #include #include #include CheckerWidget::CheckerWidget( QWidget* parent ) : QWidget( parent ) { setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_mainLayout = new QVBoxLayout; setLayout( m_mainLayout ); QHBoxLayout* spacerLayout = new QHBoxLayout; m_mainLayout->addLayout( spacerLayout ); m_paddingSize = qBound( 32, CalamaresUtils::defaultFontHeight() * 4, 128 ); spacerLayout->addSpacing( m_paddingSize ); m_entriesLayout = new QVBoxLayout; spacerLayout->addLayout( m_entriesLayout ); spacerLayout->addSpacing( m_paddingSize ); CalamaresUtils::unmarginLayout( spacerLayout ); } void CheckerWidget::init( const QList< PrepareEntry >& checkEntries ) { bool allChecked = true; bool requirementsSatisfied = true; for ( const PrepareEntry& entry : checkEntries ) { if ( !entry.checked ) { CheckItemWidget* ciw = new CheckItemWidget( entry.checked ); CALAMARES_RETRANSLATE( ciw->setText( entry.negatedText() ); ) m_entriesLayout->addWidget( ciw ); ciw->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); allChecked = false; if ( entry.required ) { requirementsSatisfied = false; } ciw->setAutoFillBackground( true ); QPalette pal( ciw->palette() ); pal.setColor( QPalette::Background, Qt::white ); ciw->setPalette( pal ); } } QLabel* textLabel = new QLabel; textLabel->setWordWrap( true ); m_entriesLayout->insertWidget( 0, textLabel ); textLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); if ( !allChecked ) { m_entriesLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() / 2 ); if ( !requirementsSatisfied ) { CALAMARES_RETRANSLATE( textLabel->setText( tr( "This computer does not satisfy the minimum " "requirements for installing %1.
" "Installation cannot continue. " "Details..." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) textLabel->setOpenExternalLinks( false ); connect( textLabel, &QLabel::linkActivated, this, [ this, checkEntries ]( const QString& link ) { if ( link == "#details" ) showDetailsDialog( checkEntries ); } ); } else { CALAMARES_RETRANSLATE( textLabel->setText( tr( "This computer does not satisfy some of the " "recommended requirements for installing %1.
" "Installation can continue, but some features " "might be disabled." ) .arg( *Calamares::Branding::ShortVersionedName ) ); ) } } if ( allChecked && requirementsSatisfied ) { if ( !Calamares::Branding::instance()-> imagePath( Calamares::Branding::ProductWelcome ).isEmpty() ) { QPixmap theImage = QPixmap( Calamares::Branding::instance()-> imagePath( Calamares::Branding::ProductWelcome ) ); if ( !theImage.isNull() ) { QLabel* imageLabel; if ( Calamares::Branding::instance()->welcomeExpandingLogo() ) { FixedAspectRatioLabel *p = new FixedAspectRatioLabel; p->setPixmap( theImage ); imageLabel = p; } else { imageLabel = new QLabel; imageLabel->setPixmap( theImage ); } imageLabel->setContentsMargins( 4, CalamaresUtils::defaultFontHeight() * 3 / 4, 4, 4 ); m_mainLayout->addWidget( imageLabel ); imageLabel->setAlignment( Qt::AlignCenter ); imageLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); } } CALAMARES_RETRANSLATE( textLabel->setText( tr( "This program will ask you some questions and " "set up %2 on your computer." ) .arg( *Calamares::Branding::ProductName ) ); textLabel->setAlignment( Qt::AlignCenter ); ) } else { m_mainLayout->addStretch(); } } void CheckerWidget::showDetailsDialog( const QList< PrepareEntry >& checkEntries ) { QDialog* detailsDialog = new QDialog( this ); QBoxLayout* mainLayout = new QVBoxLayout; detailsDialog->setLayout( mainLayout ); QLabel* textLabel = new QLabel; mainLayout->addWidget( textLabel ); CALAMARES_RETRANSLATE( textLabel->setText( tr( "For best results, please ensure that this computer:" ) ); ) QBoxLayout* entriesLayout = new QVBoxLayout; CalamaresUtils::unmarginLayout( entriesLayout ); mainLayout->addLayout( entriesLayout ); for ( const PrepareEntry& entry : checkEntries ) { if ( entry.enumerationText().isEmpty() ) continue; CheckItemWidget* ciw = new CheckItemWidget( entry.checked ); CALAMARES_RETRANSLATE( ciw->setText( entry.enumerationText() ); ) entriesLayout->addWidget( ciw ); ciw->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); ciw->setAutoFillBackground( true ); QPalette pal( ciw->palette() ); pal.setColor( QPalette::Background, Qt::white ); ciw->setPalette( pal ); } QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Close, Qt::Horizontal, this ); mainLayout->addWidget( buttonBox ); detailsDialog->setModal( true ); detailsDialog->setWindowTitle( tr( "System requirements" ) ); connect( buttonBox, &QDialogButtonBox::clicked, detailsDialog, &QDialog::close ); detailsDialog->exec(); detailsDialog->deleteLater(); } calamares-3.1.12/src/modules/welcome/checker/CheckerWidget.h000066400000000000000000000024201322271446000237040ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef CHECKERWIDGET_H #define CHECKERWIDGET_H #include "RequirementsChecker.h" #include #include class CheckerWidget : public QWidget { Q_OBJECT public: explicit CheckerWidget( QWidget* parent = nullptr ); void init( const QList< PrepareEntry >& checkEntries ); private: void showDetailsDialog( const QList< PrepareEntry >& checkEntries ); QBoxLayout* m_mainLayout; QBoxLayout* m_entriesLayout; int m_paddingSize; }; #endif // CHECKERWIDGET_H calamares-3.1.12/src/modules/welcome/checker/RequirementsChecker.cpp000066400000000000000000000336051322271446000255100ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * Copyright 2017, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "RequirementsChecker.h" #include "CheckerWidget.h" #include "partman_devices.h" #include "widgets/WaitingWidget.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Units.h" #include "JobQueue.h" #include "GlobalStorage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //geteuid RequirementsChecker::RequirementsChecker( QObject* parent ) : QObject( parent ) , m_widget( new QWidget() ) , m_requiredStorageGB( -1 ) , m_requiredRamGB( -1 ) , m_actualWidget( new CheckerWidget() ) , m_verdict( false ) { QBoxLayout* mainLayout = new QHBoxLayout; m_widget->setLayout( mainLayout ); CalamaresUtils::unmarginLayout( mainLayout ); WaitingWidget* waitingWidget = new WaitingWidget( QString() ); mainLayout->addWidget( waitingWidget ); CALAMARES_RETRANSLATE( waitingWidget->setText( tr( "Gathering system information..." ) ); ) QSize availableSize = qApp->desktop()->availableGeometry( m_widget ).size(); QTimer* timer = new QTimer; timer->setSingleShot( true ); connect( timer, &QTimer::timeout, [=]() { bool enoughStorage = false; bool enoughRam = false; bool hasPower = false; bool hasInternet = false; bool isRoot = false; bool enoughScreen = (availableSize.width() >= CalamaresUtils::windowPreferredWidth) && (availableSize.height() >= CalamaresUtils::windowPreferredHeight); qint64 requiredStorageB = CalamaresUtils::GiBtoBytes(m_requiredStorageGB); cDebug() << "Need at least storage bytes:" << requiredStorageB; if ( m_entriesToCheck.contains( "storage" ) ) enoughStorage = checkEnoughStorage( requiredStorageB ); qint64 requiredRamB = CalamaresUtils::GiBtoBytes(m_requiredRamGB); cDebug() << "Need at least ram bytes:" << requiredRamB; if ( m_entriesToCheck.contains( "ram" ) ) enoughRam = checkEnoughRam( requiredRamB ); if ( m_entriesToCheck.contains( "power" ) ) hasPower = checkHasPower(); if ( m_entriesToCheck.contains( "internet" ) ) hasInternet = checkHasInternet(); if ( m_entriesToCheck.contains( "root" ) ) isRoot = checkIsRoot(); cDebug() << "enoughStorage, enoughRam, hasPower, hasInternet, isRoot: " << enoughStorage << enoughRam << hasPower << hasInternet << isRoot; QList< PrepareEntry > checkEntries; foreach ( const QString& entry, m_entriesToCheck ) { if ( entry == "storage" ) checkEntries.append( { entry, [this]{ return tr( "has at least %1 GB available drive space" ) .arg( m_requiredStorageGB ); }, [this]{ return tr( "There is not enough drive space. At least %1 GB is required." ) .arg( m_requiredStorageGB ); }, enoughStorage, m_entriesToRequire.contains( entry ) } ); else if ( entry == "ram" ) checkEntries.append( { entry, [this]{ return tr( "has at least %1 GB working memory" ) .arg( m_requiredRamGB ); }, [this]{ return tr( "The system does not have enough working memory. At least %1 GB is required." ) .arg( m_requiredRamGB ); }, enoughRam, m_entriesToRequire.contains( entry ) } ); else if ( entry == "power" ) checkEntries.append( { entry, [this]{ return tr( "is plugged in to a power source" ); }, [this]{ return tr( "The system is not plugged in to a power source." ); }, hasPower, m_entriesToRequire.contains( entry ) } ); else if ( entry == "internet" ) checkEntries.append( { entry, [this]{ return tr( "is connected to the Internet" ); }, [this]{ return tr( "The system is not connected to the Internet." ); }, hasInternet, m_entriesToRequire.contains( entry ) } ); else if ( entry == "root" ) checkEntries.append( { entry, [this]{ return QString(); }, //we hide it [this]{ return tr( "The installer is not running with administrator rights." ); }, isRoot, m_entriesToRequire.contains( entry ) } ); else if ( entry == "screen" ) checkEntries.append( { entry, [this]{ return QString(); }, // we hide it [this]{ return tr( "The screen is too small to display the installer." ); }, enoughScreen, false } ); } m_actualWidget->init( checkEntries ); m_widget->layout()->removeWidget( waitingWidget ); waitingWidget->deleteLater(); m_actualWidget->setParent( m_widget ); m_widget->layout()->addWidget( m_actualWidget ); bool canGoNext = true; foreach ( const PrepareEntry& entry, checkEntries ) { if ( !entry.checked && entry.required ) { canGoNext = false; break; } } m_verdict = canGoNext; emit verdictChanged( m_verdict ); if ( canGoNext ) detectFirmwareType(); timer->deleteLater(); } ); timer->start( 0 ); emit verdictChanged( true ); } RequirementsChecker::~RequirementsChecker() { if ( m_widget && m_widget->parent() == nullptr ) m_widget->deleteLater(); } QWidget* RequirementsChecker::widget() const { return m_widget; } void RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap ) { bool incompleteConfiguration = false; if ( configurationMap.contains( "requiredStorage" ) && ( configurationMap.value( "requiredStorage" ).type() == QVariant::Double || configurationMap.value( "requiredStorage" ).type() == QVariant::Int ) ) { bool ok = false; m_requiredStorageGB = configurationMap.value( "requiredStorage" ).toDouble( &ok ); if ( !ok ) { cDebug() << "WARNING: RequirementsChecker entry 'requiredStorage' is invalid."; m_requiredStorageGB = 3.; } Calamares::JobQueue::instance()->globalStorage()->insert( "requiredStorageGB", m_requiredStorageGB ); } else { cDebug() << "WARNING: RequirementsChecker entry 'requiredStorage' is missing."; m_requiredStorageGB = 3.; incompleteConfiguration = true; } if ( configurationMap.contains( "requiredRam" ) && ( configurationMap.value( "requiredRam" ).type() == QVariant::Double || configurationMap.value( "requiredRam" ).type() == QVariant::Int ) ) { bool ok = false; m_requiredRamGB = configurationMap.value( "requiredRam" ).toDouble( &ok ); if ( !ok ) { cDebug() << "WARNING: RequirementsChecker entry 'requiredRam' is invalid."; m_requiredRamGB = 1.; incompleteConfiguration = true; } } else { cDebug() << "WARNING: RequirementsChecker entry 'requiredRam' is missing."; m_requiredRamGB = 1.; incompleteConfiguration = true; } if ( configurationMap.contains( "internetCheckUrl" ) && configurationMap.value( "internetCheckUrl" ).type() == QVariant::String ) { m_checkHasInternetUrl = configurationMap.value( "internetCheckUrl" ).toString().trimmed(); if ( m_checkHasInternetUrl.isEmpty() || !QUrl( m_checkHasInternetUrl ).isValid() ) { cDebug() << "WARNING: RequirementsChecker entry 'internetCheckUrl' is invalid in welcome.conf" << m_checkHasInternetUrl << "reverting to default (http://example.com)."; m_checkHasInternetUrl = "http://example.com"; incompleteConfiguration = true; } } else { cDebug() << "WARNING: RequirementsChecker entry 'internetCheckUrl' is undefined in welcome.conf," "reverting to default (http://example.com)."; m_checkHasInternetUrl = "http://example.com"; incompleteConfiguration = true; } if ( configurationMap.contains( "check" ) && configurationMap.value( "check" ).type() == QVariant::List ) { m_entriesToCheck.clear(); m_entriesToCheck.append( configurationMap.value( "check" ).toStringList() ); } else { cDebug() << "WARNING: RequirementsChecker entry 'check' is incomplete."; incompleteConfiguration = true; } if ( configurationMap.contains( "required" ) && configurationMap.value( "required" ).type() == QVariant::List ) { m_entriesToRequire.clear(); m_entriesToRequire.append( configurationMap.value( "required" ).toStringList() ); } else { cDebug() << "WARNING: RequirementsChecker entry 'required' is incomplete."; incompleteConfiguration = true; } if ( incompleteConfiguration ) cDebug() << "WARNING: RequirementsChecker configuration map:\n" << configurationMap; } bool RequirementsChecker::verdict() const { return m_verdict; } bool RequirementsChecker::checkEnoughStorage( qint64 requiredSpace ) { return check_big_enough( requiredSpace ); } bool RequirementsChecker::checkEnoughRam( qint64 requiredRam ) { // Ignore the guesstimate-factor; we get an under-estimate // which is probably the usable RAM for programs. quint64 availableRam = CalamaresUtils::System::instance()->getTotalMemoryB().first; return availableRam >= requiredRam * 0.95; // because MemTotal is variable } bool RequirementsChecker::checkBatteryExists() { const QFileInfo basePath( "/sys/class/power_supply" ); if ( !( basePath.exists() && basePath.isDir() ) ) return false; QDir baseDir( basePath.absoluteFilePath() ); const auto entries = baseDir.entryList( QDir::AllDirs | QDir::Readable | QDir::NoDotAndDotDot ); for ( const auto &item : entries ) { QFileInfo typePath( baseDir.absoluteFilePath( QString( "%1/type" ) .arg( item ) ) ); QFile typeFile( typePath.absoluteFilePath() ); if ( typeFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { if ( typeFile.readAll().startsWith( "Battery" ) ) return true; } } return false; } bool RequirementsChecker::checkHasPower() { const QString UPOWER_SVC_NAME( "org.freedesktop.UPower" ); const QString UPOWER_INTF_NAME( "org.freedesktop.UPower" ); const QString UPOWER_PATH( "/org/freedesktop/UPower" ); if ( !checkBatteryExists() ) return true; cDebug() << "A battery exists, checking for mains power."; QDBusInterface upowerIntf( UPOWER_SVC_NAME, UPOWER_PATH, UPOWER_INTF_NAME, QDBusConnection::systemBus() ); bool onBattery = upowerIntf.property( "OnBattery" ).toBool(); if ( !upowerIntf.isValid() ) { // We can't talk to upower but we're obviously up and running // so I guess we got that going for us, which is nice... return true; } // If a battery exists but we're not using it, means we got mains // power. return !onBattery; } bool RequirementsChecker::checkHasInternet() { // default to true in the QNetworkAccessManager::UnknownAccessibility case QNetworkAccessManager qnam( this ); bool hasInternet = qnam.networkAccessible() == QNetworkAccessManager::Accessible; if ( !hasInternet && qnam.networkAccessible() == QNetworkAccessManager::UnknownAccessibility ) { QNetworkRequest req = QNetworkRequest( QUrl( m_checkHasInternetUrl ) ); QNetworkReply* reply = qnam.get( req ); QEventLoop loop; connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit ); loop.exec(); if( reply->bytesAvailable() ) hasInternet = true; } Calamares::JobQueue::instance()->globalStorage()->insert( "hasInternet", hasInternet ); return hasInternet; } bool RequirementsChecker::checkIsRoot() { return !geteuid(); } void RequirementsChecker::detectFirmwareType() { QString fwType = QFile::exists( "/sys/firmware/efi/efivars" ) ? "efi" : "bios"; Calamares::JobQueue::instance()->globalStorage()->insert( "firmwareType", fwType ); } calamares-3.1.12/src/modules/welcome/checker/RequirementsChecker.h000066400000000000000000000042651322271446000251550ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef REQUIREMENTSCHECKER_H #define REQUIREMENTSCHECKER_H #include #include #include class CheckerWidget; class QWidget; struct PrepareEntry { QString name; std::function< QString() > enumerationText; //Partial string, inserted in a //list of requirements to satisfy. std::function< QString() > negatedText; //Complete sentence about this requirement //not having been met. bool checked; bool required; }; class RequirementsChecker : public QObject { Q_OBJECT public: explicit RequirementsChecker( QObject* parent = nullptr ); virtual ~RequirementsChecker(); QWidget* widget() const; void setConfigurationMap( const QVariantMap& configurationMap ); bool verdict() const; signals: void verdictChanged( bool ); private: QStringList m_entriesToCheck; QStringList m_entriesToRequire; bool checkEnoughStorage( qint64 requiredSpace ); bool checkEnoughRam( qint64 requiredRam ); bool checkBatteryExists(); bool checkHasPower(); bool checkHasInternet(); bool checkIsRoot(); void detectFirmwareType(); QWidget* m_widget; qreal m_requiredStorageGB; qreal m_requiredRamGB; QString m_checkHasInternetUrl; CheckerWidget* m_actualWidget; bool m_verdict; }; #endif // REQUIREMENTSCHECKER_H calamares-3.1.12/src/modules/welcome/checker/partman_devices.c000066400000000000000000000070021322271446000243340ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac * * Based on parted_devices.c, from partman-base. * * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #include "partman_devices.h" #include #include #include #include #include #include #ifdef __linux__ /* from */ #define CDROM_GET_CAPABILITY 0x5331 /* get capabilities */ #endif /* __linux__ */ #ifdef __FreeBSD_kernel__ #include #include #endif #include #if defined(__linux__) static int is_cdrom(const char *path) { int fd = -1; int ret = -1; fd = open(path, O_RDONLY | O_NONBLOCK); if (fd >= 0) { ret = ioctl(fd, CDROM_GET_CAPABILITY, NULL); close(fd); } if (ret >= 0) return 1; else return 0; } #elif defined(__FreeBSD_kernel__) /* !__linux__ */ static int is_cdrom(const char *path) { int fd; fd = open(path, O_RDONLY | O_NONBLOCK); ioctl(fd, CDIOCCAPABILITY, NULL); close(fd); if (errno != EBADF && errno != ENOTTY) return 1; else return 0; } #else /* !__linux__ && !__FreeBSD_kernel__ */ #define is_cdrom(path) 0 #endif #if defined(__linux__) static int is_floppy(const char *path) { return (strstr(path, "/dev/floppy") != NULL || strstr(path, "/dev/fd") != NULL); } #elif defined(__FreeBSD_kernel__) /* !__linux__ */ static int is_floppy(const char *path) { return (strstr(path, "/dev/fd") != NULL); } #else /* !__linux__ && !__FreeBSD_kernel__ */ #define is_floppy(path) 0 #endif static long long process_device(PedDevice *dev) { if (dev->read_only) return -1; if (is_cdrom(dev->path) || is_floppy(dev->path)) return -1; /* Exclude compcache (http://code.google.com/p/compcache/) */ if (strstr(dev->path, "/dev/ramzswap") != NULL || strstr(dev->path, "/dev/zram") != NULL) return -1; return dev->length * dev->sector_size; } int check_big_enough(long long required_space) { PedDevice *dev = NULL; ped_exception_fetch_all(); ped_device_probe_all(); bool big_enough = false; for (dev = NULL; NULL != (dev = ped_device_get_next(dev));) { long long dev_size = process_device(dev); if (dev_size > required_space) { big_enough = true; break; } } // We would free the devices to release allocated memory, // but other modules might be using partman use well, // and they can hold pointers to libparted structures in // other threads. // // So prefer to leak memory, instead. // // ped_device_free_all(); return big_enough; } /* Local variables: indent-tabs-mode: nil c-file-style: "linux" c-font-lock-extra-types: ("Ped\\sw+") End: */ calamares-3.1.12/src/modules/welcome/checker/partman_devices.h000066400000000000000000000017521322271446000243470ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef PARTMAN_DEVICES_H #define PARTMAN_DEVICES_H #ifdef __cplusplus extern "C" { #endif int check_big_enough(long long required_space); #ifdef __cplusplus } // extern "C" #endif #endif // PARTMAN_DEVICES_H calamares-3.1.12/src/modules/welcome/welcome.conf000066400000000000000000000015041322271446000217230ustar00rootroot00000000000000--- showSupportUrl: true showKnownIssuesUrl: true showReleaseNotesUrl: true requirements: requiredStorage: 5.5 requiredRam: 1.0 internetCheckUrl: http://google.com # List conditions to check. Each listed condition will be # probed in some way, and yields true or false according to # the host system satisfying the condition. # # This sample file lists all the conditions that are know. check: - storage - ram - power - internet - root - screen # List conditions that must be satisfied (from the list # of conditions, above) for installation to proceed. # If any of these conditions are not met, the user cannot # continue past the welcome page. required: - storage - ram - root calamares-3.1.12/src/qml/000077500000000000000000000000001322271446000151075ustar00rootroot00000000000000calamares-3.1.12/src/qml/CMakeLists.txt000066400000000000000000000000361322271446000176460ustar00rootroot00000000000000add_subdirectory( calamares ) calamares-3.1.12/src/qml/calamares/000077500000000000000000000000001322271446000170375ustar00rootroot00000000000000calamares-3.1.12/src/qml/calamares/CMakeLists.txt000066400000000000000000000025431322271446000216030ustar00rootroot00000000000000file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) # Iterate over all the subdirectories which have a qmldir file, copy them over to the build dir, # and install them into share/calamares/qml/calamares foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/qmldir" ) set( QML_DIR share/calamares/qml ) set( QML_MODULE_DESTINATION ${QML_DIR}/calamares/${SUBDIRECTORY} ) # We glob all the files inside the subdirectory, and we make sure they are # synced with the bindir structure and installed. file( GLOB QML_MODULE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*" ) foreach( QML_MODULE_FILE ${QML_MODULE_FILES} ) if( NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${QML_MODULE_FILE} ) configure_file( ${SUBDIRECTORY}/${QML_MODULE_FILE} ${SUBDIRECTORY}/${QML_MODULE_FILE} COPYONLY ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${QML_MODULE_FILE} DESTINATION ${QML_MODULE_DESTINATION} ) endif() endforeach() message( "-- ${BoldYellow}Configured QML module: ${BoldRed}calamares.${SUBDIRECTORY}${ColorReset}" ) endif() endforeach() calamares-3.1.12/src/qml/calamares/slideshow/000077500000000000000000000000001322271446000210405ustar00rootroot00000000000000calamares-3.1.12/src/qml/calamares/slideshow/Presentation.qml000066400000000000000000000212141322271446000242260ustar00rootroot00000000000000/* === This file is part of Calamares - === * * Copyright 2017, Adriaan de Groot * - added looping, keys-instead-of-shortcut * * SPDX-License-Identifier: LGPL-2.1 * License-Filename: LICENSES/LGPLv2.1-Presentation */ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QML Presentation System. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.5 import QtQuick.Window 2.0 Item { id: root property variant slides: [] property int currentSlide: 0 property bool showNotes: false; property bool allowDelay: true; property alias mouseNavigation: mouseArea.enabled property bool arrowNavigation: true property bool keyShortcutsEnabled: true property color titleColor: textColor; property color textColor: "black" property string fontFamily: "Helvetica" property string codeFontFamily: "Courier New" // Private API property bool _faded: false property int _userNum; property int _lastShownSlide: 0 Component.onCompleted: { var slideCount = 0; var slides = []; for (var i=0; i 0) root.slides[root.currentSlide].visible = true; } function switchSlides(from, to, forward) { from.visible = false to.visible = true return true } onCurrentSlideChanged: { switchSlides(root.slides[_lastShownSlide], root.slides[currentSlide], currentSlide > _lastShownSlide) _lastShownSlide = currentSlide // Always keep focus on the slideshow root.focus = true } function goToNextSlide() { root._userNum = 0 if (_faded) return if (root.slides[currentSlide].delayPoints) { if (root.slides[currentSlide]._advance()) return; } if (currentSlide + 1 < root.slides.length) ++currentSlide; else currentSlide = 0; // Loop at the end } function goToPreviousSlide() { root._userNum = 0 if (root._faded) return if (currentSlide - 1 >= 0) --currentSlide; } function goToUserSlide() { --_userNum; if (root._faded || _userNum >= root.slides.length) return if (_userNum < 0) goToNextSlide() else { currentSlide = _userNum; root.focus = true; } } // directly type in the slide number: depends on root having focus Keys.onPressed: { if (event.key >= Qt.Key_0 && event.key <= Qt.Key_9) _userNum = 10 * _userNum + (event.key - Qt.Key_0) else { if (event.key == Qt.Key_Return || event.key == Qt.Key_Enter) goToUserSlide(); _userNum = 0; } } focus: true // Keep focus // Navigation through key events, too Keys.onSpacePressed: goToNextSlide() Keys.onRightPressed: goToNextSlide() Keys.onLeftPressed: goToPreviousSlide() // navigate with arrow keys Shortcut { sequence: StandardKey.MoveToNextLine; enabled: root.arrowNavigation; onActivated: goToNextSlide() } Shortcut { sequence: StandardKey.MoveToPreviousLine; enabled: root.arrowNavigation; onActivated: goToPreviousSlide() } Shortcut { sequence: StandardKey.MoveToNextChar; enabled: root.arrowNavigation; onActivated: goToNextSlide() } Shortcut { sequence: StandardKey.MoveToPreviousChar; enabled: root.arrowNavigation; onActivated: goToPreviousSlide() } // presentation-specific single-key shortcuts (which interfere with normal typing) Shortcut { sequence: " "; enabled: root.keyShortcutsEnabled; onActivated: goToNextSlide() } Shortcut { sequence: "c"; enabled: root.keyShortcutsEnabled; onActivated: root._faded = !root._faded } // standard shortcuts Shortcut { sequence: StandardKey.MoveToNextPage; onActivated: goToNextSlide() } Shortcut { sequence: StandardKey.MoveToPreviousPage; onActivated: goToPreviousSlide() } Shortcut { sequence: StandardKey.Quit; onActivated: Qt.quit() } Rectangle { z: 1000 color: "black" anchors.fill: parent opacity: root._faded ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 250 } } } MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked: { if (mouse.button == Qt.RightButton) goToPreviousSlide() else goToNextSlide() } onPressAndHold: goToPreviousSlide(); //A back mechanism for touch only devices } Window { id: notesWindow; width: 400 height: 300 title: "QML Presentation: Notes" visible: root.showNotes Flickable { anchors.fill: parent contentWidth: parent.width contentHeight: textContainer.height Item { id: textContainer width: parent.width height: notesText.height + 2 * notesText.padding Text { id: notesText property real padding: 16; x: padding y: padding width: parent.width - 2 * padding font.pixelSize: 16 wrapMode: Text.WordWrap property string notes: root.slides[root.currentSlide].notes; onNotesChanged: { var result = ""; var lines = notes.split("\n"); var beginNewLine = false for (var i=0; i 0) result += " "; result += line; } } if (result.length == 0) { font.italic = true; text = "no notes.." } else { font.italic = false; text = result; } } } } } } } calamares-3.1.12/src/qml/calamares/slideshow/Slide.qml000066400000000000000000000153021322271446000226140ustar00rootroot00000000000000/* === This file is part of Calamares - === * * SPDX-License-Identifier: LGPL-2.1 * License-Filename: LICENSES/LGPLv2.1-Presentation */ /**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QML Presentation System. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Item { /* Slides can only be instantiated as a direct child of a Presentation {} as they rely on several properties there. */ id: slide property bool isSlide: true; property bool delayPoints: false; property int _pointCounter: 0; function _advance() { if (!parent.allowDelay) return false; _pointCounter = _pointCounter + 1; if (_pointCounter < content.length) return true; _pointCounter = 0; return false; } property string title; property variant content: [] property string centeredText property string writeInText; property string notes; property real fontSize: parent.height * 0.05 property real fontScale: 1 property real baseFontSize: fontSize * fontScale property real titleFontSize: fontSize * 1.2 * fontScale property real bulletSpacing: 1 property real contentWidth: width // Define the slide to be the "content area" x: parent.width * 0.05 y: parent.height * 0.2 width: parent.width * 0.9 height: parent.height * 0.7 property real masterWidth: parent.width property real masterHeight: parent.height property color titleColor: parent.titleColor; property color textColor: parent.textColor; property string fontFamily: parent.fontFamily; property int textFormat: Text.PlainText visible: false Text { id: titleText font.pixelSize: titleFontSize text: title; anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.top anchors.bottomMargin: parent.fontSize * 1.5 font.bold: true; font.family: slide.fontFamily color: slide.titleColor horizontalAlignment: Text.Center z: 1 } Text { id: centeredId width: parent.width anchors.centerIn: parent anchors.verticalCenterOffset: - parent.y / 3 text: centeredText horizontalAlignment: Text.Center font.pixelSize: baseFontSize font.family: slide.fontFamily color: slide.textColor wrapMode: Text.Wrap } Text { id: writeInTextId property int length; font.family: slide.fontFamily font.pixelSize: baseFontSize color: slide.textColor anchors.fill: parent; wrapMode: Text.Wrap text: slide.writeInText.substring(0, length); NumberAnimation on length { from: 0; to: slide.writeInText.length; duration: slide.writeInText.length * 30; running: slide.visible && parent.visible && slide.writeInText.length > 0 } visible: slide.writeInText != undefined; } Column { id: contentId anchors.fill: parent Repeater { model: content.length Row { id: row function decideIndentLevel(s) { return s.charAt(0) == " " ? 1 + decideIndentLevel(s.substring(1)) : 0 } property int indentLevel: decideIndentLevel(content[index]) property int nextIndentLevel: index < content.length - 1 ? decideIndentLevel(content[index+1]) : 0 property real indentFactor: (10 - row.indentLevel * 2) / 10; height: text.height + (nextIndentLevel == 0 ? 1 : 0.3) * slide.baseFontSize * slide.bulletSpacing x: slide.baseFontSize * indentLevel visible: (!slide.parent.allowDelay || !delayPoints) || index <= _pointCounter Rectangle { id: dot anchors.baseline: text.baseline anchors.baselineOffset: -text.font.pixelSize / 2 width: text.font.pixelSize / 3 height: text.font.pixelSize / 3 color: slide.textColor radius: width / 2 opacity: text.text.length == 0 ? 0 : 1 } Item { id: space width: dot.width * 1.5 height: 1 } Text { id: text width: slide.contentWidth - parent.x - dot.width - space.width font.pixelSize: baseFontSize * row.indentFactor text: content[index] textFormat: slide.textFormat wrapMode: Text.WordWrap color: slide.textColor horizontalAlignment: Text.AlignLeft font.family: slide.fontFamily } } } } } calamares-3.1.12/src/qml/calamares/slideshow/qmldir000066400000000000000000000001221322271446000222460ustar00rootroot00000000000000module calamares.slideshow Presentation 1.0 Presentation.qml Slide 1.0 Slide.qml