diff --git a/.gitignore b/.gitignore
index 21d239c..8437de6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
 *.la
 *.lai
 *.so
+*.so.*
 *.dll
 *.dylib
 
@@ -28,13 +29,12 @@ ui_*.h
 *.jsc
 Makefile*
 *build-*
+*.qm
+*.prl
 
 # Qt unit tests
 target_wrapper.*
 
-# Qt qm files
-translations/*.qm
-
 # QtCreator
 *.autosave
 
@@ -44,13 +44,22 @@ translations/*.qm
 
 # QtCreator CMake
 CMakeLists.txt.user*
-build
 
-# Debian dpkg-buildpackage
+# QtCreator 4.8< compilation database
+compile_commands.json
+
+# QtCreator local machine specific files for imported projects
+*creator.user*
+
+*_qmlcache.qrc
+
+# debian
 debian/*.debhelper*
 debian/files
 debian/*.substvars
 debian/spark-store
 
-.vscode/*
-src/spark-store
+# Others
+build
+obj-*
+.vscode
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..6f049df
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,43 @@
+cmake_minimum_required(VERSION 3.12)
+
+project(spark-store)
+
+if(NOT DEFINED VERSION)
+    set(VERSION 4.0.0)
+endif()
+add_compile_definitions(APP_VERSION="${VERSION}")
+
+execute_process(
+    COMMAND git symbolic-ref --short -q HEAD
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    OUTPUT_VARIABLE BRANCH
+)
+string(STRIP "${BRANCH}" BRANCH)
+add_compile_definitions(APP_BRANCH="${BRANCH}")
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(AUTOMOC_COMPILER_PREDEFINES ON)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")
+if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "sw_64")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mieee")
+endif ()
+if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
+endif ()
+
+add_compile_definitions(QT_MESSAGELOGCONTEXT)
+
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+    set(CMAKE_INSTALL_PREFIX /usr)
+endif()
+
+include(GNUInstallDirs)
+
+add_subdirectory(src)
+add_subdirectory(translations)
diff --git a/debian/control b/debian/control
index 996cf1b..bfbb561 100644
--- a/debian/control
+++ b/debian/control
@@ -3,16 +3,18 @@ Maintainer: shenmo <shenmo@spark-app.store>
 Section: utils
 Priority: optional
 Build-Depends:
- debhelper (>= 9),
+ cmake,
+ debhelper (>= 11),
  pkg-config,
- qtchooser (>= 55-gc9562a1-1~) | qt5-default,
- qtbase5-dev,
- libqt5svg5-dev,
- qttools5-dev-tools,
- qtwebengine5-dev,
- libdtkcore-dev (>= 5.0),
- libdtkgui-dev (>= 5.0),
- libdtkwidget-dev (>= 5.0)
+ qtchooser (>= 55-gc9562a1-1~),
+ qt6-base-dev,
+ qt6-svg-dev,
+ qt6-tools-dev,
+ qt6-webengine-dev,
+ libdtkcommon-dev,
+ libdtk6core-dev,
+ libdtk6gui-dev,
+ libdtk6widget-dev
 Standards-Version: 4.1.7
 Homepage: https://www.spark-app.store/
 
@@ -20,10 +22,11 @@ Package: spark-store
 Architecture: any
 Provides: spark-store-console-in-container
 Depends: ${shlibs:Depends}, ${misc:Depends},
- dde-qt5integration,
+ dde-qt6integration,
  curl,
  openssl,
  aria2,
+ qtwayland5,
  gnupg,
  zenity,
  policykit-1 | pkexec,
diff --git a/debian/rules b/debian/rules
index fc38dd1..9eeded9 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,9 +1,14 @@
 #!/usr/bin/make -f
 
-export QT_SELECT = qt5
-export DEB_BUILD_MAINT_OPTIONS = hardening=+all
 include /usr/share/dpkg/default.mk
 
+export QT_SELECT = qt6
+export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+DEB_CFLAGS ?= $(shell dpkg-buildflags --get CFLAGS)
+DEB_CPPFLAGS ?= $(shell dpkg-buildflags --get CPPFLAGS)
+DEB_CXXFLAGS ?= $(shell dpkg-buildflags --get CXXFLAGS)
+
 DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
 DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
 
@@ -16,24 +21,14 @@ SOURCE_DATE_EPOCH := $(shell date +%s)
 %:
 	dh $@ --parallel
 
-override_dh_auto_clean:
-	rm -rf $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
-
 override_dh_auto_configure:
-	mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
+	dh_auto_configure -- \
+	-DVERSION=$(DEB_VERSION_UPSTREAM) \
+	-DCMAKE_BUILD_TYPE=Release \
+	-DCMAKE_C_FLAGS="$(DEB_CFLAGS) $(DEB_CPPFLAGS)" \
+	-DCMAKE_CXX_FLAGS="$(DEB_CXXFLAGS) $(DEB_CPPFLAGS)"
 
-	qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
-	-spec linux-g++ CONFIG+=force_debug_info \
-	-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
-
-override_dh_auto_build:
-	make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) -j$(JOBS)
-
-override_dh_auto_install:
-	make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) install \
-	INSTALL_ROOT=$(CURDIR)/debian/spark-store
-
-# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
-# Qt Mutidedia lib will ref to network libraray.
+#Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
+#Qt Mutidedia lib will ref to network libraray.
 override_dh_shlibdeps:
 	dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0
diff --git a/debian/spark-store.postinst b/debian/spark-store.postinst
index 879a976..b1ac582 100755
--- a/debian/spark-store.postinst
+++ b/debian/spark-store.postinst
@@ -2,7 +2,6 @@
 
 case "$1" in
 	configure)
-
 		case `arch` in
    			x86_64)
 				echo "Enabling i386 arch..."
@@ -12,7 +11,8 @@ case "$1" in
         		aarch64)
         			echo "Will not enable armhf since 4271"
 			;;
-            loongarch64)
+
+			loongarch64)
 				echo "Nope we DO NOT WANT ABI1 now"
 				dpkg --remove-architecture loongarch64
 			;;
@@ -51,11 +51,9 @@ case "$1" in
 		cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg
 
 
-
 		# Start upgrade detect service
 		systemctl daemon-reload
-		systemctl enable spark-update-notifier
-		systemctl start spark-update-notifier
+		systemctl enable spark-update-notifier --now || true
 
 
 		# Update certain caches
@@ -72,7 +70,6 @@ case "$1" in
 	;;
 
 	triggered)
-			spark-dstore-patch
-
+		spark-dstore-patch
 	;;
 esac
diff --git a/debian/spark-store.preinst b/debian/spark-store.preinst
index 1eae804..51de70c 100755
--- a/debian/spark-store.preinst
+++ b/debian/spark-store.preinst
@@ -1,4 +1,5 @@
 #!/bin/bash
+
 #检测网络链接畅通
 function network-check()
 {
@@ -23,6 +24,5 @@ function network-check()
 
 }
 
-
 #network-check
-echo "不再检测网络"
\ No newline at end of file
+#echo "不再检测网络"
diff --git a/debian/spark-store.prerm b/debian/spark-store.prerm
index 1adb1a5..b33f538 100755
--- a/debian/spark-store.prerm
+++ b/debian/spark-store.prerm
@@ -12,6 +12,7 @@ function notify-send()
 }
 
 if [ "$1" = "remove" -o "$1" = "purge" ] ; then
+
 	echo "$1"
 	echo "卸载操作,进行配置清理"
 
@@ -32,33 +33,29 @@ if [ "$1" = "remove" -o "$1" = "purge" ] ; then
 	# Remove residual symbol links to stop upgrade detect
 	rm -f /etc/xdg/autostart/spark-update-notifier.desktop
 	# Remove config files
-for username in `ls /home`      
-    do
-      echo /home/$username
-        if [ -d /home/$username/.config/spark-union/spark-store ]
-        then
-        rm -rf /home/$username/.config/spark-union/spark-store
-        fi
-    done
+	for username in `ls /home`; do
+		echo /home/$username
+		if [ -d /home/$username/.config/spark-union/spark-store ]; then
+			rm -rf /home/$username/.config/spark-union/spark-store
+		fi
+	done
 
 
 	# Shutdown services
-	systemctl stop spark-update-notifier
-	# Stop update detect service
-	systemctl disable spark-update-notifier
+	systemctl disable spark-update-notifier --now || true
 
 
 
 	# Remove gpg key file
 	rm -f /etc/apt/trusted.gpg.d/spark-store.gpg
 	apt-key del '9D9A A859 F750 24B1 A1EC  E16E 0E41 D354 A29A 440C'
+
 else
-	
+
 	if [ ! -z "`pidof spark-store`" ] ; then
 		echo "关闭已有 spark-store.."
 		notify-send "正在升级星火商店" "请在升级结束后重启星火商店" -i spark-store
 		killall spark-store
 	fi
+
 fi
-
-
diff --git a/pkg/etc/apt/sources.list.d/sparkstore.list b/pkg/etc/apt/sources.list.d/sparkstore.list
deleted file mode 100644
index 0563772..0000000
--- a/pkg/etc/apt/sources.list.d/sparkstore.list
+++ /dev/null
@@ -1 +0,0 @@
-deb [by-hash=force] https://d.store.deepinos.org.cn / 
diff --git a/pkg/usr/lib/systemd/system/spark-update-notifier.service b/pkg/lib/systemd/system/spark-update-notifier.service
similarity index 100%
rename from pkg/usr/lib/systemd/system/spark-update-notifier.service
rename to pkg/lib/systemd/system/spark-update-notifier.service
diff --git a/pkg/usr/share/icons/hicolor/scalable/apps/open-me-in-terminal.png b/pkg/usr/share/icons/hicolor/512x512/apps/open-me-in-terminal.png
similarity index 100%
rename from pkg/usr/share/icons/hicolor/scalable/apps/open-me-in-terminal.png
rename to pkg/usr/share/icons/hicolor/512x512/apps/open-me-in-terminal.png
diff --git a/spark-store-project.pro b/spark-store-project.pro
index c1b13c3..c502258 100644
--- a/spark-store-project.pro
+++ b/spark-store-project.pro
@@ -10,7 +10,7 @@ TEMPLATE = subdirs
 CONFIG += ordered
 
 SUBDIRS += \
-        src/spark-store.pro
+        src/$${TARGET}.pro
 
 # https://wiki.debian.org/Hardening
 QMAKE_CFLAGS   *= $(shell dpkg-buildflags --get CFLAGS)
@@ -26,32 +26,31 @@ CONFIG(release, debug | release) {
 
 # Rules for deployment
 tool.files += tool/*
-tool.path = /opt/durapps/$${TARGET}/bin
+tool.path = /opt/durapps/$${TARGET}/bin/
 
 qm.files += translations/*.qm
-qm.path = /usr/share/spark-store/translations
+qm.path = /usr/share/$${TARGET}/translations/
 
 #preferences.files += pkg/etc/apt/preferences.d/sparkstore
-#preferences.path = /etc/apt/preferences.d
+#preferences.path = /etc/apt/preferences.d/
 
 #sourceslist.files += pkg/etc/apt/sources.list.d/sparkstore.list
-#sourceslist.path = /etc/apt/sources.list.d
+#sourceslist.path = /etc/apt/sources.list.d/
 
 bash_completion.files += pkg/usr/share/bash-completion/completions/aptss
-bash_completion.path = /usr/share/bash-completion/completions
+bash_completion.path = /usr/share/bash-completion/completions/
 
 desktop.files += pkg/usr/share/applications/*.desktop
-desktop.path = /usr/share/applications
+desktop.path = /usr/share/applications/
 
 service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
-service.path = /usr/lib/systemd/system/
+service.path = /lib/systemd/system/
 
 polkit-1.files += pkg/usr/share/polkit-1/actions/*
 polkit-1.path = /usr/share/polkit-1/actions/
 
-icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.svg
-icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.png
-icon.path = /usr/share/icons/hicolor/scalable/apps
+icon.files += pkg/usr/share/icons
+icon.path = /usr/share/
 
 ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell
 ssinstall-transhell.path = /usr/share/ssinstall/
@@ -60,7 +59,7 @@ aptss-transhell.files += pkg/usr/share/aptss/transhell
 aptss-transhell.path = /usr/share/aptss/
 
 tmp.files += pkg/tmp/spark-store-install/feedback.sh
-tmp.path = /tmp/spark-store-install
+tmp.path = /tmp/spark-store-install/
 
 INSTALLS += \
         tool \
@@ -74,4 +73,3 @@ INSTALLS += \
         service \
         bash_completion \
         polkit-1 
-#   暂时不添加
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..b5bc88e
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,39 @@
+find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Concurrent Network Svg WebEngineWidgets)
+find_package(Dtk6 REQUIRED COMPONENTS Core Gui Widget)
+
+include(src.cmake)
+
+add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${QRC_FILE})
+
+target_include_directories(${PROJECT_NAME} PUBLIC
+    Qt6::Core
+    Qt6::Gui
+    Qt6::Widgets
+    Qt6::Concurrent
+    Qt6::Network
+    Qt6::Svg
+    Qt6::WebEngineWidgets
+    Dtk6::Core
+    Dtk6::Gui
+    Dtk6::Widget
+)
+
+target_link_libraries(${PROJECT_NAME} PRIVATE
+    Qt6::Core
+    Qt6::Gui
+    Qt6::Widgets
+    Qt6::Concurrent
+    Qt6::Network
+    Qt6::Svg
+    Qt6::WebEngineWidgets
+    Dtk6::Core
+    Dtk6::Gui
+    Dtk6::Widget
+)
+
+install(TARGETS ${PROJECT_NAME} DESTINATION /opt/durapps/${PROJECT_NAME}/bin)
+
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/tool/ DESTINATION /opt/durapps/${PROJECT_NAME}/bin USE_SOURCE_PERMISSIONS)
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/lib/ DESTINATION /lib USE_SOURCE_PERMISSIONS)
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/tmp/ DESTINATION /tmp USE_SOURCE_PERMISSIONS)
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/usr/ DESTINATION ${CMAKE_INSTALL_PREFIX} USE_SOURCE_PERMISSIONS)
diff --git a/src/application.cpp b/src/application.cpp
index 46c56a9..28ec098 100644
--- a/src/application.cpp
+++ b/src/application.cpp
@@ -25,7 +25,6 @@ Application::Application(int &argc, char **argv)
     if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
         setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
     }
-    setAttribute(Qt::AA_UseHighDpiPixmaps);
 
     setQuitOnLastWindowClosed(false); // 启用托盘图标时,关闭窗口程序仍然运行
 
diff --git a/src/main.cpp b/src/main.cpp
index ec50d24..d3bee24 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -12,7 +12,6 @@
 #include <execinfo.h>
 
 #include <DSysInfo>
-#include <DApplicationSettings>
 
 #include <QDate>
 #include <QProcessEnvironment>
@@ -147,13 +146,10 @@ int main(int argc, char *argv[])
     // qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
     // 全平台软件渲染Webkit
     qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu");
-#ifdef __sw_64__
+#if defined (__sw_64__) || defined (__loongarch__)
     qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
 #endif
 
-#ifdef __loongarch__
-    qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
-#endif
     /**
      * NOTE: https://zhuanlan.zhihu.com/p/550285855
      * 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
@@ -163,15 +159,6 @@ int main(int argc, char *argv[])
         DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
     }
 
-
-
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
-    // 开启 Hidpi 支持
-    qDebug() << "Enable HiDPI Support.";
-    DApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
-    DApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
-#endif
-
     // 强制使用 DTK 平台插件
     QVector<char *> fakeArgs(argc + 2);
     fakeArgs[0] = argv[0];
@@ -193,8 +180,6 @@ int main(int argc, char *argv[])
         return -1;
     }
 
-    DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置
-
     MainWindow w;
     a.setMainWindow(&w); // 设置应用程序主窗口,用于初始化关于对话框
 
diff --git a/src/pages/settingspage.cpp b/src/pages/settingspage.cpp
index 16cf2c9..367d094 100644
--- a/src/pages/settingspage.cpp
+++ b/src/pages/settingspage.cpp
@@ -134,7 +134,7 @@ void SettingsPage::on_pushButton_updateServer_clicked()
         ui->comboBox_server->setCurrentIndex(0); });
 }
 
-void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1)
+void SettingsPage::on_comboBox_server_currentTextChanged(const QString &arg1)
 {
     SparkAPI::setServerUrl(arg1); // 服务器信息更新
     qDebug() << arg1;
diff --git a/src/pages/settingspage.h b/src/pages/settingspage.h
index d1e9267..6a82a65 100644
--- a/src/pages/settingspage.h
+++ b/src/pages/settingspage.h
@@ -22,7 +22,7 @@ public:
 private slots:
     void on_pushButton_updateServer_clicked();
 
-    void on_comboBox_server_currentIndexChanged(const QString &arg1);
+    void on_comboBox_server_currentTextChanged(const QString &arg1);
 
     void on_pushButton_updateApt_clicked();
 
diff --git a/src/src.cmake b/src/src.cmake
new file mode 100644
index 0000000..89b47da
--- /dev/null
+++ b/src/src.cmake
@@ -0,0 +1,18 @@
+include_directories(backend)
+include_directories(dbus)
+include_directories(pages)
+include_directories(utils)
+include_directories(widgets)
+
+# https://cmake.org/cmake/help/v3.12/command/file.html#glob-recurse
+file(GLOB_RECURSE HEADERS CONFIGURE_DEPENDS
+    "${CMAKE_CURRENT_SOURCE_DIR}/*.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp"
+)
+
+file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS
+    "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
+    "${CMAKE_CURRENT_SOURCE_DIR}/*.ui"
+)
+
+qt6_add_resources(QRC_FILE ${CMAKE_CURRENT_SOURCE_DIR}/assets/assets.qrc)
diff --git a/src/utils/httprequest.cpp b/src/utils/httprequest.cpp
index b64e095..8baf92a 100644
--- a/src/utils/httprequest.cpp
+++ b/src/utils/httprequest.cpp
@@ -41,8 +41,7 @@ QString HttpRequest::postRequest(QString url, QString jsondata)
     QEventLoop eventLoop;
     connect(naManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
     eventLoop.exec();
-    QTextCodec *codec = QTextCodec::codecForName("utf8");
-    QString strReply = codec->toUnicode(reply->readAll());
+    QString strReply(reply->readAll());
     reply->deleteLater();
     return strReply;
 }
diff --git a/src/utils/httprequest.h b/src/utils/httprequest.h
index e6ad7f1..c55bc52 100644
--- a/src/utils/httprequest.h
+++ b/src/utils/httprequest.h
@@ -6,7 +6,6 @@
 #include <QNetworkReply>
 #include <QNetworkRequest>
 #include <QEventLoop>
-#include <QTextCodec>
 class HttpRequest : public QObject
 {
     Q_OBJECT
diff --git a/src/widgets/big_image.cpp b/src/widgets/big_image.cpp
index 5620518..e3bcf98 100644
--- a/src/widgets/big_image.cpp
+++ b/src/widgets/big_image.cpp
@@ -17,7 +17,7 @@ big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
     QHBoxLayout *layout = new QHBoxLayout;
     setLayout(layout);
     layout->addWidget(m_image);
-    layout->setMargin(0);
+    layout->setContentsMargins(0, 0, 0, 0);
 
     // Make sure the image has a parent so that it will be freed.
     m_image->setParent(this);
diff --git a/src/widgets/common/downloaditem.cpp b/src/widgets/common/downloaditem.cpp
index 574780b..07f5a45 100644
--- a/src/widgets/common/downloaditem.cpp
+++ b/src/widgets/common/downloaditem.cpp
@@ -158,7 +158,7 @@ void DownloadItem::on_pushButton_3_clicked()
     output_w->setMinimumHeight(600);
     output_w->setAttribute(Qt::WA_TranslucentBackground);
     output_w->setTitle(ui->label->text());
-    output_w->layout()->setMargin(20);
+    output_w->layout()->setContentsMargins(20, 20, 20, 20);
     output_w->layout()->addWidget(textbrowser);
     output_w->show();
 }
diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt
new file mode 100644
index 0000000..789bfe6
--- /dev/null
+++ b/translations/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Have to disable cleaning for this folder because cmake deletes .ts files upon clean
+# Not sure what else wont clean up / dirty workaround of Qt bug
+# @ref https://bugreports.qt.io/browse/QTBUG-41736
+# @ref https://stackoverflow.com/a/24245615/1917249
+set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM TRUE)
+
+find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
+
+# Update ts files and release qm files only in Release build
+file(GLOB TS_FILES "*.ts")
+if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
+    set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_SOURCE_DIR})
+    qt6_create_translation(QM_FILES ${CMAKE_SOURCE_DIR}/src ${TS_FILES} OPTIONS -no-obsolete)
+    # https://stackoverflow.com/questions/70665191/cmake-does-not-generate-ts-files
+    add_custom_target(${PROJECT_NAME}_translations DEPENDS ${TS_FILES} ${QM_FILES})
+    add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_translations)
+endif ()
+
+install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/translations)
diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts
index baea222..a0e289b 100644
--- a/translations/spark-store_en.ts
+++ b/translations/spark-store_en.ts
@@ -269,12 +269,12 @@
 <context>
     <name>DAboutDialog</name>
     <message>
-        <location filename="../src/application.cpp" line="142"/>
+        <location filename="../src/application.cpp" line="141"/>
         <source>Version: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="152"/>
+        <location filename="../src/application.cpp" line="151"/>
         <source>%1 is released under %2</source>
         <translation type="unfinished"></translation>
     </message>
@@ -515,6 +515,7 @@
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../src/application.cpp" line="35"/>
         <location filename="../src/application.cpp" line="36"/>
         <location filename="../src/application.cpp" line="37"/>
         <location filename="../src/mainwindow-dtk.cpp" line="142"/>
@@ -522,12 +523,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="41"/>
+        <location filename="../src/application.cpp" line="40"/>
         <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="149"/>
+        <location filename="../src/application.cpp" line="148"/>
         <source>Spark Project</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/translations/spark-store_es.ts b/translations/spark-store_es.ts
index 98d4b03..c91f395 100644
--- a/translations/spark-store_es.ts
+++ b/translations/spark-store_es.ts
@@ -269,12 +269,12 @@
 <context>
     <name>DAboutDialog</name>
     <message>
-        <location filename="../src/application.cpp" line="142"/>
+        <location filename="../src/application.cpp" line="141"/>
         <source>Version: %1</source>
         <translation>Versión %1</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="152"/>
+        <location filename="../src/application.cpp" line="151"/>
         <source>%1 is released under %2</source>
         <translation>%1 publicado bajo %2</translation>
     </message>
@@ -515,6 +515,7 @@
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../src/application.cpp" line="35"/>
         <location filename="../src/application.cpp" line="36"/>
         <location filename="../src/application.cpp" line="37"/>
         <location filename="../src/mainwindow-dtk.cpp" line="142"/>
@@ -522,12 +523,12 @@
         <translation>SPARK Store</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="41"/>
+        <location filename="../src/application.cpp" line="40"/>
         <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
         <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="149"/>
+        <location filename="../src/application.cpp" line="148"/>
         <source>Spark Project</source>
         <translation>Proyecto spark</translation>
     </message>
diff --git a/translations/spark-store_fr.ts b/translations/spark-store_fr.ts
index d2e2a3e..dfa93e8 100644
--- a/translations/spark-store_fr.ts
+++ b/translations/spark-store_fr.ts
@@ -269,12 +269,12 @@
 <context>
     <name>DAboutDialog</name>
     <message>
-        <location filename="../src/application.cpp" line="142"/>
+        <location filename="../src/application.cpp" line="141"/>
         <source>Version: %1</source>
         <translation>Version: %1</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="152"/>
+        <location filename="../src/application.cpp" line="151"/>
         <source>%1 is released under %2</source>
         <translation>%1 publié sous %2</translation>
     </message>
@@ -515,6 +515,7 @@
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../src/application.cpp" line="35"/>
         <location filename="../src/application.cpp" line="36"/>
         <location filename="../src/application.cpp" line="37"/>
         <location filename="../src/mainwindow-dtk.cpp" line="142"/>
@@ -522,12 +523,12 @@
         <translation>Le Spark store</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="41"/>
+        <location filename="../src/application.cpp" line="40"/>
         <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
         <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="149"/>
+        <location filename="../src/application.cpp" line="148"/>
         <source>Spark Project</source>
         <translation>Le projet Spark</translation>
     </message>
diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts
index e041cff..c90f564 100644
--- a/translations/spark-store_zh_CN.ts
+++ b/translations/spark-store_zh_CN.ts
@@ -269,12 +269,12 @@
 <context>
     <name>DAboutDialog</name>
     <message>
-        <location filename="../src/application.cpp" line="142"/>
+        <location filename="../src/application.cpp" line="141"/>
         <source>Version: %1</source>
         <translation>版本:%1</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="152"/>
+        <location filename="../src/application.cpp" line="151"/>
         <source>%1 is released under %2</source>
         <translation>%1遵循%2协议发布</translation>
     </message>
@@ -515,6 +515,7 @@
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../src/application.cpp" line="35"/>
         <location filename="../src/application.cpp" line="36"/>
         <location filename="../src/application.cpp" line="37"/>
         <location filename="../src/mainwindow-dtk.cpp" line="142"/>
@@ -522,12 +523,12 @@
         <translation>星火应用商店</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="41"/>
+        <location filename="../src/application.cpp" line="40"/>
         <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
         <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;一款由社区提供的应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="149"/>
+        <location filename="../src/application.cpp" line="148"/>
         <source>Spark Project</source>
         <translation>星火计划</translation>
     </message>
diff --git a/translations/spark-store_zh_TW.ts b/translations/spark-store_zh_TW.ts
index 442d45b..43d69cb 100644
--- a/translations/spark-store_zh_TW.ts
+++ b/translations/spark-store_zh_TW.ts
@@ -269,12 +269,12 @@
 <context>
     <name>DAboutDialog</name>
     <message>
-        <location filename="../src/application.cpp" line="142"/>
+        <location filename="../src/application.cpp" line="141"/>
         <source>Version: %1</source>
         <translation>版本:%1</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="152"/>
+        <location filename="../src/application.cpp" line="151"/>
         <source>%1 is released under %2</source>
         <translation>%1遵循%2协议发布</translation>
     </message>
@@ -515,19 +515,19 @@
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../src/application.cpp" line="35"/>
         <location filename="../src/application.cpp" line="36"/>
-        <location filename="../src/application.cpp" line="37"/>
-        <location filename="../src/mainwindow-dtk.cpp" line="142"/>
+        <location filename="../src/mainwindow-dtk.cpp" line="126"/>
         <source>Spark Store</source>
         <translation>星火应用商店</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="41"/>
+        <location filename="../src/application.cpp" line="40"/>
         <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
         <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;一款由社区提供的应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
     </message>
     <message>
-        <location filename="../src/application.cpp" line="149"/>
+        <location filename="../src/application.cpp" line="148"/>
         <source>Spark Project</source>
         <translation>星火计划</translation>
     </message>