diff -Nru kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts
--- kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts	1970-01-01 08:00:00.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts	2025-02-27 10:48:52.000000000 +0800
@@ -0,0 +1,662 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ar">
+<context>
+    <name>BlankPage</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="24"/>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="71"/>
+        <source>No Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="66"/>
+        <source>No Relevant Contacts</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ChatMsg</name>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="145"/>
+        <source>Resend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="146"/>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="147"/>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="148"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="149"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="984"/>
+        <source>Save As</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="150"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="151"/>
+        <source>Clear All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="224"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="233"/>
+        <source>Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="242"/>
+        <source>Screen Shot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="251"/>
+        <source>History Message</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="268"/>
+        <source>Send</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="528"/>
+        <source>Message send failed, please check whether IP connection is successful!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="641"/>
+        <source>Can not write file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="838"/>
+        <source>No such file or directory!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1004"/>
+        <source>Delete the currently selected message?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1007"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1035"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1084"/>
+        <source>folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1006"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1034"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1032"/>
+        <source>Clear all current messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1054"/>
+        <source>Send Files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1081"/>
+        <source>Send Folders</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ChatSearch</name>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="289"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clear All</source>
+        <translation type="obsolete">清空聊天记录</translation>
+    </message>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="190"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="193"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="327"/>
+        <source>All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="198"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="200"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="328"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="204"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="209"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="329"/>
+        <source>Image/Video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="214"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="216"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="330"/>
+        <source>Link</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="221"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="222"/>
+        <source>canael</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="227"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="232"/>
+        <source>sure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="239"/>
+        <source>DeleteMenu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="140"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="250"/>
+        <source>Batch delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="66"/>
+        <source>Chat content</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="141"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="252"/>
+        <source>Clear all messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="162"/>
+        <source>Chat Content</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="290"/>
+        <source>Choose Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="291"/>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="292"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="684"/>
+        <source>No such file or directory!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="745"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="979"/>
+        <source>Delete the currently selected message?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="748"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="786"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="982"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="747"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="785"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="981"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="783"/>
+        <source>Clear all current messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Control</name>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/controller/control.cpp" line="282"/>
+        <source>Anonymous</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FriendInfoWid</name>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="159"/>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="186"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="195"/>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="225"/>
+        <source>Username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="234"/>
+        <source>IP Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="244"/>
+        <source>Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="343"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FriendListView</name>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="96"/>
+        <source>Start Chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="97"/>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="150"/>
+        <source>Set to Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="98"/>
+        <source>Change Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="99"/>
+        <source>View Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="100"/>
+        <source>Delete Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="153"/>
+        <source>Cancel the Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>KyView</name>
+    <message>
+        <location filename="../../src/view/kyview.cpp" line="154"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LocalInfo</name>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localinfo.cpp" line="179"/>
+        <source>Modify Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localinfo.cpp" line="188"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LocalUpdateName</name>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="159"/>
+        <source>Set Username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="160"/>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="211"/>
+        <source>Please enter username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="163"/>
+        <source>Change nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="164"/>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="213"/>
+        <source>Please enter friend nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="167"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="172"/>
+        <source>Confirm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="179"/>
+        <source>Skip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="216"/>
+        <source>The length of user name is less than 20 words</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="218"/>
+        <source>Please do not enter special characters</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="121"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="122"/>
+        <source>Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SearchMsgDelegate</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/search_msg_delegate.cpp" line="47"/>
+        <source> relevant chat records</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SearchPage</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="125"/>
+        <source>Start Chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="126"/>
+        <source>Set to Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="127"/>
+        <source>Change Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="128"/>
+        <source>View Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="129"/>
+        <source>Delete Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="167"/>
+        <source>Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="171"/>
+        <source>Chat Record</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TitleBar</name>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="161"/>
+        <source>Minimize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="162"/>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="165"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TitleSeting</name>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="103"/>
+        <source>File Save Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="116"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="236"/>
+        <source>Change Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="124"/>
+        <source>Clear All Chat Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="132"/>
+        <source>Clear the Cache</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Modified successfully</source>
+        <translation type="vanished">修改成功</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="255"/>
+        <source>Modified Successfully</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="296"/>
+        <source>Clear all messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="299"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="326"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="298"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="327"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="242"/>
+        <source>The save path can only be a dir under the home dir!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="310"/>
+        <source>Cleared</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="324"/>
+        <source>Clean the cache information such as images/videos/documents?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="340"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="364"/>
+        <source>Clean Up Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clean up complete</source>
+        <translation type="vanished">清理完成</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="391"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="398"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="406"/>
+        <source>Please do not save the file in this directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TrayIconWid</name>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="168"/>
+        <source>Ignore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="135"/>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="179"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>menuModule</name>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="44"/>
+        <source>Options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="58"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="141"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="60"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="139"/>
+        <source>Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="62"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="137"/>
+        <source>Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="64"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="135"/>
+        <source>About</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="66"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="143"/>
+        <source>Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="74"/>
+        <source>Follow the Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="78"/>
+        <source>Light Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="82"/>
+        <source>Dark Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="194"/>
+        <source>Version: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="195"/>
+        <source>Message provides text chat and file transfer functions in the LAN. There is no need to build a server. It supports multiple people to interact at the same time and send and receive in parallel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Service &amp; Support: </source>
+        <translation type="vanished">服务与支持团队:</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.h" line="68"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff -Nru kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts
--- kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts	1970-01-01 08:00:00.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts	2025-02-27 10:48:52.000000000 +0800
@@ -0,0 +1,662 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="vi">
+<context>
+    <name>BlankPage</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="24"/>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="71"/>
+        <source>No Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="66"/>
+        <source>No Relevant Contacts</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ChatMsg</name>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="145"/>
+        <source>Resend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="146"/>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="147"/>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="148"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="149"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="984"/>
+        <source>Save As</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="150"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="151"/>
+        <source>Clear All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="224"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="233"/>
+        <source>Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="242"/>
+        <source>Screen Shot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="251"/>
+        <source>History Message</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="268"/>
+        <source>Send</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="528"/>
+        <source>Message send failed, please check whether IP connection is successful!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="641"/>
+        <source>Can not write file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="838"/>
+        <source>No such file or directory!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1004"/>
+        <source>Delete the currently selected message?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1007"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1035"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1084"/>
+        <source>folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1006"/>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1034"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1032"/>
+        <source>Clear all current messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1054"/>
+        <source>Send Files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1081"/>
+        <source>Send Folders</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ChatSearch</name>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="289"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clear All</source>
+        <translation type="obsolete">清空聊天记录</translation>
+    </message>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="190"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="193"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="327"/>
+        <source>All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="198"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="200"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="328"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="204"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="209"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="329"/>
+        <source>Image/Video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="214"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="216"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="330"/>
+        <source>Link</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="221"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="222"/>
+        <source>canael</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="227"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="232"/>
+        <source>sure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="239"/>
+        <source>DeleteMenu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="140"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="250"/>
+        <source>Batch delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="66"/>
+        <source>Chat content</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="141"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="252"/>
+        <source>Clear all messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="162"/>
+        <source>Chat Content</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="290"/>
+        <source>Choose Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="291"/>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="292"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="684"/>
+        <source>No such file or directory!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="745"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="979"/>
+        <source>Delete the currently selected message?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="748"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="786"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="982"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="747"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="785"/>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="981"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/chatsearch/chat_search.cpp" line="783"/>
+        <source>Clear all current messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Control</name>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/controller/control.cpp" line="282"/>
+        <source>Anonymous</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FriendInfoWid</name>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="159"/>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="186"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="195"/>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="225"/>
+        <source>Username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="234"/>
+        <source>IP Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="244"/>
+        <source>Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendinfowid.cpp" line="343"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FriendListView</name>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="96"/>
+        <source>Start Chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="97"/>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="150"/>
+        <source>Set to Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="98"/>
+        <source>Change Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="99"/>
+        <source>View Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="100"/>
+        <source>Delete Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/friendlist.cpp" line="153"/>
+        <source>Cancel the Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>KyView</name>
+    <message>
+        <location filename="../../src/view/kyview.cpp" line="154"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LocalInfo</name>
+    <message>
+        <source>Search</source>
+        <translation type="vanished">搜索</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localinfo.cpp" line="179"/>
+        <source>Modify Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localinfo.cpp" line="188"/>
+        <source>Open Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LocalUpdateName</name>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="159"/>
+        <source>Set Username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="160"/>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="211"/>
+        <source>Please enter username</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="163"/>
+        <source>Change nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="164"/>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="213"/>
+        <source>Please enter friend nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="167"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="172"/>
+        <source>Confirm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="179"/>
+        <source>Skip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="216"/>
+        <source>The length of user name is less than 20 words</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/localinfo/localupdatename.cpp" line="218"/>
+        <source>Please do not enter special characters</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="121"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="122"/>
+        <source>Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SearchMsgDelegate</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/search_msg_delegate.cpp" line="47"/>
+        <source> relevant chat records</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SearchPage</name>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="125"/>
+        <source>Start Chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="126"/>
+        <source>Set to Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="127"/>
+        <source>Change Nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="128"/>
+        <source>View Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="129"/>
+        <source>Delete Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="167"/>
+        <source>Friend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="171"/>
+        <source>Chat Record</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TitleBar</name>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="161"/>
+        <source>Minimize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="162"/>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titlebar.cpp" line="165"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TitleSeting</name>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="103"/>
+        <source>File Save Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="116"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="236"/>
+        <source>Change Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="124"/>
+        <source>Clear All Chat Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="132"/>
+        <source>Clear the Cache</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Modified successfully</source>
+        <translation type="vanished">修改成功</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="255"/>
+        <source>Modified Successfully</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="296"/>
+        <source>Clear all messages?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="299"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="326"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="298"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="327"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="242"/>
+        <source>The save path can only be a dir under the home dir!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="310"/>
+        <source>Cleared</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="324"/>
+        <source>Clean the cache information such as images/videos/documents?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="340"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="364"/>
+        <source>Clean Up Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clean up complete</source>
+        <translation type="vanished">清理完成</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="391"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="398"/>
+        <location filename="../../src/view/titlebar/titleseting.cpp" line="406"/>
+        <source>Please do not save the file in this directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TrayIconWid</name>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="168"/>
+        <source>Ignore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="135"/>
+        <location filename="../../src/view/trayicon/trayiconwid.cpp" line="179"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>menuModule</name>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="44"/>
+        <source>Options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="58"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="141"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="60"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="139"/>
+        <source>Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="62"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="137"/>
+        <source>Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="64"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="135"/>
+        <source>About</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="66"/>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="143"/>
+        <source>Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="74"/>
+        <source>Follow the Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="78"/>
+        <source>Light Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="82"/>
+        <source>Dark Theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="194"/>
+        <source>Version: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.cpp" line="195"/>
+        <source>Message provides text chat and file transfer functions in the LAN. There is no need to build a server. It supports multiple people to interact at the same time and send and receive in parallel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Service &amp; Support: </source>
+        <translation type="vanished">服务与支持团队:</translation>
+    </message>
+    <message>
+        <location filename="../../src/view/titlebar/menumodule.h" line="68"/>
+        <source>Messages</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff -Nru kylin-ipmsg-1.3.1.2/debian/changelog kylin-ipmsg-1.3.1.2/debian/changelog
--- kylin-ipmsg-1.3.1.2/debian/changelog	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/debian/changelog	2025-02-27 10:48:52.000000000 +0800
@@ -1,3 +1,12 @@
+kylin-ipmsg (1.3.1.2-ok16.16) nile; urgency=medium
+
+  * BUG: 无
+  * 需求号: 无
+  * 其他改动说明: 同步最新代码
+  * 其他改动影响域: 无
+
+ -- zhoudisi <zhoudisi@kylinos.cn>  Thu, 27 Feb 2025 10:48:52 +0800
+
 kylin-ipmsg (1.3.1.2-ok16.15) nile; urgency=medium
 
   * BUG: 无
diff -Nru kylin-ipmsg-1.3.1.2/debian/control kylin-ipmsg-1.3.1.2/debian/control
--- kylin-ipmsg-1.3.1.2/debian/control	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/debian/control	2025-02-27 10:48:52.000000000 +0800
@@ -40,5 +40,5 @@
 Architecture: any
 Depends: ${shlibs:Depends},
          ${misc:Depends}
-Description: Messages
- Messages is a LAN chat tool with beautiful Gui.
+Description: a LAN chat tool
+ Messages is a LAN chat tool with beautiful Gui. It also supports text chat, screenshot, file transfer and other functions.
diff -Nru kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp
--- kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp	2025-02-27 10:48:52.000000000 +0800
@@ -54,35 +54,35 @@
     };
 
     /* id 的初始值必须为 0 */
-    static void getWindowId(quint32 *id) {
+    static void getWindowId(QString *id) {
         connect(kdk::WindowManager::self(), &kdk::WindowManager::windowAdded, [=](const kdk::WindowId &windowId) {
-            if (getpid() == (int)kdk::WindowManager::getPid(windowId) && *id == 0) {
-                *id = windowId.toLongLong();
+            if (getpid() == (QString)kdk::WindowManager::getPid(windowId)) {
+                *id = windowId.toString();
             }
         });
 
         return;
     };
 
-    static void keepWindowAbove(const quint32 id) {
+    static void keepWindowAbove(const QString id) {
         kdk::WindowManager::keepWindowAbove(id);
 
         return;
     };
 
-    static void activateWindow(const quint32 id) {
+    static void activateWindow(const QString id) {
         kdk::WindowManager::activateWindow(id);
 
         return;
     }
 
-    static bool isActive(const quint32 id) {
+    static bool isActive(const QString id) {
         kdk::WindowInfo windowInfo = kdk::WindowManager::getwindowInfo(id);
 
         return windowInfo.isActive();
     }
 
-    static bool isMinimized(const quint32 id) {
+    static bool isMinimized(const QString id) {
         kdk::WindowInfo windowInfo = kdk::WindowManager::getwindowInfo(id);
 
         return windowInfo.isMinimized();
@@ -97,4 +97,4 @@
  *     2. exec字段为绝对路径
  */
 
-#endif
\ No newline at end of file
+#endif
diff -Nru kylin-ipmsg-1.3.1.2/src/main.cpp kylin-ipmsg-1.3.1.2/src/main.cpp
--- kylin-ipmsg-1.3.1.2/src/main.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/main.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -149,7 +149,7 @@
     /* wayland 下最小化拉起 */
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) {
         QObject::connect(&app, &kdk::QtSingleApplication::messageReceived, [=]() {
-            if (KyView::getInstance()->getWindowId()) {
+            if (!KyView::getInstance()->getWindowId().isEmpty()) {
                 kabase::WindowManage::activateWindow(KyView::getInstance()->getWindowId());
             }
         });
diff -Nru kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp
--- kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -127,6 +127,139 @@
     return false;
 }
 
+int TcpModule::cmd_exec_tar_decompress(QString dstFileName, QString savePath)
+{
+    if(checkLinkFile(dstFileName)) {
+        qDebug() << "( TcpModule::cmd_exec_tar_decompress )  contains linkfile";
+        return -1;
+    } else {
+        /* 代码安全规范 :使用 fork+evecve执行解压缩操作: tar -zxf \"%1\" -C \"%2\ */
+
+        qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork+evecve tart -zxf " << dstFileName << "-C" << savePath;
+        pid_t pid = -1;
+        int status = -1;
+        const char *args[6];
+        const char *des;
+        const char *save;
+
+        QByteArray des_arr = dstFileName.toLocal8Bit();
+        QByteArray save_arr = savePath.toLocal8Bit();
+        des = des_arr.data();
+        save = save_arr.data();
+
+        args[0] = "tar";
+        args[1] = "-zxf";
+        args[2] = des;
+        args[3] = "-C";
+        args[4] = save;
+        args[5] = NULL;
+        char **env = NULL;
+
+        pid = fork();
+        if (pid == (pid_t)0) {
+            /* Child side */
+            (void)execve("/usr/bin/tar",(char *const*)args, env);
+            qWarning() << "( TcpModule::cmd_exec_tar_decompress) pid = " << pid << " execve failed";
+            _exit(127);
+        } else if (pid < (pid_t)0) {
+            /* the fork failed */
+            qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork failed";
+            status = -1;
+        } else {
+            /* Parent side */
+
+            int n;
+            do{
+                n = waitpid(pid, &status, 0);
+            }while(n ==-1 && errno == EINTR);
+
+            if (n != pid) {
+                status = -1;
+            }
+            qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork parent side end";
+        }
+        return status;
+    }
+}
+
+int TcpModule::cmd_exec_tar_compress(QString dstPath, QString detFileName, QString srcPath, QString baseName)
+{
+    /* 代码安全规范 :使用 fork+evecve 执行压缩操作: tar -hzcf \"%1\" -C \"%2\  \"%3\*/
+    qDebug() << "( TcpModule::cmd_exec_tar_compress ) fork+evecve tart -hzcf " << dstPath << "/"
+             << detFileName << ".tar.gz" <<"-C" << srcPath << " " << baseName;
+    pid_t pid = -1;
+    int status = -1;
+    const char *args[7];
+    const char *des_path;
+    const char *src_path;
+    const char *file_name;
+
+
+    QByteArray des_path_arr = (dstPath + '/' + detFileName + ".tar.gz").toLocal8Bit();
+    QByteArray src_path_arr = srcPath.toLocal8Bit();
+    QByteArray file_name_arr = baseName.toLocal8Bit();
+    des_path = des_path_arr.data();
+    src_path = src_path_arr.data();
+    file_name =file_name_arr.data();
+
+    qDebug() << "des_path = " << des_path;
+    qDebug() << "src_path = " << src_path;
+    qDebug() << "file_name = " << file_name;
+
+    args[0] = "tar";
+    args[1] = "-hzcf";
+    args[2] = des_path;
+    args[3] = "-C";
+    args[4] = src_path;
+    args[5] = file_name;
+    args[6] = NULL;
+    char **env = NULL;
+
+    pid = fork();
+    if (pid == (pid_t)0) {
+        /* Child side */
+        (void)execve("/usr/bin/tar",(char *const*)args, env);
+        qDebug() << "( TcpModule::cmd_exec_tar_compress ) pid = " << pid << "execve failed";
+        _exit(127);
+    } else if (pid < (pid_t)0) {
+        /* the fork failed */
+        qDebug() << "( TcpModule::cmd_exec_tar_compress ) fork failed";
+        status = -1;
+    } else {
+        /* Parent side */
+        int n;
+        do{
+            n = waitpid(pid, &status, 0);
+        }while(n ==-1 && errno == EINTR);
+
+        if (n != pid) {
+            status = -1;
+        }
+    }
+    qDebug() << "( TcpModule::cmd_exec_tar_compress ) cmd tar exit";
+    return status;
+}
+
+bool TcpModule::checkLinkFile(QString dstFileName)
+{
+    //解压前查看是否包含软链接:tar -tvf \"%1\"'
+    QProcess tarProcess;
+    QStringList tarArguments;
+    tarArguments << "-tvf" << dstFileName;
+    qDebug() << "( TcpModule::checkLinkFile ) tar -tvf "<< dstFileName;
+    tarProcess.start("/usr/bin/tar", tarArguments);
+    tarProcess.waitForFinished();
+    bool isLink = false;
+    while(tarProcess.canReadLine()) {
+            QString str = tarProcess.readLine();
+            if (str.begin()[0] == 'l') {
+                isLink = true;
+                break;
+            }
+    }
+    return isLink;
+}
+
 /* 主动连接超时处理 */
 void TcpModule::slotConnTimeout()
 {
@@ -277,7 +410,13 @@
     QFileInfo fileInfo(send->m_filePath);
     QString baseName = fileInfo.fileName();
     filePath = send->m_filePath;
-    QString basePath = filePath.remove(baseName);
+    QString basePath = fileInfo.absolutePath();
+
+    /* 修复安全漏洞KVE-2024-0202 */
+    if (baseName.contains("../")){
+        qDebug() << "There is security threat";
+        return;
+    }
 
     std::string stdBaseName = baseName.toStdString();
     char *cBaseName = const_cast<char *>(stdBaseName.c_str());
@@ -329,7 +468,7 @@
             if (!tmpCachePath) {
                 qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!";
             }
-            if (verify_file(tmpCachePath)) { 
+            if (verify_file(tmpCachePath)) {
                 qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!";
                 assert(verify_file(tmpCachePath));
             }
@@ -349,13 +488,14 @@
         // memset(command, 0x00, sizeof(command));
         // sprintf(command, "tar -zcf \"%s/%s.tar.gz\" -C %s \"%s\"", cachePath, cBaseName, cBasePath, cBaseName);
         /* 代码安全规范进行替换(字符串拼接) */
-        QString qstrCommand = QString("tar -zcf \"%1/%2.tar.gz\" -C %3 \"%4\"").arg(strCachePath).arg(baseName).arg(basePath).arg(baseName);
-        std::string strCommand = qstrCommand.toStdString();
-        const char* command = strCommand.c_str();
-
-        ret = system(command);
-
-        if (ret) {
+        //QString qstrCommand = QString("tar -zcf \"%1/%2.tar.gz\" -C %3 \"%4\"").arg(strCachePath).arg(baseName).arg(basePath).arg(baseName);
+        //std::string strCommand = qstrCommand.toStdString();
+        //const char* command = strCommand.c_str();
+        //
+        //ret = system(command);
+        ret = cmd_exec_tar_compress(strCachePath, baseName, basePath, baseName);
+        qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile )  cmd_exec_tar_compress return value:ret = " << ret;
+        if (ret != 0) {
             /* PRO : 只是压缩失败 , 并不代表 tcp 异常 */
             emit sigSendFileFail(send);
             emit sigMaintainTcpLinkDelete(this->m_uuid);
@@ -759,6 +899,13 @@
         char *cFileType = const_cast<char *>(package.value(QByteArray("file_type")).data());
         strncpy(this->m_fileType, cFileType, sizeof(this->m_fileType) - 1);
 
+        /* 修复安全漏洞KVE-2024-0202 */
+        QString filename = this->m_fileName;
+        if (filename.contains("../")){
+            qDebug() << "There is security threat";
+            return;
+        }
+
         this->m_fileTotalSize = package.value(QByteArray("file_total_size")).toLongLong();
 
         this->m_msgType = package.value(QByteArray("type")).toInt();
@@ -878,7 +1025,7 @@
         // char dstFileName[1024 * 2];
         // memset(dstFileName, 0x00, sizeof(dstFileName));
         // sprintf(dstFileName, "%s%s", this->m_savePath, this->m_fileName);
-        
+
         /********************** 代码安全规范进行替换(字符串拼接) **********************/
         QString qstrSavePath = QString::fromUtf8(this->m_savePath);
         QString qstrFileName = QString::fromUtf8(this->m_fileName);
@@ -918,7 +1065,7 @@
         if (!dstFileName) {
             qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
         }
-        if (verify_file(dstFileName)) { 
+        if (verify_file(dstFileName)) {
             qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
             assert(verify_file(dstFileName));
         }
@@ -946,8 +1093,8 @@
             QFileInfo file(decomDirName);
             QString name;
             int i = 0;
-            ret = access(decomDirName, F_OK);
-            if (!ret) {
+            ret = QFileInfo(decomDirName).exists();
+            if (ret) {
                 /* 生成文件名 */
                 for (;;) {
                     if (file.completeSuffix().isEmpty()) {
@@ -983,14 +1130,14 @@
                 if (!tmpDecomDir) {
                     qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
                 }
-                if (verify_file(tmpDecomDir)) { 
+                if (verify_file(tmpDecomDir)) {
                     qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
                     assert(verify_file(tmpDecomDir));
                 }
                 /********************** 添加安全代码规范 **********************/
 
-                ret = access(tmpDecomDir, F_OK);
-                if (ret) {
+                ret = QFileInfo(tmpDecomDir).exists();
+                if (!ret) {
                     ret = mkdir(tmpDecomDir, 0777);
                     if (ret) {
                         qDebug() << "Error : create tmp decom path fail";
@@ -1004,8 +1151,10 @@
                 // char command[1024 * 4];
                 // memset(command, 0x00, sizeof(command));
                 // sprintf(command, "tar -zxf \"%s\" -C \"%s\"", dstFileName, tmpDecomDir);
-                ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(tmpDecomDir)).toStdString().c_str());
-                if (ret) {
+                //ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(tmpDecomDir)).toStdString().c_str());
+                ret  = cmd_exec_tar_decompress(dstFileName, QString(tmpDecomDir));
+                qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile ) cmd_exec_tar_decompress return value:ret =  " << ret;
+                if (ret == -1) {
                     qDebug() << "Error : TcpModule , recvFile , tar command if fail";
                 }
 
@@ -1041,15 +1190,18 @@
                 if (!savePath) {
                     qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
                 }
-                if (verify_file(savePath)) { 
+                if (verify_file(savePath)) {
                     qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
                     assert(verify_file(savePath));
                 }
+
+                //ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(savePath)).toStdString().c_str());
+                ret = cmd_exec_tar_decompress(dstFileName, QString(savePath));
+                qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile ) cmd_exec_tar_decompress return value:ret =  " << ret;
+                if (ret == -1) {
+                     qDebug() << "Waring : TcpModule , recvFile , tar command is fail";
+                 }
                 /********************** 添加安全代码规范 **********************/
-                ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(savePath)).toStdString().c_str());
-                if (ret) {
-                    qDebug() << "Waring : TcpModule , recvFile , tar command is fail";
-                }
 
                 ret = remove(dstFileName);
                 if (ret == -1) {
diff -Nru kylin-ipmsg-1.3.1.2/src/network/tcp_module.h kylin-ipmsg-1.3.1.2/src/network/tcp_module.h
--- kylin-ipmsg-1.3.1.2/src/network/tcp_module.h	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/network/tcp_module.h	2025-02-27 10:48:52.000000000 +0800
@@ -40,6 +40,12 @@
 
     bool judgeCancel(ChatMsgInfo *);
 
+    /* 代码安全规范 */
+    int cmd_exec_tar_decompress(QString dstFileName, QString savePath);
+    int cmd_exec_tar_compress(QString dstPath, QString detFileName, QString srcPath, QString baseName);
+    int verify_file(char *const filename);
+    bool checkLinkFile(QString dstFileName);
+
 private:
     QTcpSocket *m_socket;
     ProtocolAnalysis m_moduleProtocolAnalysis;
@@ -65,8 +71,6 @@
     /* 连接超时计时器 */
     QTimer *m_connTimer;
     int m_timeoutCount; /* 超时次数 */
-    
-    int verify_file(char *const filename);  /* 代码规范 */
 
 signals:
     void sigTaskAdd();
diff -Nru kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp
--- kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -166,6 +166,9 @@
     // this->setProperty("useSystemStyleBlur",true);
     // this->setAttribute(Qt::WA_TranslucentBackground,true);
 
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     // 主界面属性
     /* 适配kysdk的窗管 */
     kabase::WindowManage::removeHeader(this);
@@ -943,13 +946,11 @@
     }
 
     filePath = QString("file://") + filePath;
-    bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode));
+//    bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode));
 
-    if (!is_open) {
-        qDebug() << "open by xdg";
-        QString cmd = QString("xdg-open ") + filePath;
-        QProcess::startDetached(cmd);
-    }
+    qDebug() << "open by xdg";
+    QString cmd = QString("/usr/bin/xdg-open ") + filePath;
+    QProcess::startDetached(cmd);
 }
 
 // 打开所在目录
@@ -968,7 +969,7 @@
     }
 
     QString pathCmd = "\"" + filePath + "\"";
-    QString cmd = QString("peony --show-items " + pathCmd);
+    QString cmd = QString("/usr/bin/peony --show-items " + pathCmd);
 
     QProcess::startDetached(cmd);
 }
@@ -1139,7 +1140,7 @@
         m_hasOldImage = false;
     }
 
-    QString cmd = "kylin-screenshot gui";
+    QString cmd = "/usr/bin/kylin-screenshot gui";
     QProcess::execute(cmd);
 
     m_startShot = true;
diff -Nru kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp
--- kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -154,6 +154,9 @@
     /* 适配kysdk的窗管 */
     ::kabase::WindowManage::removeHeader(this);
 
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     this->setFixedSize(QSize(500, 680));
     this->setMouseTracking(true);
 
@@ -707,13 +710,11 @@
     }
 
     filePath = QString("file://") + filePath;
-    bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode));
+//    bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode));
 
-    if (!is_open) {
-        qDebug() << "open by xdg";
-        QString cmd = QString("xdg-open ") + filePath;
-        QProcess::execute(cmd);
-    }
+    qDebug() << "open by xdg";
+    QString cmd = QString("/usr/bin/xdg-open ") + filePath;
+    QProcess::startDetached(cmd);
 }
 
 // 打开所在目录
@@ -732,7 +733,7 @@
     }
 
     QString pathCmd = "\"" + filePath + "\"";
-    QString cmd = QString("peony --show-items " + pathCmd);
+    QString cmd = QString("/usr/bin/peony --show-items " + pathCmd);
 
     QProcess::execute(cmd);
 }
diff -Nru kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp
--- kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -162,6 +162,9 @@
     this->setProperty("useSystemStyleBlur", true);
     this->setAttribute(Qt::WA_TranslucentBackground, true);
 
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     /* 适配kysdk的窗管 */
     kabase::WindowManage::removeHeader(this);
 
@@ -380,8 +383,10 @@
     /* SDK功能点:修改好友备注 */
     GlobalSizeData::SDKPointModifyFriendNotes();
 
-    LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, m_friendId);
+    LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, m_friendId, this);
     updateNameWid->show();
+    kdk::WindowManager::setSkipTaskBar(updateNameWid->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(updateNameWid->windowHandle(), true);
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){
     kabase::WindowManage::setMiddleOfScreen(updateNameWid);
     }
diff -Nru kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp
--- kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -170,6 +170,8 @@
 
     if (m_msgWidMap.contains(friendId)) {
         chatMsg = m_msgWidMap.value(friendId);
+        /* 适配kysdk的窗管 */
+        kabase::WindowManage::removeHeader(chatMsg);
     } else {
         QString friendUuid = FriendListModel::getInstance()->getUuidById(friendId);
         chatMsg = new ChatMsg(friendId, friendUuid);
@@ -280,8 +282,10 @@
     QModelIndex friendIndex = m_sortFilterModel->mapToSource(this->currentIndex());
     int friendId = friendIndex.data(FriendListModel::Id).toInt();
 
-    LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, friendId);
+    LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, friendId, this);
     updateNameWid->show();
+    kdk::WindowManager::setSkipTaskBar(updateNameWid->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(updateNameWid->windowHandle(), true);
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
     {
     kabase::WindowManage::setMiddleOfScreen(updateNameWid);
@@ -299,9 +303,11 @@
     QModelIndex friendIndex = m_sortFilterModel->mapToSource(this->currentIndex());
     int friendId = friendIndex.data(FriendListModel::Id).toInt();
 
-    FriendInfoWid::getInstance()->fillFriendInfo(friendId);
-    FriendInfoWid::getInstance()->activateWindow();
-    FriendInfoWid::getInstance()->show();
+    FriendInfoWid::getInstance(this)->fillFriendInfo(friendId);
+    FriendInfoWid::getInstance(this)->activateWindow();
+    FriendInfoWid::getInstance(this)->show();
+    kdk::WindowManager::setSkipTaskBar(FriendInfoWid::getInstance(this)->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(FriendInfoWid::getInstance(this)->windowHandle(), true);
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){
     kabase::WindowManage::setMiddleOfScreen(FriendInfoWid::getInstance());
     }
diff -Nru kylin-ipmsg-1.3.1.2/src/view/kyview.cpp kylin-ipmsg-1.3.1.2/src/view/kyview.cpp
--- kylin-ipmsg-1.3.1.2/src/view/kyview.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/kyview.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -93,7 +93,7 @@
     m_titleBar->setFixedHeight(GlobalSizeData::TITLEBAR_HEIGHT);
 
     // 本机信息
-    m_localInfo = LocalInfo::getInstance();
+    m_localInfo = LocalInfo::getInstance(this);
     m_localInfo->installEventFilter(this);
 
     // 好友列表
@@ -162,6 +162,9 @@
     this->setProperty("useSystemStyleBlur", true);
     this->setAttribute(Qt::WA_TranslucentBackground, true);
 
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     // 应用居中
     QScreen *screen = QGuiApplication::primaryScreen();
     this->move(screen->geometry().center() - this->rect().center());
@@ -292,8 +295,9 @@
     m_stackedWid->setCurrentIndex(1);
 }
 
-quint32 KyView::getWindowId(void)
+QString KyView::getWindowId(void)
 {
+    kabase::WindowManage::getWindowId(&m_windowId);
     return m_windowId;
 }
 
diff -Nru kylin-ipmsg-1.3.1.2/src/view/kyview.h kylin-ipmsg-1.3.1.2/src/view/kyview.h
--- kylin-ipmsg-1.3.1.2/src/view/kyview.h	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/kyview.h	2025-02-27 10:48:52.000000000 +0800
@@ -80,7 +80,7 @@
     // 窗口关闭事件
     void closeEvent(QCloseEvent *event);
 
-    quint32 getWindowId(void);
+    QString getWindowId(void);
 
 private:
     // 整体界面窗体
@@ -110,7 +110,7 @@
     // 系统托盘
     TrayIconWid *m_trayIconWid;
 
-    quint32 m_windowId = 0;
+    QString m_windowId = "";
 
     // 透明度变化
     void transChange();
diff -Nru kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp
--- kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -41,12 +41,12 @@
 
 LocalInfo *LocalInfo::getInstance(QWidget *parent)
 {
-    Q_UNUSED(parent);
+//    Q_UNUSED(parent);
 
     static LocalInfo *instanse = nullptr;
 
     if (nullptr == instanse) {
-        instanse = new LocalInfo();
+        instanse = new LocalInfo(parent);
     }
 
     return instanse;
@@ -146,6 +146,9 @@
 // 设置组件样式
 void LocalInfo::setWidgetStyle()
 {
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     // 设置空间大小
     m_userAvatarLab->setFixedSize(60, 60);
     m_updateNameBtn->setFixedSize(20, 20);
@@ -244,8 +247,10 @@
     /* sdk功能点:昵称修改 */
     GlobalSizeData::SDKPointNicknameModify();
     
-    m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, false);
+    m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, false, this);
     m_updateNameWid->show();
+    kdk::WindowManager::setSkipTaskBar(m_updateNameWid->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(m_updateNameWid->windowHandle(), true);
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){
     kabase::WindowManage::setMiddleOfScreen(m_updateNameWid);
     }
@@ -307,11 +312,15 @@
 void LocalInfo::checkLocalName()
 {
     if (m_settings->getLocalNickname().isEmpty()) {
-        m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, true);
-        m_updateNameWid->show();
-        if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){
-        kabase::WindowManage::setMiddleOfScreen(m_updateNameWid);
-        }
+        QTimer::singleShot(100, this, [=](){
+            m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, true, this);
+            m_updateNameWid->show();
+            kdk::WindowManager::setSkipTaskBar(m_updateNameWid->windowHandle(), true);
+            kdk::WindowManager::setSkipSwitcher(m_updateNameWid->windowHandle(), true);
+            if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){
+            kabase::WindowManage::setMiddleOfScreen(m_updateNameWid);
+            }
+        });
     }
 }
 
diff -Nru kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp
--- kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -139,6 +139,9 @@
     this->setAutoFillBackground(true);
     this->setBackgroundRole(QPalette::Base);
 
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     this->setFixedSize(QSize(376, 235));
 
     m_titleBar->m_pMinimizeButton->hide();
@@ -212,7 +215,8 @@
 //        } else if (m_nameType == LocalUpdateName::FriendName) {
 //            m_tipsLab->setText(tr("Please enter friend nickname"));
 //        }
-    QRegularExpression re("^[a-zA-Z0-9\\p{Han}\\x{1800}-\\x{18AF}\\x{0400}-\\x{04FF}]+$");
+//    QRegularExpression re("^[a-zA-Z0-9\\p{Han}\\x{1800}-\\x{18AF}\\x{0400}-\\x{04FF}]+$");
+    QRegularExpression re(R"([~!@#$%^&*()_+\-={}|:\"<>?\[\]\\;',./,。、;‘’【】{}:“”《》?!¥……()·∑∏〓"#﹪﹫\s]+)");
     QRegularExpressionMatch match = re.match(m_nameEdit->text());
     if (m_nameEdit->text() == "" && m_nameType == LocalUpdateName::LocalName) {
         m_tipsLab->setText(tr("Please enter username"));
@@ -220,7 +224,7 @@
         m_tipsLab->setText(tr("The length of user name is less than 20 words"));
 //    } else if (!rx.exactMatch(m_nameEdit->text())) {
     }
-    else if ((!match.hasMatch() && m_nameEdit->text() != "" && m_nameType == LocalUpdateName::FriendName)||(!match.hasMatch() && m_nameType == LocalUpdateName::LocalName)) {
+    else if ((match.hasMatch() && m_nameEdit->text() != "" && m_nameType == LocalUpdateName::FriendName)||(match.hasMatch() && m_nameType == LocalUpdateName::LocalName)) {
         m_tipsLab->setText(tr("Please do not enter special characters"));
     } else {
         m_tipsLab->setText("");
diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp
--- kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -28,6 +28,8 @@
 
 menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent)
 {
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
     init();
 }
 
@@ -64,7 +66,8 @@
     actionAbout->setText(tr("About"));
     QAction *actionQuit = new QAction(m_menu);
     actionQuit->setText(tr("Quit"));
-    actions << actionSetUp << actionHelp << actionAbout << actionQuit;
+    KMenuButton* menubutton = new KMenuButton();
+    actions << actionSetUp << actionHelp << actionAbout << menubutton->feedbackAction() << actionQuit;
 
     m_menu->addActions(actions);
 
@@ -183,7 +186,7 @@
 
 void menuModule::setupAction()
 {
-    TitleSeting *titleSetUp = new TitleSeting();
+    TitleSeting *titleSetUp = new TitleSeting(this);
     if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) {
         titleSetUp->show();
         kabase::WindowManage::setMiddleOfScreen(titleSetUp);
@@ -191,18 +194,57 @@
     else{
         titleSetUp->show();
     }
+    kdk::WindowManager::setSkipTaskBar(titleSetUp->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(titleSetUp->windowHandle(), true);
     titleSetUp->update();
 }
 
+QString menuModule::getfontviewerVersion()
+{
+    //return VERSION;
+       FILE *pp = NULL;
+       char *line = NULL;
+       size_t len = 0;
+       ssize_t read;
+       char *q = NULL;
+       QString version = tr("none");
+
+       pp = popen("dpkg -l kylin-ipmsg", "r");
+       if(NULL == pp)
+           return version;
+
+       while((read = getline(&line, &len, pp)) != -1){
+           q = strrchr(line, '\n');
+           *q = '\0';
+
+           QString content = line;
+           QStringList list = content.split(" ");
+
+           list.removeAll("");
+
+           if (list.size() >= 3)
+               version = list.at(2);
+       }
+
+       free(line);
+       pclose(pp);
+       return version;
+}
+
 #include <QDialog>
 void menuModule::initAbout()
 {
-    kdk::KAboutDialog aboutWindow(this, QIcon::fromTheme("kylin-ipmsg"), tr(appShowingName.toLocal8Bit()), tr("Version: ") + APP_VERSION);
+    appVersion = getfontviewerVersion();
+    kdk::KAboutDialog aboutWindow(this, QIcon::fromTheme("kylin-ipmsg"), tr(appShowingName.toLocal8Bit()), tr("Version: ") + appVersion);
     aboutWindow.setBodyText(tr("Message provides text chat and file transfer functions in the LAN. "
                       "There is no need to build a server. "
                       "It supports multiple people to interact at the same time "
                       "and send and receive in parallel."));
     aboutWindow.setBodyTextVisiable(false);
+    aboutWindow.setModal(true);
+    aboutWindow.show();
+    kdk::WindowManager::setSkipTaskBar(aboutWindow.windowHandle(),true);
+    kdk::WindowManager::setSkipSwitcher(aboutWindow.windowHandle(),true);
     aboutWindow.exec();
 
 }
diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h
--- kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h	2025-02-27 10:48:52.000000000 +0800
@@ -66,7 +66,7 @@
     //    程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充
     QString appName = "Messages";            //格式kylin-usb-creator
     QString appShowingName = tr("Messages"); //格式kylin usb creator ,用来在前端展示
-    QString appVersion = qApp->applicationVersion();
+//    QString appVersion = qApp->applicationVersion();
     QString confPath = "org.kylin-calculator-data.settings";
 
     kdk::KAboutDialog *m_aboutWindow = nullptr; // 关于界面
@@ -80,6 +80,7 @@
     // QGSettings *m_pGsettingThemeData = nullptr;
     // QGSettings *m_pGsettingThemeStatus = nullptr;
     enum typeThemeStatus : int { themeAuto = 0, themeBlackOnly = 1, themeLightOnly = 2 } themeStatus;
+    QString appVersion     = nullptr;
 
 public slots:
     void dealSystemGsettingChange(const QString);
@@ -101,6 +102,8 @@
     void helpAction();
     void setupAction();
 
+    QString getfontviewerVersion();
+
     void setThemeFromLocalThemeSetting(QList<QAction *>); //获取本地主题配置
     void setStyleByThemeGsetting();                       //通过外部主题配置设置主题
     void setThemeStyle();
diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp
--- kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -96,6 +96,9 @@
 
 void TitleSeting::setWidgetStyle()
 {
+    //失焦仍显示提示信息
+    this->setAttribute(Qt::WA_AlwaysShowToolTips);
+
     this->setFixedSize(420, 320);
 
     QFont fontLabel = GlobalData::getInstance()->getFontSize16px();
@@ -104,7 +107,9 @@
 
     QFont font = GlobalData::getInstance()->getFontSize14px();
     m_lineRoute->setFont(font);
-    m_lineRoute->setFocusPolicy(Qt::NoFocus);
+    m_lineRoute->setFocusPolicy(Qt::ClickFocus);
+    m_lineRoute->setReadOnly(true);
+    m_lineRoute->setCursor(Qt::IBeamCursor);
     m_lineRoute->setText(IniSettings::getInstance()->getFilePath()); //路径
     m_lineRoute->setTextMargins(8, 6, 8, 6);
     m_lineRoute->setCursorPosition(0);
@@ -115,6 +120,7 @@
 
     m_chooseRouteBtn->setText(tr("Change Directory"));
     m_chooseRouteBtn->setFont(font);
+    m_chooseRouteBtn->setFocusPolicy(Qt::NoFocus);
     m_chooseRouteBtn->setProperty("useButtonPalette", true);
     m_chooseRouteBtn->setProperty("isWindowButton", 0x1);
     m_chooseRouteBtn->setProperty("useIconHighlightEffect", 0x2);
@@ -123,6 +129,7 @@
 
     m_clearChatBtn->setText(tr("Clear All Chat Messages"));
     m_clearChatBtn->setFont(font);
+    m_clearChatBtn->setFocusPolicy(Qt::NoFocus);
     m_clearChatBtn->setProperty("useButtonPalette", true);
     m_clearChatBtn->setProperty("isWindowButton", 0x1);
     m_clearChatBtn->setProperty("useIconHighlightEffect", 0x2);
@@ -131,6 +138,7 @@
 
     m_clearCacheBtn->setText(tr("Clear the Cache"));
     m_clearCacheBtn->setFont(font);
+    m_clearCacheBtn->setFocusPolicy(Qt::NoFocus);
     m_clearCacheBtn->setProperty("useButtonPalette", true);
     m_clearCacheBtn->setProperty("isWindowButton", 0x1);
     m_clearCacheBtn->setProperty("useIconHighlightEffect", 0x2);
diff -Nru kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp
--- kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp	2024-08-21 16:58:29.000000000 +0800
+++ kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp	2025-02-27 10:48:52.000000000 +0800
@@ -375,15 +375,15 @@
     /* sdk功能点:托盘 */
     GlobalSizeData::SDKPointTray();
 
-    quint32 mainWindowId = KyView::getInstance()->getWindowId();
-    if (mainWindowId == 0) {
+    QString mainWindowId = KyView::getInstance()->getWindowId();
+    if (mainWindowId.isEmpty()) {
         qWarning() << "tray active window : window id is 0";
         return;
     }
 
     switch (reason) {
     case QSystemTrayIcon::Trigger:
-    case QSystemTrayIcon::MiddleClick:
+//    case QSystemTrayIcon::MiddleClick:
         if (!kabase::WindowManage::isActive(mainWindowId) || kabase::WindowManage::isMinimized(mainWindowId)) {
             kabase::WindowManage::activateWindow(mainWindowId);
             KyView::getInstance()->show();
@@ -496,6 +496,8 @@
 {
     TitleSeting *titleSetUp = new TitleSeting(this);
     titleSetUp->show();
+    kdk::WindowManager::setSkipTaskBar(titleSetUp->windowHandle(), true);
+    kdk::WindowManager::setSkipSwitcher(titleSetUp->windowHandle(), true);
     titleSetUp->update();
     return;
 }