diff --git a/0000-fix-pkgconfig-Fix-the-issue-of-incorrect-content-in-.patch b/0000-fix-pkgconfig-Fix-the-issue-of-incorrect-content-in-.patch new file mode 100644 index 0000000..339257f --- /dev/null +++ b/0000-fix-pkgconfig-Fix-the-issue-of-incorrect-content-in-.patch @@ -0,0 +1,32 @@ +From 558754678f0a34d1e624dcc9c17b583bc05d4d80 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Tue, 12 Dec 2023 20:26:29 +0800 +Subject: [PATCH] fix(pkgconfig): Fix the issue of incorrect content in the PC + file provided by pkgconfig +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复提供的pkgconfig配置内容缺失的问题 +--- + data/kiran-control-panel.pc.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/data/kiran-control-panel.pc.in b/data/kiran-control-panel.pc.in +index de3ae6b..1e50a0d 100644 +--- a/data/kiran-control-panel.pc.in ++++ b/data/kiran-control-panel.pc.in +@@ -1,7 +1,7 @@ +-includedir=@KCP_INSTALL_INCLUDE@ ++includedir=@KCP_INCLUDEDIR@ + +-category_desktop_location=@CATEGORY_DESKTOP_INSTALL_DIR@ +-category_icon_location=@CATEGORY_ICON_INSTALL_DIR@ ++category_desktop_location=@CATEGORY_DESKTOP_DIR@ ++category_icon_location=@CATEGORY_ICON_DIR@ + + plugin_location=@PLUGIN_LIBS_DIR@ + plugin_desktop_location=@PLUGIN_DESKTOP_DIR@ +-- +2.27.0 + diff --git a/0001-fix-appearance-remove-the-Kiran-and-Adwaita-icon-the.patch b/0001-fix-appearance-remove-the-Kiran-and-Adwaita-icon-the.patch new file mode 100644 index 0000000..9cdc85d --- /dev/null +++ b/0001-fix-appearance-remove-the-Kiran-and-Adwaita-icon-the.patch @@ -0,0 +1,9973 @@ +From a6ac8962724e45553dacdf74fa80a11e04d9b635 Mon Sep 17 00:00:00 2001 +From: yuanxing +Date: Wed, 13 Dec 2023 14:04:46 +0800 +Subject: [PATCH] fix(appearance):remove the Kiran and Adwaita icon theme in ui + and translate the icon name for show +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 在界面中不显示Kiran和Adwaita图标主题,将图标名称翻译为中文显示在界面 +--- + .../pages/theme/icon/icon-theme-page.cpp | 6 +- + .../pages/theme/icon/icon-theme-page.h | 7 +- + plugins/appearance/pages/theme/theme-page.cpp | 20 +- + translations/kiran-control-panel.zh_CN.ts | 7099 ++++++++++------- + 4 files changed, 4079 insertions(+), 3053 deletions(-) + +diff --git a/plugins/appearance/pages/theme/icon/icon-theme-page.cpp b/plugins/appearance/pages/theme/icon/icon-theme-page.cpp +index 7aaa142..845d5bf 100644 +--- a/plugins/appearance/pages/theme/icon/icon-theme-page.cpp ++++ b/plugins/appearance/pages/theme/icon/icon-theme-page.cpp +@@ -96,7 +96,6 @@ void IconThemePage::loadIconThemes() + for (auto theme : themeInfos) + { + // 过滤非白名单主题 +- static const QStringList iconThemeWhiteList = {"Kiran", "Adwaita", "Spring","Summer"}; + if (!iconThemeWhiteList.contains(theme.name)) + { + continue; +@@ -174,11 +173,10 @@ ThemePreviewWidget* IconThemePage::createPreviewWidget(const QString& themeName, + previewWidget->setSpacingAndMargin(24, QMargins(24, 0, 24, 0)); + previewWidget->setSelectedIndicatorEnable(true); + previewWidget->setSelected(selected); +- previewWidget->setThemeInfo(themeName, themeName); ++ previewWidget->setThemeInfo(iconThemeWhiteList.value(themeName, themeName), themeName); + previewWidget->setPreviewPixmapSize(QSize(40, 40)); + previewWidget->appendPreviewPixmap(pixmaps); +- connect(previewWidget, &ThemePreviewWidget::pressed, this, [this]() +- { emit requestReturn(); }); ++ connect(previewWidget, &ThemePreviewWidget::pressed, this, [this]() { emit requestReturn(); }); + + return previewWidget; + } +diff --git a/plugins/appearance/pages/theme/icon/icon-theme-page.h b/plugins/appearance/pages/theme/icon/icon-theme-page.h +index 853ef13..dbc52e1 100644 +--- a/plugins/appearance/pages/theme/icon/icon-theme-page.h ++++ b/plugins/appearance/pages/theme/icon/icon-theme-page.h +@@ -16,8 +16,13 @@ + #define ICONTHEMES_H + + #include +-#include + #include ++#include ++ ++// 图标主题及对应翻译 ++const QMap iconThemeWhiteList = { ++ {"Spring", QObject::tr("Spring")}, ++ {"Summer", QObject::tr("Summer")}}; + + namespace Ui + { +diff --git a/plugins/appearance/pages/theme/theme-page.cpp b/plugins/appearance/pages/theme/theme-page.cpp +index a20c4a5..7c303b7 100644 +--- a/plugins/appearance/pages/theme/theme-page.cpp ++++ b/plugins/appearance/pages/theme/theme-page.cpp +@@ -89,21 +89,19 @@ bool ThemePage::initIconTheme() + return false; + } + +- m_chooseIconWidget->setName(m_currIconTheme); ++ m_chooseIconWidget->setName(iconThemeWhiteList.value(m_currIconTheme, m_currIconTheme)); + + m_iconThemePage = new IconThemePage(ui->stackedWidget); + m_iconThemePage->installEventFilter(this); + ui->stackedWidget->addWidget(m_iconThemePage); + + connect(m_chooseIconWidget, &SettingBriefWidget::clicked, this, +- [this] +- { ++ [this] { + ui->stackedWidget->setCurrentWidget(m_iconThemePage); + }); + + connect(m_iconThemePage, &IconThemePage::requestReturn, this, +- [&, this]() +- { ++ [&, this]() { + ui->stackedWidget->setCurrentIndex(0); + }); + +@@ -128,14 +126,12 @@ bool ThemePage::initCursorTheme() + ui->stackedWidget->addWidget(m_cursorThemePage); + + connect(m_chooseCursorWidget, &SettingBriefWidget::clicked, +- [this] +- { ++ [this] { + ui->stackedWidget->setCurrentWidget(m_cursorThemePage); + }); + + connect(m_cursorThemePage, &CursorThemePage::requestReturn, +- [this]() +- { ++ [this]() { + ui->stackedWidget->setCurrentIndex(0); + }); + +@@ -154,8 +150,7 @@ void ThemePage::createThemeWidget() + const QList uiThemes = { + {tr("Light Theme"), LIGHT_THEME, ":/kcp-appearance/images/theme-light.png"}, + {tr("Auto"), THEME_AUTO_NAME, ":/kcp-appearance/images/theme-auto.png"}, +- {tr("Dark Theme"), DARK_THEME, ":/kcp-appearance/images/theme-dark.png"} +- }; ++ {tr("Dark Theme"), DARK_THEME, ":/kcp-appearance/images/theme-dark.png"}}; + + for (int i = 0; i < uiThemes.count(); i++) + { +@@ -212,7 +207,7 @@ void ThemePage::handleThemeChange(int type) + { + QString iconName; + AppearanceGlobalInfo::instance()->getTheme(APPEARANCE_THEME_TYPE_ICON, iconName); +- m_chooseIconWidget->setName(iconName); ++ m_chooseIconWidget->setName(iconThemeWhiteList.value(iconName, iconName)); + m_iconThemePage->updateCurrentTheme(iconName); + break; + } +@@ -258,5 +253,4 @@ void ThemePage::onCurrentUiThemeChanged() + KLOG_INFO(qLcAppearance) << "updated ui theme" << currentID; + } + } +- + } +diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts +index 1ef3d82..6fb278f 100644 +--- a/translations/kiran-control-panel.zh_CN.ts ++++ b/translations/kiran-control-panel.zh_CN.ts +@@ -2,5768 +2,6797 @@ + + + +- CPanelNetworkWidget ++ AccountItemWidget + +- CPanelNetworkWidget +- ++ Create new user ++ 创建新用户 + + +- VPN +- VPN ++ disable ++ 禁用 + + +- Network Details +- 网络详情 ++ enable ++ 启用 + ++ ++ ++ AccountSubItem + +- Wired Network +- 有线网络 ++ ++ account ++ 帐户 + + +- Wireless Network +- 无线网络 ++ ++ New User ++ 创建新用户 + ++ ++ ++ AccountWidget + +- Connected +- 已连接 ++ ++ ++ disable ++ 禁用 + + +- Unavailable +- 已禁用 ++ ++ ++ enable ++ 启用 + + +- Disconnected +- 已断开 ++ ++ Create new user ++ 创建新用户 + ++ ++ ++ ActGuideWidget + +- Wired Network %1 +- 有线网络 %1 ++ Please choose activation mode: ++ 请选择激活方式: + + +- Wireless Network %1 +- 无线网络 %1 ++ Next ++ 下一步 + +- +- +- ConnectionDetailsWidget + +- ConnectionDetailsWidget +- ++ Current machine code: ++ 当前系统机器码: + + +- Security type +- 安全类型 ++ Please input activation code: ++ 请输入激活码: + + +- TextLabel +- ++ Back ++ 上一步 + + +- Frequency band +- 频段 ++ Please insert the UsbKey device first! ++ 请先插入UsbKey设备! + + +- Channel +- 网络通道 ++ Activate online ++ 在线激活 + + +- Interface +- 接口 ++ Activate with the input activation code ++ 输入激活码激活 + + +- MAC +- ++ Activate with insert UsbKey ++ 插入UsbKey设备激活 + + +- IPv4 +- ++ Activate ++ 激活 + + +- Gateway +- 网关 ++ Please enter the activate server address: ++ 请输入激活服务器地址: + + +- DNS +- ++ Activating...... ++ 正在激活...... + + +- Subnet mask +- 子网掩码 ++ System activate successful! ++ 系统激活成功! + + +- IPv6 +- ++ server activation and remaining points: ++ 服务器版激活点数和剩余点数: + + +- Prefix +- 前缀 ++ development activation and remaining points: ++ 开发版激活点数和剩余点数: + + +- Rate +- 速率 ++ industrial activation and remaining points: ++ 工控版激活点数和剩余点数: + + +- Preferred DNS +- 首选DNS ++ desktop activation and remaining points: ++ 桌面版激活点数和剩余点数: + +- +- +- ConnectionItemWidget + +- +- disconnect +- 断开 ++ activation points: ++ 激活点数: + + +- +- ignore +- 忽略 ++ remaining points: ++ 剩余点数: + + +- +- remove +- 移除 ++ Close ++ 关闭 + + +- +- The current device:%1 is not available +- 当前设备:%1 不可用 ++ System activate failed! ++ 系统激活失败! + + +- +- The carrier is pulled out +- 网线被拔出 ++ unknow ++ 未知 + + +- +- Are you sure you want to delete the connection %1 +- 您是否确定要删除连接 "%1" ++ Activation Mode ++ 选择激活方式 + + +- +- Warning +- 警告 ++ Start Activation ++ 开始激活 + + +- +- +- Tips +- 提示 ++ Activation Complete ++ 激活完成 + + +- +- Password required to connect to %1. +- 连接网络 "%1" 需要密码 ++ Activation Guide ++ 激活向导 + + +- +- Please input a network name +- 请输入网络名称 ++ Server IP address or Domain name ++ 服务器IP地址或域名 + + + +- ConnectionNameWidget ++ AdvanceSettings + +- ConnectionNameWidget +- ++ ++ Advance Settings ++ 高级设置 + + +- TextLabel +- ++ ++ ++ Automatically generated by system ++ 由系统自动生成 + + +- EditConnectionName +- ++ ++ Please enter the correct path ++ 请输入正确的路径 + + +- Auto Connection +- 自动连接 ++ ++ Please enter specify user Id ++ 请输入用户ID + + +- Required +- 必填 ++ ++ Please enter an integer above 1000 ++ 请输入一个大于或等于1000的整数 + + +- Wired Connection %1 +- 有线网络%1 ++ ++ Please enter the correct home directory ++ 请输入正确的用户目录 + + +- VPN L2TP %1 +- ++ ++ Form ++ + + +- VPN PPTP %1 ++ ++ Login shell ++ 登录Shell ++ ++ ++ ++ EditLoginShell + + + +- Connection name can not be empty +- 网络名称不能为空 ++ ++ Specify user id (needs to be greater than 1000) ++ 指定用户ID(需大于或等于1000) + +- +- +- ConnectionShowPage + +- ConnectionShowPage ++ ++ EditSpecifyUserID + + + +- TextLabel +- ++ ++ Specify user home ++ 指定用户目录 + + +- ButtonCreateConnection ++ ++ EditSpecifyUserHome + + +- +- +- DetailsPage + +- DetailsPage ++ ++ ButtonConfirm + + + +- Network Details +- 网络详情 ++ ++ confirm ++ 确认 + + +- Please select a connection +- 请选择连接 ++ ++ ButtonCancel ++ + + +- ComboBoxDetailsSelectConnection +- ++ ++ cancel ++ 取消 ++ ++ ++ Specify user id ++ 指定用户ID + + + +- DeviceAvailableConnectionWidget ++ AppearancePlugin + +- +- Network card: %1 +- 网卡:%1 ++ ++ Theme ++ 主题 + + +- +- Other WiFi networks +- 其它WIFI网络 ++ ++ Wallpaper ++ 壁纸 ++ ++ ++ ++ Font ++ 字体 + + + +- DeviceList ++ ApplicationPlugin + +- +- Wired Network Adapter +- 有线网络配置 ++ ++ DefaultApp ++ 默认程序 + + +- +- Wireless Network Adapter +- 无线网络配置 ++ ++ AutoStart ++ 开机启动 + + + +- DisconnectAndDeleteButton ++ AudioSystemTray + +- DisconnectAndDeleteButton +- +- +- +- ButtonDisconnect +- ++ ++ Volume Setting ++ 声音设置 + + +- Disconnect +- 断开 ++ ++ Mixed Setting ++ 混合设置 + ++ ++ ++ AuthManagerPage + +- ButtonDelete +- ++ Fingerprint Authentication ++ 指纹认证 + + +- Delete +- 删除 ++ Face Authentication ++ 人脸认证 + + +- ButtonIgnore +- ++ Password Authentication ++ 密码认证 + + +- Ignore +- 忽略 ++ save ++ 保存 + + +- Are you sure you want to delete the connection %1 +- 您是否确定要删除连接 "%1" ++ return ++ 返回 + + +- Warning +- 警告 ++ add fingerprint ++ 录入指纹数据 + +- +- +- DnsWidget + +- DnsWidget +- ++ add face ++ 录入人脸数据 + + +- Preferred DNS +- 首选DNS ++ error ++ 错误 + + +- Alternate DNS +- 备选DNS ++ please ensure that at least one authentication option exists ++ 请确保至少一个认证选项打开 + +- +- +- DslManager + +- DslManager +- ++ fingerprint_ ++ 指纹_ + + +- DSL +- ++ face_ ++ 人脸_ + + + +- DslSettingPage +- +- DslSettingPage +- +- +- +- Save +- 保存 +- ++ AuthPlugin + +- Return +- 返回 ++ ++ Fingerprint ++ 指纹 + +- +- +- EthernetWidget + +- EthernetWidget +- ++ ++ FingerVein ++ 指静脉 + + +- MAC Address Of Ethernet Device +- 设备MAC地址 ++ ++ UKey ++ UKey + + +- ComboBoxDeviceMac +- ++ ++ Iris ++ 虹膜 + + +- Ethernet Clone MAC Address +- 克隆MAC地址 ++ ++ Face ++ 人脸 + + +- EditDeviceMac +- ++ ++ Driver Manager ++ 驱动管理 + + +- Custom MTU +- 自定义MTU ++ ++ Prefs ++ 配置 + + +- SpinBoxCustomMTU +- ++ Word size ++ 字号 + + +- No device specified +- 不指定设备 ++ System font ++ 系统字体 + + +- Clone Mac invalid +- 无效的克隆MAC地址 ++ Monospaced font ++ 等宽字体 + + + +- Ipv4Widget ++ AutoStartPage + +- Ipv4Widget +- ++ Boot Setup ++ 开机启动设置 + + +- IPV4 Method +- IPV4方法 ++ Desktop files(*.desktop) ++ 桌面类型(*.desktop) + + +- ComboBoxIpv4Method +- ++ select autostart desktop ++ 选择自启动应用 + + +- IP Address +- IP地址 ++ Select ++ 选择 + + +- EditIpv4Address +- ++ Cancel ++ 取消 + + +- Net Mask +- 子网掩码 ++ Error ++ 错误 + + +- EditIpv4Netmask +- ++ Desktop has existed ++ 该程序已存在 + + +- Gateway +- 网关 ++ Desktop cant permit to join ++ 该程序不允许添加 + + +- EditIpv4Gateway +- ++ Desktop dont support ++ 不支持该程序 + ++ ++ ++ AutostartPage + +- +- DNS +- ++ ++ Boot Setup ++ 开机启动设置 + + +- EditIpv4PreferredDNS +- ++ ++ Desktop files(*.desktop) ++ 桌面类型(*.desktop) + + +- Auto +- 自动 ++ ++ select autostart desktop ++ 选择自启动应用 + + +- Manual +- 手动 ++ ++ Select ++ 选择 + + +- Required +- 必填 ++ ++ Cancel ++ 取消 + + +- +- Please separate multiple DNS entries by semicolon +- 请用分号分隔多个DNS ++ ++ ++ ++ Error ++ 错误 + + +- +- Ipv4 DNS invalid +- 无效的Ipv4 DNS ++ ++ Desktop has existed ++ 该程序已存在 + + +- Ipv4 address can not be empty +- Ipv4地址不能为空 ++ ++ Desktop cant permit to join ++ 该程序不允许添加 + + +- Ipv4 Address invalid +- 无效的Ipv4地址 ++ ++ Desktop dont support ++ 不支持该程序 + ++ ++ ++ BatterySettingsPage + +- NetMask can not be empty +- 子网掩码不能为空 ++ ++ BatterySettingsPage ++ 电池设置 + + +- Netmask invalid +- 无效的子网掩码 ++ ++ After idle for more than the following time, the computer will execute ++ 空闲超过以下时间后,计算机将执行 + + +- Ipv4 Gateway invalid +- 无效的Ipv4网关 ++ ++ ComboIdleTime ++ + + +- Preferred DNS +- 首选DNS ++ ++ ComboIdleAction ++ + + +- Alternate DNS +- 备选DNS ++ ++ When the battery is lit up, it will be executed ++ 电池电量将用尽时 + + +- EditIpv4AlternateDNS +- ++ ++ ComboLowBatteryAction ++ + + +- Ipv4 Preferred DNS invalid +- 无效的Ipv4首选DNS ++ ++ The monitor will turn off when it is idle ++ 显示器空闲以下时间关闭 + + +- Ipv4 Alternate DNS invalid +- 无效的Ipv4备选DNS ++ ++ ComboMonitorTurnOffIdleTime ++ + + +- DNS 1 +- ++ ++ Reduce screen brightness when idle ++ 空闲时减少亮度 + + +- DNS 2 +- ++ ++ Reduce screen brightness when no power ++ 低点亮时减少亮度 + +- +- +- Ipv6Widget + +- Ipv6Widget +- ++ ++ The energy saving mode is enabled when the power is low ++ 低电量时自动开启节能模式 + + +- IPV6 Method +- IPV6方法 ++ ++ ++ Suspend ++ 待机 + + +- ComboBoxIpv6Method +- ++ ++ ++ Shutdown ++ 关机 + + +- IP Address +- IP地址 ++ ++ ++ Hibernate ++ 休眠 + + +- EditIpv6Address +- ++ ++ ++ Do nothing ++ 不执行操作 + ++ ++ ++ BatterySubItem + +- Prefix +- 前缀 ++ Battery Settings ++ 电池设置 + +- +- SpinBoxIpv6Prefix +- ++ ++ ++ BiometricItem ++ ++ add ++ 添加 + ++ ++ ++ CPanelAudioWidget + +- Gateway +- 网关 ++ ++ CPanelAudioWidget ++ + + +- EditIpv6Gateway +- ++ ++ Output ++ 输出 + + +- +- DNS +- ++ ++ Input ++ 输入 + ++ ++ ++ CPanelNetworkWidget + +- EditIpv6PreferredDNS ++ ++ CPanelNetworkWidget + + + +- Auto +- 自动 ++ ++ ++ VPN ++ VPN + + +- Manual +- 手动 ++ ++ ++ Network Details ++ 网络详情 + + +- Ignored +- 忽略 ++ ++ ++ ++ ++ ++ Wired Network ++ 有线网络 + + +- Required +- 必填 ++ ++ ++ ++ ++ ++ ++ Wireless Network ++ 无线网络 + + +- +- Please separate multiple DNS entries by semicolon +- 请用分号分隔多个DNS ++ ++ Connected ++ 已连接 + + +- +- Ipv6 DNS invalid +- 无效的Ipv6 DNS ++ ++ Unavailable ++ 已禁用 + + +- Ipv6 address can not be empty +- Ipv6地址不能为空 ++ ++ Disconnected ++ 已断开 + + +- Ipv6 address invalid +- 无效的Ipv6地址 ++ Wired Network %1 ++ 有线网络 %1 + + +- Ipv6 Gateway invalid +- 无效的Ipv6网关 ++ Wireless Network %1 ++ 无线网络 %1 + ++ ++ ++ ChangeHostNameWidget + +- Preferred DNS +- 首选DNS ++ ++ Form ++ + + +- Alternate DNS +- 备选DNS ++ ++ Host Name: ++ 主机名: + + +- EditIpv6AlternateDNS ++ ++ EditHostName + + + +- Ipv6 Preferred DNS invalid +- 无效的Ipv6首选DNS ++ ++ ButtonSaveHostName ++ + + +- Ipv6 Alternate DNS invalid +- 无效的Ipv6备选DNS ++ ++ Save ++ 保存 + +- +- +- NetworkSubItem + +- Wired Network %1 +- 有线网络 %1 ++ ++ ButtonCancelChangeHostName ++ + + +- Wired Network +- 有线网络 ++ ++ Cancel ++ 取消 + + +- Wireless Network %1 +- 无线网络 %1 ++ Host Name ++ 主机名 + + +- Wireless Network +- 无线网络 ++ ++ Warning ++ 警告 + + +- VPN +- VPN ++ ++ Change host name failed! Please check the Dbus service! ++ 修改主机名失败!请 检查Dbus服务! + ++ ++ ++ CheckpasswdDialog + +- Network Details +- 网络详情 ++ ++ Check password ++ 校验当前用户密码 ++ ++ ++ ++ Check the current password before you enroll the feature ++ 录入特征之前需要校验当前密码 + + + +- NetworkTray ++ ChooseItem + +- Network settings +- 网络设置 ++ ++ Form ++ + ++ ++ ++ ConnectionDetailsWidget + +- Network unavailable +- 网络不可用 ++ ++ ConnectionDetailsWidget ++ + + +- +- +- The network is connected, but you cannot access the Internet +- 网络已连接,但不能访问互联网 ++ ++ Security type ++ 安全类型 + + +- +- +- Network not connected +- 网络已断开 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ TextLabel ++ + + +- Wired network card: %1 available +- 有线网卡: %1 可用 ++ ++ Frequency band ++ 频段 + + +- Wireless network card: %1 available +- 无线网卡: %1 可用 ++ ++ Channel ++ 网络通道 + + +- Wired network card: %1 unavailable +- 有线网卡: %1 不可用 ++ ++ Interface ++ 接口 + + +- Wireless network card: %1 unavailable +- 无线网卡: %1 不可用 ++ ++ MAC ++ + + +- +- Network connected +- 网络已连接 ++ ++ IPv4 ++ + +- +- +- PluginConnectionList + +- Other WiFi networks +- 其它WIFI网络 ++ ++ ++ Gateway ++ 网关 + + +- Tips +- 提示 ++ ++ DNS ++ + + +- Please input a network name +- 请输入网络名称 ++ ++ Subnet mask ++ 子网掩码 + +- +- +- StatusNotification + +- Connection Failed +- 连接失败 ++ ++ IPv6 ++ + + +- the network not found +- 未找到网络 ++ ++ Prefix ++ 前缀 + + +- The hidden network "%1" to be connected has been detected and exists in the network list +- 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 ++ ++ Rate ++ 速率 + + +- Failed to connect to the network "%1" +- 无法连接到网络 "%1" ++ Preferred DNS ++ 首选DNS ++ ++ ++ ++ ConnectionItemWidget ++ ++ ++ disconnect ++ 断开 + + +- Connection activated +- 网络已连接 ++ ++ ignore ++ 忽略 + + +- You are now connected to the network "%1" +- 您已连接到网络 "%1" ++ ++ remove ++ 移除 + + +- Connection deactivated +- 连接断开 ++ ++ The current device:%1 is not available ++ 当前设备:%1 不可用 + + +- You have now disconnected the network "%1" +- 您已断开网络连接 "%1" ++ ++ The carrier is pulled out ++ 网线被拔出 + + +- Connection deleted +- 连接已删除 ++ ++ Are you sure you want to delete the connection %1 ++ 您是否确定要删除连接 "%1" + + +- The connection has been deleted "%1" +- 已删除连接 "%1" ++ ++ Warning ++ 警告 + +- +- +- TextInputDialog + ++ ++ + Tips + 提示 + + +- Yes +- 确认 ++ ++ Password required to connect to %1. ++ 连接网络 "%1" 需要密码 + + +- Cancel +- 取消 ++ ++ Please input a network name ++ 请输入网络名称 + + + +- TrayConnectionList ++ ConnectionNameWidget + +- Other WiFi networks +- 其它WIFI网络 ++ ++ ConnectionNameWidget ++ + +- +- +- TrayItemWidget + +- TrayItemWidget ++ ++ TextLabel + + + +- Icon ++ ++ EditConnectionName + + + +- Name +- 名称 ++ ++ Auto Connection ++ 自动连接 + + +- Status +- 状态 ++ ++ Required ++ 必填 + + +- Ignore +- 忽略 +- +- +- Disconnect +- 断开 ++ ++ Wired Connection %1 ++ 有线网络%1 + + +- Cancel +- 取消 ++ ++ VPN L2TP %1 ++ + + +- Connect +- 连接 ++ ++ VPN PPTP %1 ++ + + +- Connected +- 已连接 ++ ++ Connection name can not be empty ++ 网络名称不能为空 + ++ ++ ++ ConnectionShowPage + +- Unconnected +- 未连接 ++ ++ ConnectionShowPage ++ + + +- Please input password +- 请输入密码 ++ ++ TextLabel ++ + + +- Please input a network name +- 请输入网络名称 ++ ++ ButtonCreateConnection ++ + + + +- TrayPage ++ CreateGroupPage + +- TrayPage ++ ++ CreateGroupPage + + + +- TextLabel ++ ++ Create Group + + + +- Select wired network card +- 请选择有线网卡 +- +- +- Select wireless network card +- 请选择无线网卡 ++ ++ Add Group Members ++ + +- +- +- VpnIPsec + +- VpnIPsec ++ ++ Confirm + + + +- Enable IPsec +- 启用IPsec ++ ++ Please enter your group name ++ + + +- Group Name +- 组名 ++ ++ group name cannot be a pure number ++ + + +- EditGroupName ++ ++ group name already exists + + + +- Group ID +- 组ID ++ ++ ++ Error ++ 错误 + ++ ++ ++ CreateUserPage + +- EditGroupId +- ++ Account type ++ 帐户类型 + + +- Pre-Shared Key +- 预共享密钥 ++ ++ standard ++ 普通用户 + + +- EditPreSharedKey +- ++ ++ administrator ++ 管理员 + + +- Show Password +- 显示密码 ++ ++ Please enter user name first ++ 请输入用户名 + + +- Internet Key Exchange Protocol +- 密钥交换协议 ++ ++ Please enter your user name ++ 请输入用户名 + + +- EditIpsecIKE +- ++ ++ user name cannot be a pure number ++ 用户名不能全为数字 + + +- Encapsulating Security Payload +- 安全封装协议 ++ ++ user name already exists ++ 用户名已存在 + + +- EditIpsecESP +- ++ ++ Please enter your password ++ 请输出密码 + +- +- +- VpnIpvx + +- VpnIpvx +- ++ ++ Please enter the password again ++ 请再次输入密码 + + +- IPV4 Method +- IPV4方法 ++ ++ The password you enter must be the same as the former one ++ 两次密码不相同,请核对后,再次输入 + + +- ComboBoxVPNIpv4Method +- ++ ++ ++ Error ++ 错误 + + +- Only applied in corresponding resources +- 仅用于相对应的网络上的资源 ++ ++ Password encryption failed ++ 密码加密失败 + + +- Preferred DNS +- 首选DNS ++ ++ Form ++ + + +- EditVPNIpv4PreferredDNS ++ ++ UserAvatarWidget + + + +- Alternate DNS +- 备选DNS ++ ++ User name ++ 用户名 + + +- EditIpv4AlternateDNS ++ ++ EditUserName + + + +- Auto +- 自动 ++ ++ User type ++ 用户类型 + +- +- +- VpnL2tpSetting + +- VpnL2tpSetting ++ ++ ComboUserType + + + +- VPN name +- VPN名称 ++ ++ Password ++ 用户密码 + +- +- +- VpnManager + +- VpnManager ++ ++ EditPasswd + + + +- VPN type +- VPN类型 ++ ++ Confirm password ++ 确认密码 + + +- Save +- 保存 ++ ++ EditPasswdConfirm ++ + + +- Return +- 返回 ++ ++ ButtonAdvanceSetting ++ + + +- VPN +- VPN ++ ++ Advance setting ++ 高级设置 + + +- L2TP ++ ++ ButtonConfirm + + + +- Tips +- 提示 +- +- +- Password required to connect to %1. +- 连接网络 "%1" 需要密码 ++ ++ Confirm ++ 创建 + +- +- +- VpnPpp + +- VpnPpp ++ ++ ButtonCancel + + + +- Use MPPE +- 使用MPPE ++ ++ Cancel ++ 取消 + + +- Security +- 安全 ++ Please enter account name first ++ 请先输入帐户名 + + +- ComboBoxMppeSecurity +- ++ Please enter your account name ++ 请输入帐户名 + + +- Stateful MPPE +- 使用带状态的MPPE ++ Account cannot be a pure number ++ 帐户名不能全为数字 + + +- All available (default) +- 都可用(默认) ++ Account already exists ++ 帐户名已存在 + + +- 40-bit (less secure) +- 40位(较安全) ++ Please enter your userName name ++ 请输入用户名 + ++ ++ ++ CursorThemePage + +- 128-bit (most secure) +- 128位(最安全) ++ ++ Cursor Themes Settings ++ 光标主题设置 + ++ ++ ++ CursorThemes + +- Refuse EAP Authentication +- 拒绝EAP认证 ++ Cursor Themes Settings ++ 光标主题设置 + + +- Refuse PAP Authentication +- 拒绝PAP认证 ++ Faild ++ 失败 + + +- Refuse CHAP Authentication +- 拒绝CHAP认证 ++ Set cursor themes failed! ++ 设置光标主题失败! + ++ ++ ++ DateTimeSettings + +- Refuse MSCHAP Authentication +- 拒绝MSCHAP认证 ++ ++ DateTimeSettings ++ 日期时间设置 + + +- Refuse MSCHAPv2 Authentication +- 拒绝MSCHAPv2认证 ++ ++ Select Time ++ 选择时间 + + +- No BSD Data Compression +- 无BSD数据压缩 ++ ++ Select Date ++ 选择日期 + + +- No Deflate Data Compression +- 无Deflate数据压缩 ++ ++ ButtonSave ++ + + +- No TCP Header Compression +- 无TCP头压缩 ++ ++ save ++ 保存 + + +- No Protocol Field Compression +- 无协议字段压缩 ++ ++ ButtonReset ++ + + +- No Address/Control Compression +- 无地址/控制压缩 +- +- +- Send PPP Echo Packets +- 发送PPP回响包 ++ ++ reset ++ 重置 + + + +- VpnPptpSetting +- +- VpnPptpSetting +- +- ++ DaySpinBox + +- VPN name +- VPN名称 ++ ++ %1 ++ %1日 + + + +- VpnWidget ++ DefaultApp + +- VpnWidget +- ++ ++ DefaultApp ++ 默认程序 + + +- Gateway +- 网关 ++ ++ Web Browser ++ web浏览器 + + +- EditVPNGateway +- ++ ++ Email ++ 电子邮件 + + +- User Name +- 用户名 ++ ++ Text ++ 文档查看器 + + +- EditVPNUserName +- ++ ++ Music ++ 音乐播放器 + + +- Password Options +- 密码选项 ++ ++ Video ++ 视频播放器 + + +- ComboBoxVPNPasswordOptions +- ++ ++ Image ++ 图片查看器 + ++ ++ ++ DefaultappPlugin + +- Password +- 密码 ++ Email ++ 电子邮件 + + +- EditVPNPassword +- ++ Text ++ 文档查看器 + + +- ButtonPasswordVisual +- ++ Music ++ 音乐播放器 + + +- Show Password +- 显示密码 ++ Video ++ 视频播放器 + + +- NT Domain +- NT域 ++ Image ++ 图片查看器 + + +- EditNTDomain +- ++ DefaultApp ++ 默认程序 + ++ ++ ++ DetailsPage + +- Required +- 必填 ++ ++ DetailsPage ++ + + +- Saved +- 已保存的 ++ ++ Network Details ++ 网络详情 + + +- Ask +- 总是询问 ++ ++ Please select a connection ++ 请选择连接 + + +- Not required +- 不要求 ++ ++ ComboBoxDetailsSelectConnection ++ + ++ ++ ++ DeviceAvailableConnectionWidget + +- Gateway can not be empty +- 网关不能为空 ++ ++ Network card: %1 ++ 网卡:%1 + + +- Gateway invalid +- 无效的网关 ++ ++ Other WiFi networks ++ 其它WIFI网络 + ++ ++ ++ DeviceList + +- user name can not be empty +- 用户名不能为空 ++ ++ Wired Network Adapter ++ 有线网络配置 + + +- password can not be empty +- 密码不能为空 ++ ++ Wireless Network Adapter ++ 无线网络配置 + + + +- WiredManager ++ DevicePanel + +- WiredManager ++ ++ Form + + + +- ButtonSave ++ ++ Rotate left 90 degrees ++ 左旋转90度 ++ ++ ++ ++ ButtonLeft + + + +- Save +- 保存 ++ ++ Rotate right 90 degrees ++ 右旋转90度 + + +- ButtonReturn ++ ++ ButtonRight + + + +- Return +- 返回 ++ ++ Turn left and right ++ 左右翻转 + + +- Wired Network Adapter +- 有线网络配置 ++ ++ ButtonHorizontal ++ + + +- The carrier is pulled out +- 网线被拔出 ++ ++ upside down ++ 上下翻转 + + +- The current device is not available +- 当前设备不可用 ++ ++ ButtonVertical ++ + +- +- +- WiredSettingPage + +- WiredSettingPage +- ++ ++ Identification display ++ 标识显示器 + + +- Network name +- 网络名称 ++ ++ ButtonIdentifying ++ + + + +- WirelessManager ++ DisconnectAndDeleteButton + +- WirelessManager ++ ++ DisconnectAndDeleteButton + + + +- Save +- 保存 ++ ++ ButtonDisconnect ++ + + +- Return +- 返回 ++ ++ Disconnect ++ 断开 + + +- Wireless Network Adapter +- 无线网卡 ++ ++ ButtonDelete ++ + + +- The current device is not available +- 当前设备不可用 ++ ++ Delete ++ 删除 + + +- Tips +- 提示 ++ ++ ButtonIgnore ++ + + +- Password required to connect to %1. +- 连接网络 "%1" 需要密码 ++ ++ Ignore ++ 忽略 + +- +- +- WirelessSecurityWidget + +- WirelessSecurityWidget +- ++ ++ Are you sure you want to delete the connection %1 ++ 您是否确定要删除连接 "%1" + + +- Security +- 安全 ++ ++ Warning ++ 警告 + ++ ++ ++ DisplayFormatSettings + +- ComboBoxWirelessSecurityOption +- ++ ++ DisplayFormatSettings ++ 日期时间格式设置 + + +- Password Options +- 密码选项 ++ ++ Long date display format ++ 长日期显示格式 + + +- ComboBoxWirelessPasswordOption ++ ++ ComboLongDateDisplayFormat + + + +- Password +- 密码 ++ ++ Short date display format ++ 短日期显示格式 + + +- EditWirelessPassword ++ ++ ComboShortDateDisplayFormat + + + +- ButtonWirelessPasswordVisual +- ++ ++ Time format ++ 时间格式 + + +- PushButton ++ ++ ComboTimeFormat + + + +- None +- ++ ++ Show time witch seconds ++ 时间显示秒 + + +- WPA/WPA2 Personal +- WPA/WPA2个人版 ++ ++ 24-hours ++ 二十四小时制 + + +- Save password for all users +- 仅为该用户存储密码 ++ ++ 12-hours ++ 十二小时制 + ++ ++ ++ DisplayPage + +- Save password for this user +- 存储所有用户密码 ++ ++ DisplayPage ++ + + +- Ask me always +- 总是询问 ++ ++ ButtonCopyDisplay ++ + + +- Required +- 必填 ++ ++ Copy display ++ 复制显示 + +- +- +- WirelessSettingPage + +- WirelessSettingPage ++ ++ ButtonExtendedDisplay + + + +- Wireless name +- 无线网络名称 ++ ++ Extended display ++ 扩展显示 + +- +- +- WirelessTrayWidget + +- the network "%1" not found +- 未找到网络 "%1" ++ ++ ++ Resolution ratio ++ 分辨率 + +- +- +- WirelessWidget + +- WirelessWidget ++ ++ ComboResolutionRatio + + + +- SSID +- ++ ++ ++ Refresh rate ++ 刷新率 + + +- EditSsid ++ ++ ComboRefreshRate + + + +- MAC Address Of Device +- 设备MAC地址 ++ ++ ++ Zoom rate ++ 缩放率 + + +- ComboBoxWirelessMacAddress ++ ++ ComboZoomRate + + + +- Custom MTU +- 自定义MTU ++ ++ ++ Automatic ++ 自动 + + +- SpinBoxWirelessCustomMTU ++ ++ ++ 100% (recommended) ++ 100% (推荐) ++ ++ ++ ++ ++ 200% + + + +- Required +- 必填 ++ ++ Open ++ 开启 + + +- No device specified +- 不指定设备 ++ ++ Set as main display ++ 设为主显示器 + +- +- +- AudioSystemTray + +- Volume Setting +- 声音设置 ++ ++ SwitchExtraPrimary ++ + + +- Mixed Setting +- 混合设置 ++ ++ ComboExtraResolutionRatio ++ + +- +- +- CPanelAudioWidget + +- CPanelAudioWidget +- ++ ++ ComboExtraRefreshRate ++ + + +- Output +- 输出 ++ ++ ComboExtraZoomRate ++ + + +- Input +- 输入 ++ ++ ButtonExtraApply ++ + +- +- +- InputPage + +- InputPage +- ++ ++ Apply ++ 应用 + + +- +- Input cards +- 输入声卡 ++ ++ ButtonExtraCancel ++ + + +- Input devices +- 输入设备 ++ ++ Close ++ 关闭 + + +- ComboBoxInputDevices +- ++ ++ ++ (recommended) ++ (推荐) + + +- Input volume +- 输入音量 ++ ++ Is the display normal? ++ 显示是否正常? + + +- SliderVolumeSetting +- ++ ++ Save current configuration(K) ++ 保存当前配置(K) + + +- Feedback volume +- 反馈音量 ++ ++ Restore previous configuration(R) ++ 恢复之前的配置(R) + + +- No input device detected +- 未检测到输入设备 ++ ++ The display will resume the previous configuration in %1 seconds ++ 显示将会在 %1 秒后恢复之前的配置 + + + +- OutputPage +- +- OutputPage +- +- ++ DisplaySubitem + +- +- Output cards +- 输出声卡 ++ ++ Display ++ 显示 + ++ ++ ++ DnsWidget + +- Output devices +- 输出设备 ++ ++ DnsWidget ++ + + +- ComboBoxOutputDevices +- ++ ++ Preferred DNS ++ 首选DNS + + +- Output volume +- 输出音量 ++ ++ Alternate DNS ++ 备选DNS + ++ ++ ++ DriverPage + +- SlilderVolumeSetting +- ++ ++ device type ++ 设备类型 + + +- Left/right balance +- 左/右平衡 ++ ++ driver list ++ 驱动列表 + + +- SliderVolumeBalance +- ++ ++ Fingerprint ++ 指纹 + + +- Left +- ++ FingerVein ++ 指静脉 + + +- Right +- ++ ++ Fingervein ++ 指静脉 + + +- No output device detected +- 未检测到输出设备 ++ ++ iris ++ 虹膜 + +- +- +- VolumeIntputSubItem + +- VolumeInput +- 输入 ++ ++ ukey ++ UKey + +- +- +- VolumeOutputSubItem + +- VolumeOutput +- 输出 ++ ++ face ++ 人脸 + + + +- VolumeSettingPage ++ DslManager + +- VolumeSettingPage +- ++ ++ DslManager ++ + + +- Volume +- 音量 ++ ++ DSL ++ + + + +- AccountItemWidget ++ DslSettingPage + +- Create new user +- 创建新用户 ++ ++ DslSettingPage ++ + + +- disable +- 禁用 ++ ++ Save ++ 保存 + + +- enable +- 启用 ++ ++ Return ++ 返回 + + + +- AccountSubItem ++ EthernetWidget + +- account +- 帐户 ++ ++ EthernetWidget ++ + + +- New User +- 创建新用户 ++ ++ MAC Address Of Ethernet Device ++ 设备MAC地址 + +- +- +- AccountWidget + +- disable +- 禁用 ++ ++ ComboBoxDeviceMac ++ + + +- enable +- 启用 ++ ++ Ethernet Clone MAC Address ++ 克隆MAC地址 + + +- Create new user +- 创建新用户 ++ ++ EditDeviceMac ++ + +- +- +- ActGuideWidget + +- Please choose activation mode: +- 请选择激活方式: ++ ++ Custom MTU ++ 自定义MTU + + +- Next +- 下一步 ++ ++ SpinBoxCustomMTU ++ + + +- Current machine code: +- 当前系统机器码: ++ ++ No device specified ++ 不指定设备 + + +- Please input activation code: +- 请输入激活码: ++ ++ Clone Mac invalid ++ 无效的克隆MAC地址 + ++ ++ ++ FaceEnrollDialog + +- Back +- 上一步 ++ save ++ 保存 + + +- Please insert the UsbKey device first! +- 请先插入UsbKey设备! ++ cancel ++ 取消 + + +- Activate online +- 在线激活 ++ initializing face collection environment... ++ 正在初始化人脸采集环境,请稍后 + + +- Activate with the input activation code +- 输入激活码激活 ++ failed to initialize face collection environment! ++ 初始化人脸采集环境失败! + + +- Activate with insert UsbKey +- 插入UsbKey设备激活 +- +- +- Activate +- 激活 +- +- +- Please enter the activate server address: +- 请输入激活服务器地址: +- +- +- Activating...... +- 正在激活...... +- +- +- System activate successful! +- 系统激活成功! ++ Failed to start collection ++ 开始采集失败 + ++ ++ ++ FaceInputDialog + +- server activation and remaining points: +- 服务器版激活点数和剩余点数: ++ save ++ 保存 + + +- development activation and remaining points: +- 开发版激活点数和剩余点数: ++ cancel ++ 取消 + + +- industrial activation and remaining points: +- 工控版激活点数和剩余点数: ++ initializing face collection environment... ++ 正在初始化人脸采集环境,请稍后 + + +- desktop activation and remaining points: +- 桌面版激活点数和剩余点数: ++ failed to initialize face collection environment! ++ 初始化人脸采集环境失败! + + +- activation points: +- 激活点数: ++ Failed to start collection ++ 开始采集失败 + ++ ++ ++ FacePage + +- remaining points: +- 剩余点数: ++ ++ Default face device ++ 默认人脸设备 + + +- Close +- 关闭 ++ ++ face feature list ++ 人脸特征列表 + + +- System activate failed! +- 系统激活失败! ++ ++ face ++ 人脸 + + +- unknow +- 未知 ++ ++ Cancel ++ 取消 + + +- Activation Mode +- 选择激活方式 ++ ++ Start enroll failed,%1 ++ 开始录入失败,%1 + + +- Start Activation +- 开始激活 ++ ++ ++ Error ++ 错误 + + +- Activation Complete +- 激活完成 ++ ++ The biometric features were successfully recorded. The feature name is:%1 ++ 特征已成功录入,特征名为:%1 + + +- Activation Guide +- 激活向导 ++ ++ Tips ++ 提示 + + +- Server IP address or Domain name +- 服务器IP地址或域名 ++ ++ Failed to record biometrics(%1), Please try again ++ 录入特征失败(%1),请重试 + + + +- AdvanceSettings +- +- Advance Settings +- 高级设置 +- +- +- Automatically generated by system +- 由系统自动生成 +- +- +- Please enter the correct path +- 请输入正确的路径 +- ++ FingerPage + +- Please enter specify user Id +- 请输入用户ID ++ ++ Cancel ++ 取消 + + +- Please enter an integer above 1000 +- 请输入一个大于或等于1000的整数 ++ ++ fingerprint ++ 指纹 + + +- Please enter the correct home directory +- 请输入正确的用户目录 ++ ++ fingervein ++ 指静脉 + + +- Form +- ++ default %1 device ++ 默认%1设备 + + +- Login shell +- 登录Shell ++ ++ %1 list ++ %1列表 + + +- EditLoginShell +- ++ ++ Start enroll failed,%1 ++ 开始录入失败,%1 + + +- Specify user id (needs to be greater than 1000) +- 指定用户ID(需大于或等于1000) ++ ++ ++ Error ++ 错误 + + +- EditSpecifyUserID +- ++ ++ The biometric features were successfully recorded. The feature name is:%1 ++ 特征已成功录入,特征名为:%1 + + +- Specify user home +- 指定用户目录 ++ ++ Tips ++ 提示 + + +- EditSpecifyUserHome +- ++ ++ Failed to record biometrics(%1), Please try again ++ 录入特征失败(%1),请重试 + + +- ButtonConfirm +- ++ %1list ++ %1列表 + + +- confirm +- 确认 ++ ++ Default %1 device ++ 默认%1设备 + ++ ++ ++ FingerprintEnrollDialog + +- ButtonCancel +- ++ save ++ 保存 + + + cancel +- 取消 +- +- +- Specify user id +- 指定用户ID +- +- +- +- AppearancePlugin +- +- Theme +- 主题 ++ 取消 + + +- Wallpaper +- 壁纸 ++ Finger Enroll ++ 指纹录入 + + +- Font +- 字体 ++ This fingerprint is bound to the user(%1) ++ 该指纹已绑定用户(%1) + +- +- +- ApplicationPlugin + +- DefaultApp +- 默认程序 ++ Info ++ 提示 + + +- AutoStart +- 开机启动 ++ Error ++ 错误 + + + +- AuthManagerPage +- +- Fingerprint Authentication +- 指纹认证 +- +- +- Face Authentication +- 人脸认证 +- +- +- Password Authentication +- 密码认证 +- ++ FingerprintInputDialog + + save + 保存 + + +- return +- 返回 +- +- +- add fingerprint +- 录入指纹数据 +- +- +- add face +- 录入人脸数据 ++ cancel ++ 取消 + + +- ComboAppFontName +- ++ Finger Enroll ++ 指纹录入 + + +- ComboAppFontSize +- +- error ++ Error + 错误 + ++ ++ ++ FingerprintInputWorker + +- please ensure that at least one authentication option exists +- 请确保至少一个认证选项打开 +- +- +- fingerprint_ +- 指纹_ +- +- +- ComboTitleFontName +- +- face_ +- 人脸_ ++ initializing fingerprint collection environment... ++ 正在初始化指纹采集环境,请稍等 + + + +- AuthPlugin ++ Fonts + +- ComboTitleFontSize ++ ++ Form + +- Fingerprint +- 指纹 + + +- FingerVein +- 指静脉 ++ ++ Word size ++ 字号 + + +- ComboMonospaceFontName +- ++ ++ System font ++ 系统字体 + + +- ComboMonospaceFontSize +- ++ ++ Monospaced font ++ 等宽字体 + + +- Word size +- 字号 ++ Application Font Settings ++ 应用程序字体设置 + + +- System font +- 系统字体 ++ Titlebar Font Settings ++ 窗口标题字体设置 + + +- Monospaced font +- 等宽字体 ++ Monospace Font Settings ++ 等宽字体设置 + + + + GeneralBioPage + ++ + default device + 默认设备 + + ++ + feature list + 特征列表 + + ++ + Are you sure you want to delete the feature called %1, Ensure that the Ukey device is inserted; otherwise the information stored in the Ukey will not be deleted + 您确定要删除特征名为%1的UKey绑定吗?请确保已插入Ukey设备;否则存储在Ukey中的信息将不会被删除 + + ++ + Are you sure you want to delete the feature called %1 + 您确定要删除特征名为%1的特征吗 + + ++ + tips + 提示 + + +- Error +- 错误 + Driver Manager +- 驱动管理 ++ 驱动管理 + + + Prefs +- 配置 ++ 配置 + + + UKey +- UKey ++ UKey + + + Iris +- 虹膜 ++ 虹膜 + + + Face +- 人脸 ++ 人脸 + +- +- +- AutoStartPage + +- Boot Setup +- 开机启动设置 ++ ++ Error ++ 错误 + + +- Desktop files(*.desktop) +- 桌面类型(*.desktop) ++ ++ Failed to enroll feature because the password verification failed! ++ 由于密码校验失败,录入特征失败! + + +- select autostart desktop +- 选择自启动应用 ++ ++ Rename Feature ++ 重命名特征值 + + +- Select +- 选择 ++ ++ Please enter the renamed feature name ++ 请输入特征名 + ++ ++ ++ GeneralPage + +- Cancel +- 取消 ++ ++ Form ++ + + +- Error +- 错误 ++ ++ Capslock Tip ++ 大写锁定提示 + + +- Desktop has existed +- 该程序已存在 ++ ++ Numlock Tip ++ 数字键盘锁定提示 + + +- Desktop cant permit to join +- 该程序不允许添加 ++ ++ Repeat Key ++ 重复键 + + +- Desktop dont support +- 不支持该程序 ++ ++ (Repeat a key while holding it down) ++ (按住某一键时重复该键) + +- +- +- AutostartPage + +- Boot Setup +- 开机启动设置 ++ ++ SwitchRepeatKey ++ + + +- Desktop files(*.desktop) +- 桌面类型(*.desktop) ++ ++ Delay ++ 延时 + + +- select autostart desktop +- 选择自启动应用 ++ ++ SliderRepeatDelay ++ + + +- Select +- 选择 ++ ++ Short ++ + + +- Cancel +- 取消 ++ ++ Long ++ + + +- Error +- 错误 ++ ++ Interval ++ 速度 + + +- Desktop has existed +- 该程序已存在 ++ ++ SliderRepeatInterval ++ + + +- Desktop cant permit to join +- 该程序不允许添加 ++ ++ Slow ++ + + +- Desktop dont support +- 不支持该程序 ++ ++ Fast ++ ++ ++ ++ ++ ++ Enter repeat characters to test ++ 输入重复字符测试 ++ ++ ++ ++ EditTestRepeatKey ++ ++ ++ ++ Enter characters to test the settings ++ 输入重复字符测试 + + + +- BatterySettingsPage ++ GeneralSettingsPage + +- BatterySettingsPage +- 电池设置 ++ ++ GeneralSettingsPage ++ 通用设置页面 + + +- After idle for more than the following time, the computer will execute +- 空闲超过以下时间后,计算机将执行 ++ ++ When the power button is pressed ++ 按下电源按钮时 + + +- ComboIdleTime ++ ++ ComboPowerButtonAction + + + +- ComboIdleAction ++ ++ When the suspend button is pressed ++ 按下挂起按钮时 ++ ++ ++ ++ ComboSuspendAction + + + +- When the battery is lit up, it will be executed +- 电池电量将用尽时 ++ ++ When closing the lid ++ 合上盖子操作 + + +- ComboLowBatteryAction ++ ++ ComboCloseLidAction + + + +- The monitor will turn off when it is idle +- 显示器空闲以下时间关闭 ++ ++ Computer Mode ++ 计算机模式 + + +- ComboMonitorTurnOffIdleTime +- ++ ++ Display brightness setting ++ 显示亮度设置 + + +- Reduce screen brightness when idle +- 空闲时减少亮度 ++ ++ 0% ++ + + +- Reduce screen brightness when no power +- 低点亮时减少亮度 ++ ++ SliderDisplayBrightness ++ + + +- The energy saving mode is enabled when the power is low +- 低电量时自动开启节能模式 ++ ++ Color temperature ++ 色温 + + +- Suspend +- 待机 ++ ++ Automatic color temperature ++ 自动色温 + + +- Shutdown +- 关机 ++ ++ cold ++ + + +- Hibernate +- 休眠 ++ ++ standard ++ 标准 + + +- Do nothing +- 不执行操作 ++ ++ warm ++ + +- +- +- BatterySubItem + +- Battery Settings +- 电池设置 ++ ++ Regard computer as idle after ++ 于此时间后视计算机为空闲 + +- +- +- BiometricItem + +- add +- 添加 ++ ++ SliderComputerIdleTime ++ + +- +- +- ChangeHostNameWidget + +- Form +- ++ ++ Lock screen when idle ++ 计算机空闲时锁定屏幕 + + +- Host Name: +- 主机名: ++ ++ password is required to wake up in standby mode ++ 待机时唤醒需要输入密码 + + +- EditHostName +- ++ ++ ++ shutdown ++ 关机 + + +- ButtonSaveHostName +- ++ ++ ++ ++ hibernate ++ 休眠 + + +- Save +- 保存 ++ ++ ++ ++ suspend ++ 待机 + + +- ButtonCancelChangeHostName +- ++ ++ ++ display off ++ 关闭显示器 + + +- Cancel +- 取消 ++ ++ ++ ++ do nothing ++ 不执行操作 + + +- Host Name +- 主机名 ++ ++ ERROR ++ 错误 + + +- Warning +- 警告 ++ ++ %1hour ++ %1小时 + + +- Change host name failed! Please check the Dbus service! +- 修改主机名失败!请 检查Dbus服务! ++ ++ %1minute ++ %1分钟 + + + +- CheckpasswdDialog ++ GeneralSettingsSubItem + +- Check password +- 校验当前用户密码 ++ General Settings ++ 通用设置 + ++ ++ ++ GeneralSubItem + +- Check the current password before you enroll the feature +- 录入特征之前需要校验当前密码 ++ ++ Keyboard General Option ++ 键盘通用选项 + + + +- ChooseItem ++ GroupInfoPage + ++ + Form +- ++ + +- +- +- CreateGroupPage + +- CreateGroupPage ++ ++ TextLabel + + + +- Create Group ++ ++ Group + + + +- Add Group Members ++ ++ Member List + + + +- Confirm ++ ++ Add User + + + +- Please enter your group name ++ ++ Delete + + + +- group name cannot be a pure number ++ ++ Add Member + + + +- group name already exists ++ ++ Save ++ 保存 ++ ++ ++ ++ Cancel ++ 取消 ++ ++ ++ ++ Please input keys for search... + + + ++ ++ ++ ++ + Error + 错误 + + + +- CreateUserPage ++ GroupSubItem + +- Account type +- 帐户类型 ++ ++ Group ++ + + +- standard +- 普通用户 ++ ++ Creat group ++ + + +- administrator +- 管理员 ++ ++ Change group name ++ + + +- Please enter user name first +- 请输入用户名 ++ ++ Add group member ++ + ++ ++ ++ HardWorker + +- Please enter your user name +- 请输入用户名 ++ ++ Create User failed ++ 创建用户失败 + + +- user name cannot be a pure number +- 用户名不能全为数字 ++ ++ update password failed ++ 更新密码失败 + + +- user name already exists +- 用户名已存在 ++ ++ icon file ++ 头像 + + +- Please enter your password +- 请输出密码 ++ ++ userName type ++ 用户名 + + +- Please enter the password again +- 请再次输入密码 ++ ++ locked ++ 启用状态 + + +- The password you enter must be the same as the former one +- 两次密码不相同,请核对后,再次输入 ++ ++ Failed to update user properties,%1 ++ 更新用户属性失败,%1 + + +- Error +- 错误 ++ ++ Failed to delete user,%1 ++ 删除用户失败,%1 + + +- Password encryption failed +- 密码加密失败 ++ password ++ 密码 + + +- Form +- ++ home directory ++ 用户目录 + + +- UserAvatarWidget +- ++ shell ++ shell + + +- User name +- 用户名 ++ icon ++ 头像 + + +- EditUserName +- ++ Failed to set user attributes ++ 设置用户属性失败 + + +- User type +- 用户类型 ++ account type ++ 帐户类型 + + +- ComboUserType +- ++ Failed to update user properties(%1) ++ 更新用户属性失败(%1) + + +- Password +- 用户密码 ++ Failed to delete user ++ 删除用户失败 + + +- EditPasswd ++ ++ Failed to connect to the account management service + + + +- Confirm password +- 确认密码 ++ ++ Create Group failed ++ + + +- EditPasswdConfirm ++ ++ Failed to delete group,%1 + + + +- ButtonAdvanceSetting ++ ++ ++ add user to group failed + + + +- Advance setting +- 高级设置 ++ ++ change group name failed ++ + + +- ButtonConfirm ++ ++ change group name failed, the new group name is occupied + + ++ ++ ++ HardwareInformation + +- Confirm +- 创建 ++ ++ Form ++ + + +- ButtonCancel ++ ++ CPU: ++ CPU: ++ ++ ++ ++ LabelCpuInfo + + + +- Cancel +- 取消 ++ ++ ++ TextLabel ++ + + +- Please enter account name first +- 请先输入帐户名 ++ ++ Memory: ++ 内存: + + +- Please enter your account name +- 请输入帐户名 ++ ++ LabelMemoryInfo ++ + + +- Account cannot be a pure number +- 帐户名不能全为数字 ++ ++ Hard disk: ++ 硬盘: + + +- Account already exists +- 帐户名已存在 ++ ++ Graphics card: ++ 显卡: + + +- Please enter your userName name +- 请输入用户名 ++ ++ Network card: ++ 网卡: + +- +- +- CursorThemePage + +- Cursor Themes Settings +- 光标主题设置 ++ Copyright © ++ 版权所有 © + +- +- +- CursorThemes + +- Cursor Themes Settings +- 光标主题设置 ++ KylinSec. All rights reserved. ++ KylinSec.保留所有权利. + + +- Faild +- 失败 ++ ++ ++ ++ Unknow ++ 未知 + + +- Set cursor themes failed! +- 设置光标主题失败! ++ ++ %1 GB (%2 GB available) ++ %1 GB (%2 GB 可用) + + + +- DateTimeSettings ++ HardwareInformationWidget + +- DateTimeSettings +- 日期时间设置 ++ CPU: ++ CPU: + + +- Select Time +- 选择时间 ++ Memory: ++ 内存: + + +- Select Date +- 选择日期 ++ Hard disk: ++ 硬盘: + + +- ButtonSave +- ++ Graphics card: ++ 显卡: + + +- save +- 保存 ++ Network card: ++ 网卡: + + +- ButtonReset +- ++ Unknow ++ 未知 + ++ ++ ++ HardwareSubItem + +- reset +- 重置 ++ ++ Hardware Information ++ 硬件信息 + + + +- DaySpinBox ++ IconThemePage + +- %1 +- %1日 ++ ++ Form ++ ++ ++ ++ ++ Icon Themes Setting ++ 图标主题设置 + + + +- DefaultApp ++ IconThemes + +- DefaultApp +- 默认程序 ++ Icon Themes Setting ++ 图标主题设置 + + +- Web Browser +- web浏览器 ++ Faild ++ 失败 + + +- Email +- 电子邮件 ++ Set icon themes failed! ++ 设置图标主题失败! + ++ ++ ++ IdentificationRenameDialog + +- Text +- 文档查看器 ++ Rename Feature ++ 重命名特征值 + + +- Music +- 音乐播放器 ++ Please enter the renamed feature name ++ 请输入特征名 + + +- Video +- 视频播放器 ++ Confirm ++ 确认 + + +- Image +- 图片查看器 ++ Cancel ++ 取消 + + + +- DefaultappPlugin ++ ImageSelector + +- Email +- 电子邮件 ++ ++ Add Image Failed ++ 添加壁纸失败 + + +- Text +- 文档查看器 ++ ++ The image already exists! ++ 该壁纸已存在! + + +- Music +- 音乐播放器 ++ ++ Delete image ++ 删除壁纸 + + +- Video +- 视频播放器 ++ ++ Are you sure you want to delete this picture? ++ 您确定要删除此壁纸? + ++ ++ ++ InputDialog + +- Image +- 图片查看器 ++ ++ Confirm ++ 确认 + + +- DefaultApp +- 默认程序 ++ ++ Cancel ++ 取消 + + + +- DevicePanel ++ InputPage + +- Form +- ++ ++ InputPage ++ + + +- Rotate left 90 degrees +- 左旋转90度 ++ ++ Input cards ++ 输入声卡 + + +- ButtonLeft +- ++ ++ Input devices ++ 输入设备 + + +- Rotate right 90 degrees +- 右旋转90度 ++ ++ ComboBoxInputDevices ++ + + +- ButtonRight +- ++ ++ Input volume ++ 输入音量 + + +- Turn left and right +- 左右翻转 ++ ++ SliderVolumeSetting ++ + + +- ButtonHorizontal +- ++ ++ Feedback volume ++ 反馈音量 + + +- upside down +- 上下翻转 ++ ++ No input device detected ++ 未检测到输入设备 + ++ ++ ++ Ipv4Widget + +- ButtonVertical ++ ++ Ipv4Widget + + + +- Identification display +- 标识显示器 ++ ++ IPV4 Method ++ IPV4方法 + + +- ButtonIdentifying ++ ++ ComboBoxIpv4Method + + +- +- +- DisplayFormatSettings +- +- DisplayFormatSettings +- 日期时间格式设置 +- + +- Long date display format +- 长日期显示格式 ++ ++ IP Address ++ IP地址 + + +- ComboLongDateDisplayFormat ++ ++ EditIpv4Address + + + +- Short date display format +- 短日期显示格式 ++ ++ Net Mask ++ 子网掩码 + + +- ComboShortDateDisplayFormat ++ ++ EditIpv4Netmask + + + +- Time format +- 时间格式 ++ ++ Gateway ++ 网关 + + +- ComboTimeFormat ++ ++ EditIpv4Gateway + + + +- Show time witch seconds +- 时间显示秒 ++ ++ DNS ++ + + +- 24-hours +- 二十四小时制 ++ ++ EditIpv4PreferredDNS ++ + + +- 12-hours +- 十二小时制 ++ ++ Auto ++ 自动 + +- +- +- DisplayPage + +- DisplayPage +- ++ ++ Manual ++ 手动 + + +- ButtonCopyDisplay +- ++ ++ ++ Required ++ 必填 + + +- Copy display +- 复制显示 ++ ++ Please separate multiple DNS entries by semicolon ++ 请用分号分隔多个DNS + + +- ButtonExtendedDisplay +- ++ ++ Ipv4 DNS invalid ++ 无效的Ipv4 DNS + + +- Extended display +- 扩展显示 ++ ++ Ipv4 address can not be empty ++ Ipv4地址不能为空 + + +- Resolution ratio +- 分辨率 ++ ++ Ipv4 Address invalid ++ 无效的Ipv4地址 + + +- ComboResolutionRatio +- ++ ++ NetMask can not be empty ++ 子网掩码不能为空 + + +- Refresh rate +- 刷新率 ++ ++ Netmask invalid ++ 无效的子网掩码 + + +- ComboRefreshRate +- ++ ++ Ipv4 Gateway invalid ++ 无效的Ipv4网关 + + +- Zoom rate +- 缩放率 ++ Preferred DNS ++ 首选DNS + + +- ComboZoomRate +- ++ Alternate DNS ++ 备选DNS + + +- Automatic +- 自动 ++ Ipv4 Preferred DNS invalid ++ 无效的Ipv4首选DNS + + +- 100% (recommended) +- 100% (推荐) ++ Ipv4 Alternate DNS invalid ++ 无效的Ipv4备选DNS + ++ ++ ++ Ipv6Widget + +- 200% ++ ++ Ipv6Widget + + + +- Open +- 开启 +- +- +- Set as main display +- 设为主显示器 ++ ++ IPV6 Method ++ IPV6方法 + + +- SwitchExtraPrimary ++ ++ ComboBoxIpv6Method + + + +- ComboExtraResolutionRatio +- ++ ++ IP Address ++ IP地址 + + +- ComboExtraRefreshRate ++ ++ EditIpv6Address + + + +- ComboExtraZoomRate +- ++ ++ Prefix ++ 前缀 + + +- ButtonExtraApply ++ ++ SpinBoxIpv6Prefix + + + +- Apply +- 应用 ++ ++ Gateway ++ 网关 + + +- ButtonExtraCancel ++ ++ EditIpv6Gateway + + + +- Close +- 关闭 ++ ++ DNS ++ + + +- (recommended) +- (推荐) ++ ++ EditIpv6PreferredDNS ++ + + +- Is the display normal? +- 显示是否正常? ++ ++ Auto ++ 自动 + + +- Save current configuration(K) +- 保存当前配置(K) ++ ++ Manual ++ 手动 + + +- Restore previous configuration(R) +- 恢复之前的配置(R) ++ ++ Ignored ++ 忽略 + + +- The display will resume the previous configuration in %1 seconds +- 显示将会在 %1 秒后恢复之前的配置 ++ ++ Required ++ 必填 + +- +- +- DisplaySubitem + +- Display +- 显示 ++ ++ Please separate multiple DNS entries by semicolon ++ 请用分号分隔多个DNS + +- +- +- DriverPage + +- device type +- 设备类型 ++ ++ Ipv6 DNS invalid ++ 无效的Ipv6 DNS + + +- driver list +- 驱动列表 ++ ++ Ipv6 address can not be empty ++ Ipv6地址不能为空 + + +- Fingerprint +- 指纹 ++ ++ Ipv6 address invalid ++ 无效的Ipv6地址 + + +- FingerVein +- 指静脉 ++ ++ Ipv6 Gateway invalid ++ 无效的Ipv6网关 + + +- Fingervein +- 指静脉 ++ Preferred DNS ++ 首选DNS + + +- iris +- 虹膜 ++ Alternate DNS ++ 备选DNS + + +- ukey +- UKey ++ Ipv6 Preferred DNS invalid ++ 无效的Ipv6首选DNS + + +- face +- 人脸 ++ Ipv6 Alternate DNS invalid ++ 无效的Ipv6备选DNS + + + +- FaceEnrollDialog ++ IrisPage + +- save +- 保存 ++ ++ Default Iris device ++ 默认虹膜设备 + + +- cancel +- 取消 ++ ++ Iris feature list ++ 虹膜特征列表 + + +- initializing face collection environment... +- 正在初始化人脸采集环境,请稍后 ++ ++ iris ++ 虹膜 + + +- failed to initialize face collection environment! +- 初始化人脸采集环境失败! ++ ++ Cancel ++ 取消 + + +- Failed to start collection +- 开始采集失败 ++ ++ Start enroll failed,%1 ++ 开始录入失败,%1 + +- +- +- FaceInputDialog + +- save +- 保存 +- +- +- cancel +- 取消 ++ ++ ++ Error ++ 错误 + + +- initializing face collection environment... +- 正在初始化人脸采集环境,请稍后 ++ ++ The biometric features were successfully recorded. The feature name is:%1 ++ 特征已成功录入,特征名为:%1 + + +- failed to initialize face collection environment! +- 初始化人脸采集环境失败! ++ ++ Tips ++ 提示 + + +- Failed to start collection +- 开始采集失败 ++ ++ Failed to record biometrics(%1), Please try again ++ 录入特征失败(%1),请重试 + + + +- FacePage ++ KcpInterface + +- Default face device +- 默认人脸设备 ++ Warning ++ 警告 + + +- face feature list +- 人脸特征列表 ++ load qss file failed ++ 加载qss文件失败 + ++ ++ ++ KeybindingSubItem + +- face +- 人脸 ++ ++ Keybinding ++ 快捷键 + ++ ++ ++ KeycodeTranslator + +- Cancel +- 取消 ++ ++ None ++ 暂无 + + +- Start enroll failed,%1 +- 开始录入失败,%1 ++ ++ disabled ++ 禁用 + ++ ++ ++ KiranAccountManager + +- Error +- 错误 ++ disable ++ 禁用 + + +- The biometric features were successfully recorded. The feature name is:%1 +- 特征已成功录入,特征名为:%1 ++ enable ++ 启用 + + +- Tips +- 提示 ++ Create new user ++ 创建新用户 + + +- Failed to record biometrics(%1), Please try again +- 录入特征失败(%1),请重试 ++ User Manager ++ 帐户管理工具 ++ ++ ++ Create new account ++ 创建新用户 + + + +- FingerPage ++ KiranAvatarEditor ++ ++ ++ Avatar Editor ++ 头像编辑器 ++ ++ ++ ++ Confirm ++ 确认 ++ + ++ + Cancel + 取消 + ++ ++ ++ KiranCPanelMouse + +- fingerprint +- 指纹 ++ Mouse and TouchPad ++ 鼠标和触摸板 + ++ ++ ++ KiranCPanelMouseWidget + +- fingervein +- 指静脉 ++ Select Mouse Hand ++ 选择鼠标手持模式 + + +- default %1 device +- 默认%1设备 ++ Mouse Motion Acceleration ++ 鼠标移动加速 + + +- %1 list +- %1列表 ++ Natural Scroll ++ 是否为自然滚动 + + +- Start enroll failed,%1 +- 开始录入失败,%1 ++ Middle Emulation Enabled ++ 同时按下左右键模拟中键 + + +- Error +- 错误 ++ Touchpad Enabled ++ 禁用触摸板 + + +- The biometric features were successfully recorded. The feature name is:%1 +- 特征已成功录入,特征名为:%1 ++ Select TouchPad Hand ++ 选择触摸板使用模式 + + +- Tips +- 提示 ++ TouchPad Motion Acceleration ++ 触摸板移动加速 + + +- Failed to record biometrics(%1), Please try again +- 录入特征失败(%1),请重试 ++ Select Click Method ++ 设置点击触摸板方式 + + +- %1list +- %1列表 ++ Select Scroll Method ++ 滚动窗口方式 + + +- Default %1 device +- 默认%1设备 ++ Enabled while Typing ++ 打字时触摸板禁用 + +- +- +- FingerprintEnrollDialog + +- save +- 保存 ++ Tap to Click ++ 轻击(不按下)触摸板功能是否生效 + + +- cancel +- 取消 ++ Reset ++ 重置 + + +- Finger Enroll +- 指纹录入 ++ Exit ++ 关闭 + + +- This fingerprint is bound to the user(%1) +- 该指纹已绑定用户(%1) ++ Cancel ++ 取消 + + +- Info +- 提示 ++ Save ++ 保存 + + +- Error +- 错误 ++ Mouse Settings ++ 鼠标设置 + +- +- +- FingerprintInputDialog + +- save +- 保存 ++ TouchPad Settings ++ 触摸板设置 + + +- cancel +- 取消 ++ Standard ++ 标准 + + +- Finger Enroll +- 指纹录入 ++ Right Hand Mode ++ 右手模式 + + +- Error +- 错误 ++ Left Hand Mode ++ 左手模式 + +- +- +- FingerprintInputWorker + +- initializing fingerprint collection environment... +- 正在初始化指纹采集环境,请稍等 ++ Press and Tap ++ 按键和轻触 + +- +- +- Fonts + +- Form +- ++ Tap ++ 轻触 + + +- Application Font Settings +- 应用程序字体设置 ++ Two Finger Scroll ++ 两指滑动 + + +- ComboAppFontName +- ++ Edge Scroll ++ 边缘滑动 + + +- ComboAppFontSize +- ++ Slow ++ 低速 + + +- Titlebar Font Settings +- 窗口标题字体设置 ++ Fast ++ 快速 + ++ ++ ++ KiranCollapse + +- ComboTitleFontName ++ ++ ListExpansionSpace + + ++ ++ ++ KiranCpanelAppearance + +- ComboTitleFontSize +- ++ Wallpaper Setting ++ 壁纸设置 + + +- Monospace Font Settings +- 等宽字体设置 ++ Theme Setting ++ 主题设置 + + +- ComboMonospaceFontName +- ++ Font Setting ++ 字体设置 + ++ ++ ++ KiranDatePickerWidget + +- ComboMonospaceFontSize ++ ++ Form + + + + +- GeneralBioPage ++ KiranGroupManager + +- default device +- 默认设备 ++ ++ Create new group ++ + ++ ++ ++ KiranModuleWidget + +- feature list +- 特征列表 ++ Warning ++ 警告 + + +- Are you sure you want to delete the feature called %1, Ensure that the Ukey device is inserted; otherwise the information stored in the Ukey will not be deleted +- 您确定要删除特征名为%1的UKey绑定吗?请确保已插入Ukey设备;否则存储在Ukey中的信息将不会被删除 ++ The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? ++ %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? + + +- Are you sure you want to delete the feature called %1 +- 您确定要删除特征名为%1的特征吗 ++ ++ Form ++ + ++ ++ ++ KiranSystemWidget + +- tips +- 提示 ++ kiran-system-imformation ++ 系统信息 + + +- Error +- 错误 ++ 保存 ++ 保存 + ++ ++ ++ KiranTimeDateWidget + +- Failed to enroll feature because the password verification failed! +- 由于密码校验失败,录入特征失败! +- +- +- Rename Feature +- 重命名特征值 +- +- +- Please enter the renamed feature name +- 请输入特征名 ++ ++ KiranTimeDateWidget ++ + +- +- +- GeneralPage + +- Form +- ++ ++ Automatic synchronizetion ++ 自动同步 + + +- Capslock Tip +- 大写锁定提示 ++ ++ Change Time Zone ++ 更改时区 + + +- Numlock Tip +- 数字键盘锁定提示 ++ ++ Set Time Manually ++ 手动设置时间 + + +- Repeat Key +- 重复键 ++ ++ Time date format setting ++ 日期时间格式设置 + + +- (Repeat a key while holding it down) +- (按住某一键时重复该键) ++ ++ %1(%2) ++ %1时间(%2) + ++ ++ ++ KiranTimePickerWidget + +- SwitchRepeatKey ++ ++ Form + + ++ ++ ++ KiranTimeZone + +- Delay +- 延时 +- +- +- SliderRepeatDelay ++ ++ Form + + + +- Short +- +- +- +- Long +- +- +- +- Interval +- 速度 ++ ++ Search in all time zones... ++ 在所有时区中搜索... + ++ ++ ++ KiranTimeZoneItem + +- SliderRepeatInterval ++ ++ Form + + + +- Slow +- +- +- +- Fast +- +- +- +- Enter repeat characters to test +- 输入重复字符测试 ++ ++ No search results, please search again... ++ 无搜索结果,请重新搜索... + ++ ++ ++ KiranTimeZoneList + +- EditTestRepeatKey ++ ++ Form + + +- +- Enter characters to test the settings +- 输入重复字符测试 +- + + +- GeneralSettingsPage +- +- GeneralSettingsPage +- 通用设置页面 +- +- +- When the power button is pressed +- 按下电源按钮时 +- +- +- ComboPowerButtonAction +- +- ++ KiranTips + +- When the suspend button is pressed +- 按下挂起按钮时 ++ ++ ++ Form ++ + ++ ++ ++ KylinsecLogo + +- ComboSuspendAction +- ++ ++ Copyright © ++ 版权所有 © + + +- When closing the lid +- 合上盖子操作 ++ ++ KylinSec. All rights reserved. ++ KylinSec.保留所有权利. + ++ ++ ++ LayoutItem + +- ComboCloseLidAction ++ ++ Form + + ++ ++ ++ LayoutList + +- Computer Mode +- 计算机模式 +- +- +- Display brightness setting +- 显示亮度设置 +- +- +- 0% ++ ++ LayoutList + + ++ ++ ++ LayoutPage + +- SliderDisplayBrightness ++ ++ Form + + + +- Color temperature +- 色温 +- +- +- Automatic color temperature +- 自动色温 +- +- +- cold +- +- +- +- standard +- 标准 +- +- +- warm +- ++ ++ Select Kayboard Layout ++ 选择布局 + + +- Regard computer as idle after +- 于此时间后视计算机为空闲 ++ ++ ++ Edit ++ 编辑 + + +- SliderComputerIdleTime +- ++ ++ ++ Add Layout ++ 添加布局 + + +- Lock screen when idle +- 计算机空闲时锁定屏幕 ++ ++ ButtonAddLayout ++ + + +- password is required to wake up in standby mode +- 待机时唤醒需要输入密码 ++ ++ Addition ++ 添加 + + +- shutdown +- 关机 ++ ++ ButtonReturn ++ + + +- hibernate +- 休眠 ++ ++ Return ++ 返回 + + +- suspend +- 待机 ++ ++ ++ ++ ++ Failed ++ 失败 + + +- display off +- 关闭显示器 ++ ++ You have added this keyboard layout! ++ 您已经添加过该布局 + + +- do nothing +- 不执行操作 ++ ++ The %1 keyboard layout does not exist! ++ 该 %1 键盘布局不存在! + + +- ERROR +- 错误 ++ ++ The keyboard layout is currently in use and cannot be deleted! ++ 该布局目前正在使用,无法删除! + + +- %1hour +- %1小时 ++ ++ Delete Layout ++ 删除布局 + + +- %1minute +- %1分钟 ++ ++ You do not appear to have added %1 keyboard layout! ++ 您似乎没有添加 %1 键盘布局! + +- +- +- GeneralSettingsSubItem + +- General Settings +- 通用设置 ++ ++ Finish ++ 完成 + + + +- GeneralSubItem ++ LayoutSubItem + +- Keyboard General Option +- 键盘通用选项 ++ ++ Keyboard Layout ++ 键盘布局 + + + +- GroupInfoPage ++ LicenseAgreement + ++ + Form + + + +- TextLabel ++ ++ BrowserLicense + + + +- Group ++ ++ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> ++<html><head><meta name="qrichtext" content="1" /><style type="text/css"> ++p, li { white-space: pre-wrap; } ++</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:9pt; font-weight:400; font-style:normal;"> ++<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + +- Member List ++ ++ ButtonExportLicense + + + +- Add User +- ++ ++ Export ++ 导出 + + +- Delete ++ ++ ButtonCloseLicense + + + +- Add Member +- ++ ++ Close ++ 关闭 + + ++ + Save +- 保存 ++ 保存 + + +- Cancel +- 取消 ++ ++ PDF(*.pdf) ++ + + +- Please input keys for search... +- ++ ++ Export License ++ 导出协议 + + +- Error +- 错误 ++ ++ Export License failed! ++ 导出协议失败! + +- +- +- GroupSubItem + +- Group +- ++ ++ User End License Agreement ++ 最终用户许可协议 + + +- Creat group +- ++ ++ ++ ++ ++ ++ ++ None ++ 暂无 + + +- Change group name +- ++ ++ Version License ++ 版本协议 + + +- Add group member +- ++ Export EULA ++ 导出最终用户许可协议 ++ ++ ++ Export EULA failed! ++ 导出最终用户许可协议失败! ++ ++ ++ ++ ++ Privacy Policy ++ 隐私协议 + + + +- HardWorker ++ LicenseInfoWidget + +- Create User failed +- 创建用户失败 ++ Machine Code: ++ 机器码: + + +- update password failed +- 更新密码失败 ++ Activation Code: ++ 激活码: + + +- icon file +- 头像 ++ Activation Information ++ 激活信息 + + +- userName type +- 用户名 ++ Can't get machine code ++ 无法获取到机器码 + + +- locked +- 启用状态 ++ Can't get activation code ++ 无法获取到激活码 + ++ ++ ++ LicenseInformation + +- Failed to update user properties,%1 +- 更新用户属性失败,%1 ++ Installation time: ++ 安装时间: + + +- Failed to delete user,%1 +- 删除用户失败,%1 ++ Activation status: ++ 激活状态: + + +- password +- 密码 ++ Expiry date: ++ 质保期: + + +- home directory +- 用户目录 ++ Contact Us: ++ 联系我们: + + +- shell +- shell ++ Unknow ++ 未知 + + +- icon +- 头像 ++ Can't get activation information ++ 无法获取激活信息 + + +- Failed to set user attributes +- 设置用户属性失败 ++ Activate ++ 激活 + + +- account type +- 帐户类型 ++ The current time is illegal ++ 当前时间不合法 + + +- Failed to update user properties(%1) +- 更新用户属性失败(%1) ++ Less than the installation time ++ 小于安装时间 + + +- Failed to delete user +- 删除用户失败 ++ Not activated. Trail expiration: ++ 未激活.试用到期: + + +- Failed to connect to the account management service +- ++ get service status failed ++ 获取服务状态信息失败 + + +- Create Group failed +- ++ Not yet ++ 暂无 + + +- Failed to delete group,%1 +- ++ Activated ++ 已激活 + + +- add user to group failed +- ++ Forever ++ 永久授权 + + +- change group name failed +- ++ Copyright © ++ 版权所有 © + + +- change group name failed, the new group name is occupied +- ++ KylinSec. All rights reserved. ++ KylinSec.保留所有权利. + + + +- HardwareInformation ++ ListExpansionSpace + +- Form ++ ++ ListExpansionSpace + + ++ ++ ++ Media Key + +- CPU: +- CPU: +- +- +- LabelCpuInfo +- ++ ++ Audio Play ++ 音频播放 + + +- TextLabel +- ++ ++ Search ++ 搜索 + + +- Memory: +- 内存: ++ ++ WWW ++ 万维网 + + +- LabelMemoryInfo +- ++ ++ Audio Lower Volume ++ 减小音量 + + +- Hard disk: +- 硬盘: ++ ++ Audio Raise Volume ++ 增大音量 + + +- Graphics card: +- 显卡: ++ ++ Mic Mute ++ 输入静音 + + +- Network card: +- 网卡: ++ ++ Audio Stop ++ 音频停止 + + +- Copyright © +- 版权所有 © ++ ++ Explorer ++ 浏览 + + +- KylinSec. All rights reserved. +- KylinSec.保留所有权利. ++ ++ Calculator ++ 计算器 + + +- Unknow +- 未知 ++ ++ Audio Mute ++ 音频暂停 + + +- %1 GB (%2 GB available) +- %1 GB (%2 GB 可用) ++ ++ Audio Pause ++ 音频暂停 + +- +- +- HardwareInformationWidget + +- CPU: +- CPU: ++ ++ Audio Prev ++ 音频上一个 + + +- Memory: +- 内存: ++ ++ Audio Media ++ 音频媒体 + + +- Hard disk: +- 硬盘: ++ ++ Audio Next ++ 音频下一个 + + +- Graphics card: +- 显卡: ++ ++ Mail ++ 邮件 + + +- Network card: +- 网卡: ++ ++ Tools ++ 工具 + + +- Unknow +- 未知 ++ ++ Eject ++ 弹出 + + + +- HardwareSubItem ++ MonthSpinBox + +- Hardware Information +- 硬件信息 ++ ++ MMMM ++ MMMM + + + +- IconThemePage ++ MousePage + ++ + Form + + + +- Icon Themes Setting +- 图标主题设置 ++ ++ Select Mouse Hand ++ 选择鼠标手持模式 + +- +- +- IconThemes + +- Icon Themes Setting +- 图标主题设置 ++ ++ ComboSelectMouseHand ++ + + +- Faild +- 失败 ++ ++ Mouse Motion Acceleration ++ 鼠标移动加速 + + +- Set icon themes failed! +- 设置图标主题失败! ++ ++ SliderMouseMotionAcceleration ++ + +- +- +- IdentificationRenameDialog + +- Rename Feature +- 重命名特征值 ++ ++ Slow ++ + + +- Please enter the renamed feature name +- 请输入特征名 ++ ++ Fast ++ + + +- Confirm +- 确认 ++ ++ Natural Scroll ++ 是否为自然滚动 + + +- Cancel +- 取消 ++ ++ SwitchMouseNatturalScroll ++ + +- +- +- ImageSelector + +- Add Image Failed +- 添加壁纸失败 ++ ++ Middle Emulation Enabled ++ 同时按下左右键模拟中键 + + +- The image already exists! +- 该壁纸已存在! ++ ++ SwitchMiddleEmulation ++ + + +- Delete image +- 删除壁纸 ++ ++ Test mouse wheel direction ++ 鼠标滚轮方向测试 + + +- Are you sure you want to delete this picture? +- 您确定要删除此壁纸? ++ ++ This is line 1 of the test text ++This is line 2 of the test text ++This is line 3 of the test text ++This is line 4 of the test text ++This is line 5 of the test text ++This is line 6 of the test text ++This is line 7 of the test text ++This is line 8 of the test text ++This is line 9 of the test text ++This is line 10 of the test text ++This is line 11 of the test text ++This is line 12 of the test text ++This is line 13 of the test text ++This is line 14 of the test text ++This is line 15 of the test text ++This is line 16 of the test text ++This is line 17 of the test text ++This is line 18 of the test text ++This is line 19 of the test text ++This is line 20 of the test text ++This is line 21 of the test text ++This is line 22 of the test text ++This is line 23 of the test text ++This is line 24 of the test text ++This is line 25 of the test text ++This is line 26 of the test text ++This is line 27 of the test text ++This is line 28 of the test text ++This is line 29 of the test text ++This is line 30 of the test text ++This is line 31 of the test text ++This is line 32 of the test text ++This is line 33 of the test text ++This is line 34 of the test text ++This is line 35 of the test text ++This is line 36 of the test text ++This is line 37 of the test text ++This is line 38 of the test text ++This is line 39 of the test text ++This is line 40 of the test text ++This is line 41 of the test text ++This is line 42 of the test text ++This is line 43 of the test text ++This is line 44 of the test text ++This is line 45 of the test text ++This is line 46 of the test text ++This is line 47 of the test text ++This is line 48 of the test text ++This is line 49 of the test text ++This is line 50 of the test text ++ 这是第1行测试文字 ++这是第2行测试文字 ++这是第3行测试文字 ++这是第4行测试文字 ++这是第5行测试文字 ++这是第6行测试文字 ++这是第7行测试文字 ++这是第8行测试文字 ++这是第9行测试文字 ++这是第10行测试文字 ++这是第11行测试文字 ++这是第12行测试文字 ++这是第13行测试文字 ++这是第14行测试文字 ++这是第15行测试文字 ++这是第16行测试文字 ++这是第17行测试文字 ++这是第18行测试文字 ++这是第19行测试文字 ++这是第20行测试文字 ++这是第21行测试文字 ++这是第22行测试文字 ++这是第23行测试文字 ++这是第24行测试文字 ++这是第25行测试文字 ++这是第26行测试文字 ++这是第27行测试文字 ++这是第28行测试文字 ++这是第29行测试文字 ++这是第30行测试文字 ++这是第31行测试文字 ++这是第32行测试文字 ++这是第33行测试文字 ++这是第34行测试文字 ++这是第35行测试文字 ++这是第36行测试文字 ++这是第37行测试文字 ++这是第38行测试文字 ++这是第39行测试文字 ++这是第40行测试文字 ++这是第41行测试文字 ++这是第42行测试文字 ++这是第43行测试文字 ++这是第44行测试文字 ++这是第45行测试文字 ++这是第46行测试文字 ++这是第47行测试文字 ++这是第48行测试文字 ++这是第49行测试文字 ++这是第50行测试文字 + +- +- +- InputDialog + +- Confirm +- 确认 ++ ++ Right Hand Mode ++ 右手模式 + + +- Cancel +- 取消 ++ ++ Left Hand Mode ++ 左手模式 + + + +- IrisPage ++ MouseSettings + +- Default Iris device +- 默认虹膜设备 ++ Select Mouse Hand ++ 选择鼠标手持模式 + + +- Iris feature list +- 虹膜特征列表 ++ Mouse Motion Acceleration ++ 鼠标移动加速 + + +- iris +- 虹膜 ++ Natural Scroll ++ 是否为自然滚动 + + +- Cancel +- 取消 ++ Middle Emulation Enabled ++ 同时按下左右键模拟中键 + + +- Start enroll failed,%1 +- 开始录入失败,%1 ++ Right Hand Mode ++ 右手模式 + + +- Error +- 错误 ++ Left Hand Mode ++ 左手模式 + + +- The biometric features were successfully recorded. The feature name is:%1 +- 特征已成功录入,特征名为:%1 ++ Slow ++ + + +- Tips +- 提示 ++ Standard ++ 标准 + + +- Failed to record biometrics(%1), Please try again +- 录入特征失败(%1),请重试 ++ Fast ++ + + + +- KcpInterface +- +- Warning +- 警告 +- ++ MouseSubItem + +- load qss file failed +- 加载qss文件失败 ++ ++ Mouse Settings ++ 鼠标设置 + + + +- KeybindingSubItem ++ NetworkSubItem + +- Keybinding +- 快捷键 ++ ++ Wired Network %1 ++ 有线网络 %1 + +- +- +- KeycodeTranslator + +- None +- 暂无 ++ ++ Wired Network ++ 有线网络 + + +- disabled +- 禁用 ++ ++ Wireless Network %1 ++ 无线网络 %1 ++ ++ ++ ++ Wireless Network ++ 无线网络 ++ ++ ++ ++ VPN ++ VPN ++ ++ ++ ++ Network Details ++ 网络详情 + + + +- KiranAccountManager ++ NetworkTray + +- disable +- 禁用 ++ ++ Network settings ++ 网络设置 + + +- enable +- 启用 ++ ++ ++ Network unavailable ++ 网络不可用 + + +- Create new user +- 创建新用户 ++ ++ ++ The network is connected, but you cannot access the Internet ++ 网络已连接,但不能访问互联网 + + +- User Manager +- 帐户管理工具 ++ ++ Network not connected ++ 网络已断开 + + +- Create new account +- 创建新用户 ++ ++ Wired network card: %1 available ++ 有线网卡: %1 可用 + +- +- +- KiranAvatarEditor + +- Avatar Editor +- 头像编辑器 ++ ++ Wireless network card: %1 available ++ 无线网卡: %1 可用 + + +- Confirm +- 确认 ++ ++ Wired network card: %1 unavailable ++ 有线网卡: %1 不可用 + + +- Cancel +- 取消 ++ ++ Wireless network card: %1 unavailable ++ 无线网卡: %1 不可用 + +- +- +- KiranCPanelMouse + +- Mouse and TouchPad +- 鼠标和触摸板 ++ ++ ++ Network connected ++ 网络已连接 + + + +- KiranCPanelMouseWidget ++ OutputPage + +- Select Mouse Hand +- 选择鼠标手持模式 ++ ++ OutputPage ++ ++ ++ ++ ++ Output cards ++ 输出声卡 ++ ++ ++ ++ Output devices ++ 输出设备 ++ ++ ++ ++ ComboBoxOutputDevices ++ ++ ++ ++ ++ Output volume ++ 输出音量 ++ ++ ++ ++ SlilderVolumeSetting ++ ++ ++ ++ ++ Left/right balance ++ 左/右平衡 ++ ++ ++ ++ SliderVolumeBalance ++ + + +- Mouse Motion Acceleration +- 鼠标移动加速 ++ ++ Left ++ + + +- Natural Scroll +- 是否为自然滚动 ++ ++ Right ++ + + +- Middle Emulation Enabled +- 同时按下左右键模拟中键 ++ ++ No output device detected ++ 未检测到输出设备 + ++ ++ ++ PanelWindow + +- Touchpad Enabled +- 禁用触摸板 ++ ++ Control Panel ++ 控制面板 + ++ ++ ++ PasswordExpirationPolicyPage + +- Select TouchPad Hand +- 选择触摸板使用模式 ++ ++ PasswordExpirationPolicyPage ++ + + +- TouchPad Motion Acceleration +- 触摸板移动加速 ++ ++ User expires ++ 用户过期时间 + + +- Select Click Method +- 设置点击触摸板方式 ++ ++ SpinBoxUserExpires ++ + + +- Select Scroll Method +- 滚动窗口方式 ++ ++ yyyy-MM-dd ++ + + +- Enabled while Typing +- 打字时触摸板禁用 ++ ++ Last password change ++ 最近一次密码修改时间 + + +- Tap to Click +- 轻击(不按下)触摸板功能是否生效 ++ ++ LabelLastPasswdChange ++ + + +- Reset +- 重置 ++ ++ 1990-01-01 ++ + + +- Exit +- 关闭 ++ ++ Maximum vaild days of password ++ 密码最大有限天数 + + +- Cancel +- 取消 ++ ++ SpinBoxMaximumValidDays ++ + + +- Save +- 保存 ++ ++ Prompt time before password expiration ++ 密码过期之前提醒的天数 + + +- Mouse Settings +- 鼠标设置 ++ ++ SpinBoxPromptBeforeExpiration ++ + + +- TouchPad Settings +- 触摸板设置 ++ ++ how many days after password expires will become inactive ++ 密码过期多少天认定为失效 + + +- Standard +- 标准 ++ ++ SpinBoxPasswdInactiveTime ++ + + +- Right Hand Mode +- 右手模式 ++ ++ ButtonSave ++ + + +- Left Hand Mode +- 左手模式 ++ ++ save ++ 保存 + + +- Press and Tap +- 按键和轻触 ++ ++ ButtonReturn ++ + + +- Tap +- 轻触 ++ ++ return ++ 返回 + + +- Two Finger Scroll +- 两指滑动 ++ ++ ++ ++ day ++ + ++ ++ ++ PluginConnectionList + +- Edge Scroll +- 边缘滑动 ++ ++ Other WiFi networks ++ 其它WIFI网络 + + +- Slow +- 低速 ++ ++ Tips ++ 提示 + + +- Fast +- 快速 ++ ++ Please input a network name ++ 请输入网络名称 + + + +- KiranCollapse ++ Popup + +- ListExpansionSpace +- ++ cancel ++ 取消 + + + +- KiranCpanelAppearance ++ PowerPlugin + +- Wallpaper Setting +- 壁纸设置 ++ ++ General Settings ++ 通用设置 + + +- Theme Setting +- 主题设置 ++ ++ Power Settings ++ 电源设置 + + +- Font Setting +- 字体设置 ++ ++ Battery Settings ++ 电池设置 + + + +- KiranDatePickerWidget ++ PowerProfilesWrapper + +- Form +- ++ ++ ++ power-saver ++ 省电模式 + +- +- +- KiranGroupManager + +- Create new group +- ++ ++ ++ balanced ++ 平衡模式 ++ ++ ++ ++ ++ performance ++ 性能模式 + + + +- KiranModuleWidget ++ PowerSettingsPage + +- Warning +- 警告 ++ ++ PowerSettingsPage ++ 电源设置页面 + + +- The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? +- %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? ++ ++ After idle for more than the following time, the computer will execute ++ 空闲超过以下时间后,计算机将执行 + + +- Form ++ ++ ComboIdleTime + + +- +- +- KiranSystemWidget + +- kiran-system-imformation +- 系统信息 ++ ++ ComboIdleAction ++ + + +- 保存 +- 保存 ++ ++ The monitor will turn off when it is idle ++ 显示器空闲以下时间关闭 + +- +- +- KiranTimeDateWidget + +- KiranTimeDateWidget ++ ++ ComboMonitorTrunOffIdleTime + + + +- Automatic synchronizetion +- 自动同步 +- +- +- Change Time Zone +- 更改时区 ++ ++ Suspend ++ 待机 + + +- Set Time Manually +- 手动设置时间 ++ ++ Shutdown ++ 关机 + + +- Time date format setting +- 日期时间格式设置 ++ ++ Hibernate ++ 休眠 + + +- %1(%2) +- %1时间(%2) ++ ++ Do nothing ++ 不执行操作 + + + +- KiranTimePickerWidget ++ PowerSubItem + +- Form +- ++ Power Settings ++ 电源设置 + + + +- KiranTimeZone +- +- Form +- +- ++ PrefsPage + +- Search in all time zones... +- 在所有时区中搜索... ++ ++ Authentication type Enabled status ++ 认证类型启用状态 + +- +- +- KiranTimeZoneItem + +- Form +- ++ ++ ++ fingerprint ++ 指纹 + + +- No search results, please search again... +- 无搜索结果,请重新搜索... ++ ++ ++ fingervein ++ 指静脉 + +- +- +- KiranTimeZoneList + +- Form ++ ++ ... + + +- +- +- KiranTips + +- Form +- ++ ++ Return ++ 返回 + +- +- +- KylinsecLogo + +- Copyright © +- 版权所有 © ++ ++ login ++ 登录 + + +- KylinSec. All rights reserved. +- KylinSec.保留所有权利. ++ ++ unlock ++ 解锁 + +- +- +- LayoutItem + +- Form +- ++ ++ empowerment ++ 授权 + +- +- +- LayoutList + +- LayoutList +- ++ ++ Apply the %1 authentication to the following applications ++ 启用%1认证在以下的认证应用中 + +- +- +- LayoutPage + +- Form +- ++ ++ ukey ++ UKey + + +- Select Kayboard Layout +- 选择布局 ++ ++ iris ++ 虹膜 + + +- Edit +- 编辑 ++ ++ face ++ 人脸 + ++ ++ ++ QObject + +- Add Layout +- 添加布局 ++ Did not reply within the specified timeout ++ 连接超时 + + +- ButtonAddLayout +- ++ The called service is not known ++ 无法连接到Dbus服务 + + +- Addition +- 添加 ++ warning ++ 警告 + + +- ButtonReturn +- ++ Open qss file failed ++ 加载qss文件失败 + + +- Return +- 返回 ++ ++ %1Day ++ %1天 + + +- Failed +- 失败 ++ ++ %1Hour ++ %1小时 + + +- You have added this keyboard layout! +- 您已经添加过该布局 ++ ++ %1Minute ++ %1分钟 + + +- The %1 keyboard layout does not exist! +- 该 %1 键盘布局不存在! ++ ++ never ++ 从不 + + +- The keyboard layout is currently in use and cannot be deleted! +- 该布局目前正在使用,无法删除! ++ SLow ++ 低速 + + +- Delete Layout +- 删除布局 ++ Standard ++ 标准 + + +- You do not appear to have added %1 keyboard layout! +- 您似乎没有添加 %1 键盘布局! ++ Fast ++ 快速 + + +- Finish +- 完成 ++ Faild ++ 失败 + +- +- +- LayoutSubItem + +- Keyboard Layout +- 键盘布局 ++ Connect Mouse or TouchPad Dbus Failed! ++ 连接鼠标或触摸板Dbus服务失败! + +- +- +- LicenseAgreement + +- Form +- ++ Load qss file failed! ++ 加载qss文件失败! + + +- BrowserLicense +- ++ ++ No search results, please search again... ++ 无搜索结果,请重新搜索... + + +- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +-<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +-p, li { white-space: pre-wrap; } +-</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:9pt; font-weight:400; font-style:normal;"> +-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +- ++ ++ ++ ++ ++ Tips ++ 提示 + + +- ButtonExportLicense +- ++ ++ ++ ++ ++ OK(K) ++ 确定(K) + + +- Export +- 导出 ++ ++ Failed to apply display settings!%1 ++ 应用显示设置失败!%1 + + +- ButtonCloseLicense +- ++ ++ Fallback display setting failed! %1 ++ 回撤显示设置失败! %1 + + +- Close +- 关闭 ++ Failed ++ 失败 + + +- Save +- 保存 ++ Set font failed! ++ 设置字体失败! + + +- PDF(*.pdf) +- ++ Get icon themes failed! ++ 获取图标主题失败! + + +- Export License +- 导出协议 ++ Get cursor themes failed! ++ 获取光标主题失败! + + +- Export License failed! +- 导出协议失败! ++ Warning ++ 警告 + + +- User End License Agreement +- 最终用户许可协议 ++ There is no theme to set! ++ 目前没有主题可以设置! + + +- None +- 暂无 ++ ++ Spring ++ 初春 + + +- Version License +- 版本协议 ++ ++ Summer ++ 盛夏 + ++ ++ ++ SearchEdit + +- Export EULA +- 导出最终用户许可协议 ++ ++ Enter keywords to search ++ 输入关键词进行搜索 + + +- Export EULA failed! +- 导出最终用户许可协议失败! ++ ++ Info ++ 提示 + + +- Privacy Policy +- 隐私协议 ++ ++ Failed to find related items, please re-enter! ++ 未能搜索到相关项,请重新输入! + + + +- LicenseInfoWidget ++ SelectAvatarPage + +- Machine Code: +- 机器码: ++ ++ Confirm ++ 确认 + + +- Activation Code: +- 激活码: ++ ++ Return ++ 返回 + + +- Activation Information +- 激活信息 ++ ++ select picture ++ 选择图片 + + +- Can't get machine code +- 无法获取到机器码 ++ ++ image files(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) ++ 图片文件(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) ++ ++ ++ ++ SettingBriefWidget ++ ++ ++ Form ++ + + +- Can't get activation code +- 无法获取到激活码 ++ ++ ++ ++ TextLabel ++ + + + +- LicenseInformation ++ Shortcut + +- Installation time: +- 安装时间: ++ ++ Form ++ + + +- Activation status: +- 激活状态: ++ ++ EditSearch ++ + + +- Expiry date: +- 质保期: ++ ++ Custom ++ 自定义 + + +- Contact Us: +- 联系我们: ++ ++ ++ ++ Edit ++ 编辑 + + +- Unknow +- 未知 ++ ++ ButtonAddShortcut ++ + + +- Can't get activation information +- 无法获取激活信息 ++ ++ ++ ++ ++ Add ++ 添加 + + +- Activate +- 激活 ++ ++ ButtonReset ++ + + +- The current time is illegal +- 当前时间不合法 ++ ++ Reset ++ 重置 + + +- Less than the installation time +- 小于安装时间 ++ ++ Custom Shortcut Name ++ 自定义快捷键名称 + + +- Not activated. Trail expiration: +- 未激活.试用到期: ++ ++ EditCustomShortcutName ++ + + +- get service status failed +- 获取服务状态信息失败 ++ ++ Custom Shortcut application ++ 自定义快捷键应用程序 + + +- Not yet +- 暂无 ++ ++ ++ EditShortcutApp ++ + + +- Activated +- 已激活 ++ ++ Custom Shortcut Key ++ 自定义快捷键 + + +- Forever +- 永久授权 ++ ++ ButtonAdd ++ + + +- Copyright © +- 版权所有 © ++ ++ ButtonCancel ++ + + +- KylinSec. All rights reserved. +- KylinSec.保留所有权利. ++ ++ Cancel ++ 取消 + +- +- +- ListExpansionSpace + +- ListExpansionSpace ++ ++ Shortcut Name ++ 快捷键名称 ++ ++ ++ ++ EditShortcutName + + +- +- +- Media Key + +- Audio Play +- 音频播放 ++ ++ Shortcut application ++ 快捷键应用程序 ++ ++ ++ ++ Shortcut key ++ 快捷键 + + +- Search +- 搜索 ++ ++ ButtonSave ++ + + +- WWW +- 万维网 ++ ++ Save ++ 保存 + + +- Audio Lower Volume +- 减小音量 ++ ++ ButtonReturn ++ + + +- Audio Raise Volume +- 增大音量 ++ ++ return ++ 返回 + + +- Mic Mute +- 输入静音 ++ ++ Please enter a search keyword... ++ 请输入搜索关键字... + + +- Audio Stop +- 音频停止 ++ ++ Required ++ 必填 + + +- Explorer +- 浏览 ++ ++ ++ Please press the new shortcut key ++ 请输入新快捷键 + + +- Calculator +- 计算器 ++ ++ Finished ++ 完成 + + +- Audio Mute +- 音频暂停 ++ ++ failed to load shortcut key data! ++ 加载快捷键数据失败! + + +- Audio Pause +- 音频暂停 ++ ++ List shortcut failed,error:%1 ++ 列出快捷键失败,错误:%1 + + +- Audio Prev +- 音频上一个 ++ ++ Error ++ 错误 + + +- Audio Media +- 音频媒体 ++ ++ Get shortcut failed,error: ++ 获取快捷键失败,错误: + + +- Audio Next +- 音频下一个 ++ ++ Open File ++ 打开文件 + + +- Mail +- 邮件 ++ ++ System ++ 系统 + + +- Tools +- 工具 ++ ++ Sound ++ 声音 + + +- Eject +- 弹出 ++ ++ ++ ++ ++ ++ ++ ++ Failed ++ 失败 + +- +- +- MonthSpinBox + +- MMMM +- MMMM ++ ++ Delete shortcut failed,error: ++ 删除快捷键失败,错误: + +- +- +- MousePage + +- Form +- ++ ++ ++ Warning ++ 警告 + + +- Select Mouse Hand +- 选择鼠标手持模式 ++ ++ ++ Please complete the shortcut information! ++ 请完善快捷键信息! + + +- ComboSelectMouseHand +- ++ ++ Set shortcut ++ 设置快捷键 + + +- Mouse Motion Acceleration +- 鼠标移动加速 ++ ++ Are you sure you want to disable this shortcut? ++ 是否确定要禁用此快捷键? + + +- SliderMouseMotionAcceleration +- ++ ++ Modify system shortcut failed,error: ++ 修改系统快捷键失败,错误: + + +- Slow +- ++ ++ Modify custom shortcut failed,error: ++ 修改自定义快捷键失败,错误: + + +- Fast +- ++ ++ Add custom shortcut failed,error: ++ 添加自定义快捷键失败,错误: + + +- Natural Scroll +- 是否为自然滚动 ++ ++ Reset shortcut failed,error: ++ 重置快捷键失败,错误: + + +- SwitchMouseNatturalScroll +- ++ ++ Cannot use shortcut "%1", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. ++ 无法使用快捷键"%1",因为使用此键将无法输入,请同时使用Ctrl,Alt,Shift再试一次。 + + +- Middle Emulation Enabled +- 同时按下左右键模拟中键 ++ ++ Shortcut keys %1 are already used in %2,Please try again! ++ 快捷键%1已用于%2,请再试一次! + ++ ++ ++ ShortcutItem + +- SwitchMiddleEmulation +- ++ ++ Form ++ + + +- Test mouse wheel direction +- 鼠标滚轮方向测试 ++ ++ ++ TextLabel ++ + ++ ++ ++ ShowQRCode + +- This is line 1 of the test text +-This is line 2 of the test text +-This is line 3 of the test text +-This is line 4 of the test text +-This is line 5 of the test text +-This is line 6 of the test text +-This is line 7 of the test text +-This is line 8 of the test text +-This is line 9 of the test text +-This is line 10 of the test text +-This is line 11 of the test text +-This is line 12 of the test text +-This is line 13 of the test text +-This is line 14 of the test text +-This is line 15 of the test text +-This is line 16 of the test text +-This is line 17 of the test text +-This is line 18 of the test text +-This is line 19 of the test text +-This is line 20 of the test text +-This is line 21 of the test text +-This is line 22 of the test text +-This is line 23 of the test text +-This is line 24 of the test text +-This is line 25 of the test text +-This is line 26 of the test text +-This is line 27 of the test text +-This is line 28 of the test text +-This is line 29 of the test text +-This is line 30 of the test text +-This is line 31 of the test text +-This is line 32 of the test text +-This is line 33 of the test text +-This is line 34 of the test text +-This is line 35 of the test text +-This is line 36 of the test text +-This is line 37 of the test text +-This is line 38 of the test text +-This is line 39 of the test text +-This is line 40 of the test text +-This is line 41 of the test text +-This is line 42 of the test text +-This is line 43 of the test text +-This is line 44 of the test text +-This is line 45 of the test text +-This is line 46 of the test text +-This is line 47 of the test text +-This is line 48 of the test text +-This is line 49 of the test text +-This is line 50 of the test text +- 这是第1行测试文字 +-这是第2行测试文字 +-这是第3行测试文字 +-这是第4行测试文字 +-这是第5行测试文字 +-这是第6行测试文字 +-这是第7行测试文字 +-这是第8行测试文字 +-这是第9行测试文字 +-这是第10行测试文字 +-这是第11行测试文字 +-这是第12行测试文字 +-这是第13行测试文字 +-这是第14行测试文字 +-这是第15行测试文字 +-这是第16行测试文字 +-这是第17行测试文字 +-这是第18行测试文字 +-这是第19行测试文字 +-这是第20行测试文字 +-这是第21行测试文字 +-这是第22行测试文字 +-这是第23行测试文字 +-这是第24行测试文字 +-这是第25行测试文字 +-这是第26行测试文字 +-这是第27行测试文字 +-这是第28行测试文字 +-这是第29行测试文字 +-这是第30行测试文字 +-这是第31行测试文字 +-这是第32行测试文字 +-这是第33行测试文字 +-这是第34行测试文字 +-这是第35行测试文字 +-这是第36行测试文字 +-这是第37行测试文字 +-这是第38行测试文字 +-这是第39行测试文字 +-这是第40行测试文字 +-这是第41行测试文字 +-这是第42行测试文字 +-这是第43行测试文字 +-这是第44行测试文字 +-这是第45行测试文字 +-这是第46行测试文字 +-这是第47行测试文字 +-这是第48行测试文字 +-这是第49行测试文字 +-这是第50行测试文字 ++ Scan QR code to get machine code ++ 扫描二维码获取机器码 + + +- Right Hand Mode +- 右手模式 ++ QRcode of Machine and Activation Code ++ 激活信息二维码 + + +- Left Hand Mode +- 左手模式 ++ Scan QR code to get activation code ++ 扫描二维码获取激活码 + + + +- MouseSettings ++ StatusNotification + +- Select Mouse Hand +- 选择鼠标手持模式 ++ ++ ++ ++ ++ ++ Connection Failed ++ 连接失败 ++ ++ ++ ++ the network not found ++ 未找到网络 + + +- Mouse Motion Acceleration +- 鼠标移动加速 ++ ++ The hidden network "%1" to be connected has been detected and exists in the network list ++ 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 + + +- Natural Scroll +- 是否为自然滚动 ++ ++ ++ Failed to connect to the network "%1" ++ 无法连接到网络 "%1" + + +- Middle Emulation Enabled +- 同时按下左右键模拟中键 ++ ++ Connection activated ++ 网络已连接 + + +- Right Hand Mode +- 右手模式 ++ ++ You are now connected to the network "%1" ++ 您已连接到网络 "%1" + + +- Left Hand Mode +- 左手模式 ++ ++ Connection deactivated ++ 连接断开 + + +- Slow +- ++ ++ You have now disconnected the network "%1" ++ 您已断开网络连接 "%1" + + +- Standard +- 标准 ++ ++ Connection deleted ++ 连接已删除 + + +- Fast +- ++ ++ The connection has been deleted "%1" ++ 已删除连接 "%1" + + + +- MouseSubItem ++ SystemInfoSubItem + +- Mouse Settings +- 鼠标设置 ++ ++ System Information ++ 系统信息 + + + +- PanelWindow ++ SystemInformation + +- Control Panel +- 控制面板 ++ ++ Form ++ + +- +- +- PasswordExpirationPolicyPage + +- PasswordExpirationPolicyPage +- ++ ++ Host Name: ++ 主机名: + + +- User expires +- 用户过期时间 ++ ++ LabelHostName ++ + + +- SpinBoxUserExpires ++ ++ ++ ++ ++ ++ TextLabel + + + +- yyyy-MM-dd +- ++ ++ ButtonChangeHostName ++ + + +- Last password change +- 最近一次密码修改时间 ++ ++ Change ++ 更改 + + +- LabelLastPasswdChange +- ++ ++ System Version: ++ 系统版本: + + +- 1990-01-01 +- ++ ++ LabelSystemVersion ++ + + +- Maximum vaild days of password +- 密码最大有限天数 ++ ++ Kernel Version: ++ 内核版本: + + +- SpinBoxMaximumValidDays ++ ++ LabelKernelVersion + + + +- Prompt time before password expiration +- 密码过期之前提醒的天数 ++ ++ System Architecture: ++ 系统架构: + + +- SpinBoxPromptBeforeExpiration ++ ++ LabelSystemArch + + + +- how many days after password expires will become inactive +- 密码过期多少天认定为失效 ++ ++ Activation status: ++ 激活状态: + + +- SpinBoxPasswdInactiveTime +- ++ ++ ++ ++ ++ Show ++ 查看 + + +- ButtonSave ++ ++ EULA: ++ 最终用户许可协议: ++ ++ ++ ++ ButtonShowEULA + + + +- save +- 保存 ++ ++ Version License: ++ 版本协议: + + +- ButtonReturn ++ ++ ButtonShowVersionLicense + + + +- return +- 返回 ++ ++ ++ ++ ++ Unknow ++ 未知 + + +- day +- ++ ++ UnActivated ++ 未激活 + +- +- +- Popup + +- cancel +- 取消 ++ ++ Activation code has expired ++ 激活码已过期 + +- +- +- PowerPlugin + +- General Settings +- 通用设置 ++ ++ Permanently activated ++ 永久激活 + + +- Power Settings +- 电源设置 ++ ++ Activated ++ 已激活 + + +- Battery Settings +- 电池设置 ++ ++ Error ++ 错误 + +- +- +- PowerProfilesWrapper + +- power-saver +- 省电模式 ++ ++ Failed to open the license activator ++ 启动激活许可证弹窗失败 + + +- balanced +- 平衡模式 ++ Copyright © ++ 版权所有 © + + +- performance +- 性能模式 ++ KylinSec. All rights reserved. ++ KylinSec.保留所有权利. ++ ++ ++ ++ Privacy policy: ++ 隐私协议: + + + +- PowerSettingsPage ++ SystemInformationWidget + +- PowerSettingsPage +- 电源设置页面 ++ Host Name: ++ 主机名: + + +- After idle for more than the following time, the computer will execute +- 空闲超过以下时间后,计算机将执行 ++ System Version: ++ 系统版本: + + +- ComboIdleTime +- ++ Kernel Version: ++ 内核版本: + + +- ComboIdleAction +- ++ System Architecture: ++ 系统架构: + + +- The monitor will turn off when it is idle +- 显示器空闲以下时间关闭 ++ Installation time: ++ 安装时间: + + +- ComboMonitorTrunOffIdleTime +- ++ Activation status: ++ 激活状态: + + +- Suspend +- 待机 ++ Expiry date: ++ 质保期: + + +- Shutdown +- 关机 ++ EULA: ++ 最终用户许可协议: + + +- Hibernate +- 休眠 ++ Version License: ++ 版本协议: + + +- Do nothing +- 不执行操作 ++ Contact Us: ++ 联系我们: + +- +- +- PowerSubItem + +- Power Settings +- 电源设置 ++ Change ++ 更改 + +- +- +- PrefsPage + +- Authentication type Enabled status +- 认证类型启用状态 ++ Show ++ 查看 + + +- fingerprint +- 指纹 ++ Unknow ++ 未知 + + +- fingervein +- 指静脉 ++ The current time is illegal ++ 当前时间不合法 + + +- ... +- ++ Less than the installation time ++ 小于安装时间 + + +- Return +- 返回 ++ Not activated. Trail expiration: ++ 未激活.试用到期: + + +- login +- 登录 ++ Can't get activation information ++ 无法获取激活信息 + + +- unlock +- 解锁 ++ Activate ++ 激活 + + +- empowerment +- 授权 ++ get service status failed ++ 获取服务状态信息失败 + + +- Apply the %1 authentication to the following applications +- 启用%1认证在以下的认证应用中 ++ Not yet ++ 暂无 ++ ++ ++ Activated ++ 已激活 ++ ++ ++ Forever ++ 永久授权 ++ ++ ++ Copyright © ++ 版权所有 © ++ ++ ++ KylinSec. All rights reserved. ++ KylinSec.保留所有权利. + ++ ++ ++ TextInputDialog + +- ukey +- UKey ++ ++ Tips ++ 提示 + + +- iris +- 虹膜 ++ ++ Yes ++ 确认 + + +- face +- 人脸 ++ ++ Cancel ++ 取消 + + + +- QObject ++ ThemePage + +- Did not reply within the specified timeout +- 连接超时 ++ ++ Form ++ + + +- The called service is not known +- 无法连接到Dbus服务 ++ ++ Dark and Light Theme ++ 深浅色主题设置 + + +- warning +- 警告 ++ ++ Themes Settings ++ 主题设置 + + +- Open qss file failed +- 加载qss文件失败 ++ ++ Open Window Effects ++ 打开或关闭窗口特效 + + +- %1Day +- %1天 ++ ++ ++ Unknown ++ 未知 + + +- %1Hour +- %1小时 ++ ++ Light Theme ++ 浅色 + + +- %1Minute +- %1分钟 ++ ++ Auto ++ 自动 + + +- never +- 从不 ++ ++ Dark Theme ++ 深色 + + +- SLow +- 低速 ++ ++ Choose icon Theme ++ 选择图标主题 + + +- Standard +- 标准 ++ ++ Choose cursor Themes ++ 选择光标主题 + ++ ++ ++ ThemeWidget + +- Fast +- 快速 ++ Dark Theme ++ 深色 + + +- Faild +- 失败 ++ Light Theme ++ 浅色 + + +- Connect Mouse or TouchPad Dbus Failed! +- 连接鼠标或触摸板Dbus服务失败! ++ Auto ++ 自动 + ++ ++ ++ Themes + +- Load qss file failed! +- 加载qss文件失败! ++ Dark and Light Theme ++ 深浅色主题设置 + + +- No search results, please search again... +- 无搜索结果,请重新搜索... ++ Themes Settings ++ 主题设置 + + +- Tips +- 提示 ++ Open Window Effects ++ 打开或关闭窗口特效 + + +- OK(K) +- 确定(K) ++ Choose icon themes ++ 选择图标主题 + + +- Failed to apply display settings!%1 +- 应用显示设置失败!%1 ++ Unknown ++ 未知 + + +- Fallback display setting failed! %1 +- 回撤显示设置失败! %1 ++ Choose cursor themes ++ 选择光标主题 + ++ ++ ++ ThreadObject + ++ + Failed + 失败 + + +- Set font failed! +- 设置字体失败! +- +- +- Get icon themes failed! +- 获取图标主题失败! ++ ++ List shortcut failed,error: ++ 列出快捷键失败,错误: + ++ ++ ++ TimeDateSubItem + +- Get cursor themes failed! +- 获取光标主题失败! ++ ++ Time Date Settings ++ 日期时间设置 + + +- Warning +- 警告 ++ ++ Chnage time Zone ++ 更改时区 + + +- There is no theme to set! +- 目前没有主题可以设置! ++ ++ Set time Manually ++ 手动设置时间 + + +- Set font failed! +- ++ ++ Time date format setting ++ 日期时间格式设置 + + + +- SearchEdit +- +- Enter keywords to search +- 输入关键词进行搜索 +- ++ TimezoneSettings + +- Info +- 提示 ++ ++ TimezoneSettings ++ + + +- Failed to find related items, please re-enter! +- 未能搜索到相关项,请重新输入! ++ ++ Select Time Zone ++ 选择时区 + +- +- +- SelectAvatarPage + +- Confirm +- 确认 ++ ++ ButtonSave ++ + + +- Return +- 返回 ++ ++ save ++ 保存 + + +- select picture +- 选择图片 ++ ++ ButtonReturn ++ + + +- image files(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) +- 图片文件(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) ++ ++ reset ++ 重置 + + + +- SettingBriefWidget ++ TopBar + +- Form ++ ++ ListExpansionSpace + + + +- TextLabel ++ ++ TITLE ++ ++ ++ ++ ++ FLAG + + + + +- Shortcut ++ TouchPadPage + ++ + Form +- ++ + + +- EditSearch +- ++ ++ TouchPad Enabled ++ 开启触摸板 + + +- Custom +- 自定义 ++ ++ SwitchTouchPadEnable ++ + + +- Edit +- 编辑 ++ ++ Select TouchPad Hand ++ 选择触摸板使用模式 + + +- ButtonAddShortcut ++ ++ ComboTouchPadHand + + + +- Add +- 添加 ++ ++ TouchPad Motion Acceleration ++ 触摸板移动加速 + + +- ButtonReset ++ ++ SliderTouchPadMotionAcceleration + + + +- Reset +- 重置 ++ ++ Slow ++ + + +- Custom Shortcut Name +- 自定义快捷键名称 ++ ++ Fast ++ + + +- EditCustomShortcutName ++ ++ Select Click Method ++ 设置点击触摸板方式 ++ ++ ++ ++ ComboClickMethod + + + +- Custom Shortcut application +- 自定义快捷键应用程序 ++ ++ Select Scroll Method ++ 滚动窗口方式 + + +- EditShortcutApp ++ ++ ComboScrollMethod + + + +- Custom Shortcut Key +- 自定义快捷键 ++ ++ Natural Scroll ++ 是否为自然滚动 + + +- ButtonAdd ++ ++ ComboNaturalScroll + + + +- ButtonCancel +- ++ ++ Enabled while Typing ++ 打字时触摸板禁用 + + +- Cancel +- 取消 ++ ++ SwitchTypingEnable ++ + + +- Shortcut Name +- 快捷键名称 ++ ++ Tap to Click ++ 轻击(不按下)触摸板功能是否生效 + + +- EditShortcutName ++ ++ SwtichTapToClick + + + +- Shortcut application +- 快捷键应用程序 ++ ++ Right Hand Mode ++ 右手模式 + + +- Shortcut key +- 快捷键 ++ ++ Left Hand Mode ++ 左手模式 + + +- ButtonSave +- ++ ++ Press and Tap ++ 按键和轻触 + + +- Save +- 保存 ++ ++ Tap ++ 轻触 ++ ++ ++ ++ Two Finger Scroll ++ 两指滑动 + + +- ButtonReturn +- ++ ++ Edge Scroll ++ 边缘滑动 + ++ ++ ++ TouchPadSettings + +- return +- 返回 ++ Touchpad Enabled ++ 禁用触摸板 + + +- Please enter a search keyword... +- 请输入搜索关键字... ++ Disable TouchPad ++ 禁用触摸板 + + +- Required +- 必填 ++ TouchPad Enabled ++ 开启触摸板 + + +- Please press the new shortcut key +- 请输入新快捷键 ++ Select TouchPad Hand ++ 选择触摸板使用模式 + + +- Finished +- 完成 ++ TouchPad Motion Acceleration ++ 触摸板移动加速 + + +- failed to load shortcut key data! +- 加载快捷键数据失败! ++ Select Click Method ++ 设置点击触摸板方式 + + +- List shortcut failed,error:%1 +- 列出快捷键失败,错误:%1 ++ Select Scroll Method ++ 滚动窗口方式 + + +- Error +- 错误 ++ Natural Scroll ++ 是否为自然滚动 + + +- Get shortcut failed,error: +- 获取快捷键失败,错误: ++ Enabled while Typing ++ 打字时触摸板禁用 + + +- Open File +- 打开文件 ++ Tap to Click ++ 轻击(不按下)触摸板功能是否生效 + + +- System +- 系统 ++ Slow ++ + + +- Sound +- 声音 ++ Standard ++ 标准 + + +- Failed +- 失败 ++ Fast ++ + + +- Delete shortcut failed,error: +- 删除快捷键失败,错误: ++ Right Hand Mode ++ 右手模式 + + +- Warning +- 警告 ++ Left Hand Mode ++ 左手模式 + + +- Please complete the shortcut information! +- 请完善快捷键信息! ++ Press and Tap ++ 按键和轻触 + + +- Set shortcut +- 设置快捷键 ++ Tap ++ 轻触 + + +- Are you sure you want to disable this shortcut? +- 是否确定要禁用此快捷键? ++ Two Finger Scroll ++ 两指滑动 + + +- Modify system shortcut failed,error: +- 修改系统快捷键失败,错误: ++ Edge Scroll ++ 边缘滑动 + ++ ++ ++ TouchPadSubItem + +- Modify custom shortcut failed,error: +- 修改自定义快捷键失败,错误: ++ ++ TouchPad Settings ++ 触摸板设置 + ++ ++ ++ TrayConnectionList + +- Add custom shortcut failed,error: +- 添加自定义快捷键失败,错误: ++ ++ Other WiFi networks ++ 其它WIFI网络 + ++ ++ ++ TrayItemWidget + +- Reset shortcut failed,error: +- 重置快捷键失败,错误: ++ ++ TrayItemWidget ++ + + +- Cannot use shortcut "%1", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. +- 无法使用快捷键"%1",因为使用此键将无法输入,请同时使用Ctrl,Alt,Shift再试一次。 ++ ++ Icon ++ + + +- Shortcut keys %1 are already used in %2,Please try again! +- 快捷键%1已用于%2,请再试一次! ++ ++ Name ++ 名称 + +- +- +- ShortcutItem + +- Form +- ++ ++ Status ++ 状态 + + +- TextLabel +- ++ ++ Ignore ++ 忽略 + +- +- +- ShowQRCode + +- Scan QR code to get machine code +- 扫描二维码获取机器码 ++ ++ Disconnect ++ 断开 + + +- QRcode of Machine and Activation Code +- 激活信息二维码 ++ ++ ++ Cancel ++ 取消 + + +- Scan QR code to get activation code +- 扫描二维码获取激活码 ++ ++ ++ Connect ++ 连接 + +- +- +- SystemInfoSubItem + +- System Information +- 系统信息 ++ ++ Connected ++ 已连接 + +- +- +- SystemInformation + +- Form +- ++ ++ Unconnected ++ 未连接 + + +- Host Name: +- 主机名: ++ ++ Please input password ++ 请输入密码 + + +- LabelHostName +- ++ ++ Please input a network name ++ 请输入网络名称 + ++ ++ ++ TrayPage + +- TextLabel ++ ++ TrayPage + + + +- ButtonChangeHostName ++ ++ TextLabel + + + +- Change +- 更改 ++ ++ Select wired network card ++ 请选择有线网卡 + + +- System Version: +- 系统版本: ++ ++ Select wireless network card ++ 请选择无线网卡 + ++ ++ ++ UKeyPage + +- LabelSystemVersion +- ++ ++ Ukey ++ UKey + + +- Kernel Version: +- 内核版本: ++ ++ Default Ukey device ++ 默认UKey设备 + + +- LabelKernelVersion +- ++ ++ List of devices bound to the Ukey ++ 绑定UKey设备列表 + + +- System Architecture: +- 系统架构: ++ ++ ++ ++ error ++ 错误 + + +- LabelSystemArch +- ++ ++ No UKey device detected, pelease insert the UKey device and perform operations ++ 未检测到UKey设备,请插入UKey设备再次执行操作 + + +- Activation status: +- 激活状态: ++ ++ UKey Enroll ++ UKey录入 + + +- Show +- 查看 ++ ++ Please enter the ukey pin code ++ 请输入UKey PIN码 + ++ ++ ++ UKeyPinCodeDialog + +- EULA: +- 最终用户许可协议: ++ UKey Enroll ++ UKey录入 + + +- ButtonShowEULA +- ++ Please enter the ukey pin code ++ 请输入UKey PIN码 + + +- Version License: +- 版本协议: ++ Confirm ++ 确认 + + +- ButtonShowVersionLicense +- ++ Cancel ++ 取消 + ++ ++ ++ UserInfoPage + +- Unknow +- 未知 ++ ++ Form ++ + + +- UnActivated +- 未激活 ++ ++ Account ++ + + +- Activation code has expired +- 激活码已过期 ++ ++ Change password ++ 修改密码 + + +- Permanently activated +- 永久激活 ++ ++ User id ++ 用户ID + + +- Activated +- 已激活 ++ ++ User type ++ 用户类型 + + +- Error +- 错误 ++ ++ User status ++ 启用用户 + +- +- Failed to open the license activator +- 启动激活许可证弹窗失败 ++ ++ ++ auth manager ++ 认证管理 + + +- Copyright © +- 版权所有 © ++ ++ Password expiration policy ++ 密码过期策略 + + +- KylinSec. All rights reserved. +- KylinSec.保留所有权利. ++ ++ Confirm ++ 保存 + + +- Privacy policy: +- 隐私协议: ++ ++ Delete ++ 删除用户 + +- +- +- SystemInformationWidget + +- Host Name: +- 主机名: ++ ++ Current password ++ 当前密码 + + +- System Version: +- 系统版本: ++ ++ EditCurrentPasswd ++ + + +- Kernel Version: +- 内核版本: ++ ++ New password ++ 新密码 + + +- System Architecture: +- 系统架构: ++ ++ EditNewPasswd ++ + + +- Installation time: +- 安装时间: ++ ++ Enter the new password again ++ 再次输入新密码 + + +- Activation status: +- 激活状态: ++ ++ EditNewPasswdAgain ++ + + +- Expiry date: +- 质保期: ++ ++ EditPasswdSave ++ + + +- EULA: +- 最终用户许可协议: ++ ++ Save ++ 保存 + + +- Version License: +- 版本协议: ++ ++ EditPasswdCancel ++ + + +- Contact Us: +- 联系我们: ++ ++ Cancel ++ 取消 + + +- Change +- 更改 ++ Account type ++ 帐户类型 + + +- Show +- 查看 ++ Account status ++ 启用帐户 + + +- Unknow +- 未知 ++ ++ standard ++ 普通用户 + + +- The current time is illegal +- 当前时间不合法 ++ ++ administrator ++ 管理员 + + +- Less than the installation time +- 小于安装时间 ++ ++ Please enter the new user password ++ 请输入新密码 + + +- Not activated. Trail expiration: +- 未激活.试用到期: ++ ++ Please enter the password again ++ 请再次输入密码 + + +- Can't get activation information +- 无法获取激活信息 ++ ++ The password you enter must be the same as the former one ++ 两次密码不相同,请核对后,再次输入 + + +- Activate +- 激活 ++ ++ Please enter the current user password ++ 请输入当前密码 + + +- get service status failed +- 获取服务状态信息失败 ++ ++ The current password is incorrect ++ 当前密码错误,请再次输入 + + +- Not yet +- 暂无 ++ ++ The new password cannot be the same as the current password ++ 新密码不能和旧密码相同,请重新输入 + + +- Activated +- 已激活 ++ ++ ++ ++ ++ ++ Error ++ 错误 + + +- Forever +- 永久授权 ++ ++ ++ Password encryption failed ++ 密码加密失败 + + +- Copyright © +- 版权所有 © ++ ++ user information updated successfully ++ 用户信息更新成功 + + +- KylinSec. All rights reserved. +- KylinSec.保留所有权利. ++ ++ Password updated successfully ++ 密码更新成功 + +- +- +- ThemePage + +- Form +- ++ ++ The directory and files under the user's home directory are deleted with the user.Are you sure you want to delete the user(%1)? ++ 用户目录下的目录和文件会随用户一起删除,确定要删除%1用户吗? + + +- Dark and Light Theme +- 深浅色主题设置 ++ ++ Warning ++ 警告 + + +- Themes Settings +- 主题设置 ++ Account information updated successfully ++ 帐户信息更新成功 + ++ ++ ++ UserlicenseAgreement + +- Open Window Effects +- 打开或关闭窗口特效 ++ Export ++ 导出 + + +- Unknown +- 未知 ++ Close ++ 关闭 + + +- Light Theme +- 浅色 ++ Save ++ 保存 + + +- Auto +- 自动 ++ Export EULA ++ 导出最终用户许可协议 + + +- Dark Theme +- 深色 ++ Export EULA failed! ++ 导出最终用户许可协议失败! + + +- Choose icon Theme +- 选择图标主题 ++ User End License Agreement ++ 最终用户许可协议 + + +- Choose cursor Themes +- 选择光标主题 ++ None ++ 暂无 + + + +- ThemeWidget +- +- Dark Theme +- 深色 +- ++ VolumeIntputSubItem + +- Light Theme +- 浅色 ++ ++ VolumeInput ++ 输入 + ++ ++ ++ VolumeOutputSubItem + +- Auto +- 自动 ++ ++ VolumeOutput ++ 输出 + + + +- Themes ++ VolumeSettingPage + +- Dark and Light Theme +- 深浅色主题设置 ++ ++ VolumeSettingPage ++ + + +- Themes Settings +- 主题设置 ++ ++ ++ Volume ++ 音量 + ++ ++ ++ VpnIPsec + +- Open Window Effects +- 打开或关闭窗口特效 ++ ++ VpnIPsec ++ + + +- Choose icon themes +- 选择图标主题 ++ ++ Enable IPsec ++ 启用IPsec + + +- Unknown +- 未知 ++ ++ Group Name ++ 组名 + + +- Choose cursor themes +- 选择光标主题 ++ ++ EditGroupName ++ + +- +- +- ThreadObject + +- Failed +- 失败 ++ ++ Group ID ++ 组ID + + +- List shortcut failed,error: +- 列出快捷键失败,错误: ++ ++ EditGroupId ++ + +- +- +- TimeDateSubItem + +- Time Date Settings +- 日期时间设置 ++ ++ Pre-Shared Key ++ 预共享密钥 + + +- Chnage time Zone +- 更改时区 ++ ++ EditPreSharedKey ++ + + +- Set time Manually +- 手动设置时间 ++ ++ Show Password ++ 显示密码 + + +- Time date format setting +- 日期时间格式设置 ++ ++ Internet Key Exchange Protocol ++ 密钥交换协议 + +- +- +- TimezoneSettings + +- TimezoneSettings ++ ++ EditIpsecIKE + + + +- Select Time Zone +- 选择时区 ++ ++ Encapsulating Security Payload ++ 安全封装协议 + + +- ButtonSave ++ ++ EditIpsecESP + + ++ ++ ++ VpnIpvx + +- save +- 保存 +- +- +- ButtonReturn ++ ++ VpnIpvx + + + +- reset +- 重置 ++ ++ IPV4 Method ++ IPV4方法 + +- +- +- TopBar + +- ListExpansionSpace ++ ++ ComboBoxVPNIpv4Method + + + +- TITLE +- ++ ++ Only applied in corresponding resources ++ 仅用于相对应的网络上的资源 + + +- FLAG +- ++ ++ Preferred DNS ++ 首选DNS + +- +- +- TouchPadPage + +- Form ++ ++ EditVPNIpv4PreferredDNS + + + +- TouchPad Enabled +- 开启触摸板 ++ ++ Alternate DNS ++ 备选DNS + + +- SwitchTouchPadEnable ++ ++ EditIpv4AlternateDNS + + + +- Select TouchPad Hand +- 选择触摸板使用模式 ++ ++ Auto ++ 自动 + ++ ++ ++ VpnL2tpSetting + +- ComboTouchPadHand ++ ++ VpnL2tpSetting + + + +- TouchPad Motion Acceleration +- 触摸板移动加速 ++ ++ VPN name ++ VPN名称 + ++ ++ ++ VpnManager + +- SliderTouchPadMotionAcceleration ++ ++ ++ VpnManager + + + +- Slow +- ++ ++ VPN type ++ VPN类型 + + +- Fast +- ++ ++ Save ++ 保存 + + +- Select Click Method +- 设置点击触摸板方式 ++ ++ Return ++ 返回 + + +- ComboClickMethod +- ++ ++ VPN ++ VPN + + +- Select Scroll Method +- 滚动窗口方式 ++ ++ L2TP ++ + + +- ComboScrollMethod +- ++ ++ Tips ++ 提示 + + +- Natural Scroll +- 是否为自然滚动 ++ ++ Password required to connect to %1. ++ 连接网络 "%1" 需要密码 + ++ ++ ++ VpnPpp + +- ComboNaturalScroll ++ ++ VpnPpp + + + +- Enabled while Typing +- 打字时触摸板禁用 ++ ++ Use MPPE ++ 使用MPPE + + +- SwitchTypingEnable +- ++ ++ Security ++ 安全 + + +- Tap to Click +- 轻击(不按下)触摸板功能是否生效 ++ ++ ComboBoxMppeSecurity ++ + + +- SwtichTapToClick +- ++ ++ Stateful MPPE ++ 使用带状态的MPPE + + +- Right Hand Mode +- 右手模式 ++ ++ All available (default) ++ 都可用(默认) + + +- Left Hand Mode +- 左手模式 ++ ++ 40-bit (less secure) ++ 40位(较安全) + + +- Press and Tap +- 按键和轻触 ++ ++ 128-bit (most secure) ++ 128位(最安全) + + +- Tap +- 轻触 ++ ++ Refuse EAP Authentication ++ 拒绝EAP认证 + + +- Two Finger Scroll +- 两指滑动 ++ ++ Refuse PAP Authentication ++ 拒绝PAP认证 + + +- Edge Scroll +- 边缘滑动 ++ ++ Refuse CHAP Authentication ++ 拒绝CHAP认证 + +- +- +- TouchPadSettings + +- Touchpad Enabled +- 禁用触摸板 ++ ++ Refuse MSCHAP Authentication ++ 拒绝MSCHAP认证 + + +- Disable TouchPad +- 禁用触摸板 ++ ++ Refuse MSCHAPv2 Authentication ++ 拒绝MSCHAPv2认证 + + +- TouchPad Enabled +- 开启触摸板 ++ ++ No BSD Data Compression ++ 无BSD数据压缩 + + +- Select TouchPad Hand +- 选择触摸板使用模式 ++ ++ No Deflate Data Compression ++ 无Deflate数据压缩 + + +- TouchPad Motion Acceleration +- 触摸板移动加速 ++ ++ No TCP Header Compression ++ 无TCP头压缩 + + +- Select Click Method +- 设置点击触摸板方式 ++ ++ No Protocol Field Compression ++ 无协议字段压缩 + + +- Select Scroll Method +- 滚动窗口方式 ++ ++ No Address/Control Compression ++ 无地址/控制压缩 + + +- Natural Scroll +- 是否为自然滚动 ++ ++ Send PPP Echo Packets ++ 发送PPP回响包 + ++ ++ ++ VpnPptpSetting + +- Enabled while Typing +- 打字时触摸板禁用 ++ ++ VpnPptpSetting ++ + + +- Tap to Click +- 轻击(不按下)触摸板功能是否生效 ++ ++ VPN name ++ VPN名称 + ++ ++ ++ VpnWidget + +- Slow +- ++ ++ VpnWidget ++ + + +- Standard +- 标准 ++ ++ Gateway ++ 网关 + + +- Fast +- ++ ++ EditVPNGateway ++ + + +- Right Hand Mode +- 右手模式 ++ ++ User Name ++ 用户名 + + +- Left Hand Mode +- 左手模式 ++ ++ EditVPNUserName ++ + + +- Press and Tap +- 按键和轻触 ++ ++ Password Options ++ 密码选项 + + +- Tap +- 轻触 ++ ++ ComboBoxVPNPasswordOptions ++ + + +- Two Finger Scroll +- 两指滑动 ++ ++ Password ++ 密码 + + +- Edge Scroll +- 边缘滑动 ++ ++ EditVPNPassword ++ + +- +- +- TouchPadSubItem + +- TouchPad Settings +- 触摸板设置 ++ ++ ButtonPasswordVisual ++ + +- +- +- UKeyPage + +- Ukey +- UKey ++ ++ Show Password ++ 显示密码 + + +- Default Ukey device +- 默认UKey设备 ++ ++ NT Domain ++ NT域 + + +- List of devices bound to the Ukey +- 绑定UKey设备列表 ++ ++ EditNTDomain ++ + + +- error +- 错误 ++ ++ ++ ++ Required ++ 必填 + + +- No UKey device detected, pelease insert the UKey device and perform operations +- 未检测到UKey设备,请插入UKey设备再次执行操作 ++ ++ Saved ++ 已保存的 + + +- UKey Enroll +- UKey录入 ++ ++ Ask ++ 总是询问 + + +- Please enter the ukey pin code +- 请输入UKey PIN码 ++ ++ Not required ++ 不要求 + +- +- +- UKeyPinCodeDialog + +- UKey Enroll +- UKey录入 ++ ++ Gateway can not be empty ++ 网关不能为空 + + +- Please enter the ukey pin code +- 请输入UKey PIN码 ++ ++ Gateway invalid ++ 无效的网关 + + +- Confirm +- 确认 ++ ++ user name can not be empty ++ 用户名不能为空 + + +- Cancel +- 取消 ++ ++ password can not be empty ++ 密码不能为空 + + + +- UserInfoPage ++ Wallpaper + ++ + Form + + + +- Account +- ++ ++ Set wallpaper ++ 壁纸设置 + + +- Change password +- 修改密码 ++ ++ FrameLockScreenPreview ++ + + +- User id +- 用户ID ++ ++ FrameDesktopPreivew ++ + + +- User type +- 用户类型 ++ ++ Desktop Wallpaper Preview ++ 桌面壁纸预览 + + +- User status +- 启用用户 ++ ++ Lock Screen WallPaper Preview ++ 锁屏壁纸预览 + + +- auth manager +- 认证管理 ++ ++ Select wallpaper ++ 选择壁纸 + + +- Password expiration policy +- 密码过期策略 ++ ++ Select Wallpaper ++ 选择壁纸 + + +- Confirm +- 保存 ++ ++ Set Desktop Wallpaper ++ 选择桌面壁纸 + + +- Delete +- 删除用户 ++ ++ Set Lock Screen Wallpaper ++ 选择锁屏壁纸 + + +- Current password +- 当前密码 ++ ++ ++ set wallpaper ++ 壁纸设置 + + +- EditCurrentPasswd +- ++ ++ ++ Set wallpaper failed! ++ 壁纸设置失败! + + +- New password +- 新密码 ++ ++ select picture ++ 选择图片 + + +- EditNewPasswd +- ++ ++ image files(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) ++ 图片文件(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) + + +- Enter the new password again +- 再次输入新密码 ++ ++ Add Image Failed ++ 添加壁纸失败 + + +- EditNewPasswdAgain ++ ++ The image already exists! ++ 该壁纸已存在! ++ ++ ++ ++ WiredManager ++ ++ ++ WiredManager + + + +- EditPasswdSave ++ ++ ButtonSave + + + ++ + Save + 保存 + + +- EditPasswdCancel ++ ++ ButtonReturn + + + +- Cancel +- 取消 ++ ++ Return ++ 返回 + + +- Account type +- 帐户类型 ++ Wired Network Adapter ++ 有线网络配置 + + +- Account status +- 启用帐户 ++ The carrier is pulled out ++ 网线被拔出 + + +- standard +- 普通用户 ++ The current device is not available ++ 当前设备不可用 + ++ ++ ++ WiredSettingPage + +- administrator +- 管理员 ++ ++ WiredSettingPage ++ + + +- Please enter the new user password +- 请输入新密码 ++ ++ Network name ++ 网络名称 + ++ ++ ++ WirelessManager + +- Please enter the password again +- 请再次输入密码 ++ ++ WirelessManager ++ + + +- The password you enter must be the same as the former one +- 两次密码不相同,请核对后,再次输入 ++ ++ Save ++ 保存 + + +- Please enter the current user password +- 请输入当前密码 ++ ++ Return ++ 返回 + + +- The current password is incorrect +- 当前密码错误,请再次输入 ++ Wireless Network Adapter ++ 无线网卡 + + +- The new password cannot be the same as the current password +- 新密码不能和旧密码相同,请重新输入 ++ The current device is not available ++ 当前设备不可用 + + +- Error +- 错误 ++ Tips ++ 提示 + + +- Password encryption failed +- 密码加密失败 ++ Password required to connect to %1. ++ 连接网络 "%1" 需要密码 + ++ ++ ++ WirelessSecurityWidget + +- user information updated successfully +- 用户信息更新成功 ++ ++ WirelessSecurityWidget ++ + + +- Password updated successfully +- 密码更新成功 ++ ++ Security ++ 安全 + + +- The directory and files under the user's home directory are deleted with the user.Are you sure you want to delete the user(%1)? +- 用户目录下的目录和文件会随用户一起删除,确定要删除%1用户吗? ++ ++ ComboBoxWirelessSecurityOption ++ + + +- Warning +- 警告 ++ ++ Password Options ++ 密码选项 + + +- Account information updated successfully +- 帐户信息更新成功 ++ ++ ComboBoxWirelessPasswordOption ++ + +- +- +- UserlicenseAgreement + +- Export +- 导出 ++ ++ Password ++ 密码 + + +- Close +- 关闭 ++ ++ EditWirelessPassword ++ + + +- Save +- 保存 ++ ++ ButtonWirelessPasswordVisual ++ + + +- Export EULA +- 导出最终用户许可协议 ++ ++ PushButton ++ + + +- Export EULA failed! +- 导出最终用户许可协议失败! ++ ++ None ++ + + +- User End License Agreement +- 最终用户许可协议 ++ ++ WPA/WPA2 Personal ++ WPA/WPA2个人版 + + +- None +- 暂无 ++ ++ Save password for all users ++ 仅为该用户存储密码 + +- +- +- Wallpaper + +- Form +- ++ ++ Save password for this user ++ 存储所有用户密码 + + +- Set wallpaper +- 壁纸设置 ++ ++ Ask me always ++ 总是询问 + + +- FrameLockScreenPreview +- ++ ++ Required ++ 必填 + ++ ++ ++ WirelessSettingPage + +- FrameDesktopPreivew ++ ++ WirelessSettingPage + + + +- Desktop Wallpaper Preview +- 桌面壁纸预览 +- +- +- Lock Screen WallPaper Preview +- 锁屏壁纸预览 ++ ++ Wireless name ++ 无线网络名称 + ++ ++ ++ WirelessTrayWidget + +- Select wallpaper +- 选择壁纸 ++ ++ the network "%1" not found ++ 未找到网络 "%1" + ++ ++ ++ WirelessWidget + +- Select Wallpaper +- 选择壁纸 ++ ++ WirelessWidget ++ + + +- Set Desktop Wallpaper +- 选择桌面壁纸 ++ ++ SSID ++ + + +- Set Lock Screen Wallpaper +- 选择锁屏壁纸 ++ ++ EditSsid ++ + + +- set wallpaper +- 壁纸设置 ++ ++ MAC Address Of Device ++ 设备MAC地址 + + +- Set wallpaper failed! +- 壁纸设置失败! ++ ++ ComboBoxWirelessMacAddress ++ + + +- select picture +- 选择图片 ++ ++ Custom MTU ++ 自定义MTU + + +- image files(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) +- 图片文件(*.bmp *.jpg *.png *.tif *.gif *.pcx *.tga *.exif *.fpx *.svg *.psd *.cdr *.pcd *.dxf *.ufo *.eps *.ai *.raw *.WMF *.webp) ++ ++ SpinBoxWirelessCustomMTU ++ + + +- Add Image Failed +- 添加壁纸失败 ++ ++ Required ++ 必填 + + +- The image already exists! +- 该壁纸已存在! ++ ++ No device specified ++ 不指定设备 + + + + YearSpinBox + ++ + yyyy + yyyy年 + +-- +2.27.0 + diff --git a/0001-fix-network-After-receiving-the-Connection-Update-si.patch b/0001-fix-network-After-receiving-the-Connection-Update-si.patch deleted file mode 100644 index c8338de..0000000 --- a/0001-fix-network-After-receiving-the-Connection-Update-si.patch +++ /dev/null @@ -1,121 +0,0 @@ -From c3f02b61332c2cbac185e0306ff2583f639e5ca8 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Tue, 22 Aug 2023 15:57:19 +0800 -Subject: [PATCH 1/5] fix(network):After receiving the Connection::Update - signal from an active connection, the connection is no longer automatically - reactivated -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 收到已激活的连接的更新信号Connection::Update后,不再自动重新激活连接 - -Related #13231 ---- - .../src/plugin/manager/wired-manager.cpp | 69 +++++++++---------- - 1 file changed, 32 insertions(+), 37 deletions(-) - -diff --git a/plugins/network/src/plugin/manager/wired-manager.cpp b/plugins/network/src/plugin/manager/wired-manager.cpp -index ffe33b3..32ac227 100644 ---- a/plugins/network/src/plugin/manager/wired-manager.cpp -+++ b/plugins/network/src/plugin/manager/wired-manager.cpp -@@ -91,27 +91,34 @@ void WiredManager::handleActivateSelectedConnection(const QString &connectionPat - - auto devicestate = device->state(); - KLOG_DEBUG() << "device state:" << devicestate ; -- if(devicestate != Device::Unavailable) -+ if(devicestate == Device::Unavailable) - { -- QDBusPendingReply reply = -- NetworkManager::activateConnection(connectionPath, m_devicePath, connectionParameter); -+ StatusNotification::connectitonFailedNotifyByReason(tr("The current device is not available")); -+ return; -+ } - -- reply.waitForFinished(); -- if (reply.isError()) -+ QDBusPendingReply reply = -+ NetworkManager::activateConnection(connectionPath, m_devicePath, connectionParameter); -+ -+ reply.waitForFinished(); -+ if (reply.isError()) -+ { -+ // 此处处理进入激活流程失败的原因,并不涉及流程中某个具体阶段失败的原因 -+ KLOG_ERROR() << "activate connection failed:" << reply.error(); -+ QString errorMessage = reply.error().message(); -+ if (errorMessage.contains("device has no carrier")) - { -- // 此处处理进入激活流程失败的原因,并不涉及流程中某个具体阶段失败的原因 -- KLOG_ERROR() << "activate connection failed:" << reply.error(); -- QString errorMessage = reply.error().message(); -- if (errorMessage.contains("device has no carrier")) -- StatusNotification::connectitonFailedNotifyByReason(tr("The carrier is pulled out")); -- else -- StatusNotification::connectitonFailedNotify(connectionPath); -+ StatusNotification::connectitonFailedNotifyByReason(tr("The carrier is pulled out")); - } - else -- KLOG_DEBUG() << "activateConnection reply:" << reply.reply(); -+ { -+ StatusNotification::connectitonFailedNotify(connectionPath); -+ } - } - else -- StatusNotification::connectitonFailedNotifyByReason(tr("The current device is not available")); -+ { -+ KLOG_DEBUG() << "activateConnection reply:" << reply.reply(); -+ } - } - - // 获取到当前激活对象后,开启等待动画,判断完激活状态后停止等待动画 -@@ -141,7 +148,7 @@ void WiredManager::handleActiveConnectionAdded(const QString &path) - break; - } - } -- connect(activatedConnection.data(), &ActiveConnection::stateChanged, this, &WiredManager::handleActiveConnectionStateChanged); -+ connect(activatedConnection.data(), &ActiveConnection::stateChanged, this, &WiredManager::handleActiveConnectionStateChanged, Qt::UniqueConnection); - } - } - -@@ -214,28 +221,16 @@ void WiredManager::handleConnectionUpdated(const QString &path) - { - KLOG_DEBUG() << "Connection updated:" << path; - Connection::Ptr updateConnection = findConnection(path); -- if (updateConnection->settings()->connectionType() == ConnectionSettings::Wired) -+ if (updateConnection->settings()->connectionType() != ConnectionSettings::Wired) - { -- //移除后再加载进来以更新信息 -- ui->connectionShowPage->removeConnectionFromList(path); -- ui->connectionShowPage->addConnection(updateConnection, ""); -- if (ui->stackedWidget->currentIndex() != PAGE_SETTING) -- handleReturnPreviousPage(); -- -- QString updateConnectionPath = updateConnection->path(); -- ActiveConnection::List activeConnectionLists = activeConnections(); -- //已连接的网络的配置被修改后,点击保存 ,应该重新连接网络,以使配置生效 -- for (auto activeConn : activeConnectionLists) -- { -- if (activeConn->connection()->path() == updateConnectionPath) -- { -- auto deviceLists = activeConn->devices(); -- if (deviceLists.contains(m_devicePath)) -- { -- QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activeConn->connection()->path()); -- handleActivateSelectedConnection(updateConnectionPath, ""); -- } -- } -- } -+ return; -+ } -+ -+ //移除后再加载进来以更新信息 -+ ui->connectionShowPage->removeConnectionFromList(path); -+ ui->connectionShowPage->addConnection(updateConnection, ""); -+ if (ui->stackedWidget->currentIndex() != PAGE_SETTING) -+ { -+ handleReturnPreviousPage(); - } - } --- -2.33.0 - diff --git a/0002-feature-display-When-switching-resolutions-refresh-r.patch b/0002-feature-display-When-switching-resolutions-refresh-r.patch deleted file mode 100644 index 4c80fcd..0000000 --- a/0002-feature-display-When-switching-resolutions-refresh-r.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 8468d6df5794ede71a39905e2d31f4cadda244b7 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Wed, 23 Aug 2023 11:11:09 +0800 -Subject: [PATCH 2/5] feature(display):When switching resolutions, refresh rate - preferentially selects the recommended refresh rate -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 切换分辨率时,刷新率优先选择推荐的刷新率 - -Related #13283 ---- - plugins/display/src/display-page.cpp | 21 +++++++++++++++++---- - 1 file changed, 17 insertions(+), 4 deletions(-) - -diff --git a/plugins/display/src/display-page.cpp b/plugins/display/src/display-page.cpp -index a885b8b..23b5e8e 100644 ---- a/plugins/display/src/display-page.cpp -+++ b/plugins/display/src/display-page.cpp -@@ -263,22 +263,35 @@ void DisplayPage::initExtraComboBoxRefreshRate(QComboBox *comboBox, const QList< - { - comboBox->clear(); - -- QString recommend; - QList list = m_displayConfig->listPreferredModes(m_curMonitorPath); -+ double recommendRefreshRate; - if (!list.isEmpty()) - { -- double refreshRate = list.first().refreshRate; -- recommend = QString("%1HZ").arg(QString::asprintf("%.2f", refreshRate)); -+ recommendRefreshRate = list.first().refreshRate; - } - -+ QString strPostfix = tr(" (recommended)"); - QList t_refreshRateList = refreshRateList; - std::sort(t_refreshRateList.begin(), t_refreshRateList.end(), std::greater()); - foreach (double r, t_refreshRateList) - { - QString text = QString("%1HZ").arg(QString::asprintf("%.2f", r)); -- if (text == recommend) text += tr(" (recommended)"); -+ if (QString::asprintf("%.2f", r) == QString::asprintf("%.2f", recommendRefreshRate)) -+ { -+ text.append(strPostfix); -+ } - comboBox->addItem(text, r); - } -+ -+ for (size_t i = 0; i < comboBox->count(); i++) -+ { -+ double refreshRate = comboBox->itemData(i).toDouble(); -+ if(QString::asprintf("%.2f", refreshRate) == QString::asprintf("%.2f", recommendRefreshRate)) -+ { -+ comboBox->setCurrentIndex(i); -+ break; -+ } -+ } - } - - void DisplayPage::selectResolutionComboboxItem(QComboBox *comboBox, const int &w, const int &h) --- -2.33.0 - diff --git a/0002-fix-plugins-Fix-runtime-plugin-loading-errors.patch b/0002-fix-plugins-Fix-runtime-plugin-loading-errors.patch new file mode 100644 index 0000000..961ec22 --- /dev/null +++ b/0002-fix-plugins-Fix-runtime-plugin-loading-errors.patch @@ -0,0 +1,93 @@ +From 18e6891a56f471168cbe964c61c134f6d2aeb90d Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Fri, 15 Dec 2023 21:06:06 +0800 +Subject: [PATCH] fix(plugins): Fix runtime plugin loading errors +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复运行时插件加载错误,补全相关依赖 +--- + CMakeLists.txt | 2 +- + common/plugin-subitem.h | 4 ++-- + plugins/account/CMakeLists.txt | 12 +++++++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4fe9765..07a668d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -102,4 +102,4 @@ add_subdirectory(lib) + add_subdirectory(libexec) + add_subdirectory(launcher) + add_subdirectory(plugins) +-add_subdirectory(data) +\ No newline at end of file ++add_subdirectory(data) +diff --git a/common/plugin-subitem.h b/common/plugin-subitem.h +index f6f6287..1315fda 100644 +--- a/common/plugin-subitem.h ++++ b/common/plugin-subitem.h +@@ -32,7 +32,7 @@ public: + m_pCreateWidget(func) + { + } +- ~PluginSubItem(); ++ ~PluginSubItem(){}; + + public: + // 功能项ID,用于区分功能项,应确保其唯一 +@@ -72,4 +72,4 @@ private: + QString m_icon; + int m_weight; + CreateWidgetFunc m_pCreateWidget = nullptr; +-}; +\ No newline at end of file ++}; +diff --git a/plugins/account/CMakeLists.txt b/plugins/account/CMakeLists.txt +index 98c5383..586c6c8 100644 +--- a/plugins/account/CMakeLists.txt ++++ b/plugins/account/CMakeLists.txt +@@ -5,6 +5,8 @@ if (PASSWD_EXPIRATION_POLICY_VISIBLE) + endif () + + pkg_search_module(CRYPTOPP REQUIRED cryptopp) ++pkg_search_module(PAM REQUIRED pam) ++pkg_search_module(LIBCRYPT REQUIRED libcrypt) + + file(GLOB_RECURSE ACCOUNT_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp +@@ -22,11 +24,13 @@ target_include_directories(${TARGET_NAME} PRIVATE + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/pages + ${CMAKE_CURRENT_SOURCE_DIR}/utils ++ ${PAM_INCLUDE_DIRS} + ${KIRAN_WIDGETS_INCLUDE_DIRS} + ${KIRAN_CC_DAEMON_INCLUDE_DIRS} + ${KLOG_INCLUDE_DIRS} + ${KIRAN_STYLE_INCLUDE_DIRS} +- ${CRYPTOPP_INCLUDE_DIRS}) ++ ${CRYPTOPP_INCLUDE_DIRS} ++ ${LIBCRYPT_INCLUDE_DIRS}) + + target_link_libraries(${TARGET_NAME} + common-widgets +@@ -34,10 +38,12 @@ target_link_libraries(${TARGET_NAME} + Qt5::Widgets + Qt5::DBus + Qt5::Svg ++ ${PAM_LIBRARIES} + ${KIRAN_WIDGETS_LIBRARIES} + ${KIRAN_CC_DAEMON_LIBRARIES} + ${KLOG_LIBRARIES} + ${KIRAN_STYLE_LIBRARIES} +- ${CRYPTOPP_LIBRARIES}) ++ ${CRYPTOPP_LIBRARIES} ++ ${LIBCRYPT_LIBRARIES}) + +-install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) +\ No newline at end of file ++install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) +-- +2.27.0 + diff --git a/0003-fix-LC_TIME-set-LC_TIME-to-UTF-8.patch b/0003-fix-LC_TIME-set-LC_TIME-to-UTF-8.patch new file mode 100644 index 0000000..5ee43f8 --- /dev/null +++ b/0003-fix-LC_TIME-set-LC_TIME-to-UTF-8.patch @@ -0,0 +1,47 @@ +From 78e2ba6f38de67917befdabfe9d40a910b02a88c Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Fri, 15 Dec 2023 16:13:08 +0800 +Subject: [PATCH 03/17] fix(LC_TIME): set LC_TIME to UTF-8 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +根据环境变量重新设置LC_TIME为UTF-8 + +Closes #21517,#24064 +--- + src/main.cpp | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/src/main.cpp b/src/main.cpp +index 05f7153..981fdbf 100644 +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -165,6 +165,24 @@ int main(int argc, char *argv[]) + exit(EXIT_SUCCESS); + } + ++ /// NOTE: 由于strftime获取系统locale进行格式化,Qt使用UTF8,若编码设置不为UTF8中文环境下会导致乱码 ++ /// 所以LANG后面的编码若不为UTF-8,修改成UTF-8,使获取时间都为UTF-8格式 ++ QString lang = qgetenv("LANG"); ++ if (lang.contains(".")) ++ { ++#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) ++ QStringList splitRes = lang.split(".", QString::SkipEmptyParts); ++#else ++ QStringList splitRes = lang.split(".", Qt::SkipEmptyParts); ++#endif ++ if(splitRes.size() == 2 && splitRes.at(1)!="UTF-8" ) ++ { ++ splitRes.replace(1, "UTF-8"); ++ QString newLocale = splitRes.join("."); ++ setlocale(LC_TIME, newLocale.toStdString().c_str()); ++ } ++ } ++ + // 安装翻译 + installTranslator(); + +-- +2.33.0 + diff --git a/0003-fix-wallpaper-change-system-wallpaper-xml-path-to-ki.patch b/0003-fix-wallpaper-change-system-wallpaper-xml-path-to-ki.patch deleted file mode 100644 index 0d86368..0000000 --- a/0003-fix-wallpaper-change-system-wallpaper-xml-path-to-ki.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 22d4318174acee6af3008fe648f7b8fdf96404cb Mon Sep 17 00:00:00 2001 -From: yuanxing -Date: Fri, 25 Aug 2023 10:49:36 +0800 -Subject: [PATCH 3/5] fix(wallpaper):change system wallpaper xml path to kiran -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修改获取的系统壁纸xml文件路径为kiran ---- - plugins/appearance/src/pages/wallpaper/wallpaper-def.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/plugins/appearance/src/pages/wallpaper/wallpaper-def.h b/plugins/appearance/src/pages/wallpaper/wallpaper-def.h -index d27c921..adefaf9 100644 ---- a/plugins/appearance/src/pages/wallpaper/wallpaper-def.h -+++ b/plugins/appearance/src/pages/wallpaper/wallpaper-def.h -@@ -30,7 +30,7 @@ enum WallpaperType - - #define SYSTEM_BACKGROUND_PATH "/usr/share/backgrounds/kiran/" - #define LOCAL_WALLPAPER_FILE ".config/kylinsec/kiran-cpanel-appearance/wallpaper.xml" --#define SYSTEM_WALLPAPER_FILE "/usr/share/mate-background-properties/kiran_background.xml" -+#define SYSTEM_WALLPAPER_FILE "/usr/share/kiran-background-properties/kiran_background.xml" - #define CACHE_IMAGE_DIR ".config/kylinsec/kiran-cpanel-appearance/" - - #define FILENAME "filename" --- -2.33.0 - diff --git a/0004-fix-network-fix-compile-issues-QString-SkipEmptyPart.patch b/0004-fix-network-fix-compile-issues-QString-SkipEmptyPart.patch new file mode 100644 index 0000000..46e9e8a --- /dev/null +++ b/0004-fix-network-fix-compile-issues-QString-SkipEmptyPart.patch @@ -0,0 +1,50 @@ +From f803d07ba85e579776fb185f4878b6fcd6c17ddf Mon Sep 17 00:00:00 2001 +From: luoqing +Date: Thu, 21 Dec 2023 09:25:47 +0800 +Subject: [PATCH 04/17] fix(network):fix compile issues,QString::SkipEmptyParts + is used under Qt 5.14 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复编译问题,在Qt 5.14 以下使用QString::SkipEmptyParts +--- + plugins/network/src/plugin/setting-widget/ipv4-widget.cpp | 4 ++++ + plugins/network/src/plugin/setting-widget/ipv6-widget.cpp | 4 ++++ + 2 files changed, 8 insertions(+) + +diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp +index da46dab..fa23708 100644 +--- a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp ++++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp +@@ -131,7 +131,11 @@ void Ipv4Widget::saveSettings() + { + //多个DNS以分号分隔 + QString dnsString = ui->ipv4DNS->text(); ++#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) ++ QStringList dnsList = dnsString.split(";",QString::SkipEmptyParts); ++#else + QStringList dnsList = dnsString.split(";",Qt::SkipEmptyParts); ++#endif + for(auto dns : dnsList) + { + ipv4DNS << QHostAddress(dns); +diff --git a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp +index feefdcf..d19a5e0 100644 +--- a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp ++++ b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp +@@ -124,7 +124,11 @@ void Ipv6Widget::saveSettings() + { + //多个DNS以分号分隔 + QString dnsString = ui->ipv6DNS->text(); ++#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) ++ QStringList dnsList = dnsString.split(";",QString::SkipEmptyParts); ++#else + QStringList dnsList = dnsString.split(";",Qt::SkipEmptyParts); ++#endif + for(auto dns : dnsList) + { + ipv6DNS << QHostAddress(dns); +-- +2.33.0 + diff --git a/0004-fix-wallpaper-don-t-call-xmlWriter-if-system-backgro.patch b/0004-fix-wallpaper-don-t-call-xmlWriter-if-system-backgro.patch deleted file mode 100644 index f5c7ecd..0000000 --- a/0004-fix-wallpaper-don-t-call-xmlWriter-if-system-backgro.patch +++ /dev/null @@ -1,44 +0,0 @@ -From ae26631a045b39aeb760ada4c1cfd98783599fda Mon Sep 17 00:00:00 2001 -From: yuanxing -Date: Fri, 25 Aug 2023 13:47:13 +0800 -Subject: [PATCH 4/5] fix(wallpaper):don't call xmlWriter if system background - xml not exists to solve segmentation fault -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 当系统系统壁纸xml文件不存在时,不调用xmlWriter函数,防止段错误 ---- - .../wallpaper/widget/xml-management/xml-management.cpp | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/plugins/appearance/src/pages/wallpaper/widget/xml-management/xml-management.cpp b/plugins/appearance/src/pages/wallpaper/widget/xml-management/xml-management.cpp -index 8d174ab..385eb9e 100644 ---- a/plugins/appearance/src/pages/wallpaper/widget/xml-management/xml-management.cpp -+++ b/plugins/appearance/src/pages/wallpaper/widget/xml-management/xml-management.cpp -@@ -38,8 +38,8 @@ void XmlManagement::loadXmlFiles() - if (!file.exists()) - { - KLOG_DEBUG() << "local xml file no exist"; -- xmlReader(SYSTEM_WALLPAPER_FILE); -- xmlWriter(); -+ if (xmlReader(SYSTEM_WALLPAPER_FILE)) -+ xmlWriter(); - } - xmlReader(localFile); - } -@@ -209,6 +209,11 @@ void XmlManagement::xmlUpdate(QList> updateList) - { - QString localFile = QString("%1/%2").arg(QDir::homePath()).arg(LOCAL_WALLPAPER_FILE); - QFile file(localFile); -+ if (!file.exists()) -+ { -+ KLOG_DEBUG() << localFile << " doesn't exists!"; -+ return; -+ } - if (!file.open(QFile::WriteOnly | QFile::Text)) - { - KLOG_DEBUG() << "open " << localFile << " failed!"; --- -2.33.0 - diff --git a/0005-fix-account-Fixed-issues-related-to-creating-and-del.patch b/0005-fix-account-Fixed-issues-related-to-creating-and-del.patch deleted file mode 100644 index d40b2e0..0000000 --- a/0005-fix-account-Fixed-issues-related-to-creating-and-del.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 766a1ac3345852e3f95a005bd6ef2469ab9f1dd9 Mon Sep 17 00:00:00 2001 -From: liuxinhao -Date: Mon, 28 Aug 2023 19:17:41 +0800 -Subject: [PATCH 5/5] fix(account): Fixed issues related to creating and - deleting users in account management -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复账户管理创建删除用户中出现的相关问题 - -Closes #13994, #13990 ---- - plugins/account/src/kiran-account-manager.cpp | 15 ++++++--------- - .../account/src/widgets/animation-push-button.cpp | 11 +++++++++++ - .../account/src/widgets/animation-push-button.h | 1 + - .../account/src/widgets/avatar-item-button.cpp | 2 +- - plugins/account/src/widgets/mask-widget.cpp | 2 +- - 5 files changed, 20 insertions(+), 11 deletions(-) - -diff --git a/plugins/account/src/kiran-account-manager.cpp b/plugins/account/src/kiran-account-manager.cpp -index 01b4fbf..15653d9 100644 ---- a/plugins/account/src/kiran-account-manager.cpp -+++ b/plugins/account/src/kiran-account-manager.cpp -@@ -109,14 +109,11 @@ void KiranAccountManager::appendSiderbarItem(const QString &userPath) - void KiranAccountManager::setDefaultSiderbarItem() - { - //设置默认侧边栏项 -- if (m_tabList->count() > 1) -+ auto items = m_tabList->findItems(AccountsGlobalInfo::instance()->getCurrentUser(), Qt::MatchCaseSensitive); -+ if ( items.size() >= 1 ) - { -- auto items = m_tabList->findItems(AccountsGlobalInfo::instance()->getCurrentUser(), Qt::MatchCaseSensitive); -- if (items.size() == 1) -- { -- auto item = items.at(0); -- m_tabList->setCurrentRow(m_tabList->row(item)); -- } -+ auto item = items.at(0); -+ m_tabList->setCurrentRow(m_tabList->row(item)); - } - else - { -@@ -128,7 +125,7 @@ void KiranAccountManager::initUI() - { - /* 遮罩,用于繁忙时屏蔽用户操作 */ - m_maskWidget = new MaskWidget(this); -- m_maskWidget->setVisible(false); -+ m_maskWidget->setVisible(true); - - /* 初始化界面主布局 */ - auto contentLayout = new QHBoxLayout(this); -@@ -444,7 +441,7 @@ void KiranAccountManager::setMaskVisible(bool visible) - { - if (visible) - { -- this->stackUnder(m_maskWidget); -+ m_maskWidget->raise(); - m_maskWidget->show(); - } - else -diff --git a/plugins/account/src/widgets/animation-push-button.cpp b/plugins/account/src/widgets/animation-push-button.cpp -index 65791f0..d65b348 100644 ---- a/plugins/account/src/widgets/animation-push-button.cpp -+++ b/plugins/account/src/widgets/animation-push-button.cpp -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include "animation-push-button.h" - -@@ -85,6 +86,16 @@ void AnimationPushButton::paintEvent(QPaintEvent *event) - } - } - -+void AnimationPushButton::mousePressEvent(QMouseEvent *e) -+{ -+ if( m_isBusy ) -+ { -+ e->ignore(); -+ return; -+ } -+ QPushButton::mousePressEvent(e); -+} -+ - void AnimationPushButton::initTimeLine() - { - m_timeLine.setCurrentTime(0); -diff --git a/plugins/account/src/widgets/animation-push-button.h b/plugins/account/src/widgets/animation-push-button.h -index 9a172e2..f39e9a4 100644 ---- a/plugins/account/src/widgets/animation-push-button.h -+++ b/plugins/account/src/widgets/animation-push-button.h -@@ -38,6 +38,7 @@ private: - - protected: - virtual void paintEvent(QPaintEvent *event) override; -+ virtual void mousePressEvent(QMouseEvent *e) override; - - private: - bool m_isBusy = false; -diff --git a/plugins/account/src/widgets/avatar-item-button.cpp b/plugins/account/src/widgets/avatar-item-button.cpp -index a078974..a9e5a4b 100644 ---- a/plugins/account/src/widgets/avatar-item-button.cpp -+++ b/plugins/account/src/widgets/avatar-item-button.cpp -@@ -106,7 +106,7 @@ void AvatarItemButton::paintEvent(QPaintEvent *event) - QPoint checkedIconLeftop((this->width() - checkedIconSize.width()) / 2, - (this->height() - checkedIconSize.height()) / 2); - QRect checkedIconRect(checkedIconLeftop, checkedIconSize); -- QSvgRenderer svgRenderer(QString(":/kcp-account/images/success-indicator.svg")); -+ QSvgRenderer svgRenderer(QString(":/kiran-control-panel/images/success-indicator.svg")); - svgRenderer.render(&painter, checkedIconRect); - } - } -diff --git a/plugins/account/src/widgets/mask-widget.cpp b/plugins/account/src/widgets/mask-widget.cpp -index 088fd48..476cbb3 100644 ---- a/plugins/account/src/widgets/mask-widget.cpp -+++ b/plugins/account/src/widgets/mask-widget.cpp -@@ -41,5 +41,5 @@ bool MaskWidget::eventFilter(QObject *watched, QEvent *event) - break; - } - } -- return QObject::eventFilter(watched, event); -+ return QWidget::eventFilter(watched, event); - } --- -2.33.0 - diff --git a/0005-fix-audio-listen-to-mute-property-change-to-fix-shor.patch b/0005-fix-audio-listen-to-mute-property-change-to-fix-shor.patch new file mode 100644 index 0000000..9f1ce02 --- /dev/null +++ b/0005-fix-audio-listen-to-mute-property-change-to-fix-shor.patch @@ -0,0 +1,202 @@ +From b7eb0462cb754bccde3afc53b151a9b6b61e4143 Mon Sep 17 00:00:00 2001 +From: luoqing +Date: Wed, 3 Jan 2024 13:49:14 +0800 +Subject: [PATCH 05/17] fix(audio):listen to mute property change to fix + shortcut key mute, volume icon unchanged issue +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 监听mute静音属性变化,以修复快捷键静音,音量图标未变化的问题 + +Related #25508 +--- + .../src/system-tray/audio-system-tray.cpp | 12 ++++ + .../src/system-tray/volume-setting-page.cpp | 69 ++++++++++++------- + .../src/system-tray/volume-setting-page.h | 5 +- + 3 files changed, 60 insertions(+), 26 deletions(-) + +diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp +index eb554b2..ed4412f 100644 +--- a/plugins/audio/src/system-tray/audio-system-tray.cpp ++++ b/plugins/audio/src/system-tray/audio-system-tray.cpp +@@ -124,6 +124,18 @@ void AudioSystemTray::initConnect() + setTrayIcon(currentVolume); + }); + ++ connect(m_volumeSettingPage,&VolumeSettingPage::sinkMuteChanged,[this](bool mute,double currentVolume) ++ { ++ if(mute) ++ { ++ setTrayIcon(0); ++ } ++ else ++ { ++ setTrayIcon(currentVolume); ++ } ++ }); ++ + connect(Kiran::StylePalette::instance(), &Kiran::StylePalette::themeChanged, [this](Kiran::PaletteType paletteType) + { + //获取当前音量值重新设置TrayIcon +diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp +index 03116c7..dbb1cd8 100644 +--- a/plugins/audio/src/system-tray/volume-setting-page.cpp ++++ b/plugins/audio/src/system-tray/volume-setting-page.cpp +@@ -15,8 +15,8 @@ + #include "dbus/audio-device-interface.h" + #include "dbus/audio-interface.h" + #include "dbus/audio-stream-interface.h" +-#include "ui_volume-setting-page.h" + #include "logging-category.h" ++#include "ui_volume-setting-page.h" + + #include + #include +@@ -41,7 +41,9 @@ VolumeSettingPage::VolumeSettingPage(enum AudioNode audio, const QString objectP + m_sink = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); + initAudioDevice(); + +- connect(m_sink, &AudioDeviceInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged); ++ connect(m_sink, &AudioDeviceInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged, Qt::UniqueConnection); ++ connect(m_sink, &AudioDeviceInterface::muteChanged, this, &VolumeSettingPage::changeSinkMute, Qt::UniqueConnection); ++ + connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) + { + double volumeValue = value / 100.0; +@@ -101,6 +103,7 @@ void VolumeSettingPage::initAudioStream() + initSettings(m_sinkInput); + ui->volumeName->setText(m_sinkInput->GetProperty("application.name")); + connect(m_sinkInput, &AudioStreamInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged); ++ connect(m_sinkInput, &AudioStreamInterface::muteChanged, this, &VolumeSettingPage::changeSinkInputMute); + connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) + { + double volumeValue = value / 100.0; +@@ -123,10 +126,38 @@ void VolumeSettingPage::initSettings(Audio *audio) + ui->volume->setText(QString::number(currentVolume) + "%"); + } + ++void VolumeSettingPage::changeSinkMute(bool value) ++{ ++ KLOG_DEBUG() << "change sink mute:" << value; ++ double currentVolume = m_sink->volume() * 100; ++ emit sinkMuteChanged(value, currentVolume); ++ if (value) ++ { ++ setVolumeIcon(0); ++ } ++ else ++ { ++ setVolumeIcon(currentVolume); ++ } ++} ++void VolumeSettingPage::changeSinkInputMute(bool value) ++{ ++ KLOG_DEBUG() << "change sink input mute:" << value; ++ double currentVolume = m_sinkInput->volume() * 100; ++ if (value) ++ { ++ setVolumeIcon(0); ++ } ++ else ++ { ++ setVolumeIcon(currentVolume); ++ } ++} ++ + void VolumeSettingPage::handleVolumeChanged(double value) + { +- QSignalBlocker blocker(ui->volumeSetting); // 为了避免拖动的同时设置位置会出现问题 +- int currentVolume = round(value * 100); // 表示数值的时候向上取整 ++ QSignalBlocker blocker(ui->volumeSetting); // 为了避免拖动的同时设置位置会出现问题 ++ int currentVolume = round(value * 100); // 表示数值的时候向上取整 + ui->volume->setText(QString::number(currentVolume) + "%"); + setVolumeIcon(currentVolume); + ui->volumeSetting->setValue(currentVolume); +@@ -136,9 +167,9 @@ void VolumeSettingPage::handleVolumeChanged(double value) + void VolumeSettingPage::handleMuteButtonClicked() + { + if (m_audioNode == AUDIO_DEVICE) +- clickMuteButton(m_sink); ++ switchMute(m_sink); + else +- clickMuteButton(m_sinkInput); ++ switchMute(m_sinkInput); + } + + void VolumeSettingPage::handleDefaultSinkChanged(int index) +@@ -154,7 +185,8 @@ void VolumeSettingPage::handleDefaultSinkChanged(int index) + QDBusPendingReply defaultSinkPath = m_audioInterface->GetDefaultSink(); + m_sink = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); + initAudioDevice(); +- connect(m_sink, &AudioDeviceInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged); ++ connect(m_sink, &AudioDeviceInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged, Qt::UniqueConnection); ++ connect(m_sink, &AudioDeviceInterface::muteChanged, this, &VolumeSettingPage::changeSinkMute, Qt::UniqueConnection); + } + + void VolumeSettingPage::handleSinkAdded(int index) +@@ -187,30 +219,17 @@ void VolumeSettingPage::handleSinkDelete(int index) + } + + template +-void VolumeSettingPage::clickMuteButton(Audio *audio) ++void VolumeSettingPage::switchMute(Audio *audio) + { +- double currentVolumeDouble = audio->volume() * 100; +- int currentVolume = round(currentVolumeDouble); +- +- if (currentVolume != 0) ++ if (!audio->mute()) + { +- m_volumeBeforeMute = currentVolume; +- if (!audio->mute()) +- { +- audio->SetMute(true); +- } +- audio->SetVolume(0); +- KLOG_DEBUG(qLcAudio) << "current sink is mute :" << audio->mute(); ++ audio->SetMute(true); + } + else + { +- if (m_volumeBeforeMute != 0) +- { +- //重新设置音量时,会自动解除静音状态 +- audio->SetVolume(m_volumeBeforeMute / 100.0); +- m_volumeBeforeMute = 0; +- } ++ audio->SetMute(false); + } ++ KLOG_DEBUG() << "current defalut sink mute:" << audio->mute(); + } + + // XXX:频繁调用函数,需要优化 +diff --git a/plugins/audio/src/system-tray/volume-setting-page.h b/plugins/audio/src/system-tray/volume-setting-page.h +index 80f0098..4a556fe 100644 +--- a/plugins/audio/src/system-tray/volume-setting-page.h ++++ b/plugins/audio/src/system-tray/volume-setting-page.h +@@ -41,6 +41,8 @@ public: + void disableSettings(); + + public slots: ++ void changeSinkMute(bool value); ++ void changeSinkInputMute(bool value); + void handleVolumeChanged(double value); + void handleMuteButtonClicked(); + void handleDefaultSinkChanged(int index); +@@ -57,10 +59,11 @@ private: + template + void initSettings(Audio *audio); + template +- void clickMuteButton(Audio *audio); ++ void switchMute(Audio *audio); + + signals: + void volumeChanged(double value); ++ void sinkMuteChanged(bool mute, double currentVolume); + + private: + Ui::VolumeSettingPage *ui; +-- +2.33.0 + diff --git a/0006-feature-network-When-the-gateway-setting-item-is-0.0.patch b/0006-feature-network-When-the-gateway-setting-item-is-0.0.patch deleted file mode 100644 index 6f935df..0000000 --- a/0006-feature-network-When-the-gateway-setting-item-is-0.0.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 51ade1eede326506f4814081ac4141a97082ff53 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Fri, 25 Aug 2023 14:15:36 +0800 -Subject: [PATCH 1/2] feature(network):When the gateway setting item is - 0.0.0.0, the gateway setting item is null -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 当网关设置项为“0.0.0.0”时,网关设置项置空 - -Related #13150 ---- - .../network/src/plugin/setting-widget/ipv4-widget.cpp | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -index 63d029c..8c39794 100644 ---- a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -+++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -@@ -162,7 +162,14 @@ void Ipv4Widget::showSettings() - - ui->ipv4Address->setText(address); - ui->ipv4Netmask->setText(netmask); -- ui->ipv4Gateway->setText(gateway); -+ if(gateway != "0.0.0.0") -+ { -+ ui->ipv4Gateway->setText(gateway); -+ } -+ else -+ { -+ ui->ipv4Gateway->clear(); -+ } - } - QString preferredDNS = ""; - QString alternateDNS = ""; --- -2.33.0 - diff --git a/0006-fix-network-fixd-an-issue-where-the-network-tray-ico.patch b/0006-fix-network-fixd-an-issue-where-the-network-tray-ico.patch new file mode 100644 index 0000000..382a947 --- /dev/null +++ b/0006-fix-network-fixd-an-issue-where-the-network-tray-ico.patch @@ -0,0 +1,183 @@ +From 2bae469f6fdd42c15d574a0d4642d13a2fcf3d8b Mon Sep 17 00:00:00 2001 +From: luoqing +Date: Thu, 4 Jan 2024 11:17:57 +0800 +Subject: [PATCH 06/17] fix(network):fixd an issue where the network tray icon + was incorrectly displayed when there was no primary connection +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复当没有主连接时,网络托盘图标显示不准确的问题 + +Closes #25475, #25037, #25032 +--- + plugins/network/src/general.h | 1 + + plugins/network/src/tray/network-tray.cpp | 90 +++++++++++++++++------ + 2 files changed, 68 insertions(+), 23 deletions(-) + +diff --git a/plugins/network/src/general.h b/plugins/network/src/general.h +index 8aa4f67..c65ce78 100644 +--- a/plugins/network/src/general.h ++++ b/plugins/network/src/general.h +@@ -24,6 +24,7 @@ + + enum NetworkState + { ++ UNKNOWN, + WIRED_CONNECTED, + WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET, + WIRELESS_CONNECTED, +diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp +index 00b6685..db6e0cd 100644 +--- a/plugins/network/src/tray/network-tray.cpp ++++ b/plugins/network/src/tray/network-tray.cpp +@@ -20,17 +20,17 @@ + #include + #include + #include ++#include ++#include + #include + #include "config.h" ++#include "logging-category.h" + #include "status-notification.h" + #include "status-notifier-manager.h" + #include "tray-page.h" + #include "utils.h" + #include "wired-tray-widget.h" + #include "wireless-tray-widget.h" +-#include +-#include +-#include "logging-category.h" + + using namespace NetworkManager; + +@@ -359,42 +359,70 @@ void NetworkTray::getTrayGeometry() + void NetworkTray::updateTrayIcon() + { + auto status = NetworkManager::status(); +- if (status != NetworkManager::Status::Connected) ++ if (status < NetworkManager::Status::ConnectedLinkLocal) + { + setTrayIcon(DISCONNECTED); + return; + } + ++#define SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state) \ ++ if (state != UNKNOWN) \ ++ { \ ++ setTrayIcon(state); \ ++ checkInternetConnectivity(); \ ++ return; \ ++ } ++ ++ NetworkState state = UNKNOWN; + // 判断主连接类型,托盘网络图标以主连接类型为准 + // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 ++ /** ++ * NOTE: ++ * 注意特殊情况,如果当网络状态为已连接,但是没有主连接,则遍历所有已激活的连接, ++ * 按有线优先于无线的原则,如果存在激活的有线连接,则显示有线网络图标;其次显示无线网络图标 ++ * 如果既不是有线也不是无线,则显示有线网络图标 ++ */ + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); +- if (primaryActiveConnection.isNull()) ++ if (!primaryActiveConnection.isNull()) + { +- KLOG_INFO(qLcNetwork) << "update tray icon failed, primary active connection is null"; +- return; ++ if (primaryActiveConnection->type() == ConnectionSettings::Wireless) ++ { ++ state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; ++ } ++ else ++ { ++ state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; ++ } + } ++ SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); + +- // NetworkManager::connectivity() 不准确,使用checkConnectivity +- QDBusPendingReply reply = NetworkManager::checkConnectivity(); +- reply.waitForFinished(); +- uint result = reply.value(); +- +- if (result == NetworkManager::Connectivity::Full) ++ KLOG_INFO(qLcNetwork) << "primary active connection is null"; ++ ActiveConnection::List list = activeConnections(); ++ for (auto connection : list) + { +- checkInternetConnectivity(); +- return; ++ if (connection->type() == ConnectionSettings::ConnectionType::Wired) ++ { ++ state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; ++ break; ++ } + } ++ SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); + +- NetworkState state; +- if (primaryActiveConnection->type() == ConnectionSettings::Wireless) ++ for (auto connection : list) + { +- state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; ++ if (connection->type() == ConnectionSettings::ConnectionType::Wireless) ++ { ++ state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; ++ break; ++ } + } +- else ++ ++ //最后如果既不是有线也不是无线,则显示有线网络图标 ++ if (state == UNKNOWN) + { + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; + } +- setTrayIcon(state); ++ SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); + } + + void NetworkTray::setTrayIcon(NetworkState state) +@@ -712,6 +740,15 @@ void NetworkTray::initTcpSocket() + + void NetworkTray::checkInternetConnectivity() + { ++ // NetworkManager::connectivity() 不准确,使用checkConnectivity ++ QDBusPendingReply reply = NetworkManager::checkConnectivity(); ++ reply.waitForFinished(); ++ uint result = reply.value(); ++ if (result != NetworkManager::Connectivity::Full) ++ { ++ return; ++ } ++ + QSettings confSettings(SETTINGS_PATH, QSettings::NativeFormat); + QVariant enable = confSettings.value(QString("Network/CheckInternetConnectivity")); + KLOG_DEBUG(qLcNetwork) << "check Internet Connectivity : " << enable; +@@ -728,11 +765,18 @@ void NetworkTray::checkInternetConnectivity() + void NetworkTray::internetConnected() + { + KLOG_DEBUG(qLcNetwork) << "Connectivity check pass"; +- ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + NetworkState state; +- if (primaryActiveConnection->type() == ConnectionSettings::Wireless) ++ ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); ++ if (!primaryActiveConnection.isNull()) + { +- state = WIRELESS_CONNECTED; ++ if (primaryActiveConnection->type() == ConnectionSettings::Wireless) ++ { ++ state = WIRELESS_CONNECTED; ++ } ++ else ++ { ++ state = WIRED_CONNECTED; ++ } + } + else + { +-- +2.33.0 + diff --git a/0007-fix-application-add-a-compilation-switch-to-control-.patch b/0007-fix-application-add-a-compilation-switch-to-control-.patch new file mode 100644 index 0000000..f6f78e0 --- /dev/null +++ b/0007-fix-application-add-a-compilation-switch-to-control-.patch @@ -0,0 +1,63 @@ +From 3ccdcfbc6d104f1f691b7feaf6ed58daae21da63 Mon Sep 17 00:00:00 2001 +From: niko_yhc +Date: Mon, 8 Jan 2024 13:48:50 +0800 +Subject: [PATCH 07/17] fix(application):add a compilation switch to control + whether the application-plugin is turned on +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 添加编译开关控制application-plugin是否打开 +--- + cmake/options.cmake | 3 ++- + data/CMakeLists.txt | 5 +++++ + plugins/CMakeLists.txt | 4 +++- + 3 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/cmake/options.cmake b/cmake/options.cmake +index f21d2b9..bc56591 100644 +--- a/cmake/options.cmake ++++ b/cmake/options.cmake +@@ -3,4 +3,5 @@ option(PASSWD_EXPIRATION_POLICY_VISIBLE "Is password expiration policy visible" + + OPTION(ENABLE_USER_GROUP "Enable user group" OFF) + OPTION(ENABLE_NETWORK "Enable network plugin" ON) +-OPTION(ENABLE_AUDIO "Enable audio plugin" ON) +\ No newline at end of file ++OPTION(ENABLE_AUDIO "Enable audio plugin" ON) ++OPTION(ENABLE_APPLICATION "Enable application plugin" ON) +\ No newline at end of file +diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt +index 9f66d68..8b1ed54 100644 +--- a/data/CMakeLists.txt ++++ b/data/CMakeLists.txt +@@ -14,6 +14,11 @@ endif() + if(NOT ENABLE_USER_GROUP) + list(FILTER CATEGORY_DESKTOP EXCLUDE REGEX "group.desktop") + endif() ++ ++if(NOT ENABLE_APPLICATION) ++ list(FILTER CATEGORY_DESKTOP EXCLUDE REGEX "application.desktop") ++endif() ++ + install(FILES ${CATEGORY_DESKTOP} DESTINATION ${CATEGORY_DESKTOP_DIR}) + + # 安装主分类相关图标文件 +diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt +index 9acb921..ecad7b6 100644 +--- a/plugins/CMakeLists.txt ++++ b/plugins/CMakeLists.txt +@@ -8,7 +8,9 @@ add_subdirectory(timedate) + add_subdirectory(display) + add_subdirectory(keybinding) + add_subdirectory(authentication) +-add_subdirectory(application) ++if (ENABLE_APPLICATION) ++ add_subdirectory(application) ++endif() + if(ENABLE_NETWORK) + add_subdirectory(network) + endif() +-- +2.33.0 + diff --git a/0007-fix-audio-Fix-parsing-error-when-json-contains-Chine.patch b/0007-fix-audio-Fix-parsing-error-when-json-contains-Chine.patch deleted file mode 100644 index de338c2..0000000 --- a/0007-fix-audio-Fix-parsing-error-when-json-contains-Chine.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 6e8923c8712ce9875863408d3bd695375d8e8973 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Tue, 29 Aug 2023 15:21:50 +0800 -Subject: [PATCH 2/2] fix(audio):Fix parsing error when json contains Chinese - characters -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复json中包含中文字符时的解析错误 - -Related #13261 ---- - plugins/audio/src/plugin/input-page.cpp | 2 +- - plugins/audio/src/plugin/output-page.cpp | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/plugins/audio/src/plugin/input-page.cpp b/plugins/audio/src/plugin/input-page.cpp -index 00826b4..8b0ecaa 100644 ---- a/plugins/audio/src/plugin/input-page.cpp -+++ b/plugins/audio/src/plugin/input-page.cpp -@@ -202,7 +202,7 @@ void InputPage::initActivedPort() - KLOG_DEBUG() << "getPorts:" << getPorts; - //解析默认source的端口信息 - QJsonParseError jsonParseError; -- QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toLatin1(), &jsonParseError); -+ QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) -diff --git a/plugins/audio/src/plugin/output-page.cpp b/plugins/audio/src/plugin/output-page.cpp -index ef52165..420cf98 100644 ---- a/plugins/audio/src/plugin/output-page.cpp -+++ b/plugins/audio/src/plugin/output-page.cpp -@@ -98,7 +98,7 @@ void OutputPage::initActivedPort() - - //解析默认sink的端口信息 - QJsonParseError jsonParseError; -- QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toLatin1(), &jsonParseError); -+ QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) --- -2.33.0 - diff --git a/0008-fix-audio-tray-Fixed-an-issue-where-the-volume-tray-.patch b/0008-fix-audio-tray-Fixed-an-issue-where-the-volume-tray-.patch deleted file mode 100644 index 5a72931..0000000 --- a/0008-fix-audio-tray-Fixed-an-issue-where-the-volume-tray-.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 2c6ae961ff33c45c9d9d7758715af3b52d2db052 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Thu, 7 Sep 2023 19:21:39 +0800 -Subject: [PATCH] fix(audio-tray):Fixed an issue where the volume tray icon did - not change with the volume after the default Sink was changed -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复默认Sink变更后,音量托盘图标不随音量大小改变的问题 - -Closed #14124 ---- - .../src/system-tray/audio-system-tray.cpp | 27 +++++++++++-------- - .../audio/src/system-tray/audio-system-tray.h | 1 - - .../src/system-tray/volume-setting-page.cpp | 2 ++ - .../src/system-tray/volume-setting-page.h | 22 ++++++++------- - 4 files changed, 30 insertions(+), 22 deletions(-) - -diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp -index 00e90f7..0c6aca6 100644 ---- a/plugins/audio/src/system-tray/audio-system-tray.cpp -+++ b/plugins/audio/src/system-tray/audio-system-tray.cpp -@@ -41,7 +41,6 @@ AudioSystemTray::AudioSystemTray(QWidget *parent) : QWidget(parent) - initVolumeSettingPage(defaultSinkPath); - initMixedSettingPage(); - -- m_sink = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus()); - m_statusNotifierManager = new StatusNotifierManagerInterface(STATUS_NOTIFIER_MANAGER, STATUS_NOTIFIER_MANAGER_OBJECT_NAME, QDBusConnection::sessionBus(), this); - m_systemTray = new QSystemTrayIcon(); - -@@ -82,8 +81,11 @@ void AudioSystemTray::initMixedSettingPage() - void AudioSystemTray::initTrayIcon() - { - getTrayIconStyle(); -- double currentVolumeDouble = m_sink->volume() * 100; -- KLOG_INFO() << "currentVolumeDouble" << round(currentVolumeDouble); -+ -+ QDBusPendingReply defaultSinkPath = m_audioInterface->GetDefaultSink(); -+ AudioDeviceInterface defaultSink (AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus()); -+ double currentVolumeDouble = defaultSink.volume() * 100; -+ KLOG_INFO() << "current Volume Double" << round(currentVolumeDouble); - setTrayIcon(round(currentVolumeDouble)); - } - -@@ -117,11 +119,12 @@ void AudioSystemTray::initConnect() - { - connect(m_systemTray, &QSystemTrayIcon::activated, this, &AudioSystemTray::handleAudioTrayClicked); - -- connect(m_sink, &AudioDeviceInterface::volumeChanged, [=](double value) -- { -- int currentVolume = round(value * 100); //表示数值的时候向上取整 -- KLOG_DEBUG() << "m_sink volumeChanged :" << currentVolume; -- setTrayIcon(currentVolume); }); -+ connect(m_volumeSettingPage,&VolumeSettingPage::volumeChanged,[=](double value) -+ { -+ int currentVolume = round(value * 100); //表示数值的时候向上取整 -+ KLOG_DEBUG() << "m_sink volumeChanged :" << currentVolume; -+ setTrayIcon(currentVolume); -+ }); - - connect(m_statusNotifierManager, &StatusNotifierManagerInterface::StyleChanged, [=](const QString &style) - { -@@ -129,9 +132,11 @@ void AudioSystemTray::initConnect() - //重新获取style - getTrayIconStyle(); - //获取当前音量值重新设置TrayIcon -- m_sink->volume(); -- double currentVolumeDouble = m_sink->volume() * 100; -- setTrayIcon(round(currentVolumeDouble)); }); -+ QDBusPendingReply defaultSinkPath = m_audioInterface->GetDefaultSink(); -+ AudioDeviceInterface defaultSink (AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus()); -+ double currentVolumeDouble = defaultSink.volume() * 100; -+ setTrayIcon(round(currentVolumeDouble)); -+ }); - } - - void AudioSystemTray::handleAudioTrayClicked(QSystemTrayIcon::ActivationReason reason) -diff --git a/plugins/audio/src/system-tray/audio-system-tray.h b/plugins/audio/src/system-tray/audio-system-tray.h -index 16846e6..a61284e 100644 ---- a/plugins/audio/src/system-tray/audio-system-tray.h -+++ b/plugins/audio/src/system-tray/audio-system-tray.h -@@ -68,7 +68,6 @@ private: - - StatusNotifierManagerInterface* m_statusNotifierManager; - AudioInterface* m_audioInterface; -- AudioDeviceInterface* m_sink; - - QString m_colorTheme; - int xTray, yTray, heightTray, widthTray; -diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp -index fac69a6..54b8f10 100644 ---- a/plugins/audio/src/system-tray/volume-setting-page.cpp -+++ b/plugins/audio/src/system-tray/volume-setting-page.cpp -@@ -132,6 +132,7 @@ void VolumeSettingPage::handleVolumeChanged(double value) - setVolumeIcon(currentVolume); - ui->volumeSetting->setValue(currentVolume); - ui->volumeSetting->blockSignals(false); -+ emit volumeChanged(value); - } - - void VolumeSettingPage::handleMuteButtonClicked() -@@ -144,6 +145,7 @@ void VolumeSettingPage::handleMuteButtonClicked() - - void VolumeSettingPage::handleDefaultSinkChanged(int index) - { -+ KLOG_DEBUG() << "Default Sink Changed"; - // delete and restart init defaultSink - if (m_sink != nullptr) - { -diff --git a/plugins/audio/src/system-tray/volume-setting-page.h b/plugins/audio/src/system-tray/volume-setting-page.h -index 4719021..80f0098 100644 ---- a/plugins/audio/src/system-tray/volume-setting-page.h -+++ b/plugins/audio/src/system-tray/volume-setting-page.h -@@ -40,16 +40,6 @@ public: - QPixmap trayIconColorSwitch(const QString &iconPath); - void disableSettings(); - --private: -- void initDbusServiceWatcher(); -- void initAudioDevice(); -- void initAudioStream(); -- template -- void initSettings(Audio *audio); -- template -- void clickMuteButton(Audio *audio); -- -- - public slots: - void handleVolumeChanged(double value); - void handleMuteButtonClicked(); -@@ -60,6 +50,18 @@ public slots: - void setVolumeIcon(int value); - void hideLine(); - -+private: -+ void initDbusServiceWatcher(); -+ void initAudioDevice(); -+ void initAudioStream(); -+ template -+ void initSettings(Audio *audio); -+ template -+ void clickMuteButton(Audio *audio); -+ -+signals: -+ void volumeChanged(double value); -+ - private: - Ui::VolumeSettingPage *ui; - AudioInterface *m_audioInterface; --- -2.33.0 - diff --git a/0008-refactor-account-Remove-useless-password-encryption-.patch b/0008-refactor-account-Remove-useless-password-encryption-.patch new file mode 100644 index 0000000..4607bc5 --- /dev/null +++ b/0008-refactor-account-Remove-useless-password-encryption-.patch @@ -0,0 +1,137 @@ +From 3a30343a3958caafad6b27e1900c0e7b6b9ab26b Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Mon, 8 Jan 2024 15:04:41 +0800 +Subject: [PATCH 08/17] refactor(account): Remove useless password encryption + interfaces and remove the dependency of libcrypt +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 删除目前无用的密码加密接口,去除libcrypt的依赖 +--- + plugins/account/CMakeLists.txt | 7 +-- + plugins/account/utils/passwd-helper.cpp | 57 ------------------------- + plugins/account/utils/passwd-helper.h | 1 - + 3 files changed, 2 insertions(+), 63 deletions(-) + +diff --git a/plugins/account/CMakeLists.txt b/plugins/account/CMakeLists.txt +index 586c6c8..e96fa92 100644 +--- a/plugins/account/CMakeLists.txt ++++ b/plugins/account/CMakeLists.txt +@@ -6,7 +6,6 @@ endif () + + pkg_search_module(CRYPTOPP REQUIRED cryptopp) + pkg_search_module(PAM REQUIRED pam) +-pkg_search_module(LIBCRYPT REQUIRED libcrypt) + + file(GLOB_RECURSE ACCOUNT_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp +@@ -29,8 +28,7 @@ target_include_directories(${TARGET_NAME} PRIVATE + ${KIRAN_CC_DAEMON_INCLUDE_DIRS} + ${KLOG_INCLUDE_DIRS} + ${KIRAN_STYLE_INCLUDE_DIRS} +- ${CRYPTOPP_INCLUDE_DIRS} +- ${LIBCRYPT_INCLUDE_DIRS}) ++ ${CRYPTOPP_INCLUDE_DIRS}) + + target_link_libraries(${TARGET_NAME} + common-widgets +@@ -43,7 +41,6 @@ target_link_libraries(${TARGET_NAME} + ${KIRAN_CC_DAEMON_LIBRARIES} + ${KLOG_LIBRARIES} + ${KIRAN_STYLE_LIBRARIES} +- ${CRYPTOPP_LIBRARIES} +- ${LIBCRYPT_LIBRARIES}) ++ ${CRYPTOPP_LIBRARIES}) + + install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) +diff --git a/plugins/account/utils/passwd-helper.cpp b/plugins/account/utils/passwd-helper.cpp +index f6b76f2..a5641c7 100644 +--- a/plugins/account/utils/passwd-helper.cpp ++++ b/plugins/account/utils/passwd-helper.cpp +@@ -14,7 +14,6 @@ + + #include "passwd-helper.h" + +-#include + #include + #include + #include +@@ -33,62 +32,6 @@ + + using namespace CryptoPP; + +-bool PasswdHelper::encryptPassword(const QString &pwd, QString &encrypted) +-{ +- QByteArray byteArray = pwd.toLatin1(); +- QString saltChar = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz./0123456789"; +- +- QString rand16SaltChar; +- +- std::default_random_engine randomEngine; +- std::uniform_int_distribution uniformIntDistribution(0, saltChar.size() - 1); +- for (int i = 0; i < 16; i++) +- { +- char ch = saltChar.at(uniformIntDistribution(randomEngine)).toLatin1(); +- rand16SaltChar.append(ch); +- } +- +- QString salt = QString("$6$%1$").arg(rand16SaltChar); +- QByteArray saltByteArray = salt.toLatin1(); +- +- char *cryptedResult = nullptr; +- QByteArray cryptedResultBuffer(100, 0); +- +- //NOTE:兼容低版本libcrypt(不带有crypt_rn接口的版本) +-#if 0 +- forever +- { +- cryptedResult = crypt_rn(byteArray.data(), +- saltByteArray.data(), +- cryptedResultBuffer.data(), +- cryptedResultBuffer.size()); +- if (cryptedResult == nullptr) +- { +- if (errno == ERANGE) +- { +- cryptedResultBuffer.resize(cryptedResultBuffer.size() * 2); +- continue; +- } +- else +- { +- KLOG_WARNING() << "encrypt passwd failed," << strerror(errno); +- } +- } +- break; +- } +-#else +- crypt_data cryptData{}; +- cryptedResult = crypt_r(byteArray.data(), +- saltByteArray.data(), +- &cryptData); +-#endif +- +- if (cryptedResult) +- encrypted = cryptedResult; +- +- return cryptedResult != nullptr; +-} +- + bool PasswdHelper::encryptPasswordByRsa(const QString &publicKey, const QString &pwd, QString &encrypted) + { + CryptoPP::RandomPool random_pool; +diff --git a/plugins/account/utils/passwd-helper.h b/plugins/account/utils/passwd-helper.h +index b09d246..fc98068 100644 +--- a/plugins/account/utils/passwd-helper.h ++++ b/plugins/account/utils/passwd-helper.h +@@ -18,7 +18,6 @@ + class QString; + namespace PasswdHelper + { +-bool encryptPassword(const QString &pwd, QString &encrypted); + bool encryptPasswordByRsa(const QString &publicKey, const QString &pwd, QString &encrypted); + bool checkUserPassword(const QString &user, const QString &pwd); + } // namespace PasswdHelper +-- +2.33.0 + diff --git a/0009-fix-audio-The-Sink-Source-device-list-displays-only-.patch b/0009-fix-audio-The-Sink-Source-device-list-displays-only-.patch deleted file mode 100644 index 0dc8b67..0000000 --- a/0009-fix-audio-The-Sink-Source-device-list-displays-only-.patch +++ /dev/null @@ -1,306 +0,0 @@ -From 091bc92282fd07e989747ca23157f7af5113c723 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Fri, 8 Sep 2023 15:53:56 +0800 -Subject: [PATCH] fix(audio):The Sink/Source device list displays only active - ports. The port selection function is temporarily disabled -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 输入输出设备列表只显示目前已激活的端口,暂时禁用选择端口的功能 - -Related #13261 ---- - .../audio/src/dbus/audio-device-interface.cpp | 33 +++++++++ - .../audio/src/dbus/audio-device-interface.h | 9 +++ - plugins/audio/src/plugin/input-page.cpp | 69 +++++++------------ - plugins/audio/src/plugin/input-page.h | 1 - - plugins/audio/src/plugin/output-page.cpp | 62 ++++++----------- - plugins/audio/src/plugin/output-page.h | 1 - - 6 files changed, 89 insertions(+), 86 deletions(-) - -diff --git a/plugins/audio/src/dbus/audio-device-interface.cpp b/plugins/audio/src/dbus/audio-device-interface.cpp -index a3a750f..7ec201d 100644 ---- a/plugins/audio/src/dbus/audio-device-interface.cpp -+++ b/plugins/audio/src/dbus/audio-device-interface.cpp -@@ -13,6 +13,7 @@ - */ - - #include "audio-device-interface.h" -+#include - - /* - * Implementation of interface class AudioDeviceInterface -@@ -28,6 +29,38 @@ AudioDeviceInterface::~AudioDeviceInterface() - { - } - -+QList AudioDeviceInterface::getPortsInfo() -+{ -+ QDBusPendingReply getPorts = GetPorts(); -+ KLOG_DEBUG() << "getPorts:" << getPorts; -+ -+ //解析默认sink的端口信息 -+ QJsonParseError jsonParseError; -+ QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); -+ -+ if((doc.isNull()) || (jsonParseError.error != QJsonParseError::NoError)) -+ { -+ return QList(); -+ } -+ -+ QList portInfoList; -+ if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) -+ { -+ QJsonArray array = doc.array(); -+ for (int i = 0; i < array.count(); ++i) -+ { -+ QJsonObject object = array.at(i).toObject(); -+ AudioPortInfo portInfo; -+ portInfo.description = object.value("description").toString(); -+ portInfo.name = object.value("name").toString(); -+ portInfo.priority = object.value("priority").toDouble(); -+ portInfoList << portInfo; -+ } -+ } -+ -+ return portInfoList; -+} -+ - void sendPropertyChangedDetailSignal(AudioDeviceInterface *ptr, const QString &propertyName, QVariant value) - { - if (propertyName == QStringLiteral("active_port")) -diff --git a/plugins/audio/src/dbus/audio-device-interface.h b/plugins/audio/src/dbus/audio-device-interface.h -index 29fbe6d..8bea01a 100644 ---- a/plugins/audio/src/dbus/audio-device-interface.h -+++ b/plugins/audio/src/dbus/audio-device-interface.h -@@ -26,6 +26,13 @@ - #include - #include "audio-device-interface.h" - -+struct AudioPortInfo -+{ -+ QString description; -+ QString name; -+ double priority; -+}; -+ - /* - * Proxy class for interface com.kylinsec.Kiran.SessionDaemon.Audio.Device - */ -@@ -103,6 +110,8 @@ public: - return qvariant_cast(property("volume")); - } - -+ QList getPortsInfo(); -+ - public Q_SLOTS: // METHODS - inline QDBusPendingReply GetPorts() - { -diff --git a/plugins/audio/src/plugin/input-page.cpp b/plugins/audio/src/plugin/input-page.cpp -index 8b0ecaa..11275ec 100644 ---- a/plugins/audio/src/plugin/input-page.cpp -+++ b/plugins/audio/src/plugin/input-page.cpp -@@ -198,48 +198,28 @@ void InputPage::initInputDevice() - - void InputPage::initActivedPort() - { -- QDBusPendingReply getPorts = m_defaultSource->GetPorts(); -- KLOG_DEBUG() << "getPorts:" << getPorts; -- //解析默认source的端口信息 -- QJsonParseError jsonParseError; -- QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); -- if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) -- { -- if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) -- { -- QJsonArray array = doc.array(); -- for (int i = 0; i < array.count(); ++i) -- { -- KLOG_DEBUG() << "array.at(i)" << array.at(i); -- QJsonObject object = array.at(i).toObject(); -- QString description = object.value("description").toString(); -- QString name = object.value("name").toString(); -- double priority = object.value("priority").toDouble(); -- KLOG_DEBUG() << "description" << description; -- KLOG_DEBUG() << "name" << name; -- KLOG_DEBUG() << "priority" << priority; -- -- ui->inputDevices->insertItem(i, description); -- ui->inputDevices->setItemData(i, name, Qt::UserRole); //激活端口所需信息 -- //获取已激活的端口在comobox中的index -- if (m_defaultSource->active_port() == name) -- { -- m_defaultDeviceIndex = i; -- KLOG_DEBUG() << "m_defaultDeviceIndex" << m_defaultDeviceIndex; -- } -- } -- } -- //默认选中已激活的端口 -- m_isValidPort = true; -- ui->inputDevices->setCurrentIndex(m_defaultDeviceIndex); -- ui->inputDevices->setEnabled(true); -- ui->volumeSetting->setEnabled(true); -- } -- else -+ QList portsInfo = m_defaultSource->getPortsInfo(); -+ -+ if(portsInfo.isEmpty()) - { - KLOG_DEBUG() << "ports is null"; - disableSettings(); -+ return; - } -+ -+ Q_FOREACH (auto portInfo, portsInfo) -+ { -+ if(m_defaultSource->active_port() == portInfo.name) -+ { -+ ui->inputDevices->addItem(portInfo.description,portInfo.name); -+ break; -+ } -+ } -+ -+ //默认选中已激活的端口 -+ m_isValidPort = true; -+ ui->inputDevices->setEnabled(true); -+ ui->volumeSetting->setEnabled(true); - } - - void InputPage::initInputSettins() -@@ -304,13 +284,16 @@ void InputPage::disableSettings() - void InputPage::handleActivePortChanged(const QString &value) - { - KLOG_DEBUG() << "handleActivePortChanged :" << value; -- for (int i = 0; i < ui->inputDevices->count(); ++i) -+ -+ QList portsInfo = m_defaultSource->getPortsInfo(); -+ -+ Q_FOREACH (auto portInfo, portsInfo) - { -- QString name = ui->inputDevices->itemData(i, Qt::UserRole).toString(); -- if (name == value) -+ if(m_defaultSource->active_port() == portInfo.name) - { -- ui->inputDevices->setCurrentIndex(i); -- KLOG_DEBUG() << "handleActivePortChanged setCurrentIndex " << i; -+ ui->inputDevices->clear(); -+ ui->inputDevices->addItem(portInfo.description,portInfo.name); -+ break; - } - } - } -diff --git a/plugins/audio/src/plugin/input-page.h b/plugins/audio/src/plugin/input-page.h -index 3b57daf..e9f6909 100644 ---- a/plugins/audio/src/plugin/input-page.h -+++ b/plugins/audio/src/plugin/input-page.h -@@ -91,7 +91,6 @@ private: - AudioDeviceInterface *m_activedSource; - QMap m_inputDevicesMap; - int m_defaultSourceIndex; -- int m_defaultDeviceIndex; - bool m_isValidPort = false; - - QAudioInput *m_audioInput = nullptr; -diff --git a/plugins/audio/src/plugin/output-page.cpp b/plugins/audio/src/plugin/output-page.cpp -index 420cf98..1242b8a 100644 ---- a/plugins/audio/src/plugin/output-page.cpp -+++ b/plugins/audio/src/plugin/output-page.cpp -@@ -93,47 +93,25 @@ void OutputPage::initOutputDevice() - - void OutputPage::initActivedPort() - { -- QDBusPendingReply getPorts = m_defaultSink->GetPorts(); -- KLOG_DEBUG() << "getPorts:" << getPorts; -- -- //解析默认sink的端口信息 -- QJsonParseError jsonParseError; -- QJsonDocument doc = QJsonDocument::fromJson(getPorts.value().toUtf8(), &jsonParseError); -- if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) -- { -- if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) -- { -- QJsonArray array = doc.array(); -- for (int i = 0; i < array.count(); ++i) -- { -- KLOG_DEBUG() << "array.at(i)" << array.at(i); -- QJsonObject object = array.at(i).toObject(); -- QString description = object.value("description").toString(); -- QString name = object.value("name").toString(); -- double priority = object.value("priority").toDouble(); -- KLOG_DEBUG() << "description" << description; -- KLOG_DEBUG() << "name" << name; -- KLOG_DEBUG() << "priority" << priority; -- ui->outputDevices->insertItem(i, description); -- ui->outputDevices->setItemData(i, name, Qt::UserRole); //激活端口所需信息 -- -- //获取已激活的端口在comobox中的index -- if (m_defaultSink->active_port() == name) -- { -- m_defaultDeviceIndex = i; -- } -- } -- } -- //默认选中已激活的端口 -- ui->outputDevices->setCurrentIndex(m_defaultDeviceIndex); -- initOutputSettins(); -- } -- else -+ QList portsInfo = m_defaultSink->getPortsInfo(); -+ if(portsInfo.isEmpty()) - { - //无激活端口则禁用音量设置和平衡 - KLOG_DEBUG() << "default sink ports is null"; - disableSettings(); -+ return; - } -+ -+ Q_FOREACH (auto portInfo, portsInfo) -+ { -+ if(m_defaultSink->active_port() == portInfo.name) -+ { -+ ui->outputDevices->addItem(portInfo.description,portInfo.name); -+ break; -+ } -+ } -+ -+ initOutputSettins(); - } - - void OutputPage::initOutputSettins() -@@ -202,13 +180,15 @@ void OutputPage::initConnect() - void OutputPage::handleActivePortChanged(const QString &value) - { - KLOG_DEBUG() << "handleActivePortChanged :" << value; -- for (int i = 0; i < ui->outputDevices->count(); ++i) -+ QList portsInfo = m_defaultSink->getPortsInfo(); -+ -+ Q_FOREACH (auto portInfo, portsInfo) - { -- QString name = ui->outputDevices->itemData(i, Qt::UserRole).toString(); -- if (name == value) -+ if(m_defaultSink->active_port() == portInfo.name) - { -- ui->outputDevices->setCurrentIndex(i); -- KLOG_DEBUG() << "handleActivePortChanged setCurrentIndex " << i; -+ ui->outputDevices->clear(); -+ ui->outputDevices->addItem(portInfo.description,portInfo.name); -+ break; - } - } - } -diff --git a/plugins/audio/src/plugin/output-page.h b/plugins/audio/src/plugin/output-page.h -index abaf9a1..dea45e7 100644 ---- a/plugins/audio/src/plugin/output-page.h -+++ b/plugins/audio/src/plugin/output-page.h -@@ -61,7 +61,6 @@ private: - AudioInterface *m_audioInterface; - QMap m_outputDevicesMap; - AudioDeviceInterface *m_defaultSink; -- int m_defaultDeviceIndex; - QDBusServiceWatcher *m_dbusServiceWatcher; - }; - --- -2.33.0 - diff --git a/0009-fix-translations-Fix-translation-errors-in-battery-s.patch b/0009-fix-translations-Fix-translation-errors-in-battery-s.patch new file mode 100644 index 0000000..a8fea62 --- /dev/null +++ b/0009-fix-translations-Fix-translation-errors-in-battery-s.patch @@ -0,0 +1,30 @@ +From 24d7fe811440d3ab46a03db079136309f60519a8 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Mon, 8 Jan 2024 15:06:03 +0800 +Subject: [PATCH 09/17] fix(translations): Fix translation errors in battery + settings +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复电池设置中错误的翻译 +--- + translations/kiran-control-panel.zh_CN.ts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts +index 6fb278f..970c5a0 100644 +--- a/translations/kiran-control-panel.zh_CN.ts ++++ b/translations/kiran-control-panel.zh_CN.ts +@@ -533,7 +533,7 @@ + + + Reduce screen brightness when no power +- 低点亮时减少亮度 ++ 低电量时减少亮度 + + + +-- +2.33.0 + diff --git a/0010-fix-account-Fix-the-issue-of-setting-default-selecti.patch b/0010-fix-account-Fix-the-issue-of-setting-default-selecti.patch new file mode 100644 index 0000000..7ef61bf --- /dev/null +++ b/0010-fix-account-Fix-the-issue-of-setting-default-selecti.patch @@ -0,0 +1,47 @@ +From 2b6125c1a32d3de702a60a10e2baceee481f28c0 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Tue, 9 Jan 2024 16:59:21 +0800 +Subject: [PATCH 10/17] fix(account): Fix the issue of setting default + selection sidebar errors +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复设置默认选择侧边栏错误的问题 + +Closes #24761 +--- + plugins/account/account-widget.cpp | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +diff --git a/plugins/account/account-widget.cpp b/plugins/account/account-widget.cpp +index 957b154..59b6cad 100644 +--- a/plugins/account/account-widget.cpp ++++ b/plugins/account/account-widget.cpp +@@ -106,17 +106,15 @@ void AccountWidget::appendUser(const QString &userPath) + + void AccountWidget::setDefaultSelectedUser() + { +- if (m_tabList->count() <= 1) ++ auto items = m_tabList->findItems(AccountsGlobalInfo::instance()->getCurrentUser(), Qt::MatchCaseSensitive); ++ if (items.size() >= 1) + { +- m_tabList->setCurrentRow(0); +- return; ++ auto userItem = items.at(0); ++ m_tabList->setCurrentRow(m_tabList->row(userItem)); + } +- +- auto items = m_tabList->findItems(AccountsGlobalInfo::instance()->getCurrentUser(), Qt::MatchCaseSensitive); +- if (items.size() > 0) ++ else + { +- auto item = items.at(0); +- m_tabList->setCurrentRow(m_tabList->row(item)); ++ m_tabList->setCurrentRow(0); + } + } + +-- +2.33.0 + diff --git a/0010-fix-kiran-control-panel-fits-the-Qt5.9.7-interface.patch b/0010-fix-kiran-control-panel-fits-the-Qt5.9.7-interface.patch deleted file mode 100644 index 582d128..0000000 --- a/0010-fix-kiran-control-panel-fits-the-Qt5.9.7-interface.patch +++ /dev/null @@ -1,332 +0,0 @@ -From 7c62cbc143a47fa47b432b5f8a57a5dda0d536eb Mon Sep 17 00:00:00 2001 -From: niko_yhc -Date: Tue, 12 Sep 2023 16:04:09 +0800 -Subject: [PATCH] fix(kiran-control-panel):fits the Qt5.9.7 interface -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 适配Qt5.9.7接口,修复编译报错 - -Closes:#15019 ---- - lib/common-widgets/kiran-tips/kiran-tips.cpp | 4 +++ - .../src/pages/face/face-page.cpp | 1 - - .../src/pages/finger/finger-page.cpp | 11 ++++---- - .../src/pages/iris/iris-page.cpp | 1 - - .../src/pages/prefs/prefs-page.cpp | 16 ++++++------ - .../src/pages/ukey/ukey-page.cpp | 1 - - .../src/widgets/general-bio-page.cpp | 8 ++++++ - .../network/src/tray/wired-tray-widget.cpp | 10 ++++---- - .../network/src/tray/wireless-tray-widget.cpp | 14 +++++------ - plugins/power/src/upower-interface.cpp | 4 +++ - .../hardware-information.cpp | 6 ++--- - .../change-host-name-widget.cpp | 5 ---- - .../system-information/system-information.cpp | 2 +- - src/main.cpp | 25 +++++++++++++++++++ - 14 files changed, 70 insertions(+), 38 deletions(-) - -diff --git a/lib/common-widgets/kiran-tips/kiran-tips.cpp b/lib/common-widgets/kiran-tips/kiran-tips.cpp -index 7a8dcab..34f0fa2 100644 ---- a/lib/common-widgets/kiran-tips/kiran-tips.cpp -+++ b/lib/common-widgets/kiran-tips/kiran-tips.cpp -@@ -279,7 +279,11 @@ QSize KiranTips::getRightSize() const - QFontMetrics fontMetrics(font); - QMargins layoutContentMargins = this->layout()->contentsMargins(); - -+#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) - ui->label->setFixedWidth(fontMetrics.horizontalAdvance(ui->label->text()) + 10); -+#else -+ ui->label->setFixedWidth(fontMetrics.width(ui->label->text()) + 10); -+#endif - ui->label->setFixedHeight(fontMetrics.height()); - - QSize size; -diff --git a/plugins/authentication/src/pages/face/face-page.cpp b/plugins/authentication/src/pages/face/face-page.cpp -index 5e0a0db..4412631 100644 ---- a/plugins/authentication/src/pages/face/face-page.cpp -+++ b/plugins/authentication/src/pages/face/face-page.cpp -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - #include - #include - -diff --git a/plugins/authentication/src/pages/finger/finger-page.cpp b/plugins/authentication/src/pages/finger/finger-page.cpp -index 86513a6..069ab94 100644 ---- a/plugins/authentication/src/pages/finger/finger-page.cpp -+++ b/plugins/authentication/src/pages/finger/finger-page.cpp -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -43,11 +42,11 @@ enum FingerPageIndexEnum - }; - - const std::list> FingerProgressRangePixmapList = { -- {0, ":/kcp-authentication/images/finger-0.svg"}, -- {25, ":/kcp-authentication/images/finger-25.svg"}, -- {50, ":/kcp-authentication/images/finger-50.svg"}, -- {75, ":/kcp-authentication/images/finger-75.svg"}, -- {100, ":/kcp-authentication/images/finger-100.svg"}}; -+ std::make_tuple(0, ":/kcp-authentication/images/finger-0.svg"), -+ std::make_tuple(25, ":/kcp-authentication/images/finger-25.svg"), -+ std::make_tuple(50, ":/kcp-authentication/images/finger-50.svg"), -+ std::make_tuple(75, ":/kcp-authentication/images/finger-75.svg"), -+ std::make_tuple(100, ":/kcp-authentication/images/finger-100.svg")}; - - FingerPage::FingerPage(KiranAuthDBusProxy* proxy, FingerAuthType type, QWidget* parent) - : QWidget(parent), -diff --git a/plugins/authentication/src/pages/iris/iris-page.cpp b/plugins/authentication/src/pages/iris/iris-page.cpp -index 714c9c0..cacc801 100644 ---- a/plugins/authentication/src/pages/iris/iris-page.cpp -+++ b/plugins/authentication/src/pages/iris/iris-page.cpp -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - #include - #include - -diff --git a/plugins/authentication/src/pages/prefs/prefs-page.cpp b/plugins/authentication/src/pages/prefs/prefs-page.cpp -index 8bad280..a50cc15 100644 ---- a/plugins/authentication/src/pages/prefs/prefs-page.cpp -+++ b/plugins/authentication/src/pages/prefs/prefs-page.cpp -@@ -71,11 +71,11 @@ QWidget* PrefsPage::initAuthTypePage() - authTypeLayout->addStretch(); - - std::list> authTypes = { -- {KAD_AUTH_TYPE_FINGERPRINT, tr("fingerprint")}, -- {KAD_AUTH_TYPE_FINGERVEIN, tr("fingervein")}, -- {KAD_AUTH_TYPE_UKEY, tr("ukey")}, -- {KAD_AUTH_TYPE_IRIS, tr("iris")}, -- {KAD_AUTH_TYPE_FACE, tr("face")}}; -+ std::make_tuple(KAD_AUTH_TYPE_FINGERPRINT, tr("fingerprint")), -+ std::make_tuple(KAD_AUTH_TYPE_FINGERVEIN, tr("fingervein")), -+ std::make_tuple(KAD_AUTH_TYPE_UKEY, tr("ukey")), -+ std::make_tuple(KAD_AUTH_TYPE_IRIS, tr("iris")), -+ std::make_tuple(KAD_AUTH_TYPE_FACE, tr("face"))}; - - // fill auth types - for (auto iter : authTypes) -@@ -134,9 +134,9 @@ QWidget* PrefsPage::initAuthApplicationPage() - authAppLayout->addLayout(buttonLayout); - - std::list> authTypes = { -- {KAD_AUTH_APPLICATION_LOGIN, tr("login")}, -- {KAD_AUTH_APPLICATION_UNLOCK, tr("unlock")}, -- {KAD_AUTH_APPLICATION_EMPOWERMENT, tr("empowerment")}}; -+ std::make_tuple(KAD_AUTH_APPLICATION_LOGIN, tr("login")), -+ std::make_tuple(KAD_AUTH_APPLICATION_UNLOCK, tr("unlock")), -+ std::make_tuple(KAD_AUTH_APPLICATION_EMPOWERMENT, tr("empowerment"))}; - - // fill auth applications - for (auto iter : authTypes) -diff --git a/plugins/authentication/src/pages/ukey/ukey-page.cpp b/plugins/authentication/src/pages/ukey/ukey-page.cpp -index 38051ca..bdf4033 100644 ---- a/plugins/authentication/src/pages/ukey/ukey-page.cpp -+++ b/plugins/authentication/src/pages/ukey/ukey-page.cpp -@@ -27,7 +27,6 @@ - #include - #include - #include --#include - #include - - UKeyPage::UKeyPage(KiranAuthDBusProxy* proxy, QWidget* parent) -diff --git a/plugins/authentication/src/widgets/general-bio-page.cpp b/plugins/authentication/src/widgets/general-bio-page.cpp -index 36d0ef9..1047c3e 100644 ---- a/plugins/authentication/src/widgets/general-bio-page.cpp -+++ b/plugins/authentication/src/widgets/general-bio-page.cpp -@@ -12,7 +12,10 @@ - #include - #include - #include -+#include -+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - #include -+#endif - - #define MAX_FEATURE_NUMBER 1000 - -@@ -45,7 +48,12 @@ QString GeneralBioPage::autoGenerateFeatureName() - - for (int i = 0; i <= 10; ++i) - { -+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - auto featureNumber = QRandomGenerator::global()->bounded(1, MAX_FEATURE_NUMBER); -+#else -+ qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); -+ auto featureNumber = qrand() % MAX_FEATURE_NUMBER + 1; -+#endif - auto temp = QString("%1 %2").arg(m_featureNamePrefix).arg(featureNumber); - - if (!m_featureNameSet.contains(temp)) -diff --git a/plugins/network/src/tray/wired-tray-widget.cpp b/plugins/network/src/tray/wired-tray-widget.cpp -index 02fac75..67b2224 100644 ---- a/plugins/network/src/tray/wired-tray-widget.cpp -+++ b/plugins/network/src/tray/wired-tray-widget.cpp -@@ -59,11 +59,11 @@ void WiredTrayWidget::initUI() - - void WiredTrayWidget::initConnection() - { -- connect(m_connectionList, &TrayConnectionList::connectionUpdated, this, &WiredTrayWidget::handleConnectionUpdated, Qt::UniqueConnection); -- connect(m_connectionList, &TrayConnectionList::activateSelectedConnection, this, &WiredTrayWidget::handleActivateSelectedConnection, Qt::UniqueConnection); -- connect(m_connectionList, &TrayConnectionList::disconnect, this, &WiredTrayWidget::handleDisconnect, Qt::UniqueConnection); -- connect(m_connectionList, &TrayConnectionList::cancelConnection, this, &WiredTrayWidget::handleCancelConnection, Qt::UniqueConnection); -- connect(m_connectionList, &TrayConnectionList::sizeChanged, this, &WiredTrayWidget::sizeChanged, Qt::UniqueConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::connectionUpdated, this, &WiredTrayWidget::handleConnectionUpdated, Qt::UniqueConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::activateSelectedConnection, this, &WiredTrayWidget::handleActivateSelectedConnection, Qt::UniqueConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::disconnect, this, &WiredTrayWidget::handleDisconnect, Qt::UniqueConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::cancelConnection, this, &WiredTrayWidget::handleCancelConnection, Qt::UniqueConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::sizeChanged, this, &WiredTrayWidget::sizeChanged, Qt::UniqueConnection); - - connect(m_wiredDevice.data(), &WiredDevice::carrierChanged, this, &WiredTrayWidget::handleCarrierChanged, Qt::UniqueConnection); - connect(m_wiredDevice.data(), &Device::stateChanged, this, &WiredTrayWidget::handleStateChanged, Qt::UniqueConnection); -diff --git a/plugins/network/src/tray/wireless-tray-widget.cpp b/plugins/network/src/tray/wireless-tray-widget.cpp -index 2054d99..7680376 100644 ---- a/plugins/network/src/tray/wireless-tray-widget.cpp -+++ b/plugins/network/src/tray/wireless-tray-widget.cpp -@@ -55,19 +55,19 @@ void WirelessTrayWidget::initUI() - - void WirelessTrayWidget::initConnection() - { -- connect(m_connectionList, &TrayConnectionList::activateSelectedWirelessNetwork, this, &WirelessTrayWidget::handleActivateSelectedWirelessNetwork); -- connect(m_connectionList, &TrayConnectionList::disconnect, this, &WirelessTrayWidget::handleDisconnect); -- connect(m_connectionList, &TrayConnectionList::cancelConnection, this, &WirelessTrayWidget::handleCancelConnection); -- connect(m_connectionList, &TrayConnectionList::ignoreConnection, this, &WirelessTrayWidget::handleIgnoreConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::activateSelectedWirelessNetwork, this, &WirelessTrayWidget::handleActivateSelectedWirelessNetwork); -+ connect(m_connectionList.data(), &TrayConnectionList::disconnect, this, &WirelessTrayWidget::handleDisconnect); -+ connect(m_connectionList.data(), &TrayConnectionList::cancelConnection, this, &WirelessTrayWidget::handleCancelConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::ignoreConnection, this, &WirelessTrayWidget::handleIgnoreConnection); - - connect(m_wirelessDevice.data(), &WirelessDevice::networkDisappeared, this, &WirelessTrayWidget::handleNetworkDisappeared); - connect(m_wirelessDevice.data(), &WirelessDevice::networkAppeared, this, &WirelessTrayWidget::handleNetworkAppeared); - -- connect(m_connectionList, &TrayConnectionList::sendPasswordToWirelessSetting, this, &WirelessTrayWidget::setSecurityPskAndActivateWirelessConnection); -- connect(m_connectionList, &TrayConnectionList::sendSsidToWireless, this, &WirelessTrayWidget::handleActivateHiddenNetwork); -+ connect(m_connectionList.data(), &TrayConnectionList::sendPasswordToWirelessSetting, this, &WirelessTrayWidget::setSecurityPskAndActivateWirelessConnection); -+ connect(m_connectionList.data(), &TrayConnectionList::sendSsidToWireless, this, &WirelessTrayWidget::handleActivateHiddenNetwork); - - connect(m_devicePtr.data(), &Device::stateChanged, this, &WirelessTrayWidget::handleDeviceStateChanged, Qt::UniqueConnection); -- connect(m_connectionList, &TrayConnectionList::sizeChanged, this, &WirelessTrayWidget::sizeChanged); -+ connect(m_connectionList.data(), &TrayConnectionList::sizeChanged, this, &WirelessTrayWidget::sizeChanged); - - connect(SignalForward::instance(), &SignalForward::wirelessConnectionAdded, this, &WirelessTrayWidget::handleNotifierConnectionAdded); - connect(SignalForward::instance(), &SignalForward::connectionRemoved, this, &WirelessTrayWidget::handleNotifierConnectionRemoved); -diff --git a/plugins/power/src/upower-interface.cpp b/plugins/power/src/upower-interface.cpp -index f929fbd..aa7960b 100644 ---- a/plugins/power/src/upower-interface.cpp -+++ b/plugins/power/src/upower-interface.cpp -@@ -32,7 +32,11 @@ bool UPowerInterface::haveBattery() - } - #endif - -+#if UP_CHECK_VERSION(0, 99, 8) - auto devices = up_client_get_devices2(upClient); -+#else -+ auto devices = up_client_get_devices(upClient); -+#endif - void *device = nullptr; - UpDeviceKind kind; - for (int i = 0; i < devices->len; i++) -diff --git a/plugins/system/src/pages/hardware-information/hardware-information.cpp b/plugins/system/src/pages/hardware-information/hardware-information.cpp -index 9e4ae2e..5232390 100644 ---- a/plugins/system/src/pages/hardware-information/hardware-information.cpp -+++ b/plugins/system/src/pages/hardware-information/hardware-information.cpp -@@ -88,9 +88,9 @@ void HardwareInformation::initUI(void) - ui->label_CPU_info->setToolTip(cpu); - - QList > hardwareMap = { -- {disks, ui->gridLayout_hard_disk}, -- {graphics, ui->gridLayout_graphics_card}, -- {eths, ui->gridLayout_network_card}}; -+ std::make_tuple(disks, ui->gridLayout_hard_disk), -+ std::make_tuple(graphics, ui->gridLayout_graphics_card), -+ std::make_tuple(eths, ui->gridLayout_network_card)}; - for (auto hardwareInitTuple : hardwareMap) - { - QStringList infos = std::get<0>(hardwareInitTuple); -diff --git a/plugins/system/src/pages/system-information/change-host-name-widget.cpp b/plugins/system/src/pages/system-information/change-host-name-widget.cpp -index c8ea9f6..7cad825 100644 ---- a/plugins/system/src/pages/system-information/change-host-name-widget.cpp -+++ b/plugins/system/src/pages/system-information/change-host-name-widget.cpp -@@ -61,11 +61,6 @@ void ChangeHostNameWidget::initUI() - setIcon(QIcon(":/images/kylin-about.png")); - - ui->btn_save->setEnabled(false); -- -- auto screen = QApplication::screenAt(QCursor::pos()); -- auto screenGeometry = screen->geometry(); -- this->move(screenGeometry.x() + (screenGeometry.width() - this->width()) / 2, -- screenGeometry.y() + (screenGeometry.height() - this->height()) / 2); - } - - void ChangeHostNameWidget::setNewHostName() -diff --git a/plugins/system/src/pages/system-information/system-information.cpp b/plugins/system/src/pages/system-information/system-information.cpp -index c249b69..9866d01 100644 ---- a/plugins/system/src/pages/system-information/system-information.cpp -+++ b/plugins/system/src/pages/system-information/system-information.cpp -@@ -268,7 +268,7 @@ void SystemInformation::handleChangeHostName() - { - if (hostNameWidget == nullptr) - { -- hostNameWidget = new ChangeHostNameWidget; -+ hostNameWidget = new ChangeHostNameWidget(this); - } - hostNameWidget->setAttribute(Qt::WA_QuitOnClose, false); - hostNameWidget->installEventFilter(this); -diff --git a/src/main.cpp b/src/main.cpp -index 2e75c10..2ff2737 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -123,6 +123,27 @@ void dumpPluginManagerInfo() - #endif - } - -+#if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0)) -+static QScreen *screenAt(const QPoint &point) -+{ -+ QVarLengthArray visitedScreens; -+ for (const QScreen *screen : QGuiApplication::screens()) { -+ if (visitedScreens.contains(screen)) -+ continue; -+ -+ // The virtual siblings include the screen itself, so iterate directly -+ for (QScreen *sibling : screen->virtualSiblings()) { -+ if (sibling->geometry().contains(point)) -+ return sibling; -+ -+ visitedScreens.append(sibling); -+ } -+ } -+ -+ return nullptr; -+} -+#endif -+ - int main(int argc, char *argv[]) - { - KiranSingleApplication app(argc, -@@ -165,7 +186,11 @@ int main(int argc, char *argv[]) - PanelWindow w; - w.jump(defaultCategory,defaultSubItem); - -+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - auto screen = QApplication::screenAt(QCursor::pos()); -+#else -+ auto screen = screenAt(QCursor::pos()); -+#endif - QRect screenGeometry = screen->geometry(); - w.resize(1031, 742); - w.move(screenGeometry.x() + (screenGeometry.width() - w.width()) / 2, --- -2.27.0 - diff --git a/0011-fix-build-delete-useless-methods.patch b/0011-fix-build-delete-useless-methods.patch new file mode 100644 index 0000000..0702e2e --- /dev/null +++ b/0011-fix-build-delete-useless-methods.patch @@ -0,0 +1,56 @@ +From 783eee898cda93ed345a91000834b972c971c327 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Tue, 9 Jan 2024 20:05:45 +0800 +Subject: [PATCH 11/17] fix(build): delete useless methods +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 删除无用的方法 +--- + plugins/appearance/utils/exclusion-group.cpp | 13 ------------- + plugins/appearance/utils/exclusion-group.h | 4 ---- + 2 files changed, 17 deletions(-) + +diff --git a/plugins/appearance/utils/exclusion-group.cpp b/plugins/appearance/utils/exclusion-group.cpp +index 12fb734..8db48ca 100644 +--- a/plugins/appearance/utils/exclusion-group.cpp ++++ b/plugins/appearance/utils/exclusion-group.cpp +@@ -125,19 +125,6 @@ void ExclusionGroup::removeExclusionItem(ExclusionWidget* widget) + m_exclusionItems.remove(widget); + } + +-template ::value>> +-QList ExclusionGroup::getExclusionItems() +-{ +- QList list; +- +- for( auto item : m_exclusionItems) +- { +- list << qobject_cast(item); +- } +- +- return list; +-} +- + void ExclusionGroup::onItemSelectedChanged(bool selected) + { + auto item = qobject_cast(sender()); +diff --git a/plugins/appearance/utils/exclusion-group.h b/plugins/appearance/utils/exclusion-group.h +index 4ca9bd0..7d66a1f 100644 +--- a/plugins/appearance/utils/exclusion-group.h ++++ b/plugins/appearance/utils/exclusion-group.h +@@ -65,10 +65,6 @@ public: + + void addExclusionItem(ExclusionWidget* widget); + void removeExclusionItem(ExclusionWidget* widget); +- +- template ::value>> +- QList getExclusionItems(); +- + signals: + void currentItemChanged(); + +-- +2.33.0 + diff --git a/0011-fix-tray-icon-Fixed-an-issue-where-the-tray-icon-was.patch b/0011-fix-tray-icon-Fixed-an-issue-where-the-tray-icon-was.patch deleted file mode 100644 index 8a61cfb..0000000 --- a/0011-fix-tray-icon-Fixed-an-issue-where-the-tray-icon-was.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 5160a4eab524c2208ef3f4743331a762f7f50ca7 Mon Sep 17 00:00:00 2001 -From: liuxinhao -Date: Fri, 15 Sep 2023 11:18:58 +0800 -Subject: [PATCH] fix(tray icon): Fixed an issue where the tray icon was not - displayed due to late registration of DBus tray service -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复了由于DBus托盘服务注册晚导致托盘图标不显示的问题 - -Closes #14006,#11856 ---- - plugins/audio/src/system-tray/main.cpp | 63 ++++++++---------------- - plugins/network/src/tray/main.cpp | 67 ++++++++++---------------- - 2 files changed, 47 insertions(+), 83 deletions(-) - -diff --git a/plugins/audio/src/system-tray/main.cpp b/plugins/audio/src/system-tray/main.cpp -index 169eb4d..431e6c9 100644 ---- a/plugins/audio/src/system-tray/main.cpp -+++ b/plugins/audio/src/system-tray/main.cpp -@@ -20,13 +20,13 @@ - #include - #include - #include -+#include - #include - #include - #include --#include - #include - --#define MAX_WAIT_COUNTS 10 -+#define DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER "org.kde.StatusNotifierWatcher" - - int main(int argc, char *argv[]) - { -@@ -39,56 +39,35 @@ int main(int argc, char *argv[]) - if (translator.load(QLocale(), "kiran-cpanel-audio", ".", TRANSLATE_PREFIX, ".qm")) - { - a.installTranslator(&translator); -- KLOG_INFO() << "installTranslator load:" << a.installTranslator(&translator); -+ KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); - } - else -- KLOG_INFO() << "installTranslator failed"; -+ { -+ KLOG_WARNING() << "installTranslator failed"; -+ } - - AudioSystemTray *audioSystemTray = nullptr; - -- QTimer timer; -- timer.setInterval(1000); -- int waitCounts = 0; -- QObject::connect(&timer, &QTimer::timeout, [&]() -- { -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher")) -- { -- KLOG_INFO() << "org.kde.StatusNotifierWatcher isServiceRegistered" << QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher"); -- KLOG_INFO() << "SessionDaemon.Audio isServiceRegistered " << QDBusConnection::sessionBus().interface()->isServiceRegistered("com.kylinsec.Kiran.SessionDaemon.Audio"); -- KLOG_INFO() << "QSystemTrayIcon::isSystemTrayAvailable():" << QSystemTrayIcon::isSystemTrayAvailable(); -- -- KLOG_INFO() << "init AudioSystemTray"; -- audioSystemTray = new AudioSystemTray; -- KLOG_INFO() << "wait loop : new AudioSystemTray sucess "; -- KLOG_INFO() << "currentDateTime:"< MAX_WAIT_COUNTS) -- { -- KLOG_INFO() << "超过等待次数,程序退出"; -- return QApplication::quit(); -- } -- } }); -- -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher")) -+ if (QDBusConnection::sessionBus().interface()->isServiceRegistered(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER)) - { -- KLOG_INFO() << "org.kde.StatusNotifierWatcher isServiceRegistered" << QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher"); -- KLOG_INFO() << "SessionDaemon.Audio isServiceRegistered " << QDBusConnection::sessionBus().interface()->isServiceRegistered("com.kylinsec.Kiran.SessionDaemon.Audio"); -- KLOG_INFO() << "QSystemTrayIcon::isSystemTrayAvailable():" << QSystemTrayIcon::isSystemTrayAvailable(); -- -- KLOG_INFO() << "init AudioSystemTray"; -+ KLOG_DEBUG() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create audio tray icon"; - audioSystemTray = new AudioSystemTray; -- KLOG_INFO() << "new AudioSystemTray sucess "; - } - else - { -- timer.start(); -- KLOG_INFO() << "start wait loop"; -- KLOG_INFO() << "currentDateTime:" << QDateTime::currentDateTime(); -+ KLOG_WARNING() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is not registered,wait"; -+ QDBusServiceWatcher* dbusServiceWatcher = new QDBusServiceWatcher; -+ dbusServiceWatcher->setConnection(QDBusConnection::sessionBus()); -+ dbusServiceWatcher->addWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -+ QObject::connect(dbusServiceWatcher, &QDBusServiceWatcher::serviceRegistered, -+ [&dbusServiceWatcher, &audioSystemTray](const QString& service) -+ { -+ if (service != DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER) -+ return; -+ KLOG_INFO() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create audio tray icon"; -+ audioSystemTray = new AudioSystemTray; -+ dbusServiceWatcher->removeWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -+ }); - } - return QApplication::exec(); - } -diff --git a/plugins/network/src/tray/main.cpp b/plugins/network/src/tray/main.cpp -index 26b04c7..2a62bf1 100644 ---- a/plugins/network/src/tray/main.cpp -+++ b/plugins/network/src/tray/main.cpp -@@ -17,67 +17,52 @@ - #include - #include - #include --#include -+#include - #include - #include "config.h" - #include "network-tray.h" --#define MAX_WAIT_COUNTS 10 - --int main(int argc, char *argv[]) { -+#define DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER "org.kde.StatusNotifierWatcher" -+ -+int main(int argc, char* argv[]) -+{ - KiranApplication a(argc, argv); - klog_qt5_init("", "kylinsec-session", "kiran-cpanel-network", "kiran-cpanel-network"); - - KLOG_INFO() << "autostart!"; -+ - QTranslator translator; - if (translator.load(QLocale(), "kiran-cpanel-network", ".", TRANSLATE_PREFIX, ".qm")) - { - a.installTranslator(&translator); -- KLOG_INFO() << "installTranslator load:" << a.installTranslator(&translator); -+ KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); - } - else -- KLOG_INFO() << "installTranslator failed"; -- -- NetworkTray *tray = nullptr; -- QTimer timer; -- timer.setInterval(1000); -- int waitCounts = 0; -- QObject::connect(&timer, &QTimer::timeout, [&]() { -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher")) -- { -- KLOG_INFO() << "org.kde.StatusNotifierWatcher isServiceRegistered" << QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher"); -- KLOG_INFO() << "QSystemTrayIcon::isSystemTrayAvailable():" << QSystemTrayIcon::isSystemTrayAvailable(); -- -- KLOG_INFO() << "init NetworkTray"; -- tray = new NetworkTray; -- KLOG_INFO() << "wait loop : new NetworkTray sucess "; -- KLOG_INFO() << "currentDateTime:"< MAX_WAIT_COUNTS) -- { -- KLOG_INFO() << "超过等待次数,程序退出"; -- return QApplication::quit(); -- } -- } -- }); -+ { -+ KLOG_WARNING() << "installTranslator failed"; -+ } - -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher")) -+ NetworkTray* tray = nullptr; -+ if (QDBusConnection::sessionBus().interface()->isServiceRegistered(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER)) - { -- KLOG_INFO() << "org.kde.StatusNotifierWatcher isServiceRegistered" << QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher"); -- KLOG_INFO() << "QSystemTrayIcon::isSystemTrayAvailable():" << QSystemTrayIcon::isSystemTrayAvailable(); -- KLOG_INFO() << "init NetworkTray"; -+ KLOG_DEBUG() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create network tray icon"; - tray = new NetworkTray; -- KLOG_INFO() << "new NetworkTray sucess "; - } - else - { -- timer.start(); -- KLOG_INFO() << "start wait loop"; -- KLOG_INFO() << "currentDateTime:" << QDateTime::currentDateTime(); -+ KLOG_WARNING() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is not registered,wait"; -+ QDBusServiceWatcher* dbusServiceWatcher = new QDBusServiceWatcher; -+ dbusServiceWatcher->setConnection(QDBusConnection::sessionBus()); -+ dbusServiceWatcher->addWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -+ QObject::connect(dbusServiceWatcher, &QDBusServiceWatcher::serviceRegistered, -+ [&dbusServiceWatcher, &tray](const QString& service) -+ { -+ if (service != DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER) -+ return; -+ KLOG_INFO() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create network tray icon"; -+ tray = new NetworkTray; -+ dbusServiceWatcher->removeWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -+ }); - } - - return QApplication::exec(); --- -2.33.0 - diff --git a/0012-fix-font-Fix-the-issue-of-ineffective-font-changes.patch b/0012-fix-font-Fix-the-issue-of-ineffective-font-changes.patch new file mode 100644 index 0000000..0e4154e --- /dev/null +++ b/0012-fix-font-Fix-the-issue-of-ineffective-font-changes.patch @@ -0,0 +1,39 @@ +From 4f311e12f5c61c56aece10097d106a980f633c85 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Tue, 9 Jan 2024 17:09:06 +0800 +Subject: [PATCH 12/17] fix(font): Fix the issue of ineffective font changes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复字体更改后不生效的问题 + +Closes #25084 +--- + plugins/appearance/pages/font/fonts.cpp | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/plugins/appearance/pages/font/fonts.cpp b/plugins/appearance/pages/font/fonts.cpp +index e722123..c1c6875 100644 +--- a/plugins/appearance/pages/font/fonts.cpp ++++ b/plugins/appearance/pages/font/fonts.cpp +@@ -113,14 +113,9 @@ void Fonts::initConnections() + connect(AppearanceGlobalInfo::instance(), &AppearanceGlobalInfo::fontChanged, + this, &Fonts::onBackendFontChanged); + +- for (auto fontTypeCombos : m_fontTypeComboBoxMap.values()) ++ for (auto fontTypeCombo : m_comboFontTypesMap.keys()) + { +- auto fontNameComboBox = fontTypeCombos.first; +- auto fontSizeComboBox = fontTypeCombos.second; +- +- connect(fontNameComboBox, QOverload::of(&QComboBox::currentIndexChanged), +- this, &Fonts::onCurrentFontFamilyChanged); +- connect(fontSizeComboBox, QOverload::of(&QComboBox::currentIndexChanged), ++ connect(fontTypeCombo, QOverload::of(&QComboBox::currentIndexChanged), + this, &Fonts::onCurrentFontFamilyChanged); + } + +-- +2.33.0 + diff --git a/0012-fix-network-tray-Improved-the-notification-logic.-Wi.patch b/0012-fix-network-tray-Improved-the-notification-logic.-Wi.patch deleted file mode 100644 index 805d2a6..0000000 --- a/0012-fix-network-tray-Improved-the-notification-logic.-Wi.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 5628b4b31eeb7493abe41bb9a6935955f0ca090a Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Fri, 15 Sep 2023 16:19:15 +0800 -Subject: [PATCH] fix(network-tray):Improved the notification logic. "Wired - NIC: xxx is unavailable" and "Network is Unavailable" are no longer displayed - during sleep recovery. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 完善通知弹窗逻辑,从休眠中恢复过程中不再提示“有线网卡:xxx不可用”和“网络不可用”。 - -Close #15619 ---- - plugins/network/src/tray/network-tray.cpp | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp -index 7397e28..dd5ff12 100644 ---- a/plugins/network/src/tray/network-tray.cpp -+++ b/plugins/network/src/tray/network-tray.cpp -@@ -473,9 +473,21 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat - } - } - -- // 设备变为不可用时,如果无线和有线均不可用则显示网络不可用的提示 -- if (newstate == Device::Unavailable || newstate == Device::Unmanaged || newstate == Device::UnknownState) -+ QSet unavailableStates = { -+ Device::Unavailable, -+ Device::Unmanaged, -+ Device::UnknownState -+ }; -+ -+ // 非休眠的情况下,从可用状态到不可用状态通知 -+ if (!unavailableStates.contains(oldstate) -+ && -+ unavailableStates.contains(newstate) -+ && -+ reason != Device::SleepingReason -+ ) - { -+ // 设备变为不可用时,如果无线和有线均不可用则显示网络不可用的提示 - KLOG_DEBUG() << "device is unavailable"; - if ((NetworkUtils::getAvailableDeviceList(Device::Ethernet).count() == 0) && - (NetworkUtils::getAvailableDeviceList(Device::Wifi).count() == 0)) --- -2.33.0 - diff --git a/0013-fix-network-Modify-DNS-Settings-and-display-DNS-deta.patch b/0013-fix-network-Modify-DNS-Settings-and-display-DNS-deta.patch deleted file mode 100644 index 288d042..0000000 --- a/0013-fix-network-Modify-DNS-Settings-and-display-DNS-deta.patch +++ /dev/null @@ -1,370 +0,0 @@ -From 2fcd30a538df01ae8505cf5c1baf26d18b1d2cef Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Mon, 18 Sep 2023 10:39:58 +0800 -Subject: [PATCH] fix(network):Modify DNS Settings and display DNS details -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 自动获取IP(DNS)后,网络详情显示自动获取到的DNS - 手动配置DNS,网络详情中DNS服务器仅显示手动配置的DNS - -Close #14000 ---- - .../connection-details-widget.cpp | 51 +++++-- - .../details-page/connection-details-widget.ui | 6 +- - .../src/plugin/setting-widget/ipv4-widget.cpp | 135 +++++++++--------- - .../src/plugin/setting-widget/ipv4-widget.ui | 8 +- - 4 files changed, 116 insertions(+), 84 deletions(-) - -diff --git a/plugins/network/src/plugin/details-page/connection-details-widget.cpp b/plugins/network/src/plugin/details-page/connection-details-widget.cpp -index d94b1bd..235c48d 100644 ---- a/plugins/network/src/plugin/details-page/connection-details-widget.cpp -+++ b/plugins/network/src/plugin/details-page/connection-details-widget.cpp -@@ -67,7 +67,7 @@ void ConnectionDetailsWidget::init() - void ConnectionDetailsWidget::initUI() - { - QList widgets = {ui->securityTypeWidget, ui->frequencyBandWidget, ui->channelWidget, ui->InterfaceWidget, -- ui->macWidget, ui->ipv4Widget, ui->gatewayWidget, ui->preferredDNSWidget, ui->subnetMaskWidget, -+ ui->macWidget, ui->ipv4Widget, ui->gatewayWidget, ui->DNSWidget, ui->subnetMaskWidget, - ui->ipv6Widget, ui->ipv6GatewayWidget, ui->prefixWidget, ui->rateWidget}; - - for (auto widget : widgets) -@@ -76,7 +76,7 @@ void ConnectionDetailsWidget::initUI() - } - - QList labels = {ui->securityType, ui->frequencyBand, ui->channel, ui->networkInterface, -- ui->mac, ui->ipv4, ui->ipv4Gateway, ui->preferredDNS, ui->subnetMask, -+ ui->mac, ui->ipv4, ui->ipv4Gateway, ui->DNS, ui->subnetMask, - ui->ipv6, ui->ipv6Gateway, ui->prefix, ui->rate}; - - for (auto label : labels) -@@ -151,25 +151,54 @@ void ConnectionDetailsWidget::setIpDetails() - ui->subnetMask->setText(netmask); - ui->ipv4Gateway->setText(gateway); - -- QString preferredDNS = "-"; - Dhcp4Config::Ptr dhcp = m_activeConnection->dhcp4Config(); - auto dhcpOptions = dhcp->options(); -+ -+ QStringList tmpDNS; -+ -+ QStringList dhcpDns; - if (!dhcpOptions.isEmpty()) - { - QVariant domainNameServers = dhcpOptions.value("domain_name_servers"); -- // 以空格为分隔 -- QStringList dns = domainNameServers.toString().split(" "); -- preferredDNS = dns.value(0); -+ dhcpDns = domainNameServers.toString().split(" "); - } -- else -+ -+ Ipv4Setting::Ptr ipv4Setting = m_connection->settings()->setting(Setting::Ipv4).dynamicCast(); -+ QList ipv4SettingDNS = ipv4Setting->dns(); -+ -+ QStringList manualDNS; -+ -+ for(auto &address : ipv4SettingDNS) -+ { -+ manualDNS << address.toString(); -+ } -+ /** -+ * NOTE: -+ * 1、自动获取IP(DNS)后,网络详情显示自动获取到的DNS -+ * 2、手动配置DNS,网络详情中DNS服务器仅显示手动配置的DNS -+ */ -+ -+ QString detailsDNS; -+ manualDNS.isEmpty() ? tmpDNS = dhcpDns : tmpDNS = manualDNS; -+ if(!tmpDNS.isEmpty()) - { -- Ipv4Setting::Ptr ipv4Setting = m_connection->settings()->setting(Setting::Ipv4).dynamicCast(); -- if (!ipv4Setting->dns().isEmpty()) -+ // 以空格为分隔,删除最后一个; -+ for(auto &dns : tmpDNS) - { -- preferredDNS = ipv4Setting->dns().value(0).toString(); -+ detailsDNS.append(dns); -+ detailsDNS.append(";"); - } -+ if(detailsDNS.endsWith(";")) -+ { -+ detailsDNS.remove(detailsDNS.size() - 1,1); -+ } -+ } -+ else -+ { -+ detailsDNS = "-"; - } -- ui->preferredDNS->setText(preferredDNS); -+ -+ ui->DNS->setText(detailsDNS); - - IpConfig ipV6Config = m_activeConnection->ipV6Config(); - IpAddress ipv6Address = ipV6Config.addresses().value(0); -diff --git a/plugins/network/src/plugin/details-page/connection-details-widget.ui b/plugins/network/src/plugin/details-page/connection-details-widget.ui -index c83af72..b781390 100644 ---- a/plugins/network/src/plugin/details-page/connection-details-widget.ui -+++ b/plugins/network/src/plugin/details-page/connection-details-widget.ui -@@ -518,7 +518,7 @@ - - - -- -+ - - - 0 -@@ -556,7 +556,7 @@ - - - -- Preferred DNS -+ DNS - - - -@@ -574,7 +574,7 @@ - - - -- -+ - - TextLabel - -diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -index 8c39794..8dc420f 100644 ---- a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -+++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp -@@ -74,65 +74,68 @@ void Ipv4Widget::setErrorTips(KiranTips *errorTips) - - void Ipv4Widget::saveSettings() - { -- if (m_ipv4Setting != nullptr) -+ if (m_ipv4Setting == nullptr) - { -- IpAddress ipv4Address; -- Ipv4Setting::ConfigMethod method = ui->ipv4Method->currentData().value(); -- if (method == Ipv4Setting::ConfigMethod::Automatic) -- { -- m_ipv4Setting->setMethod(method); -- ipv4Address.setIp(QHostAddress("")); -- ipv4Address.setNetmask(QHostAddress("")); -- ipv4Address.setGateway(QHostAddress("")); -- m_ipv4Setting->setAddresses(QList() << ipv4Address); -- } -- else if (method == Ipv4Setting::ConfigMethod::Manual) -- { -- m_ipv4Setting->setMethod(method); -+ return; -+ } -+ -+ IpAddress ipv4Address; -+ Ipv4Setting::ConfigMethod method = ui->ipv4Method->currentData().value(); -+ if (method == Ipv4Setting::ConfigMethod::Automatic) -+ { -+ m_ipv4Setting->setMethod(method); -+ ipv4Address.setIp(QHostAddress("")); -+ ipv4Address.setNetmask(QHostAddress("")); -+ ipv4Address.setGateway(QHostAddress("")); -+ m_ipv4Setting->setAddresses(QList() << ipv4Address); -+ } -+ else if (method == Ipv4Setting::ConfigMethod::Manual) -+ { -+ m_ipv4Setting->setMethod(method); - -- ipv4Address.setIp(QHostAddress(ui->ipv4Address->text())); -- QString netMask = ui->ipv4Netmask->text(); -- if (!netMask.contains(".")) -+ ipv4Address.setIp(QHostAddress(ui->ipv4Address->text())); -+ QString netMask = ui->ipv4Netmask->text(); -+ if (!netMask.contains(".")) -+ { -+ int netPrefix = netMask.toInt(); -+ KLOG_DEBUG() << "netMask.toInt():" << netMask.toInt(); -+ if ((netPrefix > 0) & (netPrefix < 33)) - { -- int netPrefix = netMask.toInt(); -- KLOG_DEBUG() << "netMask.toInt():" << netMask.toInt(); -- if ((netPrefix > 0) & (netPrefix < 33)) -- { -- ipv4Address.setPrefixLength(netPrefix); -- } -- else -- { -- KLOG_DEBUG() << "Net prefix length error"; -- } -+ ipv4Address.setPrefixLength(netPrefix); - } - else - { -- ipv4Address.setNetmask(QHostAddress(netMask)); -+ KLOG_DEBUG() << "Net prefix length error"; - } -- -- ipv4Address.setGateway(QHostAddress(ui->ipv4Gateway->text())); -- KLOG_DEBUG() << "ipv4Address.ip():" << ipv4Address.ip(); -- KLOG_DEBUG() << "ipv4Address.netmask():" << ipv4Address.netmask(); -- KLOG_DEBUG() << "ipv4Address.prefixLength():" << ipv4Address.prefixLength(); -- KLOG_DEBUG() << "ipv4Address.gateway():" << ipv4Address.gateway(); -- -- QList ipv4AddresseList; -- ipv4AddresseList << ipv4Address; -- m_ipv4Setting->setAddresses(ipv4AddresseList); -- } -- -- QList ipv4DNS; -- if (!ui->ipv4PreferredDNS->text().isEmpty()) -- { -- ipv4DNS << QHostAddress(ui->ipv4PreferredDNS->text()); - } -- if (!ui->ipv4AlternateDNS->text().isEmpty()) -+ else - { -- ipv4DNS << QHostAddress(ui->ipv4AlternateDNS->text()); -+ ipv4Address.setNetmask(QHostAddress(netMask)); - } -- KLOG_DEBUG() << "ipv4DNS:" << ipv4DNS; -- m_ipv4Setting->setDns(ipv4DNS); -+ -+ ipv4Address.setGateway(QHostAddress(ui->ipv4Gateway->text())); -+ KLOG_DEBUG() << "ipv4Address.ip():" << ipv4Address.ip(); -+ KLOG_DEBUG() << "ipv4Address.netmask():" << ipv4Address.netmask(); -+ KLOG_DEBUG() << "ipv4Address.prefixLength():" << ipv4Address.prefixLength(); -+ KLOG_DEBUG() << "ipv4Address.gateway():" << ipv4Address.gateway(); -+ -+ QList ipv4AddresseList; -+ ipv4AddresseList << ipv4Address; -+ m_ipv4Setting->setAddresses(ipv4AddresseList); -+ } -+ -+ QList ipv4DNS; -+ if (!ui->ipv4FirstDNS->text().isEmpty()) -+ { -+ ipv4DNS << QHostAddress(ui->ipv4FirstDNS->text()); -+ } -+ if (!ui->ipv4SecondDNS->text().isEmpty()) -+ { -+ ipv4DNS << QHostAddress(ui->ipv4SecondDNS->text()); - } -+ KLOG_DEBUG() << "ipv4DNS:" << ipv4DNS; -+ m_ipv4Setting->setDns(ipv4DNS); -+ - } - - void Ipv4Widget::showSettings() -@@ -171,20 +174,20 @@ void Ipv4Widget::showSettings() - ui->ipv4Gateway->clear(); - } - } -- QString preferredDNS = ""; -- QString alternateDNS = ""; -+ QString firstDNS = ""; -+ QString secondDNS = ""; - if (!m_ipv4Setting->dns().isEmpty()) - { -- preferredDNS = m_ipv4Setting->dns().at(0).toString(); -+ firstDNS = m_ipv4Setting->dns().at(0).toString(); - if (m_ipv4Setting->dns().count() >= 2) - { -- alternateDNS = m_ipv4Setting->dns().at(1).toString(); -+ secondDNS = m_ipv4Setting->dns().at(1).toString(); - } - } -- KLOG_DEBUG() << "preferredDNS:" << preferredDNS; -- KLOG_DEBUG() << "alternateDNS:" << alternateDNS; -- ui->ipv4PreferredDNS->setText(preferredDNS); -- ui->ipv4AlternateDNS->setText(alternateDNS); -+ KLOG_DEBUG() << "firstDNS:" << firstDNS; -+ KLOG_DEBUG() << "secondDNS:" << secondDNS; -+ ui->ipv4FirstDNS->setText(firstDNS); -+ ui->ipv4SecondDNS->setText(secondDNS); - } - else - resetSettings(); -@@ -197,8 +200,8 @@ void Ipv4Widget::resetSettings() - ui->ipv4Address->clear(); - ui->ipv4Netmask->clear(); - ui->ipv4Gateway->clear(); -- ui->ipv4PreferredDNS->clear(); -- ui->ipv4AlternateDNS->clear(); -+ ui->ipv4FirstDNS->clear(); -+ ui->ipv4SecondDNS->clear(); - } - - void Ipv4Widget::clearPtr() -@@ -271,27 +274,27 @@ bool Ipv4Widget::isInputValid() - } - } - -- QString preferredDNS = ui->ipv4PreferredDNS->text(); -- if (!preferredDNS.isEmpty()) -+ QString firstDNS = ui->ipv4FirstDNS->text(); -+ if (!firstDNS.isEmpty()) - { -- if (!isIpv4AddressValid(preferredDNS)) -+ if (!isIpv4AddressValid(firstDNS)) - { - QString error = QString(tr("Ipv4 Preferred DNS invalid")); - m_errorTip->setText(error); -- m_errorTip->showTipAroundWidget(ui->ipv4PreferredDNS); -+ m_errorTip->showTipAroundWidget(ui->ipv4FirstDNS); - KLOG_DEBUG() << "Ipv4 Preferred DNS invalid"; - return false; - } - } - -- QString alternateDNS = ui->ipv4AlternateDNS->text(); -- if (!alternateDNS.isEmpty()) -+ QString secondDNS = ui->ipv4SecondDNS->text(); -+ if (!secondDNS.isEmpty()) - { -- if (!isIpv4AddressValid(alternateDNS)) -+ if (!isIpv4AddressValid(secondDNS)) - { - QString error = QString(tr("Ipv4 Alternate DNS invalid")); - m_errorTip->setText(error); -- m_errorTip->showTipAroundWidget(ui->ipv4AlternateDNS); -+ m_errorTip->showTipAroundWidget(ui->ipv4SecondDNS); - KLOG_DEBUG() << "Ipv4 Alternate DNS invalid"; - return false; - } -diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.ui b/plugins/network/src/plugin/setting-widget/ipv4-widget.ui -index 026e26d..93b2355 100644 ---- a/plugins/network/src/plugin/setting-widget/ipv4-widget.ui -+++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.ui -@@ -187,12 +187,12 @@ - - - -- Preferred DNS -+ DNS 1 - - - - -- -+ - - - 0 -@@ -220,12 +220,12 @@ - - - -- Alternate DNS -+ DNS 2 - - - - -- -+ - - - 0 --- -2.33.0 - diff --git a/0013-fix-theme-change-the-light-and-dark-theme-name.patch b/0013-fix-theme-change-the-light-and-dark-theme-name.patch new file mode 100644 index 0000000..55d90c8 --- /dev/null +++ b/0013-fix-theme-change-the-light-and-dark-theme-name.patch @@ -0,0 +1,82 @@ +From 0422be13648a36784fcffc5a04ba725c7984b290 Mon Sep 17 00:00:00 2001 +From: yuanxing +Date: Thu, 11 Jan 2024 23:23:37 +0800 +Subject: [PATCH 13/17] fix(theme):change the light and dark theme name +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修改深浅色主题名为冰晶白、曜岩黑 + +Fixes #24747 +--- + plugins/appearance/pages/theme/theme-page.cpp | 2 +- + plugins/appearance/pages/theme/theme-page.ui | 9 +-------- + translations/kiran-control-panel.zh_CN.ts | 4 ++-- + 3 files changed, 4 insertions(+), 11 deletions(-) + +diff --git a/plugins/appearance/pages/theme/theme-page.cpp b/plugins/appearance/pages/theme/theme-page.cpp +index 7c303b7..24a5c7a 100644 +--- a/plugins/appearance/pages/theme/theme-page.cpp ++++ b/plugins/appearance/pages/theme/theme-page.cpp +@@ -27,7 +27,7 @@ + #include + + #define DARK_THEME "Kiran-dark" +-#define LIGHT_THEME "Kiran" ++#define LIGHT_THEME "Kiran-white" + #define THEME_AUTO_NAME "Kiran-auto" + + #define SETTING_THEME_NUM 2 +diff --git a/plugins/appearance/pages/theme/theme-page.ui b/plugins/appearance/pages/theme/theme-page.ui +index eecc81e..7c61009 100644 +--- a/plugins/appearance/pages/theme/theme-page.ui ++++ b/plugins/appearance/pages/theme/theme-page.ui +@@ -78,7 +78,7 @@ + + + +- Dark and Light Theme ++ Themes Settings + + + +@@ -103,13 +103,6 @@ + + 10 + +- +- +- +- Themes Settings +- +- +- + + + +diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts +index 970c5a0..8e39486 100644 +--- a/translations/kiran-control-panel.zh_CN.ts ++++ b/translations/kiran-control-panel.zh_CN.ts +@@ -5303,7 +5303,7 @@ This is line 50 of the test text + + + Light Theme +- 浅色 ++ 冰晶白 + + + +@@ -5313,7 +5313,7 @@ This is line 50 of the test text + + + Dark Theme +- 深色 ++ 曜岩黑 + + + +-- +2.33.0 + diff --git a/0014-fix-shortcut-add-custom-app-icon-Error-prompt-for-mo.patch b/0014-fix-shortcut-add-custom-app-icon-Error-prompt-for-mo.patch new file mode 100644 index 0000000..ef16052 --- /dev/null +++ b/0014-fix-shortcut-add-custom-app-icon-Error-prompt-for-mo.patch @@ -0,0 +1,482 @@ +From 55049f4ee286633b486936c7f4d19d3d426453a0 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Mon, 15 Jan 2024 16:31:01 +0800 +Subject: [PATCH 14/17] fix(shortcut): add custom app icon,Error prompt for + modifying input shortcut keys +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修改录入快捷键错误提示,新增自定义应用图标显示 + +Closes #25199,#25198 +--- + plugins/keybinding/shortcut.cpp | 79 ++++++++++++---- + plugins/keybinding/shortcut.h | 10 +- + translations/kiran-control-panel.zh_CN.ts | 106 ++++++++++++---------- + 3 files changed, 127 insertions(+), 68 deletions(-) + +diff --git a/plugins/keybinding/shortcut.cpp b/plugins/keybinding/shortcut.cpp +index bab4ad1..84c0cba 100644 +--- a/plugins/keybinding/shortcut.cpp ++++ b/plugins/keybinding/shortcut.cpp +@@ -31,12 +31,15 @@ + #include + #include + +-Q_DECLARE_METATYPE(QList) ++#define DEFAULT_APP_ICON "application-script-blank" ++#define APP_ICON_WIDTH 20 + ++Q_DECLARE_METATYPE(QList) + using namespace Kiran; + +-Shortcut::Shortcut(QWidget *parent) : QWidget(parent), +- ui(new Ui::Shortcut) ++Shortcut::Shortcut(QWidget *parent) ++ : QWidget(parent), ++ ui(new Ui::Shortcut) + { + ui->setupUi(this); + init(); +@@ -100,16 +103,24 @@ void Shortcut::initUI() + } + + QHBoxLayout *hLayoutCustomApp = new QHBoxLayout(ui->lineEdit_custom_app); ++ m_customAppIcon = new QLabel; ++ m_customAppIcon->setFixedSize(24, 24); ++ m_customAppIcon->setPixmap(QIcon::fromTheme(DEFAULT_APP_ICON).pixmap(20, 20)); ++ hLayoutCustomApp->addWidget(m_customAppIcon, 0, Qt::AlignVCenter); ++ ++ hLayoutCustomApp->addStretch(); ++ + m_btnCustomApp = new QToolButton; + m_btnCustomApp->setObjectName("btn_custom_app"); + m_btnCustomApp->setAccessibleName("ButtonAddCustomApp"); + m_btnCustomApp->setText(tr("Add")); + m_btnCustomApp->setFixedSize(56, 30); + m_btnCustomApp->setCursor(Qt::PointingHandCursor); +- hLayoutCustomApp->addStretch(); + hLayoutCustomApp->addWidget(m_btnCustomApp); +- ui->lineEdit_custom_app->setTextMargins(0, 0, m_btnCustomApp->width(), 0); ++ ++ ui->lineEdit_custom_app->setTextMargins(25, 0, m_btnCustomApp->width(), 0); + connect(m_btnCustomApp, &QToolButton::clicked, this, &Shortcut::openFileSys); ++ connect(ui->lineEdit_custom_app,&QLineEdit::textChanged,this,&Shortcut::handleCustomAppTextChanged); + + QHBoxLayout *hLayoutModifyApp = new QHBoxLayout(ui->lineEdit_modify_app); + m_btnModifyApp = new QToolButton; +@@ -354,7 +365,7 @@ bool Shortcut::isValidKeycode(QList keycodes) + return !pureModifier; + } + +-bool Shortcut::getExecFromDesktop(QString fileName, QString &exec) ++bool Shortcut::extractDesktopInfo(const QString &fileName, QString &exec, QString &icon) + { + QSettings settings(fileName, QSettings::IniFormat); + QString str = settings.value("Desktop Entry/Exec").toString(); +@@ -368,6 +379,10 @@ bool Shortcut::getExecFromDesktop(QString fileName, QString &exec) + str = str.replace("%u", "", Qt::CaseInsensitive); + + exec = str; ++ ++ str = settings.value("Desktop Entry/Icon").toString(); ++ icon = str.isEmpty() ? DEFAULT_APP_ICON : str; ++ + return true; + } + +@@ -376,23 +391,38 @@ void Shortcut::openFileSys() + QToolButton *senderbtn = qobject_cast(sender()); + QLineEdit *lineEdit = qobject_cast(senderbtn->parent()); + +- QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "/usr/share/applications"); ++ QString fileName = QFileDialog::getOpenFileName(this, ++ tr("Open File"), ++ "/usr/share/applications", ++ tr("Desktop entries(*.desktop)")); + if (fileName.isNull()) + return; + +- QString exec = fileName; +- if (fileName.endsWith(".desktop")) ++ QString cmd; ++ QString icon = DEFAULT_APP_ICON; ++ if (!extractDesktopInfo(fileName, cmd, icon)) + { +- QString tmp; +- if (!getExecFromDesktop(fileName, tmp)) +- { +- KLOG_ERROR(qLcKeybinding) << "cant't get Exec key from " << fileName; +- return; +- } +- exec = tmp; ++ KLOG_ERROR(qLcKeybinding) << "cant't get Exec key from " << fileName; ++ KiranMessageBox::message(this, tr("Error"), ++ "Extracting the program to be executed from the application's desktop file failed", ++ KiranMessageBox::Ok); ++ return; ++ } ++ ++ // 缓存该次添加的应用以及图标信息 ++ // 后续启动命令修改的时候,应复位图标 ++ m_lastIcon = icon; ++ m_lastIconExec = cmd; ++ ++ QIcon appIcon = QIcon::fromTheme(icon); ++ if( appIcon.isNull() ) ++ { ++ m_lastIcon = DEFAULT_APP_ICON; ++ appIcon = QIcon::fromTheme(DEFAULT_APP_ICON); + } + +- lineEdit->setText(exec); ++ m_customAppIcon->setPixmap(appIcon.pixmap(QSize(APP_ICON_WIDTH,APP_ICON_WIDTH))); ++ lineEdit->setText(cmd); + } + + void Shortcut::handleSearchTimerTimeout() +@@ -787,6 +817,16 @@ void Shortcut::handleResetClicked() + } + } + ++void Shortcut::handleCustomAppTextChanged(const QString& text) ++{ ++ // 直接编辑自定义应用输入框,修改命令 ++ // 导致和desktop读取出来的不一致时清空图标 ++ if( !text.isEmpty() && text != m_lastIconExec ) ++ { ++ m_customAppIcon->setPixmap(QIcon::fromTheme(DEFAULT_APP_ICON).pixmap(20,20)); ++ } ++} ++ + void Shortcut::handleInputKeycode(QList keycodes) + { + CustomLineEdit *senderLineEdit = qobject_cast(sender()); +@@ -803,8 +843,9 @@ void Shortcut::handleInputKeycode(QList keycodes) + { + KiranMessageBox::message(nullptr, + tr("Failed"), +- QString(tr("Cannot use shortcut \"%1\", Because you cannot enter with this key." +- "Please try again using Ctrl, Alt, or Shift at the same time.")) ++ QString(tr("Cannot use shortcut \"%1\"," ++ "Please keep pressing the modifier keys such as Ctrl," ++ "Alt, and Shift before pressing the last key of the shortcut key")) + .arg(keyStr), + KiranMessageBox::Ok); + return; +diff --git a/plugins/keybinding/shortcut.h b/plugins/keybinding/shortcut.h +index fc078fb..3504b1b 100644 +--- a/plugins/keybinding/shortcut.h ++++ b/plugins/keybinding/shortcut.h +@@ -35,6 +35,8 @@ class ShortcutItem; + class KeyMap; + class CustomLineEdit; + class KeybindingBackEndProxy; ++class QLabel; ++ + class Shortcut : public QWidget + { + Q_OBJECT +@@ -59,7 +61,7 @@ private: + ShortcutItem *createShortcutItem(QVBoxLayout *parent, ShortcutInfoPtr shortcutInfo, int type); + bool isConflict(QString &originName, QString newKeyCombination); + bool isValidKeycode(QList keycodes); +- bool getExecFromDesktop(QString fileName, QString &exec); ++ bool extractDesktopInfo(const QString& fileName, QString &exec, QString &icon); + void updateShorcut(ShortcutInfoPtr newShortcut); + void insertShortcut(ShortcutInfoPtr shortcutInfo); + void clearFilterItems(); +@@ -72,6 +74,7 @@ public slots: + void handledShortcutDeleted(QString result); + void handleShortcutChanged(QString result); + ++ void handleCustomAppTextChanged(const QString& text); + void handleInputKeycode(QList keycodes); + + void handleItemDeleteClicked(QString uid); +@@ -96,8 +99,13 @@ private: + QList m_shortcutItem; + QList m_filterItem; + ++ //记录上次通过应用打开的desktop文件记录的Exec和Icon ++ QString m_lastIconExec; ++ QString m_lastIcon; ++ + QToolButton *m_btnModifyApp; + QToolButton *m_btnCustomApp; ++ QLabel *m_customAppIcon; + CustomLineEdit *m_lECustomKey; + CustomLineEdit *m_lEModifyKey; + +diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts +index 970c5a0..31fc01e 100644 +--- a/translations/kiran-control-panel.zh_CN.ts ++++ b/translations/kiran-control-panel.zh_CN.ts +@@ -33,18 +33,18 @@ + AccountWidget + + +- ++ + disable + 禁用 + + + +- ++ + enable + 启用 + + +- ++ + Create new user + 创建新用户 + +@@ -2983,22 +2983,22 @@ + 请用分号分隔多个DNS + + +- ++ + Ipv6 DNS invalid + 无效的Ipv6 DNS + + +- ++ + Ipv6 address can not be empty + Ipv6地址不能为空 + + +- ++ + Ipv6 address invalid + 无效的Ipv6地址 + + +- ++ + Ipv6 Gateway invalid + 无效的Ipv6网关 + +@@ -4675,8 +4675,8 @@ This is line 50 of the test text + + + +- +- ++ ++ + Edit + 编辑 + +@@ -4688,8 +4688,8 @@ This is line 50 of the test text + + + +- +- ++ ++ + Add + 添加 + +@@ -4742,7 +4742,7 @@ This is line 50 of the test text + + + Cancel +- 取消 ++ 取消 + + + +@@ -4772,7 +4772,7 @@ This is line 50 of the test text + + + Save +- 保存 ++ 保存 + + + +@@ -4782,129 +4782,139 @@ This is line 50 of the test text + + + return +- 返回 ++ 返回 + + +- ++ + Please enter a search keyword... + 请输入搜索关键字... + + +- ++ + Required + 必填 + + +- +- ++ ++ + Please press the new shortcut key + 请输入新快捷键 + + +- ++ + Finished + 完成 + + +- ++ + failed to load shortcut key data! + 加载快捷键数据失败! + + +- ++ + List shortcut failed,error:%1 + 列出快捷键失败,错误:%1 + + +- ++ ++ + Error + 错误 + + +- ++ + Get shortcut failed,error: + 获取快捷键失败,错误: + + +- ++ + Open File + 打开文件 + + +- ++ ++ Desktop entries(*.desktop) ++ 桌面文件(*.desktop) ++ ++ ++ + System + 系统 + + +- ++ + Sound + 声音 + + +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ + Failed + 失败 + + +- ++ + Delete shortcut failed,error: + 删除快捷键失败,错误: + + +- +- ++ ++ + Warning +- 警告 ++ 警告 + + +- +- ++ ++ + Please complete the shortcut information! + 请完善快捷键信息! + + +- ++ + Set shortcut + 设置快捷键 + + +- ++ + Are you sure you want to disable this shortcut? + 是否确定要禁用此快捷键? + + +- ++ + Modify system shortcut failed,error: + 修改系统快捷键失败,错误: + + +- ++ + Modify custom shortcut failed,error: + 修改自定义快捷键失败,错误: + + +- ++ + Add custom shortcut failed,error: + 添加自定义快捷键失败,错误: + + +- ++ + Reset shortcut failed,error: + 重置快捷键失败,错误: + + +- ++ ++ Cannot use shortcut "%1",Please keep pressing the modifier keys such as Ctrl,Alt, and Shift before pressing the last key of the shortcut key ++ 无法使用快捷键"%1", 请保持按压Ctrl、Alt、Shift等修饰键后,再按压快捷键的最后一个键 ++ ++ + Cannot use shortcut "%1", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. +- 无法使用快捷键"%1",因为使用此键将无法输入,请同时使用Ctrl,Alt,Shift再试一次。 ++ 无法使用快捷键"%1",因为使用此键将无法输入,请同时使用Ctrl,Alt,Shift再试一次。 + + +- ++ + Shortcut keys %1 are already used in %2,Please try again! + 快捷键%1已用于%2,请再试一次! + +-- +2.33.0 + diff --git a/0014-fix-tray-Fixed-the-tray-menu-using-the-X11-platform-.patch b/0014-fix-tray-Fixed-the-tray-menu-using-the-X11-platform-.patch deleted file mode 100644 index 0b3bb35..0000000 --- a/0014-fix-tray-Fixed-the-tray-menu-using-the-X11-platform-.patch +++ /dev/null @@ -1,288 +0,0 @@ -From 60cfb83ae452e20c1d974eb431b2be551db3432e Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Thu, 21 Sep 2023 10:21:23 +0800 -Subject: [PATCH 1/2] fix(tray):Fixed the tray menu using the X11 platform, - which caused the missing voice and network icon in the lower right corner, - and the network icon in the taskbar was formatted incorrectly -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复托盘菜单使用X11平台,从而导致的右下角缺少声音和网络图标,以及任务栏网络图标格式不对的问题 - -Closes #13353,#11856,#14006 ---- - CMakeLists.txt | 1 + - include/dbus-tray-monitor.h | 111 +++++++++++++++++++++++++ - plugins/audio/CMakeLists.txt | 3 +- - plugins/audio/src/system-tray/main.cpp | 28 +++---- - plugins/network/CMakeLists.txt | 1 + - plugins/network/src/tray/main.cpp | 29 +++---- - 6 files changed, 141 insertions(+), 32 deletions(-) - create mode 100644 include/dbus-tray-monitor.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index bdffa50..210c938 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -77,6 +77,7 @@ target_link_libraries(${PROJECT_NAME} - ${KIRAN_STYLE_LIBRARIES} - ${GLIB_2_LIBRARIES}) - -+list(FILTER INCLUDE_SRC EXCLUDE REGEX ".*bus-tray-monitor.h$") - install(FILES "${CMAKE_SOURCE_DIR}/data/kiran-control-panel.svg" DESTINATION ${INSTALL_DATADIR}/icons/hicolor/) - install(FILES ${INCLUDE_SRC} DESTINATION ${KCP_INSTALL_INCLUDE}/) - install(FILES "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.desktop" DESTINATION "${INSTALL_DATADIR}/applications/") -diff --git a/include/dbus-tray-monitor.h b/include/dbus-tray-monitor.h -new file mode 100644 -index 0000000..652e7b1 ---- /dev/null -+++ b/include/dbus-tray-monitor.h -@@ -0,0 +1,111 @@ -+/** -+ * Copyright (c) 2022 KylinSec Co., Ltd. -+ * kiran-control-panel is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ * -+ * Author: luoqing -+ */ -+ -+#pragma once -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define KDE_STATUS_NOTIFIER_WATCHER_SERVICE "org.kde.StatusNotifierWatcher" -+#define KDE_STATUS_NOTIFIER_WATCHER_PATH "/StatusNotifierWatcher" -+#define FREEDESKTOP_DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" -+#define FREEDESKTOP_DBUS_PROPERTIES_CHANGED_METHOD "PropertiesChanged" -+ -+#define KDE_STATUS_NOTIFIER_HOST "org.kde.StatusNotifierHost" -+ -+namespace KiranControlPanel -+{ -+class DBusTrayMonitor : public QObject -+{ -+ Q_OBJECT -+public: -+ DBusTrayMonitor(QObject *parent = nullptr) -+ : QObject(parent), -+ m_connection(QDBusConnection::sessionBus()), -+ m_statusNotifierHostRegistered(false) -+ { -+ -+ QDBusInterface trayWatcherInterface(KDE_STATUS_NOTIFIER_WATCHER_SERVICE, KDE_STATUS_NOTIFIER_WATCHER_PATH, -+ KDE_STATUS_NOTIFIER_WATCHER_SERVICE, QDBusConnection::sessionBus()); -+ -+ // 确认托盘服务Watcher是否存在,检测Watcher IsStatusNotifierHostRegistered是否为true(满足QDBusTray可用的条件,具体可参考Qt代码) -+ if (trayWatcherInterface.isValid() && trayWatcherInterface.property("IsStatusNotifierHostRegistered").toBool()) -+ { -+ m_statusNotifierHostRegistered = true; -+ } -+ else -+ { -+ // 托盘服务Watcher不存在/Host未注册/IsStatusNotifierHostRegistered属性未更新 -+ // 连接到DBus Daemon,处理Watcher属性变化信号 -+ m_connection.connect(KDE_STATUS_NOTIFIER_WATCHER_SERVICE, -+ KDE_STATUS_NOTIFIER_WATCHER_PATH, -+ FREEDESKTOP_DBUS_PROPERTIES_INTERFACE, -+ FREEDESKTOP_DBUS_PROPERTIES_CHANGED_METHOD, -+ this, SLOT(onWatcherServicePropertyChanged(QDBusMessage))); -+ } -+ } -+ -+ ~DBusTrayMonitor() {} -+ -+ bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; } -+ -+private slots: -+ void onWatcherServicePropertyChanged(QDBusMessage msg) -+ { -+ // 若Host已注册过,无需判断 -+ if (m_statusNotifierHostRegistered) -+ return; -+ -+ QList args = msg.arguments(); -+ QVariantMap changedProps = qdbus_cast(args.at(1).value()); -+ for (auto iter = changedProps.begin(); iter != changedProps.end(); iter++) -+ { -+ if (iter.key() != "IsStatusNotifierHostRegistered") -+ continue; -+ -+ // IsStatusNotifierHostRegistered,属性变为true -+ // 发出DBus托盘服务可用信号(只在托盘初始化时发出) -+ // 后续属性变化不关注 -+ if (iter.value().toBool()) -+ { -+ m_statusNotifierHostRegistered = true; -+ KLOG_DEBUG() << "notifier host registered,dbus tray available!"; -+ emit dbusTrayAvailable(); -+ } -+ break; -+ } -+ } -+ -+signals: -+ void dbusTrayAvailable(); -+ -+private: -+ QDBusConnection m_connection; -+ bool m_statusNotifierHostRegistered; -+}; -+ -+static bool isDBusTrayAvailable() -+{ -+ bool dbusTrayAvailable = false; -+ DBusTrayMonitor conn; -+ if (conn.isStatusNotifierHostRegistered()) -+ dbusTrayAvailable = true; -+ return dbusTrayAvailable; -+} -+ -+} // namespace KiranControlPanel -diff --git a/plugins/audio/CMakeLists.txt b/plugins/audio/CMakeLists.txt -index ea568f1..55b07b2 100644 ---- a/plugins/audio/CMakeLists.txt -+++ b/plugins/audio/CMakeLists.txt -@@ -44,7 +44,8 @@ add_executable(${TRAY_PROCESS} - ${DBUS_SRC} - ${SYSTEM_TRAY_SRC} - ${AUDIO_QM_FILES} -- ${QRC}) -+ ${QRC} -+ ${PROJECT_SOURCE_DIR}/include/dbus-tray-monitor.h) - - target_include_directories(${TRAY_PROCESS} PRIVATE - ${CMAKE_BINARY_DIR} -diff --git a/plugins/audio/src/system-tray/main.cpp b/plugins/audio/src/system-tray/main.cpp -index 431e6c9..8c36383 100644 ---- a/plugins/audio/src/system-tray/main.cpp -+++ b/plugins/audio/src/system-tray/main.cpp -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include "dbus-tray-monitor.h" - - #define DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER "org.kde.StatusNotifierWatcher" - -@@ -47,27 +48,24 @@ int main(int argc, char *argv[]) - } - - AudioSystemTray *audioSystemTray = nullptr; -- -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER)) -+ if (KiranControlPanel::isDBusTrayAvailable()) - { -- KLOG_DEBUG() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create audio tray icon"; -+ KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; - audioSystemTray = new AudioSystemTray; - } - else - { -- KLOG_WARNING() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is not registered,wait"; -- QDBusServiceWatcher* dbusServiceWatcher = new QDBusServiceWatcher; -- dbusServiceWatcher->setConnection(QDBusConnection::sessionBus()); -- dbusServiceWatcher->addWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -- QObject::connect(dbusServiceWatcher, &QDBusServiceWatcher::serviceRegistered, -- [&dbusServiceWatcher, &audioSystemTray](const QString& service) -+ KLOG_WARNING() << KDE_STATUS_NOTIFIER_HOST << "is not registered,wait"; -+ -+ auto dBusTrayMonitor = new KiranControlPanel::DBusTrayMonitor(); -+ QObject::connect(dBusTrayMonitor, &KiranControlPanel::DBusTrayMonitor::dbusTrayAvailable, [&audioSystemTray]() - { -- if (service != DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER) -- return; -- KLOG_INFO() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create audio tray icon"; -- audioSystemTray = new AudioSystemTray; -- dbusServiceWatcher->removeWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -- }); -+ if(audioSystemTray == nullptr) -+ { -+ KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; -+ audioSystemTray = new AudioSystemTray; -+ } -+ }); - } - return QApplication::exec(); - } -diff --git a/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt -index 7ea6479..94de67a 100644 ---- a/plugins/network/CMakeLists.txt -+++ b/plugins/network/CMakeLists.txt -@@ -55,6 +55,7 @@ add_executable(${TRAY_PROCESS} - ${COMMON_SRC} - ${QRC} - ${NETWORK_QM_FILES} -+ ${PROJECT_SOURCE_DIR}/include/dbus-tray-monitor.h - ) - - target_include_directories(${TRAY_PROCESS} PRIVATE -diff --git a/plugins/network/src/tray/main.cpp b/plugins/network/src/tray/main.cpp -index 2a62bf1..5c4bb65 100644 ---- a/plugins/network/src/tray/main.cpp -+++ b/plugins/network/src/tray/main.cpp -@@ -20,10 +20,9 @@ - #include - #include - #include "config.h" -+#include "dbus-tray-monitor.h" - #include "network-tray.h" - --#define DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER "org.kde.StatusNotifierWatcher" -- - int main(int argc, char* argv[]) - { - KiranApplication a(argc, argv); -@@ -43,26 +42,24 @@ int main(int argc, char* argv[]) - } - - NetworkTray* tray = nullptr; -- if (QDBusConnection::sessionBus().interface()->isServiceRegistered(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER)) -+ if (KiranControlPanel::isDBusTrayAvailable()) - { -- KLOG_DEBUG() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create network tray icon"; -+ KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; - tray = new NetworkTray; - } - else - { -- KLOG_WARNING() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is not registered,wait"; -- QDBusServiceWatcher* dbusServiceWatcher = new QDBusServiceWatcher; -- dbusServiceWatcher->setConnection(QDBusConnection::sessionBus()); -- dbusServiceWatcher->addWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -- QObject::connect(dbusServiceWatcher, &QDBusServiceWatcher::serviceRegistered, -- [&dbusServiceWatcher, &tray](const QString& service) -+ KLOG_WARNING() << KDE_STATUS_NOTIFIER_HOST << "is not registered,wait"; -+ -+ auto dBusTrayMonitor = new KiranControlPanel::DBusTrayMonitor(); -+ QObject::connect(dBusTrayMonitor, &KiranControlPanel::DBusTrayMonitor::dbusTrayAvailable, [&tray]() - { -- if (service != DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER) -- return; -- KLOG_INFO() << DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER << "is registered,create network tray icon"; -- tray = new NetworkTray; -- dbusServiceWatcher->removeWatchedService(DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER); -- }); -+ if(tray == nullptr) -+ { -+ KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; -+ tray = new NetworkTray; -+ } -+ }); - } - - return QApplication::exec(); --- -2.33.0 - diff --git a/0015-fix-network-tray-Fixed-an-issue-where-the-size-Setti.patch b/0015-fix-network-tray-Fixed-an-issue-where-the-size-Setti.patch deleted file mode 100644 index b777357..0000000 --- a/0015-fix-network-tray-Fixed-an-issue-where-the-size-Setti.patch +++ /dev/null @@ -1,81 +0,0 @@ -From c385edb7f7babef4d46ca77f1a979dd9f139b16e Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Thu, 21 Sep 2023 10:33:42 +0800 -Subject: [PATCH 2/2] fix(network-tray):Fixed an issue where the size Settings - of widgets that are not currently displaying pages in the stackwidget did not - take effect when multiple nics were present during tray initialization -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复在托盘初始化时,存在多个网卡时,stackwidget中当前未显示页面的widget的设置大小未生效的问题 - -Close #13862 ---- - plugins/network/src/tray/tray-page.cpp | 35 ++++++++++++++++++++++++++ - plugins/network/src/tray/tray-page.h | 3 +++ - 2 files changed, 38 insertions(+) - -diff --git a/plugins/network/src/tray/tray-page.cpp b/plugins/network/src/tray/tray-page.cpp -index 753abc4..2e50f22 100644 ---- a/plugins/network/src/tray/tray-page.cpp -+++ b/plugins/network/src/tray/tray-page.cpp -@@ -53,6 +53,41 @@ void TrayPage::initUI() - { - setSingleDeviceWidget(); - } -+ -+ /** -+ * NOTE: -+ * 此处是修复当存在多个网卡时,stackwidget中当前未显示页面的widget的大小有问题 -+ * 推测原因在于,在初始化时,在页面未show的状态下,设置widget的尺寸不生效存在问题。 -+ */ -+ repolish(this); -+} -+ -+void TrayPage::repolish(QWidget *w) -+{ -+ QList children; -+ children.reserve(w->children().size() + 1); -+ for (auto child: qAsConst(w->children())) -+ children.append(child); -+ children.append(w); -+ updateObjects(children); -+} -+ -+void TrayPage::updateObjects(const QList& objects) -+{ -+ QEvent event(QEvent::StyleChange); -+ for (const QObject *object : objects) -+ { -+ if (auto widget = qobject_cast(const_cast(object))) -+ { -+ widget->style()->polish(widget); -+ QCoreApplication::sendEvent(widget, &event); -+ QList children; -+ children.reserve(widget->children().size() + 1); -+ for (auto child: qAsConst(widget->children())) -+ children.append(child); -+ updateObjects(children); -+ } -+ } - } - - void TrayPage::initConnection() -diff --git a/plugins/network/src/tray/tray-page.h b/plugins/network/src/tray/tray-page.h -index 28948a4..66a84f2 100644 ---- a/plugins/network/src/tray/tray-page.h -+++ b/plugins/network/src/tray/tray-page.h -@@ -44,6 +44,9 @@ public: - - QSize trayPageSize(); - -+ void repolish(QWidget *w); -+ void updateObjects(const QList& objects); -+ - public slots: - void handleDeviceComboBoxChanged(int index); - void handleAdjustedTraySize(QSize sizeHint); --- -2.33.0 - diff --git a/0015-fix-power-profile-mode-using-kiran-cc-daemon-power-i.patch b/0015-fix-power-profile-mode-using-kiran-cc-daemon-power-i.patch new file mode 100644 index 0000000..4d07058 --- /dev/null +++ b/0015-fix-power-profile-mode-using-kiran-cc-daemon-power-i.patch @@ -0,0 +1,669 @@ +From 26d4b8d60a30821c398ef4be3b6352f5041a56a3 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Mon, 15 Jan 2024 17:28:15 +0800 +Subject: [PATCH 15/17] fix(power): profile mode using kiran-cc-daemon power + interface +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 计算机模式接口使用控制中心后端所提供的接口 + +Closes #25242 +--- + plugins/power/CMakeLists.txt | 9 +- + ...com.kylinsec.Kiran.SessionDaemon.Power.xml | 16 ++ + .../power/data/net.hadess.PowerProfiles.xml | 144 ------------------ + plugins/power/dbus/power-profiles-wrapper.cpp | 124 --------------- + plugins/power/dbus/power-profiles-wrapper.h | 50 ------ + plugins/power/pages/general-settings-page.cpp | 47 ++++-- + plugins/power/pages/general-settings-page.h | 4 +- + translations/kiran-control-panel.zh_CN.ts | 59 ++++--- + 8 files changed, 86 insertions(+), 367 deletions(-) + delete mode 100644 plugins/power/data/net.hadess.PowerProfiles.xml + delete mode 100644 plugins/power/dbus/power-profiles-wrapper.cpp + delete mode 100644 plugins/power/dbus/power-profiles-wrapper.h + +diff --git a/plugins/power/CMakeLists.txt b/plugins/power/CMakeLists.txt +index 37d025d..99dc819 100644 +--- a/plugins/power/CMakeLists.txt ++++ b/plugins/power/CMakeLists.txt +@@ -7,6 +7,7 @@ set(TARGET_NAME kiran-cpanel-power) + pkg_search_module(UPOWER_GLIB REQUIRED upower-glib) + + set(POWER_PLUGIN_DBUS_SRC_LIST "") ++ + # com.kylinsec.Kiran.SessionDaemon.Power + set(KSD_POWER_XML data/com.kylinsec.Kiran.SessionDaemon.Power.xml) + set_source_files_properties(${KSD_POWER_XML} +@@ -17,13 +18,7 @@ kiran_qt5_add_dbus_interface_ex(KSD_POWER_SRC + ksd_power_proxy + KSDPowerProxy) + list(APPEND POWER_PLUGIN_DBUS_SRC_LIST ${KSD_POWER_SRC}) +-# net.hadess.PowerProfiles +-set(POWERPROFILES_XML data/net.hadess.PowerProfiles.xml) +-kiran_qt5_add_dbus_interface_ex(POWER_PROFILES_SRC +- ${POWERPROFILES_XML} +- power_profiles_proxy +- PowerProfilesProxy) +-list(APPEND POWER_PLUGIN_DBUS_SRC_LIST ${POWER_PROFILES_SRC}) ++ + # org.gnome.SessionManager.xml - kiran-session-manager + set(GNOME_SESSION_MANAGER_XML data/org.gnome.SessionManager.xml) + kiran_qt5_add_dbus_interface_ex(GNOME_SESSION_MANAGER_SOUCE +diff --git a/plugins/power/data/com.kylinsec.Kiran.SessionDaemon.Power.xml b/plugins/power/data/com.kylinsec.Kiran.SessionDaemon.Power.xml +index 281ffdb..c32bbb5 100644 +--- a/plugins/power/data/com.kylinsec.Kiran.SessionDaemon.Power.xml ++++ b/plugins/power/data/com.kylinsec.Kiran.SessionDaemon.Power.xml +@@ -82,6 +82,13 @@ + Enable cpu save energy when the ups or battery power is low. + + ++ ++ ++ The profile mode. Refer to PowerProfileMode in power-i.h ++ ++ Switch profile mode. ++ ++ + + + Indicates whether the system is running on battery power. +@@ -107,6 +114,11 @@ + Whether does the cpu save energy when the ups or battery power is low. + + ++ ++ ++ The active profile mode. ++ ++ + + + +@@ -120,5 +132,9 @@ + + + ++ ++ ++ ++ + + +diff --git a/plugins/power/data/net.hadess.PowerProfiles.xml b/plugins/power/data/net.hadess.PowerProfiles.xml +deleted file mode 100644 +index a3241fb..0000000 +--- a/plugins/power/data/net.hadess.PowerProfiles.xml ++++ /dev/null +@@ -1,144 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/plugins/power/dbus/power-profiles-wrapper.cpp b/plugins/power/dbus/power-profiles-wrapper.cpp +deleted file mode 100644 +index 6262fdc..0000000 +--- a/plugins/power/dbus/power-profiles-wrapper.cpp ++++ /dev/null +@@ -1,124 +0,0 @@ +-/** +- * Copyright (c) 2020 ~ 2023 KylinSec Co., Ltd. +- * kiran-control-panel is licensed under Mulan PSL v2. +- * You can use this software according to the terms and conditions of the Mulan PSL v2. +- * You may obtain a copy of Mulan PSL v2 at: +- * http://license.coscl.org.cn/MulanPSL2 +- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +- * See the Mulan PSL v2 for more details. +- * +- * Author: liuxinhao +- */ +-#include "power-profiles-wrapper.h" +-#include +-#include +-#include +-#include +-#include +-#include "power_profiles_proxy.h" +- +-#define POWERPROFILES_SERVICE_NAME "net.hadess.PowerProfiles" +-#define POWERPROFILES_SERVICE_PATH "/net/hadess/PowerProfiles" +-#define POWERPROFILES_SERVICE_PROPERTY_ACTIVE_PROFILE "ActiveProfile" +-#define POWERPROFILES_SERVICE_PROPERTY_PROFILES "Profiles" +- +-#define FREEDESKTOP_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" +-#define FREEDESKTOP_PROPERTIES_METHOD_GET "Get" +-#define FREEDESKTOP_PROPERTIES_METHOD_SET "Set" +-#define FREEDESKTOP_PROPERTIES_SIGNAL_PROPERTIES_CHANGED "PropertiesChanged" +- +-Q_DECLARE_METATYPE(QList) +-PowerProfilesWrapper::PowerProfilesWrapper(QObject* parent) +- : QObject(parent), +- m_profileProxy(new PowerProfilesProxy(POWERPROFILES_SERVICE_NAME, POWERPROFILES_SERVICE_PATH, QDBusConnection::systemBus(), this)) +-{ +- qDBusRegisterMetaType>(); +- if (QDBusConnection::systemBus().interface()->isServiceRegistered(POWERPROFILES_SERVICE_NAME)) +- { +- m_isValid = true; +- auto powerProfiles = m_profileProxy->profiles(); +- for (auto powerProfile : powerProfiles) +- { +- KLOG_DEBUG() << powerProfile["Profile"].toString()<< powerProfile["Driver"].toString(); +- if (powerProfile.contains("Profile")) +- { +- m_profiles << profileNameTransToLocale(powerProfile["Profile"].toString()); +- } +- } +- +- auto activeProfile = m_profileProxy->activeProfile(); +- m_activeProfile = activeProfile; +- connect(m_profileProxy, &PowerProfilesProxy::ActiveProfileChanged, +- this, &PowerProfilesWrapper::onActiveProfileChanged); +- } +- else +- { +- KLOG_WARNING() << "power profiles init failed," << POWERPROFILES_SERVICE_NAME << "isn't registered"; +- } +-} +- +-PowerProfilesWrapper::~PowerProfilesWrapper() +-{ +-} +- +-bool PowerProfilesWrapper::isValid() +-{ +- return m_isValid; +-} +- +-QStringList PowerProfilesWrapper::supportedProfiles() +-{ +- return m_profiles; +-} +- +-QString PowerProfilesWrapper::activeProfile() +-{ +- return profileNameTransToLocale(m_activeProfile); +-} +- +-void PowerProfilesWrapper::setActiveProfile(const QString& profileName) +-{ +- QString value = localeTransToProfileName(profileName); +- m_profileProxy->setActiveProfile(value); +-} +- +-void PowerProfilesWrapper::onActiveProfileChanged(const QString& profileName) +-{ +- m_activeProfile = profileName; +- QString localeProfileName = profileNameTransToLocale(profileName); +- emit activeProfileChanged(localeProfileName); +-} +- +-QString PowerProfilesWrapper::profileNameTransToLocale(const QString& profileName) +-{ +- QMap transMap = { +- {"power-saver", tr("power-saver")}, +- {"balanced", tr("balanced")}, +- {"performance", tr("performance")}}; +- +- QString localeProfileName = profileName; +- if (transMap.contains(profileName)) +- { +- localeProfileName = transMap[profileName]; +- } +- +- return localeProfileName; +-} +- +-QString PowerProfilesWrapper::localeTransToProfileName(const QString& locale) +-{ +- QMap transMap = { +- {tr("power-saver"), "power-saver"}, +- {tr("balanced"), "balanced"}, +- {tr("performance"), "performance"}}; +- +- QString profileName = locale; +- if (transMap.contains(locale)) +- { +- profileName = transMap[locale]; +- } +- +- return profileName; +-} +diff --git a/plugins/power/dbus/power-profiles-wrapper.h b/plugins/power/dbus/power-profiles-wrapper.h +deleted file mode 100644 +index 0e5723c..0000000 +--- a/plugins/power/dbus/power-profiles-wrapper.h ++++ /dev/null +@@ -1,50 +0,0 @@ +-/** +- * Copyright (c) 2020 ~ 2023 KylinSec Co., Ltd. +- * kiran-control-panel is licensed under Mulan PSL v2. +- * You can use this software according to the terms and conditions of the Mulan PSL v2. +- * You may obtain a copy of Mulan PSL v2 at: +- * http://license.coscl.org.cn/MulanPSL2 +- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +- * See the Mulan PSL v2 for more details. +- * +- * Author: liuxinhao +- */ +-#pragma once +- +-#include +-#include +- +-class PowerProfilesProxy; +-class PowerProfilesWrapper : public QObject +-{ +- Q_OBJECT +-public: +- PowerProfilesWrapper(QObject* parent = nullptr); +- ~PowerProfilesWrapper(); +- +- bool isValid(); +- +- QStringList supportedProfiles(); +- QString activeProfile(); +- void setActiveProfile(const QString& profileName); +- +-private slots: +- void onActiveProfileChanged(const QString& profileName); +- +-signals: +- void activeProfileChanged(const QString& profileName); +- +-private: +- // 由英文的ProfileName装换成本地locale的翻译文本 +- QString profileNameTransToLocale(const QString& profileName); +- // 由于locale的翻译文本,转换成英文的ProfileName +- QString localeTransToProfileName(const QString& locale); +- +-private: +- PowerProfilesProxy* m_profileProxy = nullptr; +- bool m_isValid = false; +- QString m_activeProfile; +- QStringList m_profiles; +-}; +\ No newline at end of file +diff --git a/plugins/power/pages/general-settings-page.cpp b/plugins/power/pages/general-settings-page.cpp +index 9176a00..430d103 100644 +--- a/plugins/power/pages/general-settings-page.cpp ++++ b/plugins/power/pages/general-settings-page.cpp +@@ -19,7 +19,6 @@ + #include + #include + #include "dbus/kwin-color-correct.h" +-#include "dbus/power-profiles-wrapper.h" + #include "dbus/power.h" + #include "kiran-message-box.h" + #include "kiran-session-daemon/power-i.h" +@@ -41,8 +40,7 @@ GeneralSettingsPage::GeneralSettingsPage(QWidget* parent) + : QWidget(parent), + ui(new Ui::GeneralSettingsPage), + m_powerInterface(PowerInterface::getInstance()), +- m_kwinColorCorrect(new KWinColorCorrect(this)), +- m_powerprofiles(new PowerProfilesWrapper(this)) ++ m_kwinColorCorrect(new KWinColorCorrect(this)) + { + ui->setupUi(this); + init(); +@@ -147,13 +145,18 @@ void GeneralSettingsPage::initUI() + } + + // 初始化计算机模式 +- if (m_powerprofiles->isValid()) ++ struct PowerProfileInfo + { +- ui->combo_computerMode->addItems(m_powerprofiles->supportedProfiles()); +- } +- else ++ QString name; ++ int index; ++ }; ++ QList profiles = { ++ {tr("Energy-saving mode"), POWER_PROFILE_MODE_SAVER}, ++ {tr("Balanced mode"), POWER_PROFILE_MODE_BALANCED}, ++ {tr("High performance mode"), POWER_PROFILE_MODE_PERFORMANCE}}; ++ for (auto profile : profiles) + { +- ui->widget_computerMode->setVisible(false); ++ ui->combo_computerMode->addItem(profile.name, profile.index); + } + + /// 初始化QSlider,和延迟设置的Timer +@@ -209,7 +212,7 @@ void GeneralSettingsPage::initConnection() + connect(ui->combo_closingLid, QOverload::of(&QComboBox::currentIndexChanged), + this, &GeneralSettingsPage::updateEventAction); + +- connect(ui->combo_computerMode, &QComboBox::currentTextChanged, ++ connect(ui->combo_computerMode, QOverload::of(&QComboBox::currentIndexChanged), + this, &GeneralSettingsPage::updateCurrentComputerMode); + + connect(&m_brightnessSettingTimer, &QTimer::timeout, +@@ -271,10 +274,15 @@ void GeneralSettingsPage::load() + updateEventActionComboCurrent(ui->combo_closingLid, POWER_EVENT_LID_CLOSED); + + // 计算机模式 +- if (m_powerprofiles->isValid()) ++ QSignalBlocker blocker(ui->combo_computerMode); ++ int activePorfileComboxIdx = ui->combo_computerMode->findData(m_powerInterface->activeProfile()); ++ if (activePorfileComboxIdx != -1) + { +- QSignalBlocker blocker(ui->combo_computerMode); +- ui->combo_computerMode->setCurrentText(m_powerprofiles->activeProfile()); ++ ui->combo_computerMode->setCurrentIndex(activePorfileComboxIdx); ++ } ++ else ++ { ++ KLOG_ERROR() << "can not fidn current active computer mode in combobox:" << m_powerInterface->activeProfile(); + } + + // 显示器亮度调整 +@@ -496,9 +504,20 @@ void GeneralSettingsPage::onSliderColorTempValueChanged(int value) + m_colorTempSettingTimer.start(); + } + +-void GeneralSettingsPage::updateCurrentComputerMode(const QString& text) ++void GeneralSettingsPage::updateCurrentComputerMode(int idx) + { +- m_powerprofiles->setActiveProfile(text); ++ auto computerMode = ui->combo_computerMode->itemData(idx); ++ auto reply = m_powerInterface->SwitchProfile(computerMode.toInt()); ++ reply.waitForFinished(); ++ if (reply.isError()) ++ { ++ KLOG_ERROR() << "set current computer mode" << computerMode.toInt() ++ << "failed," << reply.error(); ++ } ++ else ++ { ++ KLOG_DEBUG() << "set current computer mode" << computerMode.toInt(); ++ } + } + + void GeneralSettingsPage::setUiBrightnessPercent(int percent) +diff --git a/plugins/power/pages/general-settings-page.h b/plugins/power/pages/general-settings-page.h +index 63e8591..e270253 100644 +--- a/plugins/power/pages/general-settings-page.h ++++ b/plugins/power/pages/general-settings-page.h +@@ -29,7 +29,6 @@ class PowerInterface; + class KiranSwitchButton; + class QGSettings; + class KWinColorCorrect; +-class PowerProfilesWrapper; + class GeneralSettingsPage : public QWidget + { + Q_OBJECT +@@ -62,13 +61,12 @@ private slots: + void onSwitchAutoColorTempToggoled(bool checked); + void updateColorTempatureValue(); + void onSliderColorTempValueChanged(int value); +- void updateCurrentComputerMode(const QString& text); ++ void updateCurrentComputerMode(int idx); + + private: + Ui::GeneralSettingsPage *ui; + PowerInterface* m_powerInterface; + KWinColorCorrect* m_kwinColorCorrect; +- PowerProfilesWrapper* m_powerprofiles; + QTimer m_brightnessSettingTimer; + QTimer m_idleTimeSettingTimer; + QTimer m_colorTempSettingTimer; +diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts +index 31fc01e..83cac3b 100644 +--- a/translations/kiran-control-panel.zh_CN.ts ++++ b/translations/kiran-control-panel.zh_CN.ts +@@ -2297,50 +2297,65 @@ + 待机时唤醒需要输入密码 + + +- +- ++ ++ + shutdown + 关机 + + +- +- +- ++ ++ ++ + hibernate + 休眠 + + +- +- +- ++ ++ ++ + suspend + 待机 + + +- +- ++ ++ + display off + 关闭显示器 + + +- +- +- ++ ++ ++ + do nothing + 不执行操作 + + +- ++ ++ Energy-saving mode ++ 节能模式 ++ ++ ++ ++ Balanced mode ++ 平衡模式 ++ ++ ++ ++ High performance mode ++ 高性能模式 ++ ++ ++ + ERROR + 错误 + + +- ++ + %1hour + %1小时 + + +- ++ + %1minute + %1分钟 + +@@ -4329,22 +4344,16 @@ This is line 50 of the test text + + PowerProfilesWrapper + +- +- + power-saver +- 省电模式 ++ 省电模式 + + +- +- + balanced +- 平衡模式 ++ 平衡模式 + + +- +- + performance +- 性能模式 ++ 性能模式 + + + +-- +2.33.0 + diff --git a/0016-fix-launcher-Fix-the-space-before-the-parameter-caus.patch b/0016-fix-launcher-Fix-the-space-before-the-parameter-caus.patch new file mode 100644 index 0000000..da264dd --- /dev/null +++ b/0016-fix-launcher-Fix-the-space-before-the-parameter-caus.patch @@ -0,0 +1,35 @@ +From b3ac61f93e733f3ec0d9cea4452d0eee159e8957 Mon Sep 17 00:00:00 2001 +From: liuxinhao +Date: Mon, 15 Jan 2024 17:52:29 +0800 +Subject: [PATCH 16/17] fix(launcher): Fix the space before the parameter + causing a jump event when the launcher jumps +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复启动器跳转时参数前的空格导致跳转失败 + +Closes #24794 +--- + src/main.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/main.cpp b/src/main.cpp +index 981fdbf..4258832 100644 +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -65,7 +65,11 @@ void processCommandLine() + cmdParser.process(*singleApp); + + QString category = cmdParser.value(categoryOption); ++ category = category.trimmed(); ++ + QString subItem = cmdParser.value(subItemOption); ++ subItem = subItem.trimmed(); ++ + if( !subItem.isEmpty() && category.isEmpty() ) + { + std::cerr << "failed to set sub item without category" << std::endl; +-- +2.33.0 + diff --git a/0016-fix-tray-Fixed-an-issue-where-the-popup-was-in-the-w.patch b/0016-fix-tray-Fixed-an-issue-where-the-popup-was-in-the-w.patch deleted file mode 100644 index 2adf2ff..0000000 --- a/0016-fix-tray-Fixed-an-issue-where-the-popup-was-in-the-w.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 74f15f8c5e6bf30a990ebf71def1c29581e67c85 Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Tue, 17 Oct 2023 09:33:24 +0800 -Subject: [PATCH] fix(tray):Fixed an issue where the popup was in the wrong - position when the tray was at the top of the screen -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复托盘在屏幕顶部时,弹窗位置不对的问题 - -Related #17279 ---- - .../src/system-tray/audio-system-tray.cpp | 32 +++++++++++++------ - .../audio/src/system-tray/audio-system-tray.h | 2 +- - plugins/network/src/tray/network-tray.cpp | 16 +++++++--- - 3 files changed, 35 insertions(+), 15 deletions(-) - -diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp -index 0c6aca6..cc4015d 100644 ---- a/plugins/audio/src/system-tray/audio-system-tray.cpp -+++ b/plugins/audio/src/system-tray/audio-system-tray.cpp -@@ -162,7 +162,19 @@ void AudioSystemTray::setVolumeSettingPos() - int pageWidth = 300; - int pageHeight = 66; - -- m_volumenPopup->setGeometry(xTray - pageWidth / 2, yTray - pageHeight - offset, pageWidth, pageHeight); -+ int showPosY; -+ // 托盘程序在顶端 -+ if(m_yTray == 0) -+ { -+ showPosY = m_heightTray - offset; -+ } -+ else -+ { -+ //托盘程序在底部 -+ showPosY = m_yTray - pageHeight - offset; -+ } -+ -+ m_volumenPopup->setGeometry(m_xTray - pageWidth / 2, showPosY, pageWidth, pageHeight); - } - - void AudioSystemTray::handleMixedSettingClicked() -@@ -180,7 +192,7 @@ void AudioSystemTray::setMixedSettingPos() - int width = m_mixedPopup->sizeHint().width(); - - m_mixedPopup->setFixedHeight(height + offset * 2); -- m_mixedPopup->move(xTray - width / 2, yTray - height - offset); -+ m_mixedPopup->move(m_xTray - width / 2, m_yTray - height - offset); - } - - void AudioSystemTray::handleAdjustedMixedSettingPageSize() -@@ -228,15 +240,15 @@ void AudioSystemTray::getTrayGeometry() - } - } - } -- heightTray = static_cast(height); -- widthTray = static_cast(width); -- xTray = static_cast(x); -- yTray = static_cast(y); -+ m_heightTray = static_cast(height); -+ m_widthTray = static_cast(width); -+ m_xTray = static_cast(x); -+ m_yTray = static_cast(y); - KLOG_DEBUG() << "getTrayGeometry "; -- KLOG_DEBUG() << "heightTray" << heightTray; -- KLOG_DEBUG() << "widthTray" << widthTray; -- KLOG_DEBUG() << "xTray" << xTray; -- KLOG_DEBUG() << "yTray" << yTray; -+ KLOG_DEBUG() << "heightTray" << m_heightTray; -+ KLOG_DEBUG() << "widthTray" << m_widthTray; -+ KLOG_DEBUG() << "xTray" << m_xTray; -+ KLOG_DEBUG() << "yTray" << m_yTray; - } - - // XXX:频繁调用函数,需要优化 -diff --git a/plugins/audio/src/system-tray/audio-system-tray.h b/plugins/audio/src/system-tray/audio-system-tray.h -index a61284e..fd5f150 100644 ---- a/plugins/audio/src/system-tray/audio-system-tray.h -+++ b/plugins/audio/src/system-tray/audio-system-tray.h -@@ -70,7 +70,7 @@ private: - AudioInterface* m_audioInterface; - - QString m_colorTheme; -- int xTray, yTray, heightTray, widthTray; -+ int m_xTray, m_yTray, m_heightTray, m_widthTray; - - QDBusServiceWatcher *m_dbusServiceWatcher; - }; -diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp -index dd5ff12..c43d8ff 100644 ---- a/plugins/network/src/tray/network-tray.cpp -+++ b/plugins/network/src/tray/network-tray.cpp -@@ -305,16 +305,24 @@ void NetworkTray::showOrHideTrayPage() - - void NetworkTray::setTrayPagePos() - { -- // KLOG_DEBUG() << "this->sizeHint():" << this->sizeHint(); -- // KLOG_DEBUG() << "this->size():" << this->size(); -- - int pageHeight = this->size().height(); - int pageWidth = this->size().width(); - - getTrayGeometry(); - // 抵消KiranRoundedTrayPopup的margin - int offset = 8; -- this->move(m_xTray - pageWidth / 2, m_yTray - pageHeight + offset); -+ int showPosY; -+ // 托盘程序在顶端 -+ if(m_yTray == 0) -+ { -+ showPosY = m_heightTray - offset; -+ } -+ else -+ { -+ //托盘程序在底部 -+ showPosY = m_yTray - pageHeight + offset; -+ } -+ this->move(m_xTray - pageWidth / 2, showPosY); - } - - void NetworkTray::getTrayGeometry() --- -2.33.0 - diff --git a/0017-fix-audio-fixed-volume-tray-icon-level-display-not-m.patch b/0017-fix-audio-fixed-volume-tray-icon-level-display-not-m.patch new file mode 100644 index 0000000..da4df22 --- /dev/null +++ b/0017-fix-audio-fixed-volume-tray-icon-level-display-not-m.patch @@ -0,0 +1,75 @@ +From 251cff7db6e926b9df02276acf49d80c8e8b958f Mon Sep 17 00:00:00 2001 +From: luoqing +Date: Tue, 9 Jan 2024 17:13:10 +0800 +Subject: [PATCH 17/17] fix(audio):fixed volume tray icon level display not + meeting requirements +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- 修复音量托盘图标级别显示不符合需求 + +Close #25235 +--- + plugins/audio/src/system-tray/audio-system-tray.cpp | 4 ++-- + plugins/audio/src/system-tray/volume-setting-page.cpp | 4 ++-- + plugins/network/src/signal-forward.cpp | 4 ++-- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp +index ed4412f..b20ad15 100644 +--- a/plugins/audio/src/system-tray/audio-system-tray.cpp ++++ b/plugins/audio/src/system-tray/audio-system-tray.cpp +@@ -266,12 +266,12 @@ void AudioSystemTray::setTrayIcon(int value) + icon.addPixmap(trayIconColorSwitch("kcp-audio-mute")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-mute", 64)); + } +- else if (0 < value && value <= 33) ++ else if (0 < value && value <= 34) + { + icon.addPixmap(trayIconColorSwitch("kcp-audio-low")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-low", 64)); + } +- else if (33 < value && value <= 66) ++ else if (33 < value && value <= 67) + { + icon.addPixmap(trayIconColorSwitch("kcp-audio-medium")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-medium", 64)); +diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp +index dbb1cd8..d95b039 100644 +--- a/plugins/audio/src/system-tray/volume-setting-page.cpp ++++ b/plugins/audio/src/system-tray/volume-setting-page.cpp +@@ -239,11 +239,11 @@ void VolumeSettingPage::setVolumeIcon(int value) + { + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-mute")); + } +- else if (0 < value && value <= 33) ++ else if (0 < value && value <= 34) + { + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-low")); + } +- else if (33 < value && value <= 66) ++ else if (33 < value && value <= 67) + { + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-medium")); + } +diff --git a/plugins/network/src/signal-forward.cpp b/plugins/network/src/signal-forward.cpp +index 82f4de9..de8415d 100644 +--- a/plugins/network/src/signal-forward.cpp ++++ b/plugins/network/src/signal-forward.cpp +@@ -172,10 +172,10 @@ void SignalForward::addDevice(const QString &uni) + switch (device->type()) + { + case Device::Type::Ethernet: +- emit wiredDeviceAdded(uni);; ++ emit wiredDeviceAdded(uni); + break; + case Device::Type::Wifi: +- emit wirelessDeviceAdded(uni);; ++ emit wirelessDeviceAdded(uni); + break; + default: + emit otherDeviceAdded(uni); +-- +2.33.0 + diff --git a/0017-fix-network-tray-Fixed-a-flash-issue-when-the-tray-p.patch b/0017-fix-network-tray-Fixed-a-flash-issue-when-the-tray-p.patch deleted file mode 100644 index 5aef0e5..0000000 --- a/0017-fix-network-tray-Fixed-a-flash-issue-when-the-tray-p.patch +++ /dev/null @@ -1,30 +0,0 @@ -From e21e0b228328722ded74ffa92668338544d9c0cd Mon Sep 17 00:00:00 2001 -From: luoqing -Date: Thu, 19 Oct 2023 13:59:27 +0800 -Subject: [PATCH 2/2] fix(network-tray):Fixed a flash issue when the tray - position changed from bottom to top, the first time to click the tray, the - page display position is not correct, resulting in a flash issue -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- 修复托盘位置由底部变为顶部时,第一次点击托盘,页面显示位置不对,导致的闪现问题 ---- - plugins/network/src/tray/network-tray.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp -index c43d8ff..9834a0e 100644 ---- a/plugins/network/src/tray/network-tray.cpp -+++ b/plugins/network/src/tray/network-tray.cpp -@@ -282,6 +282,7 @@ void NetworkTray::showOrHideTrayPage() - this->hide(); - else - { -+ setTrayPagePos(); - // XXX:托盘界面在不可见的情况,不方便去修改size和位置,暂时先显示后在调整大小和位置 - // this->setFixedSize(258, 258); - this->show(); --- -2.33.0 - diff --git a/kiran-control-panel-2.5.5.tar.gz b/kiran-control-panel-2.6.0.tar.gz similarity index 59% rename from kiran-control-panel-2.5.5.tar.gz rename to kiran-control-panel-2.6.0.tar.gz index 1a8d82f..8b60fae 100644 Binary files a/kiran-control-panel-2.5.5.tar.gz and b/kiran-control-panel-2.6.0.tar.gz differ diff --git a/kiran-control-panel.spec b/kiran-control-panel.spec index 9c3c36a..acc691d 100644 --- a/kiran-control-panel.spec +++ b/kiran-control-panel.spec @@ -1,29 +1,30 @@ Name: kiran-control-panel -Version: 2.5.5 -Release: 13%{?dist} +Version: 2.6.0 +Release: 6%{?dist} Summary: Kiran Control Panel Summary(zh_CN): Kiran桌面控制面板 License: MulanPSL-2.0 Source0: %{name}-%{version}.tar.gz -Patch0001: 0001-fix-network-After-receiving-the-Connection-Update-si.patch -Patch0002: 0002-feature-display-When-switching-resolutions-refresh-r.patch -Patch0003: 0003-fix-wallpaper-change-system-wallpaper-xml-path-to-ki.patch -Patch0004: 0004-fix-wallpaper-don-t-call-xmlWriter-if-system-backgro.patch -Patch0005: 0005-fix-account-Fixed-issues-related-to-creating-and-del.patch -Patch0006: 0006-feature-network-When-the-gateway-setting-item-is-0.0.patch -Patch0007: 0007-fix-audio-Fix-parsing-error-when-json-contains-Chine.patch -Patch0008: 0008-fix-audio-tray-Fixed-an-issue-where-the-volume-tray-.patch -Patch0009: 0009-fix-audio-The-Sink-Source-device-list-displays-only-.patch -Patch0010: 0010-fix-kiran-control-panel-fits-the-Qt5.9.7-interface.patch -Patch0011: 0011-fix-tray-icon-Fixed-an-issue-where-the-tray-icon-was.patch -Patch0012: 0012-fix-network-tray-Improved-the-notification-logic.-Wi.patch -Patch0013: 0013-fix-network-Modify-DNS-Settings-and-display-DNS-deta.patch -Patch0014: 0014-fix-tray-Fixed-the-tray-menu-using-the-X11-platform-.patch -Patch0015: 0015-fix-network-tray-Fixed-an-issue-where-the-size-Setti.patch -Patch0016: 0016-fix-tray-Fixed-an-issue-where-the-popup-was-in-the-w.patch -Patch0017: 0017-fix-network-tray-Fixed-a-flash-issue-when-the-tray-p.patch +Patch0000: 0000-fix-pkgconfig-Fix-the-issue-of-incorrect-content-in-.patch +Patch0001: 0001-fix-appearance-remove-the-Kiran-and-Adwaita-icon-the.patch +Patch0002: 0002-fix-plugins-Fix-runtime-plugin-loading-errors.patch +Patch0003: 0003-fix-LC_TIME-set-LC_TIME-to-UTF-8.patch +Patch0004: 0004-fix-network-fix-compile-issues-QString-SkipEmptyPart.patch +Patch0005: 0005-fix-audio-listen-to-mute-property-change-to-fix-shor.patch +Patch0006: 0006-fix-network-fixd-an-issue-where-the-network-tray-ico.patch +Patch0007: 0007-fix-application-add-a-compilation-switch-to-control-.patch +Patch0008: 0008-refactor-account-Remove-useless-password-encryption-.patch +Patch0009: 0009-fix-translations-Fix-translation-errors-in-battery-s.patch +Patch00010: 0010-fix-account-Fix-the-issue-of-setting-default-selecti.patch +Patch00011: 0011-fix-build-delete-useless-methods.patch +Patch00012: 0012-fix-font-Fix-the-issue-of-ineffective-font-changes.patch +Patch00013: 0013-fix-theme-change-the-light-and-dark-theme-name.patch +Patch00014: 0014-fix-shortcut-add-custom-app-icon-Error-prompt-for-mo.patch +Patch00015: 0015-fix-power-profile-mode-using-kiran-cc-daemon-power-i.patch +Patch00016: 0016-fix-launcher-Fix-the-space-before-the-parameter-caus.patch +Patch00017: 0017-fix-audio-fixed-volume-tray-icon-level-display-not-m.patch BuildRequires: gcc-c++ BuildRequires: cmake >= 3.2 @@ -49,6 +50,8 @@ BuildRequires: kiran-qt5-integration-devel BuildRequires: kiran-qdbusxml2cpp BuildRequires: kiran-cc-daemon-devel BuildRequires: kiran-authentication-service-devel >= 2.5 +BuildRequires: libqtxdg-devel +BuildRequires: kf5-kconfig-devel Requires: qt5-qtbase Requires: qt5-qtbase-gui @@ -63,7 +66,6 @@ Requires: kiran-qt5-integration >= 2.4 Requires: kiran-system-daemon >= 2.4 Requires: kiran-session-daemon >= 2.4 Requires: kiran-authentication-service >= 2.5 -Requires: kiran-wallpapers >= 2.3.0-6 Requires: glib2 Requires: upower @@ -71,6 +73,8 @@ Requires: zeromq Requires: libnotify Requires: pam Requires: cryptopp +Requires: libqtxdg +Requires: kf5-kconfig Requires: NetworkManager-l2tp #Requires: NetworkManager-pptp @@ -79,7 +83,6 @@ Requires: NetworkManager-l2tp Requires: group-service %endif - Obsoletes: kiran-cpanel-account < 2.3 Obsoletes: kiran-cpanel-appearance < 2.3 Obsoletes: kiran-cpanel-display < 2.3 @@ -130,15 +133,7 @@ Summary: Development files for kiran control panel plugin %build %{__mkdir} -p %{buildroot} -%if "%{ks_custom_name}" == "GC" - %cmake -DENABLE_USER_GROUP:BOOL=ON \ - -DENABLE_NETWORK:BOOL=OFF \ - -DENABLE_AUDIO:BOOL=OFF \ - -DMOUSE_WHEEL_TEST_VISIBLE:BOOL=ON \ - -DMODIFIER_LOCK_TIPS_VISIBLE:BOOL=ON -%else - %cmake -%endif +%cmake make %{?_smp_mflags} @@ -152,22 +147,18 @@ make %{?_smp_mflags} %{_datadir}/kiran-control-panel/* %{_datadir}/icons/hicolor/* %exclude %{_datadir}/applications/kiran-control-panel.desktop - -#account -%{_sysconfdir}/kiran-cpanel-account/ %{_libexecdir}/kiran-avatar-editor -%{_datadir}/kiran-cpanel-account/* -%if "%{ks_custom_name}" != "GC" - #audio - %{_sysconfdir}/xdg/autostart/kiran-audio-status-icon.desktop - %{_bindir}/kiran-audio-status-icon - #network - %{_sysconfdir}/xdg/autostart/kiran-network-status-icon.desktop - %{_bindir}/kiran-network-status-icon - /etc/NetworkManager/conf.d/00-server.conf -%endif +#audio +%{_sysconfdir}/xdg/autostart/kiran-audio-status-icon.desktop +%{_bindir}/kiran-audio-status-icon + +#network +%{_sysconfdir}/xdg/autostart/kiran-network-status-icon.desktop +%{_bindir}/kiran-network-status-icon +/etc/NetworkManager/conf.d/00-server.conf + %files -n kiran-cpanel-launcher %{_bindir}/kiran-cpanel-launcher @@ -181,6 +172,9 @@ make %{?_smp_mflags} rm -rf %{buildroot} %changelog +* Thu Jan 18 2024 luoqing - 2.6.0-6 +- Update to 2.6.0-6 + * Mon Oct 23 2023 luoqing - 2.5.5-13 - KYOS-F: Fixed a flash issue when the tray position changed from bottom to top, the first time to click the tray, the page display position is not correct, resulting in a flash issue