summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authormaz-12015-12-04 12:31:06 +0800
committermaz-12015-12-04 12:31:06 +0800
commita11352361110a1b899bb259c248f496cb5811b06 (patch)
tree64db8a97882e7e7e14377a806d5cc5b158a20334
parent34abec5eac4709900345a8e233e658d7b385af01 (diff)
downloadaur-a11352361110a1b899bb259c248f496cb5811b06.tar.gz
fix
-rw-r--r--.SRCINFO2
-rw-r--r--1.diff3395
-rw-r--r--PKGBUILD2
3 files changed, 3397 insertions, 2 deletions
diff --git a/.SRCINFO b/.SRCINFO
index a897f5c87588..8c5937280a3b 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -2,7 +2,7 @@ pkgbase = grub2-editor-frameworks
pkgdesc = A KDE Control Module for configuring the GRUB2 bootloader.Unofficial KF5 port.
pkgver = 0.6.4
pkgrel = 1
- url = https://ksmanis.wordpress.com/projects/grub2-editor/
+ url = https://github.com/maz-1/grub2-editor
arch = i686
arch = x86_64
groups = plasma
diff --git a/1.diff b/1.diff
new file mode 100644
index 000000000000..aadfb7258471
--- /dev/null
+++ b/1.diff
@@ -0,0 +1,3395 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 9b71097..1c5a21c 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,31 +1,49 @@
++cmake_minimum_required( VERSION 2.8.12 )
++cmake_policy(SET CMP0002 OLD)
++cmake_policy(SET CMP0026 OLD)
++cmake_policy(SET CMP0054 OLD)
++cmake_policy(SET CMP0063 OLD)
++cmake_policy(SET CMP0064 OLD)
++
+ project(kcm-grub2)
+ set(KCM_GRUB2_VERSION_MAJOR "0")
+ set(KCM_GRUB2_VERSION_MINOR "5")
+ set(KCM_GRUB2_VERSION_PATCH "8")
+ set(KCM_GRUB2_VERSION "${KCM_GRUB2_VERSION_MAJOR}.${KCM_GRUB2_VERSION_MINOR}.${KCM_GRUB2_VERSION_PATCH}")
++set(KDE_ENABLE_EXCEPTIONS "-fexceptions -UQT_NO_EXCEPTIONS")
++
++find_package(ECM 0.0.11 REQUIRED NO_MODULE)
++set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_SOURCE_DIR}/cmake/modules)
++
++include(KDEInstallDirs)
++include(KDECMakeSettings)
++include(KDECompilerSettings)
++include(FeatureSummary)
++
++find_package(Qt5 REQUIRED COMPONENTS Widgets DBus)
++find_package(KF5 REQUIRED COMPONENTS CoreAddons I18n Auth ConfigWidgets KIO Solid) #
+
+-set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
+
+-find_package(Qt4 4.6.0 REQUIRED)
+-find_package(KDE4 4.4.0 REQUIRED)
+-include(KDE4Defaults)
+ include(GRUBPaths)
+
++include(MacroLogFeature)
++include(MacroBoolTo01)
++
+ add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS -DMAGICKCORE_QUANTUM_DEPTH=16 -DMAGICKCORE_HDRI_ENABLE=0)
+
+-macro_optional_find_package(ImageMagick COMPONENTS Magick++ MagickCore)
++find_package(ImageMagick COMPONENTS Magick++ MagickCore)
+ macro_log_feature(ImageMagick_FOUND "ImageMagick" "Create splash images compatible with GRUB2" "http://www.imagemagick.org/" FALSE "" "")
+ macro_bool_to_01(ImageMagick_FOUND HAVE_IMAGEMAGICK)
+
+-macro_optional_find_package(HD)
++find_package(HD)
+ macro_log_feature(HD_FOUND "hwinfo" "Retrieve list of resolutions valid in GRUB2" "http://www.opensuse.org/" FALSE "" "")
+ macro_bool_to_01(HD_FOUND HAVE_HD)
+
+-macro_optional_find_package(QApt)
++find_package(QApt)
+ macro_log_feature(QAPT_FOUND "LibQApt" "Remove unneeded old entries (qapt backend)" "https://projects.kde.org/projects/extragear/sysadmin/libqapt/" FALSE "" "")
+ macro_bool_to_01(QAPT_FOUND HAVE_QAPT)
+
+-macro_optional_find_package(QPackageKit)
++find_package(QPackageKit)
+ macro_log_feature(QPACKAGEKIT_FOUND "QPackageKit" "Remove unneeded old entries (qpackagekit backend)" "http://www.packagekit.org/" FALSE "" "")
+ macro_bool_to_01(QPACKAGEKIT_FOUND HAVE_QPACKAGEKIT)
+
+diff --git a/README b/README
+index 9cc5e45..d46a2f1 100644
+--- a/README
++++ b/README
+@@ -1,24 +1,4 @@
+-A KDE Control Module for configuring the GRUB2 bootloader.
++This is an unofficial kde frameworks 5 port of grub editor by Konstantinos Smanis
++https://ksmanis.wordpress.com/category/grub2-editor/
+
+-Smoothly integrated in KDE System Settings, it is the central place for managing your GRUB2 configuration. Supports many GRUB2 configuration options, most notably:
+-
+-* Manage default boot entry
+-* Manage boot timeout
+-* Manage boot resolutions
+-* Manage boot menu colors
+-* Manage boot menu theme
+-* Manage linux kernel arguments
+-* Save and update the configuration files of GRUB2
+-
+-Extra features include:
+-
+-* Recover GRUB2
+-* Remove old entries
+-* Create and preview GRUB2 splash images
+-
+-Related Blog: http://ksmanis.wordpress.com/category/grub2-editor/
+-SourceForge Page: https://sourceforge.net/projects/kcm-grub2/
+-KDE-Apps.org Page: http://kde-apps.org/content/show.php?content=139643
+-KDE Extragear Page: https://projects.kde.org/projects/extragear/sysadmin/kcm-grub2
+-
+-For installation instructions see the INSTALL file.
++For original README see the README.old file.
+diff --git a/README.old b/README.old
+new file mode 100644
+index 0000000..9cc5e45
+--- /dev/null
++++ b/README.old
+@@ -0,0 +1,24 @@
++A KDE Control Module for configuring the GRUB2 bootloader.
++
++Smoothly integrated in KDE System Settings, it is the central place for managing your GRUB2 configuration. Supports many GRUB2 configuration options, most notably:
++
++* Manage default boot entry
++* Manage boot timeout
++* Manage boot resolutions
++* Manage boot menu colors
++* Manage boot menu theme
++* Manage linux kernel arguments
++* Save and update the configuration files of GRUB2
++
++Extra features include:
++
++* Recover GRUB2
++* Remove old entries
++* Create and preview GRUB2 splash images
++
++Related Blog: http://ksmanis.wordpress.com/category/grub2-editor/
++SourceForge Page: https://sourceforge.net/projects/kcm-grub2/
++KDE-Apps.org Page: http://kde-apps.org/content/show.php?content=139643
++KDE Extragear Page: https://projects.kde.org/projects/extragear/sysadmin/kcm-grub2
++
++For installation instructions see the INSTALL file.
+diff --git a/cmake/modules/FindMsgfmt.cmake b/cmake/modules/FindMsgfmt.cmake
+new file mode 100644
+index 0000000..47c6121
+--- /dev/null
++++ b/cmake/modules/FindMsgfmt.cmake
+@@ -0,0 +1,28 @@
++# - Try to find msgfmt
++# Once done this will define
++#
++# MSGFMT_FOUND - system has msgfmt
++
++# Copyright (c) 2007, Montel Laurent <montel@kde.org>
++#
++# Redistribution and use is allowed according to the terms of the BSD license.
++# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
++
++### TODO: KDE4 needs msgfmt of version 0.15 or greater (cf. msgfmt --version )
++
++if(MSGFMT_EXECUTABLE)
++ set(MSGFMT_FOUND TRUE)
++else(MSGFMT_EXECUTABLE)
++
++ FIND_PROGRAM(MSGFMT_EXECUTABLE NAMES msgfmt)
++ if (MSGFMT_EXECUTABLE)
++ set(MSGFMT_FOUND TRUE)
++ else (MSGFMT_EXECUTABLE)
++ if (Msgfmt_FIND_REQUIRED)
++ message(SEND_ERROR "Could NOT find msgfmt program")
++ endif (Msgfmt_FIND_REQUIRED)
++ endif (MSGFMT_EXECUTABLE)
++ MARK_AS_ADVANCED(MSGFMT_EXECUTABLE)
++
++endif (MSGFMT_EXECUTABLE)
++
+diff --git a/cmake/modules/MacroBoolTo01.cmake b/cmake/modules/MacroBoolTo01.cmake
+new file mode 100644
+index 0000000..63b9852
+--- /dev/null
++++ b/cmake/modules/MacroBoolTo01.cmake
+@@ -0,0 +1,20 @@
++# MACRO_BOOL_TO_01( VAR RESULT0 ... RESULTN )
++# This macro evaluates its first argument
++# and sets all the given vaiables either to 0 or 1
++# depending on the value of the first one
++
++# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
++#
++# Redistribution and use is allowed according to the terms of the BSD license.
++# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
++
++
++MACRO(MACRO_BOOL_TO_01 FOUND_VAR )
++ FOREACH (_current_VAR ${ARGN})
++ IF(${FOUND_VAR})
++ SET(${_current_VAR} 1)
++ ELSE(${FOUND_VAR})
++ SET(${_current_VAR} 0)
++ ENDIF(${FOUND_VAR})
++ ENDFOREACH(_current_VAR)
++ENDMACRO(MACRO_BOOL_TO_01)
+diff --git a/cmake/modules/MacroLogFeature.cmake b/cmake/modules/MacroLogFeature.cmake
+new file mode 100644
+index 0000000..45e27b6
+--- /dev/null
++++ b/cmake/modules/MacroLogFeature.cmake
+@@ -0,0 +1,157 @@
++# This file defines the Feature Logging macros.
++#
++# MACRO_LOG_FEATURE(VAR FEATURE DESCRIPTION URL [REQUIRED [MIN_VERSION [COMMENTS]]])
++# Logs the information so that it can be displayed at the end
++# of the configure run
++# VAR : TRUE or FALSE, indicating whether the feature is supported
++# FEATURE: name of the feature, e.g. "libjpeg"
++# DESCRIPTION: description what this feature provides
++# URL: home page
++# REQUIRED: TRUE or FALSE, indicating whether the featue is required
++# MIN_VERSION: minimum version number. empty string if unneeded
++# COMMENTS: More info you may want to provide. empty string if unnecessary
++#
++# MACRO_DISPLAY_FEATURE_LOG()
++# Call this to display the collected results.
++# Exits CMake with a FATAL error message if a required feature is missing
++#
++# Example:
++#
++# INCLUDE(MacroLogFeature)
++#
++# FIND_PACKAGE(JPEG)
++# MACRO_LOG_FEATURE(JPEG_FOUND "libjpeg" "Support JPEG images" "http://www.ijg.org" TRUE "3.2a" "")
++# ...
++# MACRO_DISPLAY_FEATURE_LOG()
++
++# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
++# Copyright (c) 2006, Allen Winter, <winter@kde.org>
++# Copyright (c) 2009, Sebastian Trueg, <trueg@kde.org>
++#
++# Redistribution and use is allowed according to the terms of the BSD license.
++# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
++
++IF (NOT _macroLogFeatureAlreadyIncluded)
++ SET(_file ${CMAKE_BINARY_DIR}/MissingRequirements.txt)
++ IF (EXISTS ${_file})
++ FILE(REMOVE ${_file})
++ ENDIF (EXISTS ${_file})
++
++ SET(_file ${CMAKE_BINARY_DIR}/EnabledFeatures.txt)
++ IF (EXISTS ${_file})
++ FILE(REMOVE ${_file})
++ ENDIF (EXISTS ${_file})
++
++ SET(_file ${CMAKE_BINARY_DIR}/DisabledFeatures.txt)
++ IF (EXISTS ${_file})
++ FILE(REMOVE ${_file})
++ ENDIF (EXISTS ${_file})
++
++ SET(_macroLogFeatureAlreadyIncluded TRUE)
++
++ INCLUDE(FeatureSummary)
++
++ENDIF (NOT _macroLogFeatureAlreadyIncluded)
++
++
++MACRO(MACRO_LOG_FEATURE _var _package _description _url ) # _required _minvers _comments)
++
++ STRING(TOUPPER "${ARGV4}" _required)
++ SET(_minvers "${ARGV5}")
++ SET(_comments "${ARGV6}")
++
++ IF (${_var})
++ SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/EnabledFeatures.txt)
++ ELSE (${_var})
++ IF ("${_required}" STREQUAL "TRUE")
++ SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/MissingRequirements.txt)
++ ELSE ("${_required}" STREQUAL "TRUE")
++ SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/DisabledFeatures.txt)
++ ENDIF ("${_required}" STREQUAL "TRUE")
++ ENDIF (${_var})
++
++ SET(_logtext " * ${_package}")
++
++ IF (NOT ${_var})
++ IF (${_minvers} MATCHES ".*")
++ SET(_logtext "${_logtext} (${_minvers} or higher)")
++ ENDIF (${_minvers} MATCHES ".*")
++ SET(_logtext "${_logtext} <${_url}>\n ")
++ ELSE (NOT ${_var})
++ SET(_logtext "${_logtext} - ")
++ ENDIF (NOT ${_var})
++
++ SET(_logtext "${_logtext}${_description}")
++
++ IF (NOT ${_var})
++ IF (${_comments} MATCHES ".*")
++ SET(_logtext "${_logtext}\n ${_comments}")
++ ENDIF (${_comments} MATCHES ".*")
++# SET(_logtext "${_logtext}\n") #double-space missing features?
++ ENDIF (NOT ${_var})
++
++ FILE(APPEND "${_LOGFILENAME}" "${_logtext}\n")
++
++ IF(COMMAND SET_PACKAGE_INFO) # in FeatureSummary.cmake since CMake 2.8.3
++ SET_PACKAGE_INFO("${_package}" "\"${_description}\"" "${_url}" "\"${_comments}\"")
++ ENDIF(COMMAND SET_PACKAGE_INFO)
++
++ENDMACRO(MACRO_LOG_FEATURE)
++
++
++MACRO(MACRO_DISPLAY_FEATURE_LOG)
++ IF(COMMAND FEATURE_SUMMARY) # in FeatureSummary.cmake since CMake 2.8.3
++ FEATURE_SUMMARY(FILENAME ${CMAKE_CURRENT_BINARY_DIR}/FindPackageLog.txt
++ WHAT ALL)
++ ENDIF(COMMAND FEATURE_SUMMARY)
++
++ SET(_missingFile ${CMAKE_BINARY_DIR}/MissingRequirements.txt)
++ SET(_enabledFile ${CMAKE_BINARY_DIR}/EnabledFeatures.txt)
++ SET(_disabledFile ${CMAKE_BINARY_DIR}/DisabledFeatures.txt)
++
++ IF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile})
++ SET(_printSummary TRUE)
++ ENDIF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile})
++
++ IF(_printSummary)
++ SET(_missingDeps 0)
++ IF (EXISTS ${_enabledFile})
++ FILE(READ ${_enabledFile} _enabled)
++ FILE(REMOVE ${_enabledFile})
++ SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following external packages were located on your system.\n-- This installation will have the extra features provided by these packages.\n-----------------------------------------------------------------------------\n${_enabled}")
++ ENDIF (EXISTS ${_enabledFile})
++
++
++ IF (EXISTS ${_disabledFile})
++ SET(_missingDeps 1)
++ FILE(READ ${_disabledFile} _disabled)
++ FILE(REMOVE ${_disabledFile})
++ SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following OPTIONAL packages could NOT be located on your system.\n-- Consider installing them to enable more features from this software.\n-----------------------------------------------------------------------------\n${_disabled}")
++ ENDIF (EXISTS ${_disabledFile})
++
++
++ IF (EXISTS ${_missingFile})
++ SET(_missingDeps 1)
++ FILE(READ ${_missingFile} _requirements)
++ SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following REQUIRED packages could NOT be located on your system.\n-- You must install these packages before continuing.\n-----------------------------------------------------------------------------\n${_requirements}")
++ FILE(REMOVE ${_missingFile})
++ SET(_haveMissingReq 1)
++ ENDIF (EXISTS ${_missingFile})
++
++
++ IF (NOT ${_missingDeps})
++ SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- Congratulations! All external packages have been found.")
++ ENDIF (NOT ${_missingDeps})
++
++
++ MESSAGE(${_summary})
++ MESSAGE("-----------------------------------------------------------------------------\n")
++
++
++ IF(_haveMissingReq)
++ MESSAGE(FATAL_ERROR "Exiting: Missing Requirements")
++ ENDIF(_haveMissingReq)
++
++ ENDIF(_printSummary)
++
++ENDMACRO(MACRO_DISPLAY_FEATURE_LOG)
+diff --git a/config.h.cmake b/config.h.cmake
+index 5d57a67..a957167 100644
+--- a/config.h.cmake
++++ b/config.h.cmake
+@@ -18,6 +18,12 @@
+ #define GRUB_ENV "@GRUB_ENV@"
+ #define GRUB_MEMTEST "@GRUB_MEMTEST@"
+
++enum actionType {
++ actionLoad,
++ actionProbe,
++ actionProbevbe
++};
++
+ enum GrubFile {
+ GrubMenuFile,
+ GrubConfigurationFile,
+diff --git a/other/kcm_grub2.desktop b/other/kcm_grub2.desktop
+index c019c92..cff2127 100644
+--- a/other/kcm_grub2.desktop
++++ b/other/kcm_grub2.desktop
+@@ -2,12 +2,12 @@
+ Icon=system-reboot
+ Type=Service
+ X-KDE-ServiceTypes=KCModule
+-Exec=kcmshell4 kcm_grub2
++Exec=kcmshell5 kcm_grub2
+
+ X-KDE-Library=kcm_grub2
+ X-KDE-ParentApp=kcontrol
+
+-X-KDE-System-Settings-Parent-Category=startup-and-shutdown
++X-KDE-System-Settings-Parent-Category=session
+
+ Name=GRUB2 Bootloader
+ Name[bs]=GRUB2 pokretač sistemar
+@@ -79,6 +79,7 @@ Comment[ug]=Grub2 سىستېما باشلىغۇچنى ئۆزلەشتۈرۈش
+ Comment[uk]=Налаштування завантажувача GRUB2
+ Comment[x-test]=xxCustomize the GRUB2 bootloaderxx
+ Comment[zh_TW]=自訂 GRUB2 開機載入器
++Comment[zh_CN]=自定义 GRUB2 启动加载器
+ X-KDE-Keywords=grub,boot,menu,entries,default,timeout,password,color,splash,image,bootloader
+ X-KDE-Keywords[ca]=grub,arrencada,menú,entrades,omissió,temps d'expiració,contrasenya,color,benvinguda,imatge,carregador d'arrencada
+ X-KDE-Keywords[ca@valencia]=grub,arrencada,menú,entrades,omissió,temps d'expiració,contrasenya,color,benvinguda,imatge,carregador d'arrencada
+diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
+index 5dc61bd..babb8e8 100644
+--- a/po/CMakeLists.txt
++++ b/po/CMakeLists.txt
+@@ -26,4 +26,5 @@ add_subdirectory( sl )
+ add_subdirectory( sv )
+ add_subdirectory( tr )
+ add_subdirectory( uk )
++add_subdirectory( zh_CN )
+ add_subdirectory( zh_TW )
+diff --git a/po/ca/CMakeLists.txt b/po/ca/CMakeLists.txt
+index 303403c..7e99a22 100644
+--- a/po/ca/CMakeLists.txt
++++ b/po/ca/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( ca ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( ca ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/ca@valencia/CMakeLists.txt b/po/ca@valencia/CMakeLists.txt
+index ba68635..f03ca71 100644
+--- a/po/ca@valencia/CMakeLists.txt
++++ b/po/ca@valencia/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( ca@valencia ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( ca@valencia ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/cs/CMakeLists.txt b/po/cs/CMakeLists.txt
+index b71716b..88c48e3 100644
+--- a/po/cs/CMakeLists.txt
++++ b/po/cs/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( cs ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( cs ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/da/CMakeLists.txt b/po/da/CMakeLists.txt
+index 5f22517..72f9f51 100644
+--- a/po/da/CMakeLists.txt
++++ b/po/da/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( da ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( da ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/de/CMakeLists.txt b/po/de/CMakeLists.txt
+index 9c7ff66..b182f95 100644
+--- a/po/de/CMakeLists.txt
++++ b/po/de/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( de ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( de ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/el/CMakeLists.txt b/po/el/CMakeLists.txt
+index 6ce2b0d..75bfb7c 100644
+--- a/po/el/CMakeLists.txt
++++ b/po/el/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( el ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( el ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/es/CMakeLists.txt b/po/es/CMakeLists.txt
+index 74dca12..0c2dee6 100644
+--- a/po/es/CMakeLists.txt
++++ b/po/es/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( es ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( es ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/et/CMakeLists.txt b/po/et/CMakeLists.txt
+index 9ef94a3..2398e06 100644
+--- a/po/et/CMakeLists.txt
++++ b/po/et/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( et ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( et ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/fi/CMakeLists.txt b/po/fi/CMakeLists.txt
+index 1a35e1c..745ea32 100644
+--- a/po/fi/CMakeLists.txt
++++ b/po/fi/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( fi ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( fi ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/fr/CMakeLists.txt b/po/fr/CMakeLists.txt
+index b163e46..54c4ba8 100644
+--- a/po/fr/CMakeLists.txt
++++ b/po/fr/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( fr ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( fr ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/ga/CMakeLists.txt b/po/ga/CMakeLists.txt
+index becb21b..84e1e1e 100644
+--- a/po/ga/CMakeLists.txt
++++ b/po/ga/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( ga ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( ga ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/gl/CMakeLists.txt b/po/gl/CMakeLists.txt
+index dc48726..cebf5dc 100644
+--- a/po/gl/CMakeLists.txt
++++ b/po/gl/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( gl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( gl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/hu/CMakeLists.txt b/po/hu/CMakeLists.txt
+index 5bcf4b0..145f6d2 100644
+--- a/po/hu/CMakeLists.txt
++++ b/po/hu/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( hu ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( hu ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/it/CMakeLists.txt b/po/it/CMakeLists.txt
+index e9fcd01..babb757 100644
+--- a/po/it/CMakeLists.txt
++++ b/po/it/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( it ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( it ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/lt/CMakeLists.txt b/po/lt/CMakeLists.txt
+index e18e626..5307c0b 100644
+--- a/po/lt/CMakeLists.txt
++++ b/po/lt/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( lt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( lt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/nb/CMakeLists.txt b/po/nb/CMakeLists.txt
+index 26e8810..7308a2e 100644
+--- a/po/nb/CMakeLists.txt
++++ b/po/nb/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( nb ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( nb ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/nl/CMakeLists.txt b/po/nl/CMakeLists.txt
+index 5fe6d20..d088bea 100644
+--- a/po/nl/CMakeLists.txt
++++ b/po/nl/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( nl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( nl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/pa/CMakeLists.txt b/po/pa/CMakeLists.txt
+index b5d7040..86388ea 100644
+--- a/po/pa/CMakeLists.txt
++++ b/po/pa/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( pa ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( pa ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/pl/CMakeLists.txt b/po/pl/CMakeLists.txt
+index e3095d8..6646d84 100644
+--- a/po/pl/CMakeLists.txt
++++ b/po/pl/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( pl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( pl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/pt/CMakeLists.txt b/po/pt/CMakeLists.txt
+index fe0cfa7..1683e70 100644
+--- a/po/pt/CMakeLists.txt
++++ b/po/pt/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( pt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( pt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/pt_BR/CMakeLists.txt b/po/pt_BR/CMakeLists.txt
+index fe65208..f4cae0b 100644
+--- a/po/pt_BR/CMakeLists.txt
++++ b/po/pt_BR/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( pt_BR ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( pt_BR ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/ro/CMakeLists.txt b/po/ro/CMakeLists.txt
+index e17e2f7..83a5600 100644
+--- a/po/ro/CMakeLists.txt
++++ b/po/ro/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( ro ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( ro ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/ru/CMakeLists.txt b/po/ru/CMakeLists.txt
+index 8415f47..ec53a4f 100644
+--- a/po/ru/CMakeLists.txt
++++ b/po/ru/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( ru ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( ru ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/sk/CMakeLists.txt b/po/sk/CMakeLists.txt
+index 1d9681a..b05f636 100644
+--- a/po/sk/CMakeLists.txt
++++ b/po/sk/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( sk ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( sk ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/sl/CMakeLists.txt b/po/sl/CMakeLists.txt
+index 2653ceb..35fba0d 100644
+--- a/po/sl/CMakeLists.txt
++++ b/po/sl/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( sl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( sl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/sv/CMakeLists.txt b/po/sv/CMakeLists.txt
+index 6a0b8f0..2e05ceb 100644
+--- a/po/sv/CMakeLists.txt
++++ b/po/sv/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( sv ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( sv ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/tr/CMakeLists.txt b/po/tr/CMakeLists.txt
+index d44a3cb..377228d 100644
+--- a/po/tr/CMakeLists.txt
++++ b/po/tr/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( tr ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( tr ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/uk/CMakeLists.txt b/po/uk/CMakeLists.txt
+index 4834160..983c305 100644
+--- a/po/uk/CMakeLists.txt
++++ b/po/uk/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( uk ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( uk ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/zh_CN/CMakeLists.txt b/po/zh_CN/CMakeLists.txt
+new file mode 100644
+index 0000000..a3f00d4
+--- /dev/null
++++ b/po/zh_CN/CMakeLists.txt
+@@ -0,0 +1,2 @@
++file( GLOB _po_files *.po )
++GETTEXT_PROCESS_PO_FILES( zh_CN ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/po/zh_CN/kcm-grub2.po b/po/zh_CN/kcm-grub2.po
+new file mode 100644
+index 0000000..191e5d9
+--- /dev/null
++++ b/po/zh_CN/kcm-grub2.po
+@@ -0,0 +1,1085 @@
++# Copyright (C) YEAR This_file_is_part_of_KDE
++# This file is distributed under the same license as the PACKAGE package.
++#
++# maz-1 < ohmygod19993 at gmail dot com >
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
++"POT-Creation-Date: 2015-11-27 01:33+0000\n"
++"PO-Revision-Date: 2013-07-04 16:31+0800\n"
++"Last-Translator: Lin Ziyun < ohmygod19993 at gmail dot com >\n"
++"Language-Team: Chinese Simplified <kde-cn@googlegroups.com>\n"
++"Language: zh_CN\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Lokalize 1.5\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++msgctxt "NAME OF TRANSLATORS"
++msgid "Your names"
++msgstr "Lin Ziyun"
++
++msgctxt "EMAIL OF TRANSLATORS"
++msgid "Your emails"
++msgstr "franklin@goodhorse.idv.tw"
++
++#: src/convertDlg.cpp:48
++msgctxt "@item:inlistbox"
++msgid "ImageMagick supported image formats"
++msgstr "ImageMagick 支持的图像格式"
++
++#: src/convertDlg.cpp:76
++msgctxt "@info"
++msgid ""
++"Please fill in both <interface>Image</interface> and <interface>Convert To</"
++"interface> fields."
++msgstr ""
++"请填入「<interface>图像</interface>」与「<interface>转换为</interface>」栏"
++"目。"
++
++#: src/convertDlg.cpp:79
++msgctxt "@info"
++msgid ""
++"Please fill in both <interface>Width</interface> and <interface>Height</"
++"interface> fields."
++msgstr ""
++"请填入「<interface>宽度</interface>」与「<interface>高度</interface>」栏目。"
++
++#: src/convertDlg.cpp:82
++msgctxt "@info"
++msgid ""
++"You do not have write permissions in this directory, please select another "
++"destination."
++msgstr "您没有此目录的写入权限。请选择其他的目标。"
++
++#: src/helper/helper.cpp:79
++#, kde-format
++msgctxt "@info"
++msgid "Original configuration file <filename>%1</filename> does not exist."
++msgstr "原始设置文件 <filename>%1</filename> 不存在。"
++
++#: src/helper/helper.cpp:84
++#, kde-format
++msgctxt "@info"
++msgid "Cannot remove current configuration file <filename>%1</filename>."
++msgstr "无法移除目前的设置文件 <filename>%1</filename>。"
++
++#: src/helper/helper.cpp:89
++#, kde-format
++msgctxt "@info"
++msgid ""
++"Cannot copy original configuration file <filename>%1</filename> to <filename>"
++"%2</filename>."
++msgstr ""
++"无法复制原始设置文件 <filename>%1</filename> 到 <filename>%2</filename>。"
++
++#: src/helper/helper.cpp:105
++msgctxt "@info"
++msgid "Failed to create temporary mount point."
++msgstr "建立暂时的挂载点失败。"
++
++#: src/installDlg.cpp:45
++msgctxt "@title:window"
++msgid "Install/Recover Bootloader"
++msgstr "安装/恢复启动加载器"
++
++#: src/installDlg.cpp:98
++msgctxt "@info"
++msgid "Sorry, you have to select a partition with a proper name!"
++msgstr "抱歉,您必须选择有适当名称的分区。"
++
++#: src/installDlg.cpp:109
++msgctxt "@title:window"
++msgid "Installing"
++msgstr "安装中"
++
++#: src/installDlg.cpp:109
++msgctxt "@info:progress"
++msgid "Installing GRUB..."
++msgstr "安装 GRUB 中..."
++
++#: src/installDlg.cpp:120 src/kcm_grub2.cpp:484
++msgctxt "@title:window"
++msgid "Information"
++msgstr "信息"
++
++#: src/installDlg.cpp:125
++msgctxt "@info"
++msgid "Successfully installed GRUB."
++msgstr "已成功安装 GRUB。"
++
++#: src/installDlg.cpp:127
++msgctxt "@info"
++msgid "Failed to install GRUB."
++msgstr "安装 GRUB 失败。"
++
++#: src/kcm_grub2.cpp:62
++msgctxt "@title"
++msgid "KDE GRUB2 Bootloader Control Module"
++msgstr "KDE GRUB2 启动加载器控制模块"
++
++#: src/kcm_grub2.cpp:62
++msgctxt "@title"
++msgid "A KDE Control Module for configuring the GRUB2 bootloader."
++msgstr "设置 GRUB2 启动加载器的 KDE 控制模块"
++
++#: src/kcm_grub2.cpp:62
++msgctxt "@info:credit"
++msgid "Copyright (C) 2008-2013 Konstantinos Smanis"
++msgstr "Copyright (C) 2008-2013 Konstantinos Smanis"
++
++#: src/kcm_grub2.cpp:63
++msgctxt "@info:credit"
++msgid "Κonstantinos Smanis"
++msgstr "Κonstantinos Smanis"
++
++#: src/kcm_grub2.cpp:63
++msgctxt "@info:credit"
++msgid "Main Developer"
++msgstr "主要开发者"
++
++#: src/kcm_grub2.cpp:89
++msgctxt "@info"
++msgid "Successfully restored the default values."
++msgstr "已成功恢复预设值。"
++
++#: src/kcm_grub2.cpp:91
++msgctxt "@info"
++msgid "Failed to restore the default values."
++msgstr "恢复预设值失败。"
++
++#: src/kcm_grub2.cpp:472
++msgctxt "@title:window Verb (gerund). Refers to current status."
++msgid "Saving"
++msgstr "正在储存"
++
++#: src/kcm_grub2.cpp:472
++msgctxt "@info:progress"
++msgid "Saving GRUB settings..."
++msgstr "正在储存 GRUB 设置..."
++
++#: src/kcm_grub2.cpp:489
++msgctxt "@info"
++msgid "Successfully saved GRUB settings."
++msgstr "已成功储存 GRUB 设置。"
++
++#: src/kcm_grub2.cpp:492
++msgctxt "@info"
++msgid "Failed to save GRUB settings."
++msgstr "储存 GRUB 设置失败。"
++
++#: src/kcm_grub2.cpp:563 src/kcm_grub2.cpp:585
++msgctxt "@title:window"
++msgid "Enter screen resolution"
++msgstr "输入屏幕分辨率"
++
++#: src/kcm_grub2.cpp:563
++msgctxt "@label:textbox"
++msgid "Please enter a GRUB resolution:"
++msgstr "请输入 GRUB 分辨率:"
++
++#: src/kcm_grub2.cpp:585
++msgctxt "@label:textbox"
++msgid "Please enter a Linux boot resolution:"
++msgstr "请输入 Linux 开机画面分辨率:"
++
++#: src/kcm_grub2.cpp:631
++msgctxt "@info"
++msgid "Press <shortcut>Escape</shortcut> to exit fullscreen mode."
++msgstr "按下 ESC 离开全屏幕模式。"
++
++#: src/kcm_grub2.cpp:780 src/kcm_grub2.cpp:781
++msgctxt "@item:inlistbox Refers to color."
++msgid "Black"
++msgstr "黑"
++
++#: src/kcm_grub2.cpp:782 src/kcm_grub2.cpp:783
++msgctxt "@item:inlistbox Refers to color."
++msgid "Transparent"
++msgstr "透明"
++
++#: src/kcm_grub2.cpp:785
++msgctxt "@item:inlistbox Refers to color."
++msgid "Blue"
++msgstr "蓝"
++
++#: src/kcm_grub2.cpp:787
++msgctxt "@item:inlistbox Refers to color."
++msgid "Cyan"
++msgstr "青绿色"
++
++#: src/kcm_grub2.cpp:789
++msgctxt "@item:inlistbox Refers to color."
++msgid "Dark Gray"
++msgstr "暗灰色"
++
++#: src/kcm_grub2.cpp:791
++msgctxt "@item:inlistbox Refers to color."
++msgid "Green"
++msgstr "绿"
++
++#: src/kcm_grub2.cpp:793
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Cyan"
++msgstr "浅青色"
++
++#: src/kcm_grub2.cpp:795
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Blue"
++msgstr "亮蓝色"
++
++#: src/kcm_grub2.cpp:797
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Green"
++msgstr "浅绿色"
++
++#: src/kcm_grub2.cpp:799
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Gray"
++msgstr "亮灰色"
++
++#: src/kcm_grub2.cpp:801
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Magenta"
++msgstr "浅品红色"
++
++#: src/kcm_grub2.cpp:803
++msgctxt "@item:inlistbox Refers to color."
++msgid "Light Red"
++msgstr "浅红色"
++
++#: src/kcm_grub2.cpp:805
++msgctxt "@item:inlistbox Refers to color."
++msgid "Magenta"
++msgstr "紫红色"
++
++#: src/kcm_grub2.cpp:807
++msgctxt "@item:inlistbox Refers to color."
++msgid "Red"
++msgstr "红色"
++
++#: src/kcm_grub2.cpp:809
++msgctxt "@item:inlistbox Refers to color."
++msgid "White"
++msgstr "白色"
++
++#: src/kcm_grub2.cpp:811
++msgctxt "@item:inlistbox Refers to color."
++msgid "Yellow"
++msgstr "黄色"
++
++#: src/kcm_grub2.cpp:834 src/kcm_grub2.cpp:843
++msgctxt "@action:inmenu"
++msgid "Quiet Boot"
++msgstr "安静开机"
++
++#: src/kcm_grub2.cpp:835 src/kcm_grub2.cpp:844
++msgctxt "@action:inmenu"
++msgid "Show Splash Screen"
++msgstr "显示欢迎画面"
++
++#: src/kcm_grub2.cpp:836 src/kcm_grub2.cpp:845
++msgctxt "@action:inmenu"
++msgid "Disable Plymouth"
++msgstr "关闭 Plymouth"
++
++#: src/kcm_grub2.cpp:837 src/kcm_grub2.cpp:846
++msgctxt "@action:inmenu"
++msgid "Turn Off ACPI"
++msgstr "关闭 ACPI"
++
++#: src/kcm_grub2.cpp:838 src/kcm_grub2.cpp:847
++msgctxt "@action:inmenu"
++msgid "Turn Off APIC"
++msgstr "关闭 APIC"
++
++#: src/kcm_grub2.cpp:839 src/kcm_grub2.cpp:848
++msgctxt "@action:inmenu"
++msgid "Turn Off Local APIC"
++msgstr "关闭本地端 APIC"
++
++#: src/kcm_grub2.cpp:840 src/kcm_grub2.cpp:849
++msgctxt "@action:inmenu"
++msgid "Single User Mode"
++msgstr "单一使用者模式"
++
++#: src/kcm_grub2.cpp:852 src/kcm_grub2.cpp:857 src/kcm_grub2.cpp:864
++msgctxt "@action:inmenu"
++msgid "PC BIOS && EFI Console"
++msgstr "PC BIOS 与 EFI 主控台"
++
++#: src/kcm_grub2.cpp:853 src/kcm_grub2.cpp:858 src/kcm_grub2.cpp:865
++msgctxt "@action:inmenu"
++msgid "Serial Terminal"
++msgstr "序列终端"
++
++#: src/kcm_grub2.cpp:854 src/kcm_grub2.cpp:859 src/kcm_grub2.cpp:866
++msgctxt ""
++"@action:inmenu 'Open' is an adjective here, not a verb. 'Open Firmware' is a "
++"former IEEE standard."
++msgid "Open Firmware Console"
++msgstr "开启固件主控台"
++
++#: src/kcm_grub2.cpp:860
++msgctxt "@action:inmenu"
++msgid "PC AT Keyboard (Coreboot)"
++msgstr "PC AT 键盘(Coreboot)"
++
++#: src/kcm_grub2.cpp:861
++msgctxt "@action:inmenu"
++msgid "USB Keyboard (HID Boot Protocol)"
++msgstr "USB 键盘(HID 开机协定)"
++
++#: src/kcm_grub2.cpp:867
++msgctxt "@action:inmenu"
++msgid "Graphics Mode Output"
++msgstr "图形模式输出"
++
++#: src/kcm_grub2.cpp:868
++msgctxt "@action:inmenu"
++msgid "VGA Text Output (Coreboot)"
++msgstr "VGA 文字输出(Coreboot)"
++
++#: src/kcm_grub2.cpp:1063
++msgctxt "@title:window"
++msgid "Probing devices"
++msgstr "检测设备中"
++
++#: src/kcm_grub2.cpp:1063
++msgctxt "@info:progress"
++msgid "Probing devices for their GRUB names..."
++msgstr "检测设备在 GRUB 上的名称中..."
++
++#: src/kcm_grub2.cpp:1072
++msgctxt "@info"
++msgid "Failed to get GRUB device names."
++msgstr "取得 GRUB 设备名称失败。"
++
++#: src/kcm_grub2.cpp:1077
++msgctxt "@info"
++msgid "Helper returned malformed device list."
++msgstr "协助程序传回不正确的设备列表。"
++
++#: src/kcm_grub2.cpp:1130 src/kcm_grub2.cpp:1133
++msgctxt "@item:inlistbox Refers to screen resolution."
++msgid "Custom..."
++msgstr "自定义..."
++
++#: src/kcm_grub2.cpp:1134
++msgctxt "@item:inlistbox"
++msgid "Unspecified"
++msgstr "未指定"
++
++#: src/kcm_grub2.cpp:1135
++msgctxt "@item:inlistbox"
++msgid "Boot in Text Mode"
++msgstr "以文字模式开机"
++
++#: src/kcm_grub2.cpp:1136
++msgctxt "@item:inlistbox"
++msgid "Keep GRUB's Resolution"
++msgstr "保持 GRUB 的分辨率"
++
++#: src/kcm_grub2.cpp:1162
++msgctxt "@info"
++msgid "The process could not be started."
++msgstr "无法启动进程。"
++
++#: src/kcm_grub2.cpp:1165
++msgctxt "@info"
++msgid "The process crashed."
++msgstr "进程已崩溃。"
++
++#: src/kcm_grub2.cpp:1172
++#, kde-format
++msgctxt "@info"
++msgid ""
++"Command: <command>%1</command><nl/>Error code: <numid>%2</numid><nl/>Error "
++"message:<nl/><message>%3</message>"
++msgstr ""
++"命令:<command>%1</command><nl/>错误代码:<numid>%2</numid><nl/>错误信息:"
++"<nl/><message>%3</message>"
++
++#: src/qPkBackend.cpp:31
++msgctxt "This is when the transaction status is not known"
++msgid "Unknown state"
++msgstr "未知状态"
++
++#: src/qPkBackend.cpp:34
++msgctxt "transaction state, the daemon is in the process of starting"
++msgid "Waiting for service to start"
++msgstr "等待服务启动中"
++
++#: src/qPkBackend.cpp:37
++msgctxt "transaction state, the transaction is waiting for another to complete"
++msgid "Waiting for other tasks"
++msgstr "等待其它任务中"
++
++#: src/qPkBackend.cpp:40
++msgctxt "transaction state, just started"
++msgid "Running task"
++msgstr "执行任务中"
++
++#: src/qPkBackend.cpp:43
++msgctxt "transaction state, is querying data"
++msgid "Querying"
++msgstr "查询中"
++
++#: src/qPkBackend.cpp:46
++msgctxt "transaction state, getting data from a server"
++msgid "Getting information"
++msgstr "取得信息中"
++
++#: src/qPkBackend.cpp:49
++msgctxt "transaction state, removing packages"
++msgid "Removing packages"
++msgstr "移除包中"
++
++#: src/qPkBackend.cpp:52
++msgctxt "transaction state, downloading package files"
++msgid "Downloading packages"
++msgstr "下载包中"
++
++#: src/qPkBackend.cpp:55
++msgctxt "transaction state, installing packages"
++msgid "Installing packages"
++msgstr "安装包中"
++
++#: src/qPkBackend.cpp:58
++msgctxt "transaction state, refreshing internal lists"
++msgid "Refreshing software list"
++msgstr "刷新软件列表"
++
++#: src/qPkBackend.cpp:61
++msgctxt "transaction state, installing updates"
++msgid "Updating packages"
++msgstr "更新包中"
++
++#: src/qPkBackend.cpp:64
++msgctxt "transaction state, removing old packages, and cleaning config files"
++msgid "Cleaning up packages"
++msgstr "清除包中"
++
++#: src/qPkBackend.cpp:67
++msgctxt "transaction state, obsoleting old packages"
++msgid "Obsoleting packages"
++msgstr "废弃旧包中"
++
++#: src/qPkBackend.cpp:70
++msgctxt "transaction state, checking the transaction before we do it"
++msgid "Resolving dependencies"
++msgstr "解决依赖问题中"
++
++#: src/qPkBackend.cpp:73
++msgctxt ""
++"transaction state, checking if we have all the security keys for the "
++"operation"
++msgid "Checking signatures"
++msgstr "检查签名中"
++
++#: src/qPkBackend.cpp:76
++msgctxt "transaction state, when we return to a previous system state"
++msgid "Rolling back"
++msgstr "恢复先前状态中"
++
++#: src/qPkBackend.cpp:79
++msgctxt "transaction state, when we're doing a test transaction"
++msgid "Testing changes"
++msgstr "测试变更中"
++
++#: src/qPkBackend.cpp:82
++msgctxt "transaction state, when we're writing to the system package database"
++msgid "Committing changes"
++msgstr "提交变更中"
++
++#: src/qPkBackend.cpp:85
++msgctxt "transaction state, requesting data from a server"
++msgid "Requesting data"
++msgstr "请求数据中"
++
++#: src/qPkBackend.cpp:88
++msgctxt "transaction state, all done!"
++msgid "Finished"
++msgstr "已完成"
++
++#: src/qPkBackend.cpp:91
++msgctxt "transaction state, in the process of cancelling"
++msgid "Cancelling"
++msgstr "取消中"
++
++#: src/qPkBackend.cpp:94
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading repository information"
++msgstr "下载主目录信息中"
++
++#: src/qPkBackend.cpp:97
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading list of packages"
++msgstr "下载包列表中"
++
++#: src/qPkBackend.cpp:100
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading file lists"
++msgstr "下载文件列表中"
++
++#: src/qPkBackend.cpp:103
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading lists of changes"
++msgstr "下载变更列表中"
++
++#: src/qPkBackend.cpp:106
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading groups"
++msgstr "下载群组中"
++
++#: src/qPkBackend.cpp:109
++msgctxt "transaction state, downloading metadata"
++msgid "Downloading update information"
++msgstr "下载更新信息中"
++
++#: src/qPkBackend.cpp:112
++msgctxt "transaction state, repackaging delta files"
++msgid "Repackaging files"
++msgstr "重新打包文件中"
++
++#: src/qPkBackend.cpp:115
++msgctxt "transaction state, loading databases"
++msgid "Loading cache"
++msgstr "载入缓存中"
++
++#: src/qPkBackend.cpp:118
++msgctxt "transaction state, scanning for running processes"
++msgid "Scanning installed applications"
++msgstr "扫描已安装应用程序中"
++
++#: src/qPkBackend.cpp:121
++msgctxt ""
++"transaction state, generating a list of packages installed on the system"
++msgid "Generating package lists"
++msgstr "产生包列表中"
++
++#: src/qPkBackend.cpp:124
++msgctxt "transaction state, when we're waiting for the native tools to exit"
++msgid "Waiting for package manager lock"
++msgstr "等待包管理员锁定中"
++
++#: src/qPkBackend.cpp:127
++msgctxt "waiting for user to type in a password"
++msgid "Waiting for authentication"
++msgstr "等待认证中"
++
++#: src/qPkBackend.cpp:130
++msgctxt "we are updating the list of processes"
++msgid "Updating the list of running applications"
++msgstr "更新正在执行的应用程序列表中"
++
++#: src/qPkBackend.cpp:133
++msgctxt "we are checking executable files in use"
++msgid "Checking for applications currently in use"
++msgstr "检查目前使用的应用程序中"
++
++#: src/qPkBackend.cpp:136
++msgctxt "we are checking for libraries in use"
++msgid "Checking for libraries currently in use"
++msgstr "检查目前使用的函式库中"
++
++#: src/qPkBackend.cpp:139
++msgctxt "we are copying package files to prepare to install"
++msgid "Copying files"
++msgstr "复制文件中"
++
++#: src/removeDlg.cpp:46
++msgctxt "@title:window"
++msgid "Remove Old Entries"
++msgstr "移除旧项目"
++
++#: src/removeDlg.cpp:60
++msgctxt "@title:window"
++msgid "Finding Old Entries"
++msgstr "寻找旧项目中"
++
++#: src/removeDlg.cpp:60
++msgctxt "@info:progress"
++msgid "Finding Old Entries..."
++msgstr "寻找旧项目中..."
++
++#: src/removeDlg.cpp:86
++#, kde-format
++msgctxt "@item:inlistbox"
++msgid "Kernel %1"
++msgstr "内核 %1"
++
++#: src/removeDlg.cpp:102
++msgctxt "@info"
++msgid "No removable entries were found."
++msgstr "没有找到可移除的项目。"
++
++#: src/removeDlg.cpp:124
++msgctxt "@info"
++msgid "Are you sure you want to remove the following packages?"
++msgstr "您确定您要移除以下的包吗?"
++
++#: src/removeDlg.cpp:148
++msgctxt "@title:window"
++msgid "Removing Old Entries"
++msgstr "移除旧项目中"
++
++#: src/removeDlg.cpp:161
++msgctxt "@info"
++msgid "Package removal failed."
++msgstr "移除包失败。"
++
++#. i18n: ectx: property (text), widget (QLabel, label)
++#: ui/convertDlg.ui:19
++msgctxt "@label:textbox"
++msgid "Image:"
++msgstr "图像:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_2)
++#: ui/convertDlg.ui:29
++msgctxt "@label:textbox"
++msgid "Convert To:"
++msgstr "转换为:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
++#: ui/convertDlg.ui:41
++msgctxt "@title:group"
++msgid "Conversion Options"
++msgstr "转换选项"
++
++#. i18n: ectx: property (text), widget (QLabel, label_3)
++#: ui/convertDlg.ui:47
++msgctxt "@label:spinbox"
++msgid "Width:"
++msgstr "宽度:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_4)
++#: ui/convertDlg.ui:61
++msgctxt "@label:spinbox"
++msgid "Height:"
++msgstr "高度:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_5)
++#: ui/convertDlg.ui:75
++msgctxt "@option:check"
++msgid "Force resolution:"
++msgstr "强制设置分辨率:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_6)
++#: ui/convertDlg.ui:85
++msgctxt "@option:check"
++msgid "Set As GRUB Wallpaper:"
++msgstr "设为 GRUB 桌面:"
++
++#. i18n: ectx: property (text), widget (QLabel, label)
++#: ui/installDlg.ui:17
++msgctxt "@label:listbox"
++msgid "Select partition to install/recover GRUB:"
++msgstr "选择要安装/恢复 GRUB 的分区:"
++
++#. i18n: ectx: property (text), widget (QTreeWidget, treeWidget_recover)
++#: ui/installDlg.ui:48
++msgctxt "@title:column"
++msgid "Partition"
++msgstr "分区"
++
++#. i18n: ectx: property (text), widget (QTreeWidget, treeWidget_recover)
++#: ui/installDlg.ui:53
++msgctxt "@title:column"
++msgid "Mountpoint"
++msgstr "挂载点"
++
++#. i18n: ectx: property (text), widget (QTreeWidget, treeWidget_recover)
++#: ui/installDlg.ui:58
++msgctxt "@title:column"
++msgid "Label"
++msgstr "标签"
++
++#. i18n: ectx: property (text), widget (QTreeWidget, treeWidget_recover)
++#: ui/installDlg.ui:63
++msgctxt "@title:column"
++msgid "File System"
++msgstr "文件系统"
++
++#. i18n: ectx: property (text), widget (QTreeWidget, treeWidget_recover)
++#: ui/installDlg.ui:68
++msgctxt "@title:column"
++msgid "Size"
++msgstr "大小"
++
++#. i18n: ectx: property (toolTip), widget (QCheckBox, checkBox_partition)
++#: ui/installDlg.ui:76
++msgctxt "@info:tooltip"
++msgid ""
++"Install the bootloader on the boot sector of the selected partition instead "
++"of the MBR(=Master Boot Sector). Not recommended."
++msgstr "安装启动加载器到选取的分区的开机分区,而不是安装到 MBR。不建议如此。"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_partition)
++#: ui/installDlg.ui:79
++msgctxt "@option:check"
++msgid "Install on partition instead of MBR (Advanced)"
++msgstr "安装在分区而非 MBR(进阶)"
++
++#. i18n: ectx: attribute (title), widget (QWidget, tab)
++#: ui/kcm_grub2.ui:21
++msgctxt "@title:tab Refers to settings."
++msgid "General"
++msgstr "一般"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_timeout)
++#: ui/kcm_grub2.ui:27
++msgctxt "@title:group"
++msgid "Timeout"
++msgstr "超时"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_hiddenTimeout)
++#: ui/kcm_grub2.ui:35
++msgctxt "@option:check"
++msgid "Hide the menu for:"
++msgstr "隐藏选单多久:"
++
++#. i18n: ectx: property (suffix), widget (QSpinBox, spinBox_hiddenTimeout)
++#. i18n: ectx: property (suffix), widget (QSpinBox, spinBox_timeout)
++#: ui/kcm_grub2.ui:45 ui/kcm_grub2.ui:144
++msgctxt "@label:spinbox seconds (suffix)"
++msgid "s"
++msgstr "秒"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_hiddenTimeoutShowTimer)
++#: ui/kcm_grub2.ui:76
++msgctxt "@option:check"
++msgid "Show countdown timer"
++msgstr "显示倒数计时器"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_timeout)
++#: ui/kcm_grub2.ui:83
++msgctxt "@option:check"
++msgid "Automatically boot the default entry after showing the menu"
++msgstr "显示选单后自动以预设的项目开机"
++
++#. i18n: ectx: property (text), widget (QRadioButton, radioButton_timeout0)
++#: ui/kcm_grub2.ui:106
++msgctxt "@option:radio"
++msgid "Immediately"
++msgstr "立即"
++
++#. i18n: ectx: property (text), widget (QRadioButton, radioButton_timeout)
++#: ui/kcm_grub2.ui:131
++msgctxt "@option:radio"
++msgid "After:"
++msgstr "多久之后:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_entries)
++#: ui/kcm_grub2.ui:172
++msgctxt "@title:group"
++msgid "Generated Entries"
++msgstr "产生的项目"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_recovery)
++#: ui/kcm_grub2.ui:178
++msgctxt "@option:check"
++msgid "Generate recovery entries"
++msgstr "产生救援的选项"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_memtest)
++#: ui/kcm_grub2.ui:185
++msgctxt "@option:check"
++msgid "Generate memtest entries"
++msgstr "产生内存测试的选项"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_osProber)
++#: ui/kcm_grub2.ui:192
++msgctxt "@option:check"
++msgid "Probe for operating systems"
++msgstr "检测操作系统"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_default)
++#: ui/kcm_grub2.ui:202
++msgctxt "@title:group"
++msgid "Default Entry"
++msgstr "预设项目"
++
++#. i18n: ectx: property (text), widget (QLabel, label_default)
++#: ui/kcm_grub2.ui:208
++msgctxt "@label:listbox"
++msgid "Default Entry:"
++msgstr "预设项目:"
++
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_remove)
++#: ui/kcm_grub2.ui:224
++msgctxt "@action:button"
++msgid "Remove Old Entries"
++msgstr "移除旧项目"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_savedefault)
++#: ui/kcm_grub2.ui:233
++msgctxt "@option:check"
++msgid "The next booted entry will become default"
++msgstr "下一个开机项目会成为预设值"
++
++#. i18n: ectx: attribute (title), widget (QWidget, tab_3)
++#: ui/kcm_grub2.ui:244
++msgctxt "@title:tab"
++msgid "Appearance"
++msgstr "外观"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_resolutions)
++#: ui/kcm_grub2.ui:250
++msgctxt "@title:group"
++msgid "Resolutions"
++msgstr "分辨率"
++
++#. i18n: ectx: property (text), widget (QLabel, label_gfxmode)
++#: ui/kcm_grub2.ui:256
++msgctxt "@label:listbox"
++msgid "GRUB:"
++msgstr "GRUB:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_gfxpayload)
++#: ui/kcm_grub2.ui:270
++msgctxt "@label:listbox"
++msgid "Linux Kernel:"
++msgstr "Linux 内核:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_colors)
++#: ui/kcm_grub2.ui:287
++msgctxt "@title:group"
++msgid "Colors"
++msgstr "颜色"
++
++#. i18n: ectx: property (text), widget (QLabel, label_normalForeground)
++#: ui/kcm_grub2.ui:295
++msgctxt "@label:chooser"
++msgid "Normal Foreground (Text):"
++msgstr "正常前景(文字):"
++
++#. i18n: ectx: property (text), widget (QLabel, label_highlightForeground)
++#: ui/kcm_grub2.ui:305
++msgctxt "@label:chooser"
++msgid "Highlight Foreground (Text):"
++msgstr "突显的前景(文字):"
++
++#. i18n: ectx: property (text), widget (QLabel, label_normalBackground)
++#: ui/kcm_grub2.ui:319
++msgctxt "@label:chooser"
++msgid "Normal Background:"
++msgstr "正常背景:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_highlightBackground)
++#: ui/kcm_grub2.ui:329
++msgctxt "@label:chooser"
++msgid "Highlight Background:"
++msgstr "突显的背景:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_background)
++#: ui/kcm_grub2.ui:344
++msgctxt "@title:group Refers to the image shown behind the boot menu."
++msgid "Background"
++msgstr "背景"
++
++#. i18n: ectx: property (text), widget (QLabel, label_background)
++#: ui/kcm_grub2.ui:350
++msgctxt "@label:textbox"
++msgid "Wallpaper:"
++msgstr "桌面:"
++
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_preview)
++#: ui/kcm_grub2.ui:362
++msgctxt "@action:button"
++msgid "Preview"
++msgstr "预览"
++
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_create)
++#: ui/kcm_grub2.ui:369
++msgctxt "@action:button"
++msgid "Create"
++msgstr "建立"
++
++#. i18n: ectx: property (text), widget (QLabel, label_theme)
++#: ui/kcm_grub2.ui:378
++msgctxt "@label:textbox"
++msgid "Theme:"
++msgstr "主题:"
++
++#. i18n: ectx: attribute (title), widget (QWidget, tab_2)
++#: ui/kcm_grub2.ui:405
++msgctxt "@title:tab Refers to settings."
++msgid "Advanced"
++msgstr "进阶"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_linux)
++#: ui/kcm_grub2.ui:411
++msgctxt "@title:group"
++msgid "Linux Kernel Arguments"
++msgstr "Linux 内核参数"
++
++#. i18n: ectx: property (text), widget (QLabel, label_cmdlineDefault)
++#: ui/kcm_grub2.ui:417
++msgctxt "@label:textbox"
++msgid "Normal Entries:"
++msgstr "正常的项目:"
++
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_cmdlineDefaultSuggestions)
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_cmdlineSuggestions)
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_terminalSuggestions)
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_terminalInputSuggestions)
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_terminalOutputSuggestions)
++#: ui/kcm_grub2.ui:429 ui/kcm_grub2.ui:450 ui/kcm_grub2.ui:480
++#: ui/kcm_grub2.ui:501 ui/kcm_grub2.ui:522
++msgctxt "@action:button"
++msgid "Suggestions"
++msgstr "建议"
++
++#. i18n: ectx: property (text), widget (QLabel, label_cmdline)
++#: ui/kcm_grub2.ui:438
++msgctxt "@label:textbox"
++msgid "All Entries:"
++msgstr "所有的项目:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_terminal)
++#: ui/kcm_grub2.ui:462
++msgctxt "@title:group Noun."
++msgid "Terminal"
++msgstr "终端"
++
++#. i18n: ectx: property (text), widget (QLabel, label_terminal)
++#: ui/kcm_grub2.ui:468
++msgctxt "@label:textbox Noun."
++msgid "Terminal:"
++msgstr "终端:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_terminalInput)
++#: ui/kcm_grub2.ui:489
++msgctxt "@label:textbox"
++msgid "Input Terminal:"
++msgstr "输入终端:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_terminalOutput)
++#: ui/kcm_grub2.ui:510
++msgctxt "@label:textbox"
++msgid "Output Terminal:"
++msgstr "输出终端:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_other)
++#: ui/kcm_grub2.ui:534
++msgctxt "@title:group Refers to settings."
++msgid "Other"
++msgstr "其他"
++
++#. i18n: ectx: property (text), widget (QLabel, label_distributor)
++#: ui/kcm_grub2.ui:540
++msgctxt "@label:textbox"
++msgid "Distributor:"
++msgstr "发布者:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_serial)
++#: ui/kcm_grub2.ui:550
++msgctxt "@label:textbox"
++msgid "Serial Command:"
++msgstr "序列命令:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_initTune)
++#: ui/kcm_grub2.ui:560
++msgctxt "@label:textbox"
++msgid "Init Tune:"
++msgstr "初始化调整:"
++
++#. i18n: ectx: property (text), widget (QLabel, label_uuid)
++#: ui/kcm_grub2.ui:570
++msgctxt "@option:check"
++msgid "Enable UUIDs:"
++msgstr "开启 UUID:"
++
++#. i18n: ectx: property (title), widget (QGroupBox, groupBox_tools)
++#: ui/kcm_grub2.ui:596
++msgctxt "@title:group"
++msgid "Tools"
++msgstr "工具"
++
++#. i18n: ectx: property (text), widget (KPushButton, kpushbutton_install)
++#: ui/kcm_grub2.ui:608
++msgctxt "@action:button"
++msgid "Install/Recover Bootloader"
++msgstr "安装/恢复启动加载器"
++
++#. i18n: ectx: property (text), widget (QLabel, label)
++#: ui/removeDlg.ui:17
++msgctxt "@label:listbox"
++msgid "Select entries to remove:"
++msgstr "选择要移除的项目:"
++
++#. i18n: ectx: property (toolTip), widget (QCheckBox, checkBox_headers)
++#: ui/removeDlg.ui:34
++msgctxt "@info:tooltip"
++msgid "Remove associated kernel header files."
++msgstr "移除相关的内核头文件。"
++
++#. i18n: ectx: property (text), widget (QCheckBox, checkBox_headers)
++#: ui/removeDlg.ui:37
++msgctxt "@option:check"
++msgid "Also remove associated old packages"
++msgstr "同时移除相关的旧包"
++
++#~ msgctxt "@info"
++#~ msgid "No valid GRUB2/BURG installation could be detected!"
++#~ msgstr "没检测到任何合法的 GRUB2/BURG 安装。"
++
++#~ msgctxt "@action:button"
++#~ msgid "Reload Configuration"
++#~ msgstr "重新载入设置"
++
++#~ msgctxt "@item:inlistbox"
++#~ msgid "Image"
++#~ msgstr "图像"
++
++#~ msgctxt "@info"
++#~ msgid "Could not locate <command>%1</command> executable."
++#~ msgstr "找不到 <command>%1</command> 执行档。"
++
++#~ msgid "Path of the GRUB menu file."
++#~ msgstr "GRUB 选单文件路径。"
++
++#~ msgid "Path of the GRUB configuration file."
++#~ msgstr "GRUB 设置文件路径。"
++
++#~ msgid "Path of the GRUB environment file."
++#~ msgstr "GRUB 环境文件路径。"
++
++#~ msgid "Path of the GRUB memtest script."
++#~ msgstr "GRUB 内存测试脚本路径。"
++
++#~ msgctxt "@info"
++#~ msgid ""
++#~ "Some necessary GRUB configuration files are missing/invalid.<br/>Please "
++#~ "select an action:"
++#~ msgstr "有些必要的 GRUB 设置文件不见了,或是不正确。<br/>请选择一个动作:"
++
++#~ msgctxt "@option:radio"
++#~ msgid "Recover GRUB from a previous installation"
++#~ msgstr "从前一次安装恢复 GRUB"
++
++#~ msgctxt "@option:radio"
++#~ msgid "Manually browse for GRUB configuration files"
++#~ msgstr "手动浏览选择 GRUB 设置文件"
++
++#~ msgctxt "@label:textbox"
++#~ msgid "GRUB Menu File:"
++#~ msgstr "GRUB 选单文件:"
++
++#~ msgctxt "@label:textbox"
++#~ msgid "GRUB Environment File:"
++#~ msgstr "GRUB 环境文件:"
++
++#~ msgctxt "@label:textbox"
++#~ msgid "GRUB Memtest Script:"
++#~ msgstr "GRUB 内存测试脚本:"
++
++#~ msgctxt "@info"
++#~ msgid "This is your current kernel!<br/>Are you sure you want to remove it?"
++#~ msgstr "这是您目前在使用的内核!<br/>您确定要移除它吗?"
++
++#~ msgid "%1 GiB"
++#~ msgstr "%1 GB"
+diff --git a/po/zh_TW/CMakeLists.txt b/po/zh_TW/CMakeLists.txt
+index 93d2b02..01c5b48 100644
+--- a/po/zh_TW/CMakeLists.txt
++++ b/po/zh_TW/CMakeLists.txt
+@@ -1,2 +1,2 @@
+ file( GLOB _po_files *.po )
+-GETTEXT_PROCESS_PO_FILES( zh_TW ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
++GETTEXT_PROCESS_PO_FILES( zh_TW ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} PO_FILES ${_po_files} )
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 2e46392..740508b 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ add_subdirectory(helper)
+
+ # Set Include Directories
+-set(kcm_grub2_INCLUDE_DIRS ${KDE4_INCLUDES})
++# set(kcm_grub2_INCLUDE_DIRS ${KDE4_INCLUDES})
+ if(HAVE_IMAGEMAGICK)
+ set(kcm_grub2_INCLUDE_DIRS ${kcm_grub2_INCLUDE_DIRS} ${ImageMagick_INCLUDE_DIRS})
+ endif(HAVE_IMAGEMAGICK)
+@@ -12,15 +12,15 @@ elseif(HAVE_QPACKAGEKIT)
+ endif(HAVE_QAPT)
+
+ # Set Sources
+-set(kcm_grub2_SRCS common.cpp entry.cpp installDlg.cpp kcm_grub2.cpp)
+-kde4_add_ui_files(kcm_grub2_SRCS ../ui/installDlg.ui ../ui/kcm_grub2.ui)
++set(kcm_grub2_SRCS common.cpp entry.cpp installDlg.cpp kcm_grub2.cpp widgets/regexpinputdialog.cpp)
++ki18n_wrap_ui(kcm_grub2_SRCS ../ui/installDlg.ui ../ui/kcm_grub2.ui)
+ if(HAVE_IMAGEMAGICK)
+ set(kcm_grub2_SRCS ${kcm_grub2_SRCS} convertDlg.cpp)
+- kde4_add_ui_files(kcm_grub2_SRCS ../ui/convertDlg.ui)
++ ki18n_wrap_ui(kcm_grub2_SRCS ../ui/convertDlg.ui)
+ endif(HAVE_IMAGEMAGICK)
+ if(HAVE_QAPT OR HAVE_QPACKAGEKIT)
+ set(kcm_grub2_SRCS ${kcm_grub2_SRCS} removeDlg.cpp)
+- kde4_add_ui_files(kcm_grub2_SRCS ../ui/removeDlg.ui)
++ ki18n_wrap_ui(kcm_grub2_SRCS ../ui/removeDlg.ui)
+ endif(HAVE_QAPT OR HAVE_QPACKAGEKIT)
+ if(HAVE_QAPT)
+ if(QAPT_VERSION_MAJOR EQUAL 1)
+@@ -33,7 +33,14 @@ elseif(HAVE_QPACKAGEKIT)
+ endif(HAVE_QAPT)
+
+ # Set Link Libraries
+-set(kcm_grub2_LINK_LIBS ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS})
++set(kcm_grub2_LINK_LIBS
++ Qt5::Widgets
++ KF5::ConfigWidgets
++ KF5::KIOWidgets
++ KF5::I18n
++ KF5::Auth
++ KF5::Solid
++ ) #
+ if(HAVE_IMAGEMAGICK)
+ set(kcm_grub2_LINK_LIBS ${kcm_grub2_LINK_LIBS} ${ImageMagick_LIBRARIES})
+ endif(HAVE_IMAGEMAGICK)
+@@ -45,12 +52,12 @@ endif(HAVE_QAPT)
+
+ # Definitions
+ if(HAVE_IMAGEMAGICK)
+- add_definitions(${KDE4_ENABLE_EXCEPTIONS})
++ add_definitions(${KDE_ENABLE_EXCEPTIONS})
+ endif(HAVE_IMAGEMAGICK)
+
+ # Build & Link
+ include_directories(${kcm_grub2_INCLUDE_DIRS})
+-kde4_add_plugin(kcm_grub2 ${kcm_grub2_SRCS})
++add_library(kcm_grub2 MODULE ${kcm_grub2_SRCS})
+ target_link_libraries(kcm_grub2 ${kcm_grub2_LINK_LIBS})
+
+ # Install
+diff --git a/src/common.cpp b/src/common.cpp
+index b84c387..c54f7df 100644
+--- a/src/common.cpp
++++ b/src/common.cpp
+@@ -66,7 +66,7 @@ QString unquoteWord(const QString &word)
+ return QString();
+ }
+ stream >> ch;
+- switch (ch.toAscii()) {
++ switch (ch.toLatin1()) {
+ case '$':
+ case '"':
+ case '\\':
+@@ -92,7 +92,7 @@ QString unquoteWord(const QString &word)
+ return unquotedWord;
+ }
+ stream >> ch;
+- switch (ch.toAscii()) {
++ switch (ch.toLatin1()) {
+ case '\n':
+ break;
+ default:
+diff --git a/src/convertDlg.cpp b/src/convertDlg.cpp
+index d61cfe1..ea7eb1e 100644
+--- a/src/convertDlg.cpp
++++ b/src/convertDlg.cpp
+@@ -19,23 +19,34 @@
+ #include "convertDlg.h"
+
+ //KDE
+-#include <KFileDialog>
+ #include <KMessageBox>
+-#include <KMimeType>
+-
++//#include <KMimeType>
++//Qt
++#include <QFileDialog>
++#include <QMimeType>
++#include <QMimeDatabase>
+ //ImageMagick
+ #include <Magick++.h>
+
+ //Ui
+ #include "ui_convertDlg.h"
+
+-ConvertDialog::ConvertDialog(QWidget *parent, Qt::WFlags flags) : KDialog(parent, flags)
++ConvertDialog::ConvertDialog(QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags)
+ {
+ QWidget *widget = new QWidget(this);
+ ui = new Ui::ConvertDialog;
+ ui->setupUi(widget);
+- setMainWidget(widget);
+-
++ QVBoxLayout *mainLayout = new QVBoxLayout;
++ setLayout(mainLayout);
++ mainLayout->addWidget(widget);
++ QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
++ mainLayout->addWidget(buttonBox);
++ buttonBox->button(QDialogButtonBox::Ok)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOkButton));
++ buttonBox->button(QDialogButtonBox::Cancel)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton));
++ connect(buttonBox, SIGNAL(accepted()), this, SLOT(SlotOkButtonClicked()));
++ connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
++
++ QMimeDatabase db;
+ QString readFilter;
+ QList<Magick::CoderInfo> coderList;
+ coderInfoList(&coderList, Magick::CoderInfo::TrueMatch, Magick::CoderInfo::AnyMatch, Magick::CoderInfo::AnyMatch);
+@@ -47,14 +58,14 @@ ConvertDialog::ConvertDialog(QWidget *parent, Qt::WFlags flags) : KDialog(parent
+ readFilter.remove(0, 1);
+ readFilter.append('|').append(i18nc("@item:inlistbox", "ImageMagick supported image formats"));
+
+- QString writeFilter = QString("*%1|%5 (%1)\n*%2|%6 (%2)\n*%3 *%4|%7 (%3 %4)").arg(".png", ".tga", ".jpg", ".jpeg", KMimeType::mimeType("image/png")->comment(), KMimeType::mimeType("image/x-tga")->comment(), KMimeType::mimeType("image/jpeg")->comment());
++ QString writeFilter = QString("*%1|%5 (%1)\n*%2|%6 (%2)\n*%3 *%4|%7 (%3 %4)").arg(".png", ".tga", ".jpg", ".jpeg", db.mimeTypeForName("image/png").comment(), db.mimeTypeForName("image/x-tga").comment(), db.mimeTypeForName("image/jpeg").comment());
+
+ ui->kurlrequester_image->setMode(KFile::File | KFile::ExistingOnly | KFile::LocalOnly);
+- ui->kurlrequester_image->fileDialog()->setOperationMode(KFileDialog::Opening);
+- ui->kurlrequester_image->fileDialog()->setFilter(readFilter);
++ ui->kurlrequester_image->fileDialog()->setAcceptMode(QFileDialog::AcceptOpen);
++ ui->kurlrequester_image->fileDialog()->setNameFilter(readFilter);
+ ui->kurlrequester_converted->setMode(KFile::File | KFile::LocalOnly);
+- ui->kurlrequester_converted->fileDialog()->setOperationMode(KFileDialog::Saving);
+- ui->kurlrequester_converted->fileDialog()->setFilter(writeFilter);
++ ui->kurlrequester_converted->fileDialog()->setAcceptMode(QFileDialog::AcceptSave);
++ ui->kurlrequester_converted->fileDialog()->setNameFilter(writeFilter);
+ }
+ ConvertDialog::~ConvertDialog()
+ {
+@@ -69,16 +80,17 @@ void ConvertDialog::setResolution(int width, int height)
+ }
+ }
+
+-void ConvertDialog::slotButtonClicked(int button)
++void ConvertDialog::slotOkButtonClicked()
+ {
+- if (button == KDialog::Ok) {
++ QRegularExpression getdirectory("\\S*/");
++
+ if (ui->kurlrequester_image->text().isEmpty() || ui->kurlrequester_converted->text().isEmpty()) {
+ KMessageBox::information(this, i18nc("@info", "Please fill in both <interface>Image</interface> and <interface>Convert To</interface> fields."));
+ return;
+ } else if (ui->spinBox_width->value() == 0 || ui->spinBox_height->value() == 0) {
+ KMessageBox::information(this, i18nc("@info", "Please fill in both <interface>Width</interface> and <interface>Height</interface> fields."));
+ return;
+- } else if (!QFileInfo(ui->kurlrequester_converted->url().directory()).isWritable()) {
++ } else if (!QFileInfo(getdirectory.match(ui->kurlrequester_converted->url().toLocalFile()).captured(1)).isWritable()) {
+ KMessageBox::information(this, i18nc("@info", "You do not have write permissions in this directory, please select another destination."));
+ return;
+ }
+@@ -92,6 +104,5 @@ void ConvertDialog::slotButtonClicked(int button)
+ if (ui->checkBox_wallpaper->isChecked()) {
+ emit splashImageCreated(ui->kurlrequester_converted->url().toLocalFile());
+ }
+- }
+- KDialog::slotButtonClicked(button);
++ this->accept();
+ }
+diff --git a/src/convertDlg.h b/src/convertDlg.h
+index a3c63ee..05516b5 100644
+--- a/src/convertDlg.h
++++ b/src/convertDlg.h
+@@ -18,8 +18,8 @@
+ #ifndef CONVERTDLG_H
+ #define CONVERTDLG_H
+
+-//KDE
+-#include <KDialog>
++//Qt
++#include <QDialog>
+
+ //Ui
+ namespace Ui
+@@ -27,16 +27,16 @@ namespace Ui
+ class ConvertDialog;
+ }
+
+-class ConvertDialog : public KDialog
++class ConvertDialog : public QDialog
+ {
+ Q_OBJECT
+ public:
+- explicit ConvertDialog(QWidget *parent = 0, Qt::WFlags flags = 0);
++ explicit ConvertDialog(QWidget *parent = 0, Qt::WindowFlags flags = 0);
+ virtual ~ConvertDialog();
+
+ void setResolution(int width, int height);
+ protected Q_SLOTS:
+- virtual void slotButtonClicked(int button);
++ virtual void slotOkButtonClicked();
+ Q_SIGNALS:
+ void splashImageCreated(const QString &splashImage);
+ private:
+diff --git a/src/helper/CMakeLists.txt b/src/helper/CMakeLists.txt
+index 6a8792b..38854e7 100644
+--- a/src/helper/CMakeLists.txt
++++ b/src/helper/CMakeLists.txt
+@@ -8,17 +8,17 @@ endif(HAVE_HD)
+ set(kcmgrub2helper_SRCS helper.cpp)
+
+ # Set Link Libraries
+-set(kcmgrub2helper_LINK_LIBS ${KDE4_KDECORE_LIBS})
++set(kcmgrub2helper_LINK_LIBS Qt5::DBus KF5::Auth KF5::I18n)
+ if(HAVE_HD)
+ set(kcmgrub2helper_LINK_LIBS ${kcmgrub2helper_LINK_LIBS} ${HD_LIBRARY})
+ endif(HAVE_HD)
+
+ # Build & Link
+ include_directories(${kcmgrub2helper_INCLUDE_DIRS})
+-kde4_add_executable(kcmgrub2helper ${kcmgrub2helper_SRCS})
++add_executable(kcmgrub2helper ${kcmgrub2helper_SRCS})
+ target_link_libraries(kcmgrub2helper ${kcmgrub2helper_LINK_LIBS})
+
+ # Install
+-install(TARGETS kcmgrub2helper DESTINATION ${LIBEXEC_INSTALL_DIR})
+-kde4_install_auth_helper_files(kcmgrub2helper org.kde.kcontrol.kcmgrub2 root)
+-kde4_install_auth_actions(org.kde.kcontrol.kcmgrub2 kcmgrub2.actions)
++install(TARGETS kcmgrub2helper DESTINATION ${KAUTH_HELPER_INSTALL_DIR})
++kauth_install_helper_files(kcmgrub2helper org.kde.kcontrol.kcmgrub2 root)
++kauth_install_actions(org.kde.kcontrol.kcmgrub2 kcmgrub2.actions)
+diff --git a/src/helper/helper.cpp b/src/helper/helper.cpp
+index f9397bb..b0ee028 100644
+--- a/src/helper/helper.cpp
++++ b/src/helper/helper.cpp
+@@ -25,11 +25,9 @@
+ #include <QDir>
+
+ //KDE
+-#include <KDebug>
+-#include <KGlobal>
+-#include <KLocale>
++//#include <KDebug>
+ #include <KProcess>
+-#include <KAuth/HelperSupport>
++#include <klocalizedstring.h>
+
+ //Project
+ #include "../config.h"
+@@ -44,7 +42,6 @@ static const QString path = QLatin1String("/usr/sbin:/usr/bin:/sbin:/bin");
+
+ Helper::Helper()
+ {
+- KGlobal::locale()->insertCatalog("kcm-grub2");
+ qputenv("PATH", path.toLatin1());
+ }
+
+@@ -54,19 +51,36 @@ ActionReply Helper::executeCommand(const QStringList &command)
+ process.setProgram(command);
+ process.setOutputChannelMode(KProcess::MergedChannels);
+
+- kDebug() << "Executing" << command.join(" ");
++ qDebug() << "Executing" << command.join(" ");
+ int exitCode = process.execute();
+
+ ActionReply reply;
+ if (exitCode != 0) {
+- reply = ActionReply::HelperErrorReply;
+- reply.setErrorCode(exitCode);
++ reply = ActionReply::HelperErrorReply();
++ //TO BE FIXED
++ reply.setErrorCode(ActionReply::Error::InvalidActionError);
+ }
+ reply.addData("command", command);
+ reply.addData("output", process.readAll());
+ return reply;
+ }
+
++ActionReply Helper::initialize(QVariantMap args)
++{
++ ActionReply reply;
++ switch (args.value("actionType").toInt()) {
++ case actionLoad:
++ reply = load(args);
++ break;
++ case actionProbe:
++ reply = probe(args);
++ break;
++ case actionProbevbe:
++ reply = probevbe(args);
++ }
++ return reply;
++}
++
+ ActionReply Helper::defaults(QVariantMap args)
+ {
+ Q_UNUSED(args)
+@@ -75,17 +89,17 @@ ActionReply Helper::defaults(QVariantMap args)
+ QString originalConfigFileName = configFileName + ".original";
+
+ if (!QFile::exists(originalConfigFileName)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", i18nc("@info", "Original configuration file <filename>%1</filename> does not exist.", originalConfigFileName));
+ return reply;
+ }
+ if (!QFile::remove(configFileName)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", i18nc("@info", "Cannot remove current configuration file <filename>%1</filename>.", configFileName));
+ return reply;
+ }
+ if (!QFile::copy(originalConfigFileName, configFileName)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", i18nc("@info", "Cannot copy original configuration file <filename>%1</filename> to <filename>%2</filename>.", originalConfigFileName, configFileName));
+ return reply;
+ }
+@@ -101,7 +115,7 @@ ActionReply Helper::install(QVariantMap args)
+ if (mountPoint.isEmpty()) {
+ for (int i = 0; QDir(mountPoint = QString("%1/kcm-grub2-%2").arg(QDir::tempPath(), QString::number(i))).exists(); i++);
+ if (!QDir().mkpath(mountPoint)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", i18nc("@info", "Failed to create temporary mount point."));
+ return reply;
+ }
+@@ -145,7 +159,7 @@ ActionReply Helper::load(QVariantMap args)
+
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", file.errorString());
+ return reply;
+ }
+@@ -190,7 +204,7 @@ ActionReply Helper::probevbe(QVariantMap args)
+ hd_free_hd_data(&hd_data);
+ reply.addData("gfxmodes", gfxmodes);
+ #else
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ #endif
+
+ return reply;
+@@ -207,7 +221,7 @@ ActionReply Helper::save(QVariantMap args)
+
+ QFile file(configFileName);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+- reply = ActionReply::HelperErrorReply;
++ reply = ActionReply::HelperErrorReply();
+ reply.addData("errorDescription", file.errorString());
+ return reply;
+ }
+@@ -237,4 +251,4 @@ ActionReply Helper::save(QVariantMap args)
+ return grub_mkconfigReply;
+ }
+
+-KDE4_AUTH_HELPER_MAIN("org.kde.kcontrol.kcmgrub2", Helper)
++KAUTH_HELPER_MAIN("org.kde.kcontrol.kcmgrub2", Helper)
+diff --git a/src/helper/helper.h b/src/helper/helper.h
+index 782d382..18e6026 100644
+--- a/src/helper/helper.h
++++ b/src/helper/helper.h
+@@ -17,9 +17,10 @@
+
+ #ifndef HELPER_H
+ #define HELPER_H
+-
++//Qt
++#include <QDebug>
+ //KDE
+-#include <KAuth/ActionReply>
++#include <KAuth>
+ using namespace KAuth;
+
+ class Helper : public QObject
+@@ -29,12 +30,14 @@ class Helper : public QObject
+ Helper();
+ private:
+ ActionReply executeCommand(const QStringList &command);
+-public Q_SLOTS:
+- ActionReply defaults(QVariantMap args);
+- ActionReply install(QVariantMap args);
++ //merge
+ ActionReply load(QVariantMap args);
+ ActionReply probe(QVariantMap args);
+ ActionReply probevbe(QVariantMap args);
++public Q_SLOTS:
++ ActionReply initialize(QVariantMap args);
++ ActionReply defaults(QVariantMap args);
++ ActionReply install(QVariantMap args);
+ ActionReply save(QVariantMap args);
+ };
+
+diff --git a/src/helper/kcmgrub2.actions b/src/helper/kcmgrub2.actions
+index eaa7a1c..aebc5ce 100644
+--- a/src/helper/kcmgrub2.actions
++++ b/src/helper/kcmgrub2.actions
+@@ -184,7 +184,7 @@ Description[zh_TW]=安裝 GRUB2 開機載入器設定需要管理者權限
+ Policy=auth_admin
+ Persistence=session
+
+-[org.kde.kcontrol.kcmgrub2.load]
++[org.kde.kcontrol.kcmgrub2.initialize]
+ Name=Load the GRUB2 Bootloader settings
+ Name[bs]=Učitaj postavke GRUB2 pokretača sistema
+ Name[ca]=Carrega l'arranjament del gestor d'arrencada Grub2
+@@ -259,150 +259,6 @@ Description[zh_TW]=載入 GRUB2 開機載入器設定需要管理者權限
+ Policy=auth_admin
+ Persistence=session
+
+-[org.kde.kcontrol.kcmgrub2.probe]
+-Name=Probe devices for their GRUB2 names
+-Name[bs]=Testiranje uređaja za njihova GRUB2 imena
+-Name[ca]=Prova els dispositius pels seus noms a Grub2
+-Name[ca@valencia]=Prova els dispositius pels seus noms a Grub2
+-Name[cs]=Prozkoumat zařízení pro jejich GRUB2 názvy
+-Name[da]=Søg efter enheders GRUB2-navne
+-Name[de]=Geräte auf ihre GRUB2-Namen abfragen.
+-Name[el]=Έλεγχος συσκευών αν έχουν ονόματα GRUB2
+-Name[es]=Examinar los nombres de los dispositivos en GRUB2
+-Name[et]=Seadmete kontrollimine GRUB2 nimede osas
+-Name[fi]=Tunnustele laitteet niiden GRUB2-nimien selvittämiseksi
+-Name[fr]=Interroger les périphériques pour trouver leurs noms GRUB2
+-Name[gl]=Probar os dispositivos polo seu nome en GRUB2
+-Name[hu]=Eszközök vizsgálata a GRUB2 név meghatározásához
+-Name[it]=Sonda i dispositivi per trovarne i loro nomi in GRUB2
+-Name[lt]=Tikrini įrenginius dėl GRUB2 vardų
+-Name[mr]=साधनांच्या GRUB2 नावाकरिता साधने शोधा
+-Name[nb]=Undersøk enheter for å finne deres GRUB2-navn
+-Name[nds]=De Reedschappen ehr Grub2-Naams opdecken
+-Name[nl]=Apparaten aftasten voor hun GRUB2 namen
+-Name[pa]=ਜੰਤਰ ਨੂੰ ਉਹਨਾਂ ਦੇ ਗਰਬ2 ਨਾਂ ਲਈ ਪੜਤਾਲ ਕਰੋ
+-Name[pl]=Wykryj nazwy urządzeń dla GRUB2
+-Name[pt]=Detectar os nomes dos dispositivos no GRUB2
+-Name[pt_BR]=Detectar os nomes dos dispositivos no GRUB2
+-Name[ro]=Sondează dispozitivele pentru denumirile lor GRUB2
+-Name[ru]=Определение имён устройств, используемых загрузчиком GRUB2
+-Name[sk]=Vyskúšať zariadenia pre ich názvy v GRUB2
+-Name[sl]=Preizkusi naprave za njihova imena GRUB2
+-Name[sv]=Sök igenom enheter efter deras GRUB2-namn
+-Name[tr]=Aygıtları GRUB2 isimleri için araştır
+-Name[uk]=Визначення назв пристроїв GRUB2
+-Name[x-test]=xxProbe devices for their GRUB2 namesxx
+-Name[zh_CN]=探测设备的 GRUB2 名字
+-Name[zh_TW]=偵測裝置在 GRUB2 上的名稱
+-Description=Administrator authorization is required to probe devices for their GRUB2 names
+-Description[bs]=Administratorska potvrda je potrebna za upit uređaja za njihova GRUB2 imena
+-Description[ca]=Es requereix autorització de l'administrador per a provar els dispositius pels seus noms a Grub2
+-Description[ca@valencia]=Es requereix autorització de l'administrador per a provar els dispositius pels seus noms a Grub2
+-Description[cs]=Pro prozkoumání GRUB2 názvů zařízení je potřeba oprávnění administrátora
+-Description[da]=Administrator-godkendelse kræves for at søge efter enheders GRUB2-navne
+-Description[de]=Zur Abfrage der Geräte nach ihren GRUB2-Namen sind Systemverwalterrechte erforderlich.
+-Description[el]=Απαιτείται εξουσιοδότηση διαχειριστή για τον έλεγχο συσκευών για ονόματα GRUB2
+-Description[es]=Se requiere la autorización del administrador para examinar los nombres de los dispositivos en GRUB2
+-Description[et]=Seadmete kontrollimiseks GRUB2 nimede osas on vajalik autentimine administraatorina
+-Description[fi]=Laitteiden tunnusteleminen niiden GRUB2-nimien selvittämiseksi vaatii pääkäyttäjän oikeudet
+-Description[fr]=L'autorisation de l'administrateur est requise pour interroger les périphériques pour trouver leurs noms GRUB2
+-Description[gl]=Precísase a autorización do administrador para probar os dispositivos polo seu nome en GRUB2
+-Description[hu]=Rendszergazdai jogosultságok szükségesek az eszközök GRUB2 nevének meghatározásához
+-Description[it]=Sono i richiesti i privilegi amministrativi per sondare i dispositivi e trovarne i nomi in GRUB2
+-Description[lt]=Administratoriaus įgaliojimas reikalingas, kad patikrinti įrenginių GRUB2 vardus
+-Description[mr]=साधनांच्या GRUB2 नावाकरिता साधने शोधण्याकरिता व्यवस्थापकाची परवानगी आवश्यक आहे
+-Description[nb]=Det kreves autorisasjon som administrator for å søke etter enheters GRUB2-navn
+-Description[nds]=De Reedschappen ehr Grub2-Naams laat sik bloots mit Systeempleger-Verlööf opdecken.
+-Description[nl]=Autorisatie van systeembeheerder is vereist om apparaten af te tasten voor hun GRUB2 namen
+-Description[pl]=Do wykrycia nazw urządzeń dla GRUB2 potrzebne są uprawnienia administratora
+-Description[pt]=É necessária a autorização do administrador para detectar os nomes dos dispositivos no GRUB2
+-Description[pt_BR]=É necessária a autorização do administrador para detectar os nomes dos dispositivos no GRUB2
+-Description[ro]=Este necesară autorizarea ca administrator pentru a sonda dispozitivele pentru denumirile lor GRUB2
+-Description[ru]=Необходимы права администратора для определения имён устройств, используемых загрузчиком GRUB2
+-Description[sk]=Vyžaduje sa overenie administrátora na vyskúšanie zariadení pre ich názvy v GRUB2
+-Description[sl]=Za preizkus naprav za njihovimi imeni GRUB2 je zahtevana pooblastitev skrbnika
+-Description[sv]=Administratörsbehörighet krävs för att söka igenom enheter efter deras GRUB2 namn
+-Description[tr]=Aygıtların GRUB2 isimlerini araştırmak için yönetici yetkilendirmesi gerekli
+-Description[uk]=Для визначення назв пристроїв GRUB2 слід набути прав доступу адміністратора
+-Description[x-test]=xxAdministrator authorization is required to probe devices for their GRUB2 namesxx
+-Description[zh_CN]=探测设备的 GRUB2 名字需要管理员权限
+-Description[zh_TW]=偵測裝置在 GRUB2 上的名稱需要管理者權限
+-Policy=auth_admin
+-Persistence=session
+-
+-[org.kde.kcontrol.kcmgrub2.probevbe]
+-Name=Probe VESA BIOS Extensions
+-Name[bs]=Ispitaj VESA BIOS proširenja
+-Name[ca]=Prova les extensions VESA del BIOS
+-Name[ca@valencia]=Prova les extensions VESA del BIOS
+-Name[cs]=Prozkoumat rozšířeni VESA BIOS (VBE)
+-Name[da]=Søg efter VESA BIOS-udvidelser
+-Name[de]=VESA-BIOS-Erweiterungen ermitteln
+-Name[el]=Έλεγχος για VESA BIOS επεκτάσεις
+-Name[es]=Examinar las extensiones BIOS de VESA
+-Name[et]=VESA BIOS-e laiendite kontrollimine
+-Name[fi]=Tunnustele VESA BIOS -laajennukset
+-Name[fr]=Détecter les extensions « BIOS VESA »
+-Name[ga]=Fiosraigh Eisínteachtaí BIOS VESA
+-Name[gl]=Probar os engadidos VESA BIOS
+-Name[hu]=VESA BIOS kiterjesztések vizsgálata
+-Name[it]=Sonda le estensioni per il BIOS della VESA
+-Name[lt]=Tikrinti VESA BIOS plėtinius
+-Name[mr]=VESA BIOS विस्तारणे शोधा
+-Name[nb]=Se etter VESA BIOS-utvidelser
+-Name[nds]=VESA-BIOS-Verwiedern opdecken
+-Name[nl]=VESA BIOS extensies aftasten
+-Name[pa]=VESA BIOS ਇਕਸਟੈਨਸ਼ਨ ਲਈ ਪੜਤਾਲ
+-Name[pl]=Wykryj rozszerzenia VESA BIOS
+-Name[pt]=Testar as extensões da BIOS para o VESA
+-Name[pt_BR]=Testar as extensões da BIOS para o VESA
+-Name[ro]=Sondează extensiile BIOS VESA
+-Name[ru]=Проверка расширений BIOS в стандарте VESA (VBE)
+-Name[sk]=Vyskúšať rozšírenia VESA BIOSu
+-Name[sl]=Preizkusi razširitve VESA BIOS
+-Name[sv]=Sök efter VESA BIOS-utökningar
+-Name[tr]=VESA BIOS Uzantılarını Araştır
+-Name[uk]=Виявлення розширень BIOS VESA
+-Name[x-test]=xxProbe VESA BIOS Extensionsxx
+-Name[zh_CN]=探测 VESA BIOS 扩展
+-Name[zh_TW]=偵測 VESA BIOS 延伸
+-Description=Administrator authorization is required to probe VESA BIOS Extensions
+-Description[bs]=Administratorska potvrda je potrebna za testiranje VESA BIOS proširenja
+-Description[ca]=Es requereix autorització de l'administrador per a provar les extensions VESA del BIOS
+-Description[ca@valencia]=Es requereix autorització de l'administrador per a provar les extensions VESA del BIOS
+-Description[cs]=Pro prozkoumání rozšíření VESA BIOS (VBE) je potřeba oprávnění administrátora
+-Description[da]=Administrator-godkendelse kræves for at søge efter VESA BIOS-udvidelser
+-Description[de]=Zur Ermittlung der VESA-BIOS-Erweiterungen sind Systemverwalterrechte erforderlich.
+-Description[el]=Απαιτείται εξουσιοδότηση διαχειριστή για τον έλεγχο VESA BIOS επεκτάσεων
+-Description[es]=Se requiere la autorización del administrador para examinar las extensiones BIOS de VESA
+-Description[et]=VESA BIOS-e laiendite kontrollimiseks on vajalik autentimine administraatorina
+-Description[fi]=VESA BIOS -laajennusten tunnusteleminen vaatii pääkäyttäjän oikeudet
+-Description[fr]=L'autorisation de l'administrateur est requise pour détecter les extensions BIOS VESA
+-Description[ga]=Is é riarthóir an chórais amháin atá in ann Eisínteachtaí BIOS VESA a fhiosrú
+-Description[gl]=Precísase a autorización do administrador para probar os engadidos VESA BIOS
+-Description[hu]=Rendszergazdai jogosultságok szükségesek a VESA BIOS kiterjesztések vizsgálatához
+-Description[it]=Sono i richiesti i privilegi amministrativi per sondare le estensioni per il BIOS della VESA
+-Description[lt]=Administratoriaus įgaliojimas reikalingas, kad patikrinti VESA BIOS plėtinius
+-Description[mr]=VESA BIOS विस्तारणे शोधण्याकरिता व्यवस्थापकाची परवानगी आवश्यक आहे
+-Description[nb]=Det kreves autorisasjon som administrator for å søke etter VESA BIOS-utvidcelser
+-Description[nds]=De VESA-BIOS-Verwiedern laat sik bloots mit Systeempleger-Verlööf opdecken.
+-Description[nl]=Autorisatie van systeembeheerder is vereist om VESA BIOS extensies af te tasten
+-Description[pl]=Do wykrycia rozszerzeń VESA BIOS potrzebne są uprawnienia administratora
+-Description[pt]=É necessária a autorização do administrador para testar a extensões da BIOS para o VESA
+-Description[pt_BR]=É necessária a autorização do administrador para testar a extensões da BIOS para o VESA
+-Description[ro]=Este necesară autorizarea ca administrator pentru a sonda extensiile BIOS VESA
+-Description[ru]=Для проверки расширений BIOS в стандарте VESA (VBE) необходимы права администратора
+-Description[sk]=Vyžaduje sa overenie administrátora na vyskúšanie rozšírení VESA BIOSu
+-Description[sl]=Za preizkus razširitev VESA BIOS GRUB2 je zahtevana pooblastitev skrbnika
+-Description[sv]=Administratörsbehörighet krävs för att söka efter VESA BIOS-utökningar
+-Description[tr]=VESA BIOS Uzantılarını araştırmak için yönetici yetkilendirmesi gerekli
+-Description[uk]=Для виявлення розширень BIOS VESA слід набути прав доступу адміністратора
+-Description[x-test]=xxAdministrator authorization is required to probe VESA BIOS Extensionsxx
+-Description[zh_CN]=探测 VESA BIOS 扩展需要管理员权限
+-Description[zh_TW]=偵測 VESA BIOS 延伸需要管理者權限
+-Policy=auth_admin
+-Persistence=session
+-
+ [org.kde.kcontrol.kcmgrub2.save]
+ Name=Save the GRUB2 Bootloader settings
+ Name[bs]=Snimie postavke GRUB2 pokretača sistema
+diff --git a/src/installDlg.cpp b/src/installDlg.cpp
+index ceff92c..fa239ef 100644
+--- a/src/installDlg.cpp
++++ b/src/installDlg.cpp
+@@ -21,36 +21,47 @@
+ //Qt
+ #include <QFile>
+ #include <QRadioButton>
+-
++#include <QPushButton>
+ //KDE
+-#include <kdeversion.h>
+ #include <KMessageBox>
+-#include <KProgressDialog>
+-#include <KAuth/ActionWatcher>
+-using namespace KAuth;
++//#include <KProgressDialog>
++
++#include <KFormat>
+ #include <Solid/Device>
+ #include <Solid/StorageAccess>
+ #include <Solid/StorageVolume>
+
++#include <KAuth>
++using namespace KAuth;
++
+ //Ui
+ #include "ui_installDlg.h"
+
+-InstallDialog::InstallDialog(QWidget *parent, Qt::WFlags flags) : KDialog(parent, flags)
++InstallDialog::InstallDialog(QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags)
+ {
+ QWidget *widget = new QWidget(this);
++ KFormat format;
+ ui = new Ui::InstallDialog;
+ ui->setupUi(widget);
+- setMainWidget(widget);
+- enableButtonOk(false);
++ QVBoxLayout *mainLayout = new QVBoxLayout;
++ setLayout(mainLayout);
++ mainLayout->addWidget(widget);
++ QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
++ mainLayout->addWidget(buttonBox);
++ buttonBox->button(QDialogButtonBox::Ok)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOkButton));
++ buttonBox->button(QDialogButtonBox::Cancel)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton));
++ connect(buttonBox, SIGNAL(accepted()), this, SLOT(SlotOkButtonClicked()));
++ connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
++ buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ setWindowTitle(i18nc("@title:window", "Install/Recover Bootloader"));
+- setWindowIcon(KIcon("system-software-update"));
++ setWindowIcon(QIcon::fromTheme(QStringLiteral("system-software-update")));
+ if (parent) {
+- setInitialSize(parent->size());
++ resize(parent->size());
+ }
+
+ ui->treeWidget_recover->headerItem()->setText(0, QString());
+- ui->treeWidget_recover->header()->setResizeMode(QHeaderView::Stretch);
+- ui->treeWidget_recover->header()->setResizeMode(0, QHeaderView::ResizeToContents);
++ ui->treeWidget_recover->header()->setSectionResizeMode(QHeaderView::Stretch);
++ ui->treeWidget_recover->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
+ Q_FOREACH(const Solid::Device &device, Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess)) {
+ if (!device.is<Solid::StorageAccess>() || !device.is<Solid::StorageVolume>()) {
+ continue;
+@@ -66,12 +77,12 @@ InstallDialog::InstallDialog(QWidget *parent, Qt::WFlags flags) : KDialog(parent
+
+ QString uuidDir = "/dev/disk/by-uuid/", uuid = volume->uuid(), name;
+ name = (QFile::exists((name = uuidDir + uuid)) || QFile::exists((name = uuidDir + uuid.toLower())) || QFile::exists((name = uuidDir + uuid.toUpper())) ? QFile::symLinkTarget(name) : QString());
+- QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget_recover, QStringList() << QString() << name << partition->filePath() << volume->label() << volume->fsType() << KGlobal::locale()->formatByteSize(volume->size()));
+- item->setIcon(1, KIcon(device.icon()));
++ QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget_recover, QStringList() << QString() << name << partition->filePath() << volume->label() << volume->fsType() << format.formatByteSize(volume->size())); //KGlobal::locale()->
++ item->setIcon(1, QIcon::fromTheme(device.icon()));
+ item->setTextAlignment(5, Qt::AlignRight | Qt::AlignVCenter);
+ ui->treeWidget_recover->addTopLevelItem(item);
+ QRadioButton *radio = new QRadioButton(ui->treeWidget_recover);
+- connect(radio, SIGNAL(clicked(bool)), this, SLOT(enableButtonOk(bool)));
++ connect(radio, SIGNAL(clicked(bool)), buttonBox->button(QDialogButtonBox::Ok), SLOT(setEnabled(bool)));
+ ui->treeWidget_recover->setItemWidget(item, 0, radio);
+ }
+ }
+@@ -80,11 +91,10 @@ InstallDialog::~InstallDialog()
+ delete ui;
+ }
+
+-void InstallDialog::slotButtonClicked(int button)
++void InstallDialog::SlotOkButtonClicked()
+ {
+- if (button == KDialog::Ok) {
+ Action installAction("org.kde.kcontrol.kcmgrub2.install");
+- installAction.setHelperID("org.kde.kcontrol.kcmgrub2");
++ installAction.setHelperId("org.kde.kcontrol.kcmgrub2");
+ for (int i = 0; i < ui->treeWidget_recover->topLevelItemCount(); i++) {
+ QRadioButton *radio = qobject_cast<QRadioButton *>(ui->treeWidget_recover->itemWidget(ui->treeWidget_recover->topLevelItem(i), 0));
+ if (radio && radio->isChecked()) {
+@@ -98,34 +108,37 @@ void InstallDialog::slotButtonClicked(int button)
+ KMessageBox::sorry(this, i18nc("@info", "Sorry, you have to select a partition with a proper name!"));
+ return;
+ }
+-#if KDE_IS_VERSION(4,6,0)
+- installAction.setParentWidget(this);
+-#endif
+
+- if (installAction.authorize() != Action::Authorized) {
+- return;
+- }
+
+- KProgressDialog progressDlg(this, i18nc("@title:window", "Installing"), i18nc("@info:progress", "Installing GRUB..."));
+- progressDlg.setAllowCancel(false);
++ QProgressDialog progressDlg(this, Qt::Dialog);
++ progressDlg.setWindowTitle(i18nc("@title:window", "Installing"));
++ progressDlg.setLabelText(i18nc("@info:progress", "Installing GRUB..."));
++ progressDlg.setCancelButton(0);
+ progressDlg.setModal(true);
+- progressDlg.progressBar()->setMinimum(0);
+- progressDlg.progressBar()->setMaximum(0);
++ progressDlg.setRange(0,0);
+ progressDlg.show();
+- connect(installAction.watcher(), SIGNAL(actionPerformed(ActionReply)), &progressDlg, SLOT(hide()));
+
+- ActionReply reply = installAction.execute();
+- if (reply.succeeded()) {
+- KDialog *dialog = new KDialog(this, Qt::Dialog);
+- dialog->setCaption(i18nc("@title:window", "Information"));
+- dialog->setButtons(KDialog::Ok | KDialog::Details);
+- dialog->setModal(true);
+- dialog->setDefaultButton(KDialog::Ok);
+- dialog->setEscapeButton(KDialog::Ok);
+- KMessageBox::createKMessageBox(dialog, QMessageBox::Information, i18nc("@info", "Successfully installed GRUB."), QStringList(), QString(), 0, KMessageBox::Notify, reply.data().value("output").toString()); // krazy:exclude=qclasses
++ ExecuteJob* reply = installAction.execute();
++ reply->exec();
++
++ //if (installAction.status() != Action::AuthorizedStatus ) {
++ // progressDlg.hide();
++ // return;
++ //}
++
++ //connect(reply, SIGNAL(result()), &progressDlg, SLOT(hide()));
++ progressDlg.hide();
++ if (reply->error()) {
++ KMessageBox::detailedError(this, i18nc("@info", "Failed to install GRUB."), reply->data().value("errorDescription").toString());
++ this->reject();
+ } else {
+- KMessageBox::detailedError(this, i18nc("@info", "Failed to install GRUB."), KDE_IS_VERSION(4,7,0) ? reply.errorDescription() : reply.data().value("errorDescription").toString());
++ progressDlg.hide();
++ QDialog *dialog = new QDialog(this, Qt::Dialog);
++ dialog->setWindowTitle(i18nc("@title:window", "Information"));
++ dialog->setModal(true);
++ QDialogButtonBox *btnbox = new QDialogButtonBox(QDialogButtonBox::Ok);
++ KMessageBox::createKMessageBox(dialog, btnbox, QMessageBox::Information, i18nc("@info", "Successfully installed GRUB."), QStringList(), QString(), 0, KMessageBox::Notify, reply->data().value("output").toString()); // krazy:exclude=qclasses
++ this->accept();
+ }
+- }
+- KDialog::slotButtonClicked(button);
++ //this->accept();
+ }
+diff --git a/src/installDlg.h b/src/installDlg.h
+index e5ddc93..9a1da58 100644
+--- a/src/installDlg.h
++++ b/src/installDlg.h
+@@ -19,22 +19,22 @@
+ #define INSTALLDLG_H
+
+ //KDE
+-#include <KDialog>
+-
++#include <QDialog>
++#include <QProgressDialog>
+ //Ui
+ namespace Ui
+ {
+ class InstallDialog;
+ }
+
+-class InstallDialog : public KDialog
++class InstallDialog : public QDialog
+ {
+ Q_OBJECT
+ public:
+- explicit InstallDialog(QWidget *parent = 0, Qt::WFlags flags = 0);
++ explicit InstallDialog(QWidget *parent = 0, Qt::WindowFlags flags = 0);
+ virtual ~InstallDialog();
+ protected Q_SLOTS:
+- virtual void slotButtonClicked(int button);
++ virtual void SlotOkButtonClicked();
+ private:
+ Ui::InstallDialog *ui;
+ };
+diff --git a/src/kcm_grub2.cpp b/src/kcm_grub2.cpp
+index 1189a98..15fb3b5 100644
+--- a/src/kcm_grub2.cpp
++++ b/src/kcm_grub2.cpp
+@@ -20,22 +20,26 @@
+
+ //Own
+ #include "kcm_grub2.h"
+-
++#include "widgets/regexpinputdialog.h"
+ //Qt
+ #include <QDesktopWidget>
+ #include <QStandardItemModel>
+ #include <QTreeView>
+-
++#include <QMenu>
++#include <QProgressBar>
++#include <QTextStream>
+ //KDE
+ #include <KAboutData>
+-#include <KDebug>
+-#include <KInputDialog>
+-#include <KMenu>
++//#include <KDebug>
++//#include <KInputDialog>
+ #include <KMessageBox>
+ #include <kmountpoint.h>
+ #include <KPluginFactory>
+-#include <KProgressDialog>
+-#include <KAuth/ActionWatcher>
++#include <KAuth>
++using namespace KAuth;
++
++#define TRANSLATION_DOMAIN "kcm-grub2"
++#include <klocalizedstring.h>
+
+ //Project
+ #include "common.h"
+@@ -54,13 +58,22 @@
+ K_PLUGIN_FACTORY(GRUB2Factory, registerPlugin<KCMGRUB2>();)
+ K_EXPORT_PLUGIN(GRUB2Factory("kcmgrub2"))
+
+-KCMGRUB2::KCMGRUB2(QWidget *parent, const QVariantList &list) : KCModule(GRUB2Factory::componentData(), parent, list)
++#include <kcm_grub2.moc>
++
++KCMGRUB2::KCMGRUB2(QWidget *parent, const QVariantList &list) : KCModule(parent, list)
+ {
+ //Isn't KAboutData's second argument supposed to do this?
+- KGlobal::locale()->insertCatalog("kcm-grub2");
++ //The function is deprecated. TO BE FIXED
++ //KGlobal::locale()->insertCatalog("kcm-grub2");
++
++ KAboutData* about = new KAboutData("kcmgrub2", i18n("KDE GRUB2 Bootloader Control Module"), KCM_GRUB2_VERSION);
++ about->setShortDescription(i18n("A KDE Control Module for configuring the GRUB2 bootloader."));
++ about->setLicense(KAboutLicense::GPL_V3);
++ about->setHomepage("http://ksmanis.wordpress.com/projects/grub2-editor/");
+
+- KAboutData *about = new KAboutData("kcmgrub2", "kcm-grub2", ki18nc("@title", "KDE GRUB2 Bootloader Control Module"), KCM_GRUB2_VERSION, ki18nc("@title", "A KDE Control Module for configuring the GRUB2 bootloader."), KAboutData::License_GPL_V3, ki18nc("@info:credit", "Copyright (C) 2008-2013 Konstantinos Smanis"), KLocalizedString(), "http://ksmanis.wordpress.com/projects/grub2-editor/");
+- about->addAuthor(ki18nc("@info:credit", "Κonstantinos Smanis"), ki18nc("@info:credit", "Main Developer"), "konstantinos.smanis@gmail.com", "http://ksmanis.wordpress.com/");
++ about->addAuthor("Κonstantinos Smanis", i18n("Main Developer"), "konstantinos.smanis@gmail.com");
++ about->addAuthor("Lin Ziyun", i18n("Developer"), "ohmygod19993@gmail.com");
++
+ setAboutData(about);
+
+ ui = new Ui::KCMGRUB2;
+@@ -76,20 +89,15 @@ KCMGRUB2::~KCMGRUB2()
+ void KCMGRUB2::defaults()
+ {
+ Action defaultsAction("org.kde.kcontrol.kcmgrub2.defaults");
+- defaultsAction.setHelperID("org.kde.kcontrol.kcmgrub2");
+-#if KDE_IS_VERSION(4,6,0)
+- defaultsAction.setParentWidget(this);
+-#endif
+-
+- ActionReply reply = defaultsAction.execute();
+- processReply(reply);
+- if (reply.succeeded()) {
++ defaultsAction.setHelperId("org.kde.kcontrol.kcmgrub2");
++
++ ExecuteJob *reply = defaultsAction.execute();
++ if (!reply->exec())
++ KMessageBox::detailedError(this, i18nc("@info", "Failed to restore the default values."), reply->errorString());
++ else
+ load();
+ save();
+ KMessageBox::information(this, i18nc("@info", "Successfully restored the default values."));
+- } else {
+- KMessageBox::detailedError(this, i18nc("@info", "Failed to restore the default values."), reply.errorDescription());
+- }
+ }
+ void KCMGRUB2::load()
+ {
+@@ -163,7 +171,7 @@ void KCMGRUB2::load()
+ ui->kcombobox_default->setRootModelIndex(model->indexFromItem(model->invisibleRootItem()));
+ }
+ } else {
+- kWarning() << "Invalid GRUB_DEFAULT value";
++ qDebug() << "Invalid GRUB_DEFAULT value";
+ }
+ }
+ ui->kpushbutton_remove->setEnabled(!m_entries.isEmpty());
+@@ -176,7 +184,7 @@ void KCMGRUB2::load()
+ ui->checkBox_hiddenTimeout->setChecked(grubHiddenTimeout > 0);
+ ui->spinBox_hiddenTimeout->setValue(grubHiddenTimeout);
+ } else {
+- kWarning() << "Invalid GRUB_HIDDEN_TIMEOUT value";
++ qDebug() << "Invalid GRUB_HIDDEN_TIMEOUT value";
+ }
+ }
+ ui->checkBox_hiddenTimeoutShowTimer->setChecked(unquoteWord(m_settings.value("GRUB_HIDDEN_TIMEOUT_QUIET")).compare("true") != 0);
+@@ -187,7 +195,7 @@ void KCMGRUB2::load()
+ ui->radioButton_timeout->setChecked(grubTimeout > 0);
+ ui->spinBox_timeout->setValue(grubTimeout);
+ } else {
+- kWarning() << "Invalid GRUB_TIMEOUT value";
++ qDebug() << "Invalid GRUB_TIMEOUT value";
+ }
+
+ ui->checkBox_recovery->setChecked(unquoteWord(m_settings.value("GRUB_DISABLE_RECOVERY")).compare("true") != 0);
+@@ -215,7 +223,7 @@ void KCMGRUB2::load()
+ int normalForegroundIndex = ui->kcombobox_normalForeground->findData(grubColorNormal.section('/', 0, 0));
+ int normalBackgroundIndex = ui->kcombobox_normalBackground->findData(grubColorNormal.section('/', 1));
+ if (normalForegroundIndex == -1 || normalBackgroundIndex == -1) {
+- kWarning() << "Invalid GRUB_COLOR_NORMAL value";
++ qDebug() << "Invalid GRUB_COLOR_NORMAL value";
+ }
+ if (normalForegroundIndex != -1) {
+ ui->kcombobox_normalForeground->setCurrentIndex(normalForegroundIndex);
+@@ -229,7 +237,7 @@ void KCMGRUB2::load()
+ int highlightForegroundIndex = ui->kcombobox_highlightForeground->findData(grubColorHighlight.section('/', 0, 0));
+ int highlightBackgroundIndex = ui->kcombobox_highlightBackground->findData(grubColorHighlight.section('/', 1));
+ if (highlightForegroundIndex == -1 || highlightBackgroundIndex == -1) {
+- kWarning() << "Invalid GRUB_COLOR_HIGHLIGHT value";
++ qDebug() << "Invalid GRUB_COLOR_HIGHLIGHT value";
+ }
+ if (highlightForegroundIndex != -1) {
+ ui->kcombobox_highlightForeground->setCurrentIndex(highlightForegroundIndex);
+@@ -326,14 +334,14 @@ void KCMGRUB2::save()
+ }
+ if (m_dirtyBits.testBit(grubGfxmodeDirty)) {
+ if (ui->kcombobox_gfxmode->currentIndex() <= 0) {
+- kError() << "Something went terribly wrong!";
++ qDebug() << "Something went terribly wrong!";
+ } else {
+ m_settings["GRUB_GFXMODE"] = quoteWord(ui->kcombobox_gfxmode->itemData(ui->kcombobox_gfxmode->currentIndex()).toString());
+ }
+ }
+ if (m_dirtyBits.testBit(grubGfxpayloadLinuxDirty)) {
+ if (ui->kcombobox_gfxpayload->currentIndex() <= 0) {
+- kError() << "Something went terribly wrong!";
++ qDebug() << "Something went terribly wrong!";
+ } else if (ui->kcombobox_gfxpayload->currentIndex() == 1) {
+ m_settings.remove("GRUB_GFXPAYLOAD_LINUX");
+ } else if (ui->kcombobox_gfxpayload->currentIndex() > 1) {
+@@ -455,41 +463,39 @@ void KCMGRUB2::save()
+ }
+
+ Action saveAction("org.kde.kcontrol.kcmgrub2.save");
+- saveAction.setHelperID("org.kde.kcontrol.kcmgrub2");
++ saveAction.setHelperId("org.kde.kcontrol.kcmgrub2");
+ saveAction.addArgument("rawConfigFileContents", configFileContents.toLocal8Bit());
+ saveAction.addArgument("rawDefaultEntry", !m_entries.isEmpty() ? grubDefault : m_settings.value("GRUB_DEFAULT").toLocal8Bit());
+ if (m_dirtyBits.testBit(memtestDirty)) {
+ saveAction.addArgument("memtest", ui->checkBox_memtest->isChecked());
+ }
+-#if KDE_IS_VERSION(4,6,0)
+- saveAction.setParentWidget(this);
+-#endif
+-
++/*
+ if (saveAction.authorize() != Action::Authorized) {
+ return;
+ }
+-
+- KProgressDialog progressDlg(this, i18nc("@title:window Verb (gerund). Refers to current status.", "Saving"), i18nc("@info:progress", "Saving GRUB settings..."));
+- progressDlg.setAllowCancel(false);
+- progressDlg.setModal(true);
+- progressDlg.progressBar()->setMinimum(0);
+- progressDlg.progressBar()->setMaximum(0);
+- progressDlg.show();
+- connect(saveAction.watcher(), SIGNAL(actionPerformed(ActionReply)), &progressDlg, SLOT(hide()));
+-
+- ActionReply reply = saveAction.execute();
+- processReply(reply);
+- if (reply.succeeded()) {
+- KDialog *dialog = new KDialog(this, Qt::Dialog);
+- dialog->setCaption(i18nc("@title:window", "Information"));
+- dialog->setButtons(KDialog::Ok | KDialog::Details);
++*/
++ QProgressDialog progressDlg(this, Qt::Dialog);
++ progressDlg.setWindowTitle(i18nc("@title:window Verb (gerund). Refers to current status.", "Saving"));
++ progressDlg.setLabelText(i18nc("@info:progress", "Saving GRUB settings..."));
++ progressDlg.setCancelButton(0);
++ progressDlg.setModal(true);
++ progressDlg.setRange(0,0);
++ progressDlg.show();
++
++
++ ExecuteJob *reply = saveAction.execute();
++ //connect(reply, SIGNAL(result()), &progressDlg, SLOT(hide()));
++ reply->exec();
++ progressDlg.hide();
++ if (!reply->error()) {
++ QDialog *dialog = new QDialog(this, Qt::Dialog);
++ dialog->setWindowTitle(i18nc("@title:window", "Information"));
+ dialog->setModal(true);
+- dialog->setDefaultButton(KDialog::Ok);
+- dialog->setEscapeButton(KDialog::Ok);
+- KMessageBox::createKMessageBox(dialog, QMessageBox::Information, i18nc("@info", "Successfully saved GRUB settings."), QStringList(), QString(), 0, KMessageBox::Notify, reply.data().value("output").toString()); // krazy:exclude=qclasses
++ QDialogButtonBox *btnbox = new QDialogButtonBox(QDialogButtonBox::Ok);
++ KMessageBox::createKMessageBox(dialog, btnbox, QMessageBox::Information, i18nc("@info", "Successfully saved GRUB settings."), QStringList(), QString(), 0, KMessageBox::Notify, reply->data().value("output").toString()); // krazy:exclude=qclasses
+ load();
+ } else {
+- KMessageBox::detailedError(this, i18nc("@info", "Failed to save GRUB settings."), reply.errorDescription());
++ KMessageBox::detailedError(this, i18nc("@info", "Failed to save GRUB settings."), reply->errorString());
+ }
+ }
+
+@@ -559,8 +565,11 @@ void KCMGRUB2::slotGrubGfxmodeChanged()
+ {
+ if (ui->kcombobox_gfxmode->currentIndex() == 0) {
+ bool ok;
+- QRegExpValidator regExp(QRegExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?"), this);
+- QString resolution = KInputDialog::getText(i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a GRUB resolution:"), QString(), &ok, this, &regExp);
++ //QRegExpValidator regExp(QRegExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?"), this);
++ QRegExp regExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?");
++ //regExp.setPatternSyntax(QRegExp::Wildcard);
++ //QString resolution = KInputDialog::getText(i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a GRUB resolution:"), QString(), &ok, this, &regExp);
++ QString resolution = RegExpInputDialog::getText(this, i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a GRUB resolution:"), QString(), regExp, &ok);
+ if (ok) {
+ if (!m_resolutions.contains(resolution)) {
+ QString gfxpayload = ui->kcombobox_gfxpayload->itemData(ui->kcombobox_gfxpayload->currentIndex()).toString();
+@@ -581,8 +590,11 @@ void KCMGRUB2::slotGrubGfxpayloadLinuxChanged()
+ {
+ if (ui->kcombobox_gfxpayload->currentIndex() == 0) {
+ bool ok;
+- QRegExpValidator regExp(QRegExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?"), this);
+- QString resolution = KInputDialog::getText(i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a Linux boot resolution:"), QString(), &ok, this, &regExp);
++ //QRegExpValidator regExp(QRegExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?"), this);
++ QRegExp regExp("\\d{3,4}x\\d{3,4}(x\\d{1,2})?");
++ //regExp.setPatternSyntax(QRegExp::Wildcard);
++ //QString resolution = KInputDialog::getText(i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a Linux boot resolution:"), QString(), &ok, this, &regExp);
++ QString resolution = RegExpInputDialog::getText(this, i18nc("@title:window", "Enter screen resolution"), i18nc("@label:textbox", "Please enter a GRUB resolution:"), QString(), regExp, &ok);
+ if (ok) {
+ if (!m_resolutions.contains(resolution)) {
+ QString gfxmode = ui->kcombobox_gfxmode->itemData(ui->kcombobox_gfxmode->currentIndex()).toString();
+@@ -770,8 +782,8 @@ void KCMGRUB2::setupObjects()
+ view->setRootIsDecorated(false);
+ ui->kcombobox_default->setView(view);
+
+- ui->kpushbutton_install->setIcon(KIcon("system-software-update"));
+- ui->kpushbutton_remove->setIcon(KIcon("list-remove"));
++ ui->kpushbutton_install->setIcon(QIcon::fromTheme(QStringLiteral("system-software-update")));
++ ui->kpushbutton_remove->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
+ ui->kpushbutton_remove->setVisible(HAVE_QAPT || HAVE_QPACKAGEKIT);
+
+ QPixmap black(16, 16), transparent(16, 16);
+@@ -825,12 +837,12 @@ void KCMGRUB2::setupObjects()
+ ui->kcombobox_highlightForeground->setCurrentIndex(ui->kcombobox_highlightForeground->findData("black"));
+ ui->kcombobox_highlightBackground->setCurrentIndex(ui->kcombobox_highlightBackground->findData("light-gray"));
+
+- ui->kpushbutton_preview->setIcon(KIcon("image-png"));
+- ui->kpushbutton_create->setIcon(KIcon("insert-image"));
++ ui->kpushbutton_preview->setIcon(QIcon::fromTheme(QStringLiteral("image-png")));
++ ui->kpushbutton_create->setIcon(QIcon::fromTheme(QStringLiteral("insert-image")));
+ ui->kpushbutton_create->setVisible(HAVE_IMAGEMAGICK);
+
+- ui->kpushbutton_cmdlineDefaultSuggestions->setIcon(KIcon("tools-wizard"));
+- ui->kpushbutton_cmdlineDefaultSuggestions->setMenu(new KMenu(ui->kpushbutton_cmdlineDefaultSuggestions));
++ ui->kpushbutton_cmdlineDefaultSuggestions->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard")));
++ ui->kpushbutton_cmdlineDefaultSuggestions->setMenu(new QMenu(ui->kpushbutton_cmdlineDefaultSuggestions));
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Quiet Boot"))->setData("quiet");
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Show Splash Screen"))->setData("splash");
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Disable Plymouth"))->setData("noplymouth");
+@@ -838,8 +850,8 @@ void KCMGRUB2::setupObjects()
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Turn Off APIC"))->setData("noapic");
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Turn Off Local APIC"))->setData("nolapic");
+ ui->kpushbutton_cmdlineDefaultSuggestions->menu()->addAction(i18nc("@action:inmenu", "Single User Mode"))->setData("single");
+- ui->kpushbutton_cmdlineSuggestions->setIcon(KIcon("tools-wizard"));
+- ui->kpushbutton_cmdlineSuggestions->setMenu(new KMenu(ui->kpushbutton_cmdlineSuggestions));
++ ui->kpushbutton_cmdlineSuggestions->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard")));
++ ui->kpushbutton_cmdlineSuggestions->setMenu(new QMenu(ui->kpushbutton_cmdlineSuggestions));
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Quiet Boot"))->setData("quiet");
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Show Splash Screen"))->setData("splash");
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Disable Plymouth"))->setData("noplymouth");
+@@ -847,20 +859,20 @@ void KCMGRUB2::setupObjects()
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Turn Off APIC"))->setData("noapic");
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Turn Off Local APIC"))->setData("nolapic");
+ ui->kpushbutton_cmdlineSuggestions->menu()->addAction(i18nc("@action:inmenu", "Single User Mode"))->setData("single");
+- ui->kpushbutton_terminalSuggestions->setIcon(KIcon("tools-wizard"));
+- ui->kpushbutton_terminalSuggestions->setMenu(new KMenu(ui->kpushbutton_terminalSuggestions));
++ ui->kpushbutton_terminalSuggestions->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard")));
++ ui->kpushbutton_terminalSuggestions->setMenu(new QMenu(ui->kpushbutton_terminalSuggestions));
+ ui->kpushbutton_terminalSuggestions->menu()->addAction(i18nc("@action:inmenu", "PC BIOS && EFI Console"))->setData("console");
+ ui->kpushbutton_terminalSuggestions->menu()->addAction(i18nc("@action:inmenu", "Serial Terminal"))->setData("serial");
+ ui->kpushbutton_terminalSuggestions->menu()->addAction(i18nc("@action:inmenu 'Open' is an adjective here, not a verb. 'Open Firmware' is a former IEEE standard.", "Open Firmware Console"))->setData("ofconsole");
+- ui->kpushbutton_terminalInputSuggestions->setIcon(KIcon("tools-wizard"));
+- ui->kpushbutton_terminalInputSuggestions->setMenu(new KMenu(ui->kpushbutton_terminalInputSuggestions));
++ ui->kpushbutton_terminalInputSuggestions->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard")));
++ ui->kpushbutton_terminalInputSuggestions->setMenu(new QMenu(ui->kpushbutton_terminalInputSuggestions));
+ ui->kpushbutton_terminalInputSuggestions->menu()->addAction(i18nc("@action:inmenu", "PC BIOS && EFI Console"))->setData("console");
+ ui->kpushbutton_terminalInputSuggestions->menu()->addAction(i18nc("@action:inmenu", "Serial Terminal"))->setData("serial");
+ ui->kpushbutton_terminalInputSuggestions->menu()->addAction(i18nc("@action:inmenu 'Open' is an adjective here, not a verb. 'Open Firmware' is a former IEEE standard.", "Open Firmware Console"))->setData("ofconsole");
+ ui->kpushbutton_terminalInputSuggestions->menu()->addAction(i18nc("@action:inmenu", "PC AT Keyboard (Coreboot)"))->setData("at_keyboard");
+ ui->kpushbutton_terminalInputSuggestions->menu()->addAction(i18nc("@action:inmenu", "USB Keyboard (HID Boot Protocol)"))->setData("usb_keyboard");
+- ui->kpushbutton_terminalOutputSuggestions->setIcon(KIcon("tools-wizard"));
+- ui->kpushbutton_terminalOutputSuggestions->setMenu(new KMenu(ui->kpushbutton_terminalOutputSuggestions));
++ ui->kpushbutton_terminalOutputSuggestions->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard")));
++ ui->kpushbutton_terminalOutputSuggestions->setMenu(new QMenu(ui->kpushbutton_terminalOutputSuggestions));
+ ui->kpushbutton_terminalOutputSuggestions->menu()->addAction(i18nc("@action:inmenu", "PC BIOS && EFI Console"))->setData("console");
+ ui->kpushbutton_terminalOutputSuggestions->menu()->addAction(i18nc("@action:inmenu", "Serial Terminal"))->setData("serial");
+ ui->kpushbutton_terminalOutputSuggestions->menu()->addAction(i18nc("@action:inmenu 'Open' is an adjective here, not a verb. 'Open Firmware' is a former IEEE standard.", "Open Firmware Console"))->setData("ofconsole");
+@@ -956,18 +968,14 @@ QString KCMGRUB2::convertToLocalFileName(const QString &grubFileName)
+ return fileName;
+ }
+
+-ActionReply KCMGRUB2::loadFile(GrubFile grubFile)
++ExecuteJob * KCMGRUB2::loadFile(GrubFile grubFile)
+ {
+- Action loadAction("org.kde.kcontrol.kcmgrub2.load");
+- loadAction.setHelperID("org.kde.kcontrol.kcmgrub2");
++ Action loadAction("org.kde.kcontrol.kcmgrub2.initialize");
++ loadAction.setHelperId("org.kde.kcontrol.kcmgrub2");
++ loadAction.addArgument("actionType", actionLoad);
+ loadAction.addArgument("grubFile", grubFile);
+-#if KDE_IS_VERSION(4,6,0)
+- loadAction.setParentWidget(this);
+-#endif
+
+- ActionReply reply = loadAction.execute();
+- processReply(reply);
+- return reply;
++ return loadAction.execute();
+ }
+ QString KCMGRUB2::readFile(GrubFile grubFile)
+ {
+@@ -992,13 +1000,13 @@ QString KCMGRUB2::readFile(GrubFile grubFile)
+ return stream.readAll();
+ }
+
+- ActionReply reply = loadFile(grubFile);
+- if (reply.failed()) {
+- kError() << "Error loading:" << fileName;
+- kError() << "Error description:" << reply.errorDescription();
++ ExecuteJob *reply = loadFile(grubFile);
++ if (!reply->exec()) {
++ qDebug() << "Error loading:" << fileName;
++ qDebug() << "Error description:" << reply->errorString();
+ return QString();
+ }
+- return QString::fromLocal8Bit(reply.data().value("rawFileContents").toByteArray());
++ return QString::fromLocal8Bit(reply->data().value("rawFileContents").toByteArray());
+ }
+ void KCMGRUB2::readEntries()
+ {
+@@ -1030,15 +1038,15 @@ void KCMGRUB2::readMemtest()
+ return;
+ }
+
+- ActionReply reply = loadFile(GrubMemtestFile);
+- if (reply.failed()) {
+- kError() << "Error loading:" << GRUB_MEMTEST;
+- kError() << "Error description:" << reply.errorDescription();
++ ExecuteJob *reply = loadFile(GrubMemtestFile);
++ if (!reply->exec()) {
++ qDebug() << "Error loading:" << GRUB_MEMTEST;
++ qDebug() << "Error description:" << reply->errorString();
+ return;
+ }
+- m_memtest = reply.data().value("memtest").toBool();
++ m_memtest = reply->data().value("memtest").toBool();
+ if (m_memtest) {
+- m_memtestOn = reply.data().value("memtestOn").toBool();
++ m_memtestOn = reply->data().value("memtestOn").toBool();
+ }
+ }
+ void KCMGRUB2::readDevices()
+@@ -1050,29 +1058,38 @@ void KCMGRUB2::readDevices()
+ }
+ }
+
+- Action probeAction("org.kde.kcontrol.kcmgrub2.probe");
+- probeAction.setHelperID("org.kde.kcontrol.kcmgrub2");
++ Action probeAction("org.kde.kcontrol.kcmgrub2.initialize");
++ probeAction.setHelperId("org.kde.kcontrol.kcmgrub2");
++ probeAction.addArgument("actionType", actionProbe);
+ probeAction.addArgument("mountPoints", mountPoints);
+-#if KDE_IS_VERSION(4,6,0)
+- probeAction.setParentWidget(this);
+-#endif
+- if (probeAction.authorize() != Action::Authorized) {
++
++ QProgressDialog progressDlg(this, Qt::Dialog);
++ progressDlg.setWindowTitle(i18nc("@title:window", "Probing devices"));
++ progressDlg.setLabelText(i18nc("@info:progress", "Probing devices for their GRUB names..."));
++ progressDlg.setCancelButton(0);
++ progressDlg.setModal(true);
++ QProgressBar * mProgressBar = new QProgressBar(this);
++ progressDlg.setBar(mProgressBar);
++ progressDlg.show();
++
++ ExecuteJob *reply = probeAction.execute();
++ //connect(reply, SIGNAL(progressStep(int)), mProgressBar, SLOT(setValue(int)));
++ reply->exec();
++
++ if (probeAction.status() != Action::AuthorizedStatus ) {
++ progressDlg.hide();
+ return;
+ }
+-
+- KProgressDialog progressDlg(this, i18nc("@title:window", "Probing devices"), i18nc("@info:progress", "Probing devices for their GRUB names..."));
+- progressDlg.setAllowCancel(false);
+- progressDlg.setModal(true);
+- progressDlg.show();
+- connect(probeAction.watcher(), SIGNAL(progressStep(int)), progressDlg.progressBar(), SLOT(setValue(int)));
+-
+- ActionReply reply = probeAction.execute();
+- processReply(reply);
+- if (reply.failed()) {
+- KMessageBox::detailedError(this, i18nc("@info", "Failed to get GRUB device names."), reply.errorDescription());
++
++ progressDlg.hide();
++
++ if (reply->error()) {
++ KMessageBox::detailedError(this, i18nc("@info", "Failed to get GRUB device names."), reply->errorString());
+ return;
+- }
+- QStringList grubPartitions = reply.data().value("grubPartitions").toStringList();
++ }// else {
++ // progressDlg.hide();
++//}
++ QStringList grubPartitions = reply->data().value("grubPartitions").toStringList();
+ if (mountPoints.size() != grubPartitions.size()) {
+ KMessageBox::error(this, i18nc("@info", "Helper returned malformed device list."));
+ return;
+@@ -1085,20 +1102,17 @@ void KCMGRUB2::readDevices()
+ }
+ void KCMGRUB2::readResolutions()
+ {
+- Action probeVbeAction("org.kde.kcontrol.kcmgrub2.probevbe");
+- probeVbeAction.setHelperID("org.kde.kcontrol.kcmgrub2");
+-#if KDE_IS_VERSION(4,6,0)
+- probeVbeAction.setParentWidget(this);
+-#endif
++ Action probeVbeAction("org.kde.kcontrol.kcmgrub2.initialize");
++ probeVbeAction.setHelperId("org.kde.kcontrol.kcmgrub2");
++ probeVbeAction.addArgument("actionType", actionProbevbe);
+
+- ActionReply reply = probeVbeAction.execute();
+- processReply(reply);
+- if (reply.failed()) {
++ ExecuteJob *reply = probeVbeAction.execute();
++ if (!reply->exec()) {
+ return;
+ }
+
+ m_resolutions.clear();
+- m_resolutions = reply.data().value("gfxmodes").toStringList();
++ m_resolutions = reply->data().value("gfxmodes").toStringList();
+ }
+
+ void KCMGRUB2::sortResolutions()
+@@ -1140,8 +1154,8 @@ void KCMGRUB2::showResolutions()
+ ui->kcombobox_gfxpayload->addItem(resolution, resolution);
+ }
+ }
+-
+-void KCMGRUB2::processReply(ActionReply &reply)
++/*
++void KCMGRUB2::processReply(ExecuteJob * reply)
+ {
+ if (reply.type() == ActionReply::Success || reply.type() == ActionReply::KAuthError) {
+ return;
+@@ -1171,6 +1185,7 @@ void KCMGRUB2::processReply(ActionReply &reply)
+ reply.addData(QLatin1String("errorMessage"), errorMessage);
+ reply.setErrorDescription(i18nc("@info", "Command: <command>%1</command><nl/>Error code: <numid>%2</numid><nl/>Error message:<nl/><message>%3</message>", reply.data().value(QLatin1String("command")).toStringList().join(QLatin1String(" ")), reply.errorCode(), errorMessage));
+ }
++*/
+ QString KCMGRUB2::parseTitle(const QString &line)
+ {
+ QChar ch;
+@@ -1230,8 +1245,8 @@ void KCMGRUB2::parseEntries(const QString &config)
+ //If the first word is known, process the rest of the line
+ if (word == QLatin1String("menuentry")) {
+ if (inEntry) {
+- kError() << "Malformed configuration file! Aborting entries' parsing.";
+- kDebug() << "A 'menuentry' directive was detected inside the scope of a menuentry.";
++ qDebug() << "Malformed configuration file! Aborting entries' parsing.";
++ qDebug() << "A 'menuentry' directive was detected inside the scope of a menuentry.";
+ m_entries.clear();
+ return;
+ }
+@@ -1245,8 +1260,8 @@ void KCMGRUB2::parseEntries(const QString &config)
+ continue;
+ } else if (word == QLatin1String("submenu")) {
+ if (inEntry) {
+- kError() << "Malformed configuration file! Aborting entries' parsing.";
+- kDebug() << "A 'submenu' directive was detected inside the scope of a menuentry.";
++ qDebug() << "Malformed configuration file! Aborting entries' parsing.";
++ qDebug() << "A 'submenu' directive was detected inside the scope of a menuentry.";
+ m_entries.clear();
+ return;
+ }
+@@ -1262,8 +1277,8 @@ void KCMGRUB2::parseEntries(const QString &config)
+ continue;
+ } else if (word == QLatin1String("linux")) {
+ if (!inEntry) {
+- kError() << "Malformed configuration file! Aborting entries' parsing.";
+- kDebug() << "A 'linux' directive was detected outside the scope of a menuentry.";
++ qDebug() << "Malformed configuration file! Aborting entries' parsing.";
++ qDebug() << "A 'linux' directive was detected outside the scope of a menuentry.";
+ m_entries.clear();
+ return;
+ }
+diff --git a/src/kcm_grub2.h b/src/kcm_grub2.h
+index 5b2bff8..0443abe 100644
+--- a/src/kcm_grub2.h
++++ b/src/kcm_grub2.h
+@@ -20,9 +20,11 @@
+
+ //Qt
+ #include <QBitArray>
+-
++#include <QProgressDialog>
++#include <QDebug>
+ //KDE
+ #include <KCModule>
++
+ namespace KAuth
+ {
+ class ActionReply;
+@@ -89,7 +91,7 @@ private Q_SLOTS:
+ QString convertToGRUBFileName(const QString &fileName);
+ QString convertToLocalFileName(const QString &grubFileName);
+
+- ActionReply loadFile(GrubFile grubFile);
++ ExecuteJob * loadFile(GrubFile grubFile);
+ QString readFile(GrubFile grubFile);
+ void readEntries();
+ void readSettings();
+diff --git a/src/removeDlg.cpp b/src/removeDlg.cpp
+index 1c8d75f..225491d 100644
+--- a/src/removeDlg.cpp
++++ b/src/removeDlg.cpp
+@@ -28,7 +28,8 @@
+
+ //KDE
+ #include <KMessageBox>
+-#include <KProgressDialog>
++//Qt
++#include <QProgressDialog>
+
+ //Project
+ #include "entry.h"
+@@ -36,13 +37,22 @@
+ //Ui
+ #include "ui_removeDlg.h"
+
+-RemoveDialog::RemoveDialog(const QList<Entry> &entries, QWidget *parent, Qt::WFlags flags) : KDialog(parent, flags)
++RemoveDialog::RemoveDialog(const QList<Entry> &entries, QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags)
+ {
+ QWidget *widget = new QWidget(this);
+ ui = new Ui::RemoveDialog;
+ ui->setupUi(widget);
+- setMainWidget(widget);
+- enableButtonOk(false);
++ QVBoxLayout *mainLayout = new QVBoxLayout;
++ setLayout(mainLayout);
++ mainLayout->addWidget(widget);
++ QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
++ mainLayout->addWidget(buttonBox);
++ buttonBox->button(QDialogButtonBox::Ok)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOkButton));
++ buttonBox->button(QDialogButtonBox::Cancel)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton));
++ connect(buttonBox, SIGNAL(accepted()), this, SLOT(SlotOkButtonClicked()));
++ connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
++ buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
++
+ setWindowTitle(i18nc("@title:window", "Remove Old Entries"));
+ setWindowIcon(KIcon("list-remove"));
+
+@@ -57,8 +67,8 @@ RemoveDialog::RemoveDialog(const QList<Entry> &entries, QWidget *parent, Qt::WFl
+ #endif
+
+ detectCurrentKernelImage();
+- KProgressDialog progressDlg(this, i18nc("@title:window", "Finding Old Entries"), i18nc("@info:progress", "Finding Old Entries..."));
+- progressDlg.setAllowCancel(false);
++ QProgressDialog progressDlg(this, i18nc("@title:window", "Finding Old Entries"), i18nc("@info:progress", "Finding Old Entries..."));
++ progressDlg.setCancelButton(0);
+ progressDlg.setModal(true);
+ progressDlg.show();
+ bool found = false;
+@@ -97,7 +107,7 @@ RemoveDialog::RemoveDialog(const QList<Entry> &entries, QWidget *parent, Qt::WFl
+ ui->treeWidget->resizeColumnToContents(0);
+ ui->treeWidget->setMinimumWidth(ui->treeWidget->columnWidth(0) + ui->treeWidget->sizeHintForRow(0));
+ connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemChanged()));
+- enableButtonOk(true);
++ buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
+ } else {
+ KMessageBox::sorry(this, i18nc("@info", "No removable entries were found."));
+ QTimer::singleShot(0, this, SLOT(reject()));
+@@ -108,9 +118,9 @@ RemoveDialog::~RemoveDialog()
+ delete m_backend;
+ delete ui;
+ }
+-void RemoveDialog::slotButtonClicked(int button)
++void RemoveDialog::slotOkButtonClicked(int button)
+ {
+- if (button == KDialog::Ok) {
++
+ for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
+ if (ui->treeWidget->topLevelItem(i)->checkState(0) == Qt::Checked) {
+ QString packageName = ui->treeWidget->topLevelItem(i)->data(0, Qt::UserRole).toString();
+@@ -129,24 +139,23 @@ void RemoveDialog::slotButtonClicked(int button)
+ m_backend->undoChanges();
+ }
+ return;
+- }
+- KDialog::slotButtonClicked(button);
++ this->accept();
+ }
+ void RemoveDialog::slotItemChanged()
+ {
+ for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
+ if (ui->treeWidget->topLevelItem(i)->checkState(0) == Qt::Checked) {
+- enableButtonOk(true);
++ this->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
+ return;
+ }
+ }
+- enableButtonOk(false);
++ this->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ }
+ void RemoveDialog::slotProgress(const QString &status, int percentage)
+ {
+ if (!m_progressDlg) {
+- m_progressDlg = new KProgressDialog(this, i18nc("@title:window", "Removing Old Entries"));
+- m_progressDlg->setAllowCancel(false);
++ m_progressDlg = new QProgressDialog(this, i18nc("@title:window", "Removing Old Entries"));
++ m_progressDlg->setCancelButton(0);
+ m_progressDlg->setModal(true);
+ m_progressDlg->show();
+ }
+diff --git a/src/removeDlg.h b/src/removeDlg.h
+index 77b282d..c03fead 100644
+--- a/src/removeDlg.h
++++ b/src/removeDlg.h
+@@ -22,8 +22,9 @@
+ #define REMOVEDLG_H
+
+ //KDE
+-#include <KDialog>
+-class KProgressDialog;
++#include <QDialog>
++#include <QProgressDialog>
++class QProgressDialog;
+
+ //Project
+ #include <config.h>
+@@ -42,14 +43,14 @@ namespace Ui
+ class RemoveDialog;
+ }
+
+-class RemoveDialog : public KDialog
++class RemoveDialog : public QDialog
+ {
+ Q_OBJECT
+ public:
+ explicit RemoveDialog(const QList<Entry> &entries, QWidget *parent = 0, Qt::WFlags flags = 0);
+ virtual ~RemoveDialog();
+ protected Q_SLOTS:
+- virtual void slotButtonClicked(int button);
++ virtual void slotOkButtonClicked();
+ private Q_SLOTS:
+ void slotItemChanged();
+ void slotProgress(const QString &status, int percentage);
+diff --git a/src/widgets/regexpinputdialog.cpp b/src/widgets/regexpinputdialog.cpp
+new file mode 100644
+index 0000000..91fdb64
+--- /dev/null
++++ b/src/widgets/regexpinputdialog.cpp
+@@ -0,0 +1,57 @@
++#include <QtGui>
++#include "regexpinputdialog.h"
++
++RegExpInputDialog::RegExpInputDialog(QWidget *parent, Qt::WindowFlags flags) :
++QDialog(parent)
++{
++if(flags!=0) setWindowFlags(flags);
++QVBoxLayout *l=new QVBoxLayout(this);
++
++label=new QLabel(this);
++
++regExp=QRegExp("*");
++regExp.setPatternSyntax(QRegExp::Wildcard);
++validator=new QRegExpValidator(regExp);
++
++text=new QLineEdit(this);
++text->setValidator(validator);
++connect(text, SIGNAL(textChanged(QString)), this, SLOT(checkValid(QString)));
++
++buttonBox=new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, Qt::Horizontal, this);
++connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
++connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
++
++l->addWidget(label);
++l->addWidget(text);
++l->addWidget(buttonBox);
++}
++
++void RegExpInputDialog::setTitle(const QString &title){ setWindowTitle(title); }
++void RegExpInputDialog::setLabelText(const QString &label){ this->label->setText(label); }
++void RegExpInputDialog::setText(const QString &text){ this->text->setText(text); }
++
++void RegExpInputDialog::setRegExp(const QRegExp &regExp){
++validator->setRegExp(regExp);
++checkValid(text->text());
++}
++
++QString RegExpInputDialog::getLabelText(){ return label->text(); }
++QString RegExpInputDialog::getText(){ return text->text(); }
++
++void RegExpInputDialog::checkValid(const QString &text){
++QString _text=QString(text);
++int pos=0;
++bool valid=validator->validate(_text, pos)==QRegExpValidator::Acceptable;
++buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
++}
++
++QString RegExpInputDialog::getText(QWidget *parent, const QString &title, const QString &label, const QString &text, const QRegExp &regExp, bool *ok, Qt::WindowFlags flags){
++RegExpInputDialog *r=new RegExpInputDialog(parent, flags);
++r->setTitle(title);
++r->setLabelText(label);
++r->setText(text);
++r->setRegExp(regExp);
++*ok=r->exec()==QDialog::Accepted;
++if(*ok) return r->getText();
++else return QString();
++}
+\ No newline at end of file
+diff --git a/src/widgets/regexpinputdialog.h b/src/widgets/regexpinputdialog.h
+new file mode 100644
+index 0000000..ad9f532
+--- /dev/null
++++ b/src/widgets/regexpinputdialog.h
+@@ -0,0 +1,45 @@
++#ifndef REGEXPINPUTDIALOG_H
++#define REGEXPINPUTDIALOG_H
++
++#include <QDialog>
++#include <QLineEdit>
++#include <QDialogButtonBox>
++#include <QLabel>
++#include <QVBoxLayout>
++#include <QPushButton>
++
++class QLabel;
++class QLineEdit;
++class QDialogButtonBox;
++class QRegExpValidator;
++
++class RegExpInputDialog : public QDialog
++{
++Q_OBJECT
++public:
++explicit RegExpInputDialog(QWidget *parent = 0, Qt::WindowFlags=0);
++
++void setTitle(const QString &title);
++void setLabelText(const QString &label);
++void setText(const QString &text);
++void setRegExp(const QRegExp &regExp);
++
++QString getLabelText();
++QString getText();
++
++static QString getText(QWidget *parent, const QString &title, const QString &label, const QString &text, const QRegExp &regExp, bool *ok, Qt::WindowFlags flags=0);
++
++signals:
++
++private slots:
++void checkValid(const QString &text);
++
++private:
++QLabel *label;
++QLineEdit *text;
++QDialogButtonBox *buttonBox;
++QRegExp regExp;
++QRegExpValidator *validator;
++};
++
++#endif // REGEXPINPUTDIALOG_H
+\ No newline at end of file
+diff --git a/ui/kcm_grub2.ui b/ui/kcm_grub2.ui
+index 8a4bc41..a61fa49 100644
+--- a/ui/kcm_grub2.ui
++++ b/ui/kcm_grub2.ui
+@@ -12,7 +12,7 @@
+ </property>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <item row="0" column="0">
+- <widget class="KTabWidget" name="ktabwidget">
++ <widget class="QTabWidget" name="ktabwidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+@@ -219,7 +219,7 @@
+ </widget>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_remove">
++ <widget class="QPushButton" name="kpushbutton_remove">
+ <property name="text">
+ <string comment="@action:button">Remove Old Entries</string>
+ </property>
+@@ -357,14 +357,14 @@
+ <widget class="KUrlRequester" name="kurlrequester_background"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_preview">
++ <widget class="QPushButton" name="kpushbutton_preview">
+ <property name="text">
+ <string comment="@action:button">Preview</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_create">
++ <widget class="QPushButton" name="kpushbutton_create">
+ <property name="text">
+ <string comment="@action:button">Create</string>
+ </property>
+@@ -424,7 +424,7 @@
+ <widget class="KLineEdit" name="klineedit_cmdlineDefault"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_cmdlineDefaultSuggestions">
++ <widget class="QPushButton" name="kpushbutton_cmdlineDefaultSuggestions">
+ <property name="text">
+ <string comment="@action:button">Suggestions</string>
+ </property>
+@@ -445,7 +445,7 @@
+ <widget class="KLineEdit" name="klineedit_cmdline"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_cmdlineSuggestions">
++ <widget class="QPushButton" name="kpushbutton_cmdlineSuggestions">
+ <property name="text">
+ <string comment="@action:button">Suggestions</string>
+ </property>
+@@ -475,7 +475,7 @@
+ <widget class="KLineEdit" name="klineedit_terminal"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_terminalSuggestions">
++ <widget class="QPushButton" name="kpushbutton_terminalSuggestions">
+ <property name="text">
+ <string comment="@action:button">Suggestions</string>
+ </property>
+@@ -496,7 +496,7 @@
+ <widget class="KLineEdit" name="klineedit_terminalInput"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_terminalInputSuggestions">
++ <widget class="QPushButton" name="kpushbutton_terminalInputSuggestions">
+ <property name="text">
+ <string comment="@action:button">Suggestions</string>
+ </property>
+@@ -517,7 +517,7 @@
+ <widget class="KLineEdit" name="klineedit_terminalOutput"/>
+ </item>
+ <item>
+- <widget class="KPushButton" name="kpushbutton_terminalOutputSuggestions">
++ <widget class="QPushButton" name="kpushbutton_terminalOutputSuggestions">
+ <property name="text">
+ <string comment="@action:button">Suggestions</string>
+ </property>
+@@ -597,7 +597,7 @@
+ </property>
+ <layout class="QGridLayout" name="gridLayout_8">
+ <item row="0" column="0">
+- <widget class="KPushButton" name="kpushbutton_install">
++ <widget class="QPushButton" name="kpushbutton_install">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+@@ -630,21 +630,10 @@
+ <header>klineedit.h</header>
+ </customwidget>
+ <customwidget>
+- <class>KPushButton</class>
+- <extends>QPushButton</extends>
+- <header>kpushbutton.h</header>
+- </customwidget>
+- <customwidget>
+ <class>KUrlRequester</class>
+ <extends>QFrame</extends>
+ <header>kurlrequester.h</header>
+ </customwidget>
+- <customwidget>
+- <class>KTabWidget</class>
+- <extends>QTabWidget</extends>
+- <header>ktabwidget.h</header>
+- <container>1</container>
+- </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
diff --git a/PKGBUILD b/PKGBUILD
index 623090347e69..9512cd2c73ae 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,7 +4,7 @@ pkgver=0.6.4
pkgrel=1
pkgdesc="A KDE Control Module for configuring the GRUB2 bootloader.Unofficial KF5 port."
arch=('i686' 'x86_64')
-url='https://ksmanis.wordpress.com/projects/grub2-editor/'
+url='https://github.com/maz-1/grub2-editor'
license=('GPL')
provides=grub2-editor
conflicts=grub2-editor