From 7df65ee462fd76bc6c7642a5ad82c2c62167c044 Mon Sep 17 00:00:00 2001 From: luoqing Date: Tue, 7 Nov 2023 15:23:18 +0800 Subject: [PATCH 01/17] feature(network):The DNS configuration is optimized. Multiple DNS names are separated by semicolons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DNS配置优化,填写多个DNS时以分号为分隔 Close #20293 --- .../src/plugin/setting-widget/ipv4-widget.cpp | 226 ++++++++--------- .../src/plugin/setting-widget/ipv4-widget.h | 2 + .../src/plugin/setting-widget/ipv4-widget.ui | 37 +-- .../src/plugin/setting-widget/ipv6-widget.cpp | 231 ++++++++++-------- .../src/plugin/setting-widget/ipv6-widget.h | 2 + .../src/plugin/setting-widget/ipv6-widget.ui | 37 +-- .../plugin/settings/wired-setting-page.cpp | 6 +- 7 files changed, 256 insertions(+), 285 deletions(-) diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp index 8dc420fe..ed58c808 100644 --- a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp @@ -39,6 +39,7 @@ void Ipv4Widget::initUI() ui->ipv4Manual->setVisible(false); ui->ipv4Address->setPlaceholderText(tr("Required")); ui->ipv4Netmask->setPlaceholderText(tr("Required")); + ui->ipv4DNS->setPlaceholderText(tr("Please separate multiple DNS entries by semicolon")); } void Ipv4Widget::initConnection() @@ -94,11 +95,11 @@ void Ipv4Widget::saveSettings() m_ipv4Setting->setMethod(method); ipv4Address.setIp(QHostAddress(ui->ipv4Address->text())); + //TODO:net mask 支持十进制设置 QString netMask = ui->ipv4Netmask->text(); if (!netMask.contains(".")) { int netPrefix = netMask.toInt(); - KLOG_DEBUG() << "netMask.toInt():" << netMask.toInt(); if ((netPrefix > 0) & (netPrefix < 33)) { ipv4Address.setPrefixLength(netPrefix); @@ -114,10 +115,10 @@ void Ipv4Widget::saveSettings() } 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(); + KLOG_DEBUG() << "ipv4 ip:" << ipv4Address.ip(); + KLOG_DEBUG() << "ipv4 netmask:" << ipv4Address.netmask(); + KLOG_DEBUG() << "ipv4 prefix Length:" << ipv4Address.prefixLength(); + KLOG_DEBUG() << "ipv4 gateway:" << ipv4Address.gateway(); QList ipv4AddresseList; ipv4AddresseList << ipv4Address; @@ -125,72 +126,72 @@ void Ipv4Widget::saveSettings() } QList ipv4DNS; - if (!ui->ipv4FirstDNS->text().isEmpty()) + if (!ui->ipv4DNS->text().isEmpty()) { - ipv4DNS << QHostAddress(ui->ipv4FirstDNS->text()); - } - if (!ui->ipv4SecondDNS->text().isEmpty()) - { - ipv4DNS << QHostAddress(ui->ipv4SecondDNS->text()); + //多个DNS以分号分隔 + QString dnsString = ui->ipv4DNS->text(); + QStringList dnsList = dnsString.split(";",Qt::SkipEmptyParts); + for(auto dns : dnsList) + { + ipv4DNS << QHostAddress(dns); + } } - KLOG_DEBUG() << "ipv4DNS:" << ipv4DNS; + KLOG_DEBUG() << "ipv4 DNS:" << ipv4DNS; m_ipv4Setting->setDns(ipv4DNS); - } void Ipv4Widget::showSettings() { - if (m_ipv4Setting != nullptr) + if(m_ipv4Setting.isNull()) { - KLOG_DEBUG() << "m_ipv4Setting->method():" << m_ipv4Setting->method(); + resetSettings(); + return; + } - if (m_ipv4Setting->method() == Ipv4Setting::ConfigMethod::Automatic) + KLOG_DEBUG() << "current ipv4 Setting method:" << m_ipv4Setting->method(); + if (m_ipv4Setting->method() == Ipv4Setting::ConfigMethod::Automatic) + { + resetSettings(); + } + else if (m_ipv4Setting->method() == Ipv4Setting::ConfigMethod::Manual) + { + int ipv4MethodIndex = ui->ipv4Method->findData(m_ipv4Setting->method()); + ui->ipv4Method->setCurrentIndex(ipv4MethodIndex); + // xxx:取addresses的方式有待改进 + IpAddress ipv4Address = m_ipv4Setting->addresses().value(0); + QString address = ipv4Address.ip().toString(); + QString netmask = ipv4Address.netmask().toString(); + QString gateway = ipv4Address.gateway().toString(); + + KLOG_DEBUG() << "address:" << address; + KLOG_DEBUG() << "netmask:" << netmask; + KLOG_DEBUG() << "gateway:" << gateway; + + ui->ipv4Address->setText(address); + ui->ipv4Netmask->setText(netmask); + if(gateway != "0.0.0.0") { - KLOG_DEBUG() << "Ipv4Setting::ConfigMethod::Automatic"; - resetSettings(); + ui->ipv4Gateway->setText(gateway); } - else if (m_ipv4Setting->method() == Ipv4Setting::ConfigMethod::Manual) + else { - int ipv4MethodIndex = ui->ipv4Method->findData(m_ipv4Setting->method()); - ui->ipv4Method->setCurrentIndex(ipv4MethodIndex); - // xxx:取addresses的方式有待改进 - IpAddress ipv4Address = m_ipv4Setting->addresses().value(0); - QString address = ipv4Address.ip().toString(); - QString netmask = ipv4Address.netmask().toString(); - QString gateway = ipv4Address.gateway().toString(); - - KLOG_DEBUG() << "address:" << address; - KLOG_DEBUG() << "netmask:" << netmask; - KLOG_DEBUG() << "gateway:" << gateway; - - ui->ipv4Address->setText(address); - ui->ipv4Netmask->setText(netmask); - if(gateway != "0.0.0.0") - { - ui->ipv4Gateway->setText(gateway); - } - else - { - ui->ipv4Gateway->clear(); - } + ui->ipv4Gateway->clear(); } - QString firstDNS = ""; - QString secondDNS = ""; - if (!m_ipv4Setting->dns().isEmpty()) + } + + QString dnsString = ""; + if (!m_ipv4Setting->dns().isEmpty()) + { + QStringList dnsList; + auto hostAddressList = m_ipv4Setting->dns(); + for(auto address: hostAddressList) { - firstDNS = m_ipv4Setting->dns().at(0).toString(); - if (m_ipv4Setting->dns().count() >= 2) - { - secondDNS = m_ipv4Setting->dns().at(1).toString(); - } + dnsList << address.toString(); } - KLOG_DEBUG() << "firstDNS:" << firstDNS; - KLOG_DEBUG() << "secondDNS:" << secondDNS; - ui->ipv4FirstDNS->setText(firstDNS); - ui->ipv4SecondDNS->setText(secondDNS); + dnsString = dnsList.join(";"); + KLOG_DEBUG() << "ipv4 DNS:" << dnsString; } - else - resetSettings(); + ui->ipv4DNS->setText(dnsString); } void Ipv4Widget::resetSettings() @@ -200,8 +201,7 @@ void Ipv4Widget::resetSettings() ui->ipv4Address->clear(); ui->ipv4Netmask->clear(); ui->ipv4Gateway->clear(); - ui->ipv4FirstDNS->clear(); - ui->ipv4SecondDNS->clear(); + ui->ipv4DNS->clear(); } void Ipv4Widget::clearPtr() @@ -218,84 +218,92 @@ bool Ipv4Widget::isInputValid() } else if (configMethod == Ipv4Setting::ConfigMethod::Manual) { - QString ipv4 = ui->ipv4Address->text(); - QString netMask = ui->ipv4Netmask->text(); - QString ipv4Gateway = ui->ipv4Gateway->text(); - - if (ipv4.isEmpty()) + if(!isIpv4ManualConfigValid()) { - QString error = QString(tr("Ipv4 address can not be empty")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4Address); - KLOG_DEBUG() << "Ipv4 address can not be empty"; return false; } - else + } + + QString dnsString = ui->ipv4DNS->text(); + if (!dnsString.isEmpty()) + { + bool valid = true; + auto dnsList = dnsString.split(";"); + for(auto dns : dnsList) { - if (!isIpv4AddressValid(ipv4)) + if(!isIpv4AddressValid(dns)) { - QString error = QString(tr("Ipv4 Address invalid")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4Address); - KLOG_DEBUG() << "Ipv4 Address invalid"; - return false; + valid = false; + break; } } - if (netMask.isEmpty()) + if(!valid) { - QString error = QString(tr("NetMask can not be empty")); + QString error = QString(tr("Ipv4 DNS invalid")); m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4Netmask); - KLOG_DEBUG() << "NetMask cannot be empty"; - return false; - } - else - { - if (!isIpv4NetmaskValid(netMask)) - { - QString error = QString(tr("Netmask invalid")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4Netmask); - KLOG_DEBUG() << "Netmask invalid"; - return false; - } + m_errorTip->showTipAroundWidget(ui->ipv4DNS); + KLOG_DEBUG() << "Ipv4 DNS invalid"; + return false; } + } + + return true; +} - if (!ipv4Gateway.isEmpty()) +bool Ipv4Widget::isIpv4ManualConfigValid() +{ + QString ipv4 = ui->ipv4Address->text(); + QString netMask = ui->ipv4Netmask->text(); + QString ipv4Gateway = ui->ipv4Gateway->text(); + + if (ipv4.isEmpty()) + { + QString error = QString(tr("Ipv4 address can not be empty")); + m_errorTip->setText(error); + m_errorTip->showTipAroundWidget(ui->ipv4Address); + KLOG_DEBUG() << "Ipv4 address can not be empty"; + return false; + } + else + { + if (!isIpv4AddressValid(ipv4)) { - if (!isIpv4AddressValid(ipv4Gateway)) - { - QString error = QString(tr("Ipv4 Gateway invalid")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4Gateway); - return false; - } + QString error = QString(tr("Ipv4 Address invalid")); + m_errorTip->setText(error); + m_errorTip->showTipAroundWidget(ui->ipv4Address); + KLOG_DEBUG() << "Ipv4 Address invalid"; + return false; } } - QString firstDNS = ui->ipv4FirstDNS->text(); - if (!firstDNS.isEmpty()) + if (netMask.isEmpty()) { - if (!isIpv4AddressValid(firstDNS)) + QString error = QString(tr("NetMask can not be empty")); + m_errorTip->setText(error); + m_errorTip->showTipAroundWidget(ui->ipv4Netmask); + KLOG_DEBUG() << "NetMask cannot be empty"; + return false; + } + else + { + if (!isIpv4NetmaskValid(netMask)) { - QString error = QString(tr("Ipv4 Preferred DNS invalid")); + QString error = QString(tr("Netmask invalid")); m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4FirstDNS); - KLOG_DEBUG() << "Ipv4 Preferred DNS invalid"; + m_errorTip->showTipAroundWidget(ui->ipv4Netmask); + KLOG_DEBUG() << "Netmask invalid"; return false; } } - QString secondDNS = ui->ipv4SecondDNS->text(); - if (!secondDNS.isEmpty()) + if (!ipv4Gateway.isEmpty()) { - if (!isIpv4AddressValid(secondDNS)) + if (!isIpv4AddressValid(ipv4Gateway)) { - QString error = QString(tr("Ipv4 Alternate DNS invalid")); + QString error = QString(tr("Ipv4 Gateway invalid")); m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv4SecondDNS); - KLOG_DEBUG() << "Ipv4 Alternate DNS invalid"; + m_errorTip->showTipAroundWidget(ui->ipv4Gateway); return false; } } diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.h b/plugins/network/src/plugin/setting-widget/ipv4-widget.h index ccbb305f..04450724 100644 --- a/plugins/network/src/plugin/setting-widget/ipv4-widget.h +++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.h @@ -49,6 +49,8 @@ public slots: void clearPtr(); bool isInputValid(); +private: + bool isIpv4ManualConfigValid(); private: Ui::Ipv4Widget *ui; NetworkManager::Ipv4Setting::Ptr m_ipv4Setting; diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.ui b/plugins/network/src/plugin/setting-widget/ipv4-widget.ui index 93b23556..f2999c2a 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 @@ - DNS 1 + DNS - + 0 @@ -212,39 +212,6 @@ - - - - 10 - - - - - DNS 2 - - - - - - - - 0 - 36 - - - - - 16777215 - 36 - - - - EditIpv4AlternateDNS - - - - - diff --git a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp index 509aba12..47dd317b 100644 --- a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp @@ -40,6 +40,7 @@ void Ipv6Widget::initUI() ui->ipv6Address->setPlaceholderText(tr("Required")); ui->ipv6Prefix->setMaximum(128); ui->ipv6Prefix->setMinimum(1); + ui->ipv6DNS->setPlaceholderText(tr("Please separate multiple DNS entries by semicolon")); } void Ipv6Widget::initConnection() @@ -81,89 +82,105 @@ void Ipv6Widget::handleIpv6MethodChanged(NetworkManager::Ipv6Setting::ConfigMeth void Ipv6Widget::saveSettings() { - if (m_ipv6Setting != nullptr) + if (m_ipv6Setting.isNull()) { - Ipv6Setting::ConfigMethod method = ui->ipv6Method->currentData().value(); - if (method == Ipv6Setting::ConfigMethod::Ignored) - { - m_ipv6Setting->setMethod(method); - m_ipv6Setting->setAddresses(QList()); - } - else if (method == Ipv6Setting::ConfigMethod::Automatic) - { - m_ipv6Setting->setMethod(method); + KLOG_DEBUG() << "ipv6 setting null"; + return; + } + + Ipv6Setting::ConfigMethod method = ui->ipv6Method->currentData().value(); + if (method == Ipv6Setting::ConfigMethod::Ignored) + { + m_ipv6Setting->setMethod(method); + m_ipv6Setting->setAddresses(QList()); + } + else if (method == Ipv6Setting::ConfigMethod::Automatic) + { + m_ipv6Setting->setMethod(method); - NetworkManager::IpAddress ipAddressAuto; - ipAddressAuto.setIp(QHostAddress("")); - ipAddressAuto.setPrefixLength(0); - ipAddressAuto.setGateway(QHostAddress("")); - m_ipv6Setting->setAddresses(QList() << ipAddressAuto); - } - else if (method == Ipv6Setting::ConfigMethod::Manual) - { - m_ipv6Setting->setMethod(method); + NetworkManager::IpAddress ipAddressAuto; + ipAddressAuto.setIp(QHostAddress("")); + ipAddressAuto.setPrefixLength(0); + ipAddressAuto.setGateway(QHostAddress("")); + m_ipv6Setting->setAddresses(QList() << ipAddressAuto); + } + else if (method == Ipv6Setting::ConfigMethod::Manual) + { + m_ipv6Setting->setMethod(method); - IpAddress address; - address.setIp(QHostAddress(ui->ipv6Address->text())); - address.setPrefixLength(ui->ipv6Prefix->value()); - address.setGateway(QHostAddress(ui->ipv6Gateway->text())); + IpAddress address; + address.setIp(QHostAddress(ui->ipv6Address->text())); + address.setPrefixLength(ui->ipv6Prefix->value()); + address.setGateway(QHostAddress(ui->ipv6Gateway->text())); - QList addresseList; - addresseList << address; - m_ipv6Setting->setAddresses(addresseList); + QList addresseList; + addresseList << address; + m_ipv6Setting->setAddresses(addresseList); + } - QList ipv6DNS; - ipv6DNS << QHostAddress(ui->ipv6PreferredDNS->text()) << QHostAddress(ui->ipv6AlternateDNS->text()); - m_ipv6Setting->setDns(ipv6DNS); + QList ipv6DNS; + if (!ui->ipv6DNS->text().isEmpty()) + { + //多个DNS以分号分隔 + QString dnsString = ui->ipv6DNS->text(); + QStringList dnsList = dnsString.split(";",Qt::SkipEmptyParts); + for(auto dns : dnsList) + { + ipv6DNS << QHostAddress(dns); } } + KLOG_DEBUG() << "ipv6 set DNS:" << ipv6DNS; + m_ipv6Setting->setDns(ipv6DNS); } void Ipv6Widget::showSettings() { - if (m_ipv6Setting != nullptr) + + if(m_ipv6Setting.isNull()) { - if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Ignored) - { - int ipv6MethodIndex = ui->ipv6Method->findData(Ipv6Setting::ConfigMethod::Ignored); - ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); - } - else if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Automatic) - { - int ipv6MethodIndex = ui->ipv6Method->findData(Ipv6Setting::ConfigMethod::Automatic); - ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); - } - else if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Manual) - { - int ipv6MethodIndex = ui->ipv6Method->findData(m_ipv6Setting->method()); - ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); + resetSettings(); + return; + } - // xxx:取addresses的方式有待改进 - IpAddress ipv6Address = m_ipv6Setting->addresses().at(0); - QString ip = ipv6Address.ip().toString(); - int prefix = ipv6Address.prefixLength(); - QString gateway = ipv6Address.gateway().toString(); + if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Ignored) + { + int ipv6MethodIndex = ui->ipv6Method->findData(Ipv6Setting::ConfigMethod::Ignored); + ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); + } + else if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Automatic) + { + int ipv6MethodIndex = ui->ipv6Method->findData(Ipv6Setting::ConfigMethod::Automatic); + ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); + } + else if (m_ipv6Setting->method() == Ipv6Setting::ConfigMethod::Manual) + { + int ipv6MethodIndex = ui->ipv6Method->findData(m_ipv6Setting->method()); + ui->ipv6Method->setCurrentIndex(ipv6MethodIndex); - ui->ipv6Address->setText(ip); - ui->ipv6Prefix->setValue(prefix); - ui->ipv6Gateway->setText(gateway); - } + // xxx:取addresses的方式有待改进 + IpAddress ipv6Address = m_ipv6Setting->addresses().at(0); + QString ip = ipv6Address.ip().toString(); + int prefix = ipv6Address.prefixLength(); + QString gateway = ipv6Address.gateway().toString(); - QString preferredDNS = ""; - QString alternateDNS = ""; - if (!m_ipv6Setting->dns().isEmpty()) + ui->ipv6Address->setText(ip); + ui->ipv6Prefix->setValue(prefix); + ui->ipv6Gateway->setText(gateway); + } + + QString dnsString = ""; + if (!m_ipv6Setting->dns().isEmpty()) + { + QStringList dnsList; + auto hostAddressList = m_ipv6Setting->dns(); + for(auto address: hostAddressList) { - preferredDNS = m_ipv6Setting->dns().at(0).toString(); - if (m_ipv6Setting->dns().count() >= 2) - { - alternateDNS = m_ipv6Setting->dns().at(1).toString(); - } + dnsList << address.toString(); } - ui->ipv6PreferredDNS->setText(preferredDNS); - ui->ipv6AlternateDNS->setText(alternateDNS); + dnsString = dnsList.join(";"); + KLOG_DEBUG() << "current ipv6 DNS:" << dnsString; } - else - resetSettings(); + ui->ipv6DNS->setText(dnsString); } void Ipv6Widget::resetSettings() @@ -173,8 +190,7 @@ void Ipv6Widget::resetSettings() ui->ipv6Prefix->setValue(64); ui->ipv6Address->clear(); ui->ipv6Gateway->clear(); - ui->ipv6PreferredDNS->clear(); - ui->ipv6AlternateDNS->clear(); + ui->ipv6DNS->clear(); } void Ipv6Widget::clearPtr() @@ -194,68 +210,75 @@ bool Ipv6Widget::isInputValid() } else if (configMethod == Ipv6Setting::ConfigMethod::Manual) { - QString ipv6 = ui->ipv6Address->text(); - if (ipv6.isEmpty()) + if(!isIpv6ManualConfigValid()) { - QString error = QString(tr("Ipv6 address can not be empty")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv6Address); - - KLOG_DEBUG() << "Ipv6 Address cannot be empty"; return false; } - else + } + + QString dnsString = ui->ipv6DNS->text(); + if (!dnsString.isEmpty()) + { + bool valid = true; + auto dnsList = dnsString.split(";"); + for(auto dns : dnsList) { - if (!isIpv6AddressValid(ipv6)) + if(!isIpv6AddressValid(dns)) { - QString error = QString(tr("Ipv6 address invalid")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv6Address); - KLOG_DEBUG() << "Ipv6Address invalid"; - return false; + valid = false; + break; } } - QString ipv6Gateway = ui->ipv6Gateway->text(); - if (!ipv6Gateway.isEmpty()) + if (!valid) { - if (!isIpv6AddressValid(ipv6Gateway)) - { - QString error = QString(tr("Ipv6 Gateway invalid")); - m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv6Gateway); - KLOG_DEBUG() << "Ipv6 Netmask invalid"; - return false; - } + QString error = QString(tr("Ipv6 DNS invalid")); + m_errorTip->setText(error); + m_errorTip->showTipAroundWidget(ui->ipv6DNS); + KLOG_DEBUG() << "Ipv6 DNS invalid"; + return false; } } - QString preferredDNS = ui->ipv6PreferredDNS->text(); - if (!preferredDNS.isEmpty()) + return true; +} + +bool Ipv6Widget::isIpv6ManualConfigValid() +{ + QString ipv6 = ui->ipv6Address->text(); + if (ipv6.isEmpty()) + { + QString error = QString(tr("Ipv6 address can not be empty")); + m_errorTip->setText(error); + m_errorTip->showTipAroundWidget(ui->ipv6Address); + + KLOG_DEBUG() << "Ipv6 Address cannot be empty"; + return false; + } + else { - if (!isIpv6AddressValid(preferredDNS)) + if (!isIpv6AddressValid(ipv6)) { - QString error = QString(tr("Ipv6 Preferred DNS invalid")); + QString error = QString(tr("Ipv6 address invalid")); m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv6PreferredDNS); - KLOG_DEBUG() << "Ipv6 Preferred DNS invalid"; + m_errorTip->showTipAroundWidget(ui->ipv6Address); + KLOG_DEBUG() << "Ipv6Address invalid"; return false; } } - QString alternateDNS = ui->ipv6AlternateDNS->text(); - if (!alternateDNS.isEmpty()) + QString ipv6Gateway = ui->ipv6Gateway->text(); + if (!ipv6Gateway.isEmpty()) { - if (!isIpv6AddressValid(alternateDNS)) + if (!isIpv6AddressValid(ipv6Gateway)) { - QString error = QString(tr("Ipv6 Alternate DNS invalid")); + QString error = QString(tr("Ipv6 Gateway invalid")); m_errorTip->setText(error); - m_errorTip->showTipAroundWidget(ui->ipv6AlternateDNS); - KLOG_DEBUG() << "Ipv6 Alternate DNS invalid"; + m_errorTip->showTipAroundWidget(ui->ipv6Gateway); + KLOG_DEBUG() << "Ipv6 Netmask invalid"; return false; } } - return true; } diff --git a/plugins/network/src/plugin/setting-widget/ipv6-widget.h b/plugins/network/src/plugin/setting-widget/ipv6-widget.h index 2b2f6e30..e3744cc6 100644 --- a/plugins/network/src/plugin/setting-widget/ipv6-widget.h +++ b/plugins/network/src/plugin/setting-widget/ipv6-widget.h @@ -48,6 +48,8 @@ public slots: void clearPtr(); bool isInputValid(); +private: + bool isIpv6ManualConfigValid(); private: Ui::Ipv6Widget *ui; NetworkManager::Ipv6Setting::Ptr m_ipv6Setting; diff --git a/plugins/network/src/plugin/setting-widget/ipv6-widget.ui b/plugins/network/src/plugin/setting-widget/ipv6-widget.ui index fe0cf1e2..90d2b6c0 100644 --- a/plugins/network/src/plugin/setting-widget/ipv6-widget.ui +++ b/plugins/network/src/plugin/setting-widget/ipv6-widget.ui @@ -190,12 +190,12 @@ - Preferred DNS + DNS - + 0 @@ -215,39 +215,6 @@ - - - - 10 - - - - - Alternate DNS - - - - - - - - 0 - 36 - - - - - 16777215 - 36 - - - - EditIpv6AlternateDNS - - - - - diff --git a/plugins/network/src/plugin/settings/wired-setting-page.cpp b/plugins/network/src/plugin/settings/wired-setting-page.cpp index 99951024..c1d2c3d9 100644 --- a/plugins/network/src/plugin/settings/wired-setting-page.cpp +++ b/plugins/network/src/plugin/settings/wired-setting-page.cpp @@ -116,8 +116,10 @@ void WiredSettingPage::clearPtr() bool WiredSettingPage::isInputValid() { - if (ui->ipv4Widget->isInputValid() && ui->ipv6Widget->isInputValid() && - ui->connectionNameWidget->isInputValid() && ui->ethernetWidget->isInputValid()) + if (ui->ipv4Widget->isInputValid() && + ui->ipv6Widget->isInputValid() && + ui->connectionNameWidget->isInputValid() && + ui->ethernetWidget->isInputValid()) return true; else return false; -- Gitee From 17e342f6da045be88cf5b5206ff1c06b5f82802b Mon Sep 17 00:00:00 2001 From: luoqing Date: Thu, 9 Nov 2023 14:28:06 +0800 Subject: [PATCH 02/17] feature(network):Add the Internet connectivity check; Add the case that the network is connected but cannot access the Internet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加互联网连通性检查,增加已连接网络但无法访问互联网的情况 Close #20294 --- plugins/network/data/network.conf | 4 + .../kcp-network-images/wired-error.svg | 11 +- plugins/network/src/tray/network-tray.cpp | 157 +++++++++++++----- plugins/network/src/tray/network-tray.h | 14 +- 4 files changed, 135 insertions(+), 51 deletions(-) create mode 100644 plugins/network/data/network.conf diff --git a/plugins/network/data/network.conf b/plugins/network/data/network.conf new file mode 100644 index 00000000..af9b9e58 --- /dev/null +++ b/plugins/network/data/network.conf @@ -0,0 +1,4 @@ +[CheckInternetConnectivity] +Enable=true +Address=gitee.com +Port=80 \ No newline at end of file diff --git a/plugins/network/resources/kcp-network-images/wired-error.svg b/plugins/network/resources/kcp-network-images/wired-error.svg index 3d76722a..2b2b3a0d 100644 --- a/plugins/network/resources/kcp-network-images/wired-error.svg +++ b/plugins/network/resources/kcp-network-images/wired-error.svg @@ -31,20 +31,11 @@ - - - + diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp index 9834a0e0..4547a7e3 100644 --- a/plugins/network/src/tray/network-tray.cpp +++ b/plugins/network/src/tray/network-tray.cpp @@ -33,6 +33,7 @@ using namespace NetworkManager; #define STATUS_NOTIFIER_MANAGER_OBJECT_NAME "/StatusNotifierManager" #define MAX_WAIT_COUNTS 10 #define MAX_HEIGHT 868 +#define KIRAN_CPANEL_NETWORK_CONFIG "/etc/kiran-control-panel/plugins/network.conf" NetworkTray::NetworkTray(QWidget *parent) : KiranRoundedTrayPopup(parent), m_wiredTrayPage(nullptr), @@ -49,6 +50,7 @@ NetworkTray::~NetworkTray() void NetworkTray::init() { m_statusNotifierManager = new StatusNotifierManagerInterface(STATUS_NOTIFIER_MANAGER, STATUS_NOTIFIER_MANAGER_OBJECT_NAME, QDBusConnection::sessionBus(), this); + initTcpSocket(); initUI(); initMenu(); initConnect(); @@ -158,7 +160,7 @@ void NetworkTray::initConnect() void NetworkTray::initTrayIcon() { m_systemTray = new QSystemTrayIcon(); - setTrayIcon(NetworkManager::status()); + updateTrayIcon(); KLOG_DEBUG() << " NetworkManager::status():" << NetworkManager::status(); m_systemTray->show(); } @@ -312,15 +314,15 @@ void NetworkTray::setTrayPagePos() getTrayGeometry(); // 抵消KiranRoundedTrayPopup的margin int offset = 8; - int showPosY; + int showPosY; // 托盘程序在顶端 - if(m_yTray == 0) + if (m_yTray == 0) { - showPosY = m_heightTray - offset; + showPosY = m_heightTray - offset; } else { - //托盘程序在底部 + // 托盘程序在底部 showPosY = m_yTray - pageHeight + offset; } this->move(m_xTray - pageWidth / 2, showPosY); @@ -356,42 +358,64 @@ void NetworkTray::getTrayGeometry() m_yTray = static_cast(y); } -// TODO:增加其他状态图标 -void NetworkTray::setTrayIcon(NetworkManager::Status status) +void NetworkTray::updateTrayIcon() { - QIcon icon; + auto status = NetworkManager::status(); + QString iconPath; + QString toolTip; if (status == NetworkManager::Status::Connected) { // 判断主连接类型,托盘网络图标以主连接类型为准 // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); - if (primaryActiveConnection != nullptr) + if (primaryActiveConnection.isNull()) { - auto primaryConnectionType = primaryActiveConnection->connection()->settings()->connectionType(); - if (primaryConnectionType == ConnectionSettings::Wireless) - { - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wireless-4.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wireless-4.svg", 64)); - } - else - { - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-connection.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-connection.svg", 64)); - } + return; } + + //NetworkManager::connectivity() 不准确,使用checkConnectivity + QDBusPendingReply reply = NetworkManager::checkConnectivity(); + reply.waitForFinished(); + uint result = reply.value(); + + if (result == NetworkManager::Connectivity::Full) + { + checkInternetConnectivity(); + return; + } + + if (NetworkManager::primaryConnectionType() == ConnectionSettings::Wireless) + { + iconPath = ":/kcp-network-images/wireless-error.svg"; + } + else + { + iconPath = ":/kcp-network-images/wired-error.svg"; + } + toolTip = tr("The network is connected, but you cannot access the Internet"); + } else if ((status == NetworkManager::Status::Disconnecting) || (status == NetworkManager::Status::Connecting)) { // TODO:加载动画 - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg", 64)); + iconPath = ":/kcp-network-images/wired-disconnected.svg"; + toolTip = tr("Network not connected"); } else { - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg", 64)); + iconPath = ":/kcp-network-images/wired-disconnected.svg"; + toolTip = tr("Network not connected"); } + setTrayIcon(iconPath,toolTip); +} + +void NetworkTray::setTrayIcon(const QString &iconPath,const QString &toolTip) +{ + QIcon icon; + icon.addPixmap(NetworkUtils::trayIconColorSwitch(iconPath)); + icon.addPixmap(NetworkUtils::trayIconColorSwitch(iconPath, 64)); m_systemTray->setIcon(icon); + m_systemTray->setToolTip(toolTip); } // 重新获取device、初始化,刷新 @@ -454,9 +478,8 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat KLOG_DEBUG() << "Device oldstate:" << oldstate; KLOG_DEBUG() << "Device reason:" << reason; - //设备变为可用 - if ((oldstate == Device::Unavailable || oldstate == Device::Unmanaged || oldstate == Device::UnknownState) - && + // 设备变为可用 + if ((oldstate == Device::Unavailable || oldstate == Device::Unmanaged || oldstate == Device::UnknownState) && (newstate != Device::Unmanaged && newstate != Device::Unavailable && newstate != Device::UnknownState)) { if (deviceType == Device::Ethernet) @@ -485,16 +508,12 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat QSet unavailableStates = { Device::Unavailable, Device::Unmanaged, - Device::UnknownState - }; + Device::UnknownState}; // 非休眠的情况下,从可用状态到不可用状态通知 - if (!unavailableStates.contains(oldstate) - && - unavailableStates.contains(newstate) - && - reason != Device::SleepingReason - ) + if (!unavailableStates.contains(oldstate) && + unavailableStates.contains(newstate) && + reason != Device::SleepingReason) { // 设备变为不可用时,如果无线和有线均不可用则显示网络不可用的提示 KLOG_DEBUG() << "device is unavailable"; @@ -575,12 +594,13 @@ void NetworkTray::handleWirelessEnabledChanged(bool enable) void NetworkTray::handleNetworkManagerStatusChanged(NetworkManager::Status status) { - setTrayIcon(status); + KLOG_DEBUG() << "network status changed: " << status; + updateTrayIcon(); } void NetworkTray::handlePrimaryConnectionChanged(const QString &uni) { - setTrayIcon(NetworkManager::status()); + KLOG_DEBUG() << "primary connection changed: " << uni; } void NetworkTray::UnavailableTrayPage() @@ -599,14 +619,13 @@ void NetworkTray::UnavailableTrayPage() m_wirelessTrayPage = nullptr; } - if(m_unavailableWidget != nullptr) + if (m_unavailableWidget != nullptr) { return; } initUnavailableWidget(); m_verticalLayout->addWidget(m_unavailableWidget); KLOG_DEBUG() << "add unavailable widget"; - } void NetworkTray::reloadWiredTrayPage() @@ -686,5 +705,63 @@ void NetworkTray::handleAdjustedTraySize(QSize sizeHint) void NetworkTray::handleThemeChanged(Kiran::PaletteType paletteType) { - setTrayIcon(NetworkManager::status()); + updateTrayIcon(); +} + +void NetworkTray::initTcpSocket() +{ + m_tcpClient = new QTcpSocket(this); + connect(m_tcpClient, &QTcpSocket::connected, this, &NetworkTray::internetConnected); + connect(m_tcpClient, QOverload::of(&QAbstractSocket::error), this, &NetworkTray::internetError); +} + +void NetworkTray::checkInternetConnectivity() +{ + KLOG_DEBUG() << "check Internet Connectivity"; + QSettings confSettings(KIRAN_CPANEL_NETWORK_CONFIG, QSettings::NativeFormat); + QVariant enable = confSettings.value(QString("CheckInternetConnectivity/Enable")); + if(!enable.toBool()) + { + internetConnected(); + return; + } + QVariant address = confSettings.value(QString("CheckInternetConnectivity/Address")); + QVariant port = confSettings.value(QString("CheckInternetConnectivity/Port")); + m_tcpClient->connectToHost(address.toString(), port.toInt()); +} + +void NetworkTray::internetConnected() +{ + KLOG_DEBUG() << "Connectivity check pass"; + QString iconPath; + if (primaryConnectionType() == ConnectionSettings::Wireless) + { + iconPath = ":/kcp-network-images/wireless-4.svg"; + } + else + { + iconPath = ":/kcp-network-images/wired-connection.svg"; + } + QString toolTip = tr("Network connected"); + setTrayIcon(iconPath,toolTip); + + m_tcpClient->abort(); +} + +void NetworkTray::internetError(QAbstractSocket::SocketError socketError) +{ + KLOG_INFO() << "Connectivity check fail: " << socketError; + QString iconPath; + if (primaryConnectionType() == ConnectionSettings::Wireless) + { + iconPath = ":/kcp-network-images/wireless-error.svg"; + } + else + { + iconPath = ":/kcp-network-images/wired-error.svg"; + } + QString toolTip = tr("The network is connected, but you cannot access the Internet"); + setTrayIcon(iconPath,toolTip); + + m_tcpClient->abort(); } diff --git a/plugins/network/src/tray/network-tray.h b/plugins/network/src/tray/network-tray.h index df2dba99..ff028e0c 100644 --- a/plugins/network/src/tray/network-tray.h +++ b/plugins/network/src/tray/network-tray.h @@ -22,6 +22,7 @@ #include #include #include "kiran-rounded-tray-popup/kiran-rounded-tray-popup.h" +#include class WiredTrayWidget; class WirelessTrayWidget; @@ -53,7 +54,6 @@ public: public slots: void handleTrayClicked(QSystemTrayIcon::ActivationReason reason); void showOrHideTrayPage(); - void setTrayIcon(NetworkManager::Status status); void handleNetworkSettingClicked(); void handleDeviceAdded(const QString &devicePath); @@ -71,6 +71,16 @@ public slots: void handleThemeChanged(Kiran::PaletteType paletteType); +private: + void updateTrayIcon(); + void setTrayIcon(const QString &iconPath,const QString &toolTip); + void initTcpSocket(); + void checkInternetConnectivity(); + +private slots: + void internetConnected(); + void internetError(QAbstractSocket::SocketError socketError); + private: QSystemTrayIcon *m_systemTray; QMenu *m_menu; @@ -93,6 +103,8 @@ private: QString m_addDevicePath; int m_waitCounts; QSize m_wirelessTraySizeHint; + + QTcpSocket *m_tcpClient; }; #endif // KIRAN_CPANEL_NETWORK_MANAGER_TRAY_H -- Gitee From e4c1a1d300bcdd3084eebe70debc879905087967 Mon Sep 17 00:00:00 2001 From: luoqing Date: Fri, 1 Dec 2023 10:20:08 +0800 Subject: [PATCH 03/17] feature(audio):Volume tray icon optimization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 音量托盘图标优化 Close #20296 --- data/hicolor/scalable/apps/kcp-audio-loud.svg | 4 ++-- data/hicolor/scalable/apps/kcp-audio-low.svg | 12 +++++++++--- .../hicolor/scalable/apps/kcp-audio-medium.svg | 7 ++++--- data/hicolor/scalable/apps/kcp-audio-mute.svg | 5 ++--- .../src/system-tray/audio-system-tray.cpp | 18 +++++++++--------- .../src/system-tray/volume-setting-page.cpp | 10 +++++----- 6 files changed, 31 insertions(+), 25 deletions(-) diff --git a/data/hicolor/scalable/apps/kcp-audio-loud.svg b/data/hicolor/scalable/apps/kcp-audio-loud.svg index d7625571..211fe116 100644 --- a/data/hicolor/scalable/apps/kcp-audio-loud.svg +++ b/data/hicolor/scalable/apps/kcp-audio-loud.svg @@ -35,9 +35,9 @@ } - + - + diff --git a/data/hicolor/scalable/apps/kcp-audio-low.svg b/data/hicolor/scalable/apps/kcp-audio-low.svg index e3c93a04..406e96b7 100644 --- a/data/hicolor/scalable/apps/kcp-audio-low.svg +++ b/data/hicolor/scalable/apps/kcp-audio-low.svg @@ -29,13 +29,19 @@ - - + + + + + diff --git a/data/hicolor/scalable/apps/kcp-audio-medium.svg b/data/hicolor/scalable/apps/kcp-audio-medium.svg index 3a61f7f4..15a618b9 100644 --- a/data/hicolor/scalable/apps/kcp-audio-medium.svg +++ b/data/hicolor/scalable/apps/kcp-audio-medium.svg @@ -35,9 +35,10 @@ } - - - + + + + diff --git a/data/hicolor/scalable/apps/kcp-audio-mute.svg b/data/hicolor/scalable/apps/kcp-audio-mute.svg index 428ec25d..0b9d97ab 100644 --- a/data/hicolor/scalable/apps/kcp-audio-mute.svg +++ b/data/hicolor/scalable/apps/kcp-audio-mute.svg @@ -36,8 +36,7 @@ - - - + + diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp index cc4015d3..e888e419 100644 --- a/plugins/audio/src/system-tray/audio-system-tray.cpp +++ b/plugins/audio/src/system-tray/audio-system-tray.cpp @@ -206,7 +206,7 @@ void AudioSystemTray::handleAdjustedMixedSettingPageSize() QPixmap AudioSystemTray::trayIconColorSwitch(const QString &iconPath, const int iconSize) { // icon原本为浅色 - QIcon icon(iconPath); + QIcon icon = QIcon::fromTheme(iconPath); QPixmap pixmap = icon.pixmap(iconSize, iconSize); if (Kiran::StylePalette::instance()->paletteType() != Kiran::PALETTE_DARK) { @@ -257,23 +257,23 @@ void AudioSystemTray::setTrayIcon(int value) QIcon icon; if (value == 0) { - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-mute.svg")); - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-mute.svg", 64)); + icon.addPixmap(trayIconColorSwitch("kcp-audio-mute")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-mute", 64)); } else if (0 < value && value <= 33) { - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-low.svg")); - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-low.svg", 64)); + icon.addPixmap(trayIconColorSwitch("kcp-audio-low")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-low", 64)); } else if (33 < value && value <= 66) { - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-medium.svg")); - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-medium.svg", 64)); + icon.addPixmap(trayIconColorSwitch("kcp-audio-medium")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-medium", 64)); } else { - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-loud.svg")); - icon.addPixmap(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-loud.svg", 64)); + icon.addPixmap(trayIconColorSwitch("kcp-audio-loud")); + icon.addPixmap(trayIconColorSwitch("kcp-audio-loud", 64)); } m_systemTray->setIcon(icon); m_systemTray->show(); diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp index 54b8f104..4b34a3e3 100644 --- a/plugins/audio/src/system-tray/volume-setting-page.cpp +++ b/plugins/audio/src/system-tray/volume-setting-page.cpp @@ -219,26 +219,26 @@ void VolumeSettingPage::setVolumeIcon(int value) { if (value == 0) { - ui->muteButton->setIcon(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-mute.svg")); + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-mute")); } else if (0 < value && value <= 33) { - ui->muteButton->setIcon(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-low.svg")); + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-low")); } else if (33 < value && value <= 66) { - ui->muteButton->setIcon(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-medium.svg")); + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-medium")); } else { - ui->muteButton->setIcon(trayIconColorSwitch(":/kcp-audio-images/kcp-audio-loud.svg")); + ui->muteButton->setIcon(trayIconColorSwitch("kcp-audio-loud")); } } QPixmap VolumeSettingPage::trayIconColorSwitch(const QString &iconPath) { // icon原本为浅色 - QIcon icon(iconPath); + QIcon icon = QIcon::fromTheme(iconPath); QPixmap pixmap = icon.pixmap(16, 16); if (Kiran::StylePalette::instance()->paletteType() != Kiran::PALETTE_DARK) { -- Gitee From 66f3d4e160b630911871a3a52f33ab4b035f14c6 Mon Sep 17 00:00:00 2001 From: luoqing Date: Wed, 6 Dec 2023 16:01:33 +0800 Subject: [PATCH 04/17] feature(audio):supports sound card selection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端界面支持声卡选择 Close #20196 --- .../audio/src/dbus/audio-device-interface.cpp | 14 + .../audio/src/dbus/audio-device-interface.h | 4 + plugins/audio/src/dbus/audio-interface.cpp | 32 ++ plugins/audio/src/dbus/audio-interface.h | 14 + plugins/audio/src/plugin/input-page.cpp | 358 +++++++++++------ plugins/audio/src/plugin/input-page.h | 30 +- plugins/audio/src/plugin/input-page.ui | 28 +- plugins/audio/src/plugin/output-page.cpp | 372 +++++++++++------- plugins/audio/src/plugin/output-page.h | 35 +- plugins/audio/src/plugin/output-page.ui | 28 +- 10 files changed, 638 insertions(+), 277 deletions(-) diff --git a/plugins/audio/src/dbus/audio-device-interface.cpp b/plugins/audio/src/dbus/audio-device-interface.cpp index 7ec201d7..4f14c5a0 100644 --- a/plugins/audio/src/dbus/audio-device-interface.cpp +++ b/plugins/audio/src/dbus/audio-device-interface.cpp @@ -54,6 +54,7 @@ QList AudioDeviceInterface::getPortsInfo() portInfo.description = object.value("description").toString(); portInfo.name = object.value("name").toString(); portInfo.priority = object.value("priority").toDouble(); + portInfo.available = object.value("available").toInt(); portInfoList << portInfo; } } @@ -61,6 +62,19 @@ QList AudioDeviceInterface::getPortsInfo() return portInfoList; } +bool AudioDeviceInterface::isAvailablePorts() +{ + QList portsInfo = getPortsInfo(); + for(auto port : portsInfo) + { + if(port.available != PORT_AVAILABLE_NO) + { + return true; + } + } + return false; +} + 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 8bea01a1..a009b632 100644 --- a/plugins/audio/src/dbus/audio-device-interface.h +++ b/plugins/audio/src/dbus/audio-device-interface.h @@ -26,11 +26,14 @@ #include #include "audio-device-interface.h" +#define PORT_AVAILABLE_NO 1 + struct AudioPortInfo { QString description; QString name; double priority; + int available; }; /* @@ -111,6 +114,7 @@ public: } QList getPortsInfo(); + bool isAvailablePorts(); public Q_SLOTS: // METHODS inline QDBusPendingReply GetPorts() diff --git a/plugins/audio/src/dbus/audio-interface.cpp b/plugins/audio/src/dbus/audio-interface.cpp index 6d34ebb1..598b3bf7 100644 --- a/plugins/audio/src/dbus/audio-interface.cpp +++ b/plugins/audio/src/dbus/audio-interface.cpp @@ -14,6 +14,7 @@ #include "audio-interface.h" #include "kiran-session-daemon/audio-i.h" +#include /* * Implementation of interface class AudioInterface */ @@ -43,6 +44,37 @@ AudioInterface::~AudioInterface() { } +QList AudioInterface::getCards() +{ + QDBusPendingReply cards = GetCards(); + KLOG_DEBUG() << "get Cards:" << cards; + + //解析默认sink的端口信息 + QJsonParseError jsonParseError; + QJsonDocument doc = QJsonDocument::fromJson(cards.value().toUtf8(), &jsonParseError); + + if((doc.isNull()) || (jsonParseError.error != QJsonParseError::NoError)) + { + return QList(); + } + + QList cardInfoList; + 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(); + AudioCardInfo cardInfo; + cardInfo.index = object.value("index").toInt(); + cardInfo.name = object.value("name").toString(); + cardInfoList << cardInfo; + } + } + + return cardInfoList; +} + void sendPropertyChangedDetailSignal(AudioInterface *ptr, const QString &propertyName, QVariant value) { if (propertyName == QStringLiteral("state")) diff --git a/plugins/audio/src/dbus/audio-interface.h b/plugins/audio/src/dbus/audio-interface.h index c4eee871..a36cb773 100644 --- a/plugins/audio/src/dbus/audio-interface.h +++ b/plugins/audio/src/dbus/audio-interface.h @@ -26,6 +26,12 @@ #include #include "audio-interface.h" +struct AudioCardInfo +{ + int index; + QString name; +}; + /* * Proxy class for interface com.kylinsec.Kiran.SessionDaemon.Audio */ @@ -52,6 +58,14 @@ public: } public Q_SLOTS: // METHODS + QList getCards(); + + inline QDBusPendingReply GetCards() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetCards"), argumentList); + } + inline QDBusPendingReply GetDefaultSink() { QList argumentList; diff --git a/plugins/audio/src/plugin/input-page.cpp b/plugins/audio/src/plugin/input-page.cpp index 11275ec9..eaeef628 100644 --- a/plugins/audio/src/plugin/input-page.cpp +++ b/plugins/audio/src/plugin/input-page.cpp @@ -178,186 +178,276 @@ InputPage::~InputPage() void InputPage::init() { m_audioInterface = AudioInterface::instance(); + ui->inputVolume->setStyleSheet("color:#2eb3ff;"); - initInputDevice(); - initInputSettins(); - if (m_isValidPort) - initVoulumeFeedBack(); + ui->volumeSetting->setRange(0, 100); + ui->volumeSetting->setSingleStep(1); + ui->volumeSetting->setPageStep(1); + + initSettings(); initConnet(); } -void InputPage::initInputDevice() +void InputPage::initSettings() { - QDBusPendingReply defaultSourcePath = m_audioInterface->GetDefaultSource(); - KLOG_DEBUG() << "defaultSourcePath" << defaultSourcePath; + QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSource(); + KLOG_DEBUG() << "default Source Path" << dbusReply; - m_defaultSource = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSourcePath, QDBusConnection::sessionBus(), this); - m_defaultSourceIndex = m_defaultSource->index(); - initActivedPort(); + if (!dbusReply.isValid()) + { + disableSettings(); + return; + } + + QString defaultSourcePath = dbusReply.value(); + if (!defaultSourcePath.isEmpty()) + { + m_defaultSource = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSourcePath, QDBusConnection::sessionBus(), this); + initCardOptions(); + initActivedPort(); + connect(m_defaultSource, &AudioDeviceInterface::volumeChanged, this, &InputPage::onVolumeChanged,Qt::UniqueConnection); + connect(m_defaultSource, &AudioDeviceInterface::active_portChanged, this, &InputPage::onActivePortChanged,Qt::UniqueConnection); + } + else + { + disableSettings(); + } +} + +void InputPage::initCardOptions() +{ + ui->inputCards->blockSignals(true); + QList cardsInfo = m_audioInterface->getCards(); + for (auto card : cardsInfo) + { + ui->inputCards->addItem(card.name, card.index); + } + int index = ui->inputCards->findData(m_defaultSource->card_index()); + ui->inputCards->setCurrentIndex(index); + ui->inputCards->blockSignals(false); } void InputPage::initActivedPort() { - QList portsInfo = m_defaultSource->getPortsInfo(); - - if(portsInfo.isEmpty()) + if (!m_defaultSource->isAvailablePorts()) { - KLOG_DEBUG() << "ports is null"; + KLOG_INFO() << "No available ports for current default source"; disableSettings(); return; } - Q_FOREACH (auto portInfo, portsInfo) + ui->inputDevices->blockSignals(true); + ui->inputDevices->setEnabled(true); + m_isValidPort = true; + + QList portsInfo = m_defaultSource->getPortsInfo(); + for (auto portInfo : portsInfo) { - if(m_defaultSource->active_port() == portInfo.name) + if (portInfo.available != PORT_AVAILABLE_NO) { - ui->inputDevices->addItem(portInfo.description,portInfo.name); - break; + ui->inputDevices->addItem(portInfo.description, portInfo.name); + } } + int currentIndex = ui->inputDevices->findData(m_defaultSource->active_port()); + ui->inputDevices->setCurrentIndex(currentIndex); + ui->inputDevices->blockSignals(false); - //默认选中已激活的端口 - m_isValidPort = true; - ui->inputDevices->setEnabled(true); - ui->volumeSetting->setEnabled(true); + // 端口可用后才初始化音量设置和音量反馈 + initVolume(); + initVoulumeFeedBack(); } -void InputPage::initInputSettins() +void InputPage::initVolume() { - ui->volumeSetting->setRange(0, 100); - ui->volumeSetting->setSingleStep(1); - ui->volumeSetting->setPageStep(1); + if (ui->inputDevices->isEnabled()) + { + ui->volumeSetting->setEnabled(true); + } + + ui->volumeSetting->blockSignals(true); double currentVolumeDouble = m_defaultSource->volume() * 100; int currentVolume = round(currentVolumeDouble); ui->volumeSetting->setValue(currentVolume); ui->inputVolume->setText(QString::number(currentVolume) + "%"); + + ui->volumeSetting->blockSignals(false); + KLOG_DEBUG() << "current input volume:" << currentVolume; } void InputPage::initConnet() { - connect(ui->inputDevices, static_cast(&QComboBox::activated), [this](int index) - { - QString namePort = ui->inputDevices->itemData(index, Qt::UserRole).toString(); - if (!namePort.isNull()) - { - if(m_defaultSource != nullptr) - { - m_defaultSource->SetActivePort(namePort); - KLOG_DEBUG() << "SetActivePort:" << namePort; - } - else - KLOG_DEBUG() << "m_defaultSource is null"; - } - else - KLOG_DEBUG() << "namePort is null"; }); - - connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) - { - double volumeValue = static_cast(value) / static_cast(100); - if (m_defaultSource != nullptr) - { - m_defaultSource->SetVolume(volumeValue); - KLOG_DEBUG() << "SetVolume:" << volumeValue; - } - else - KLOG_DEBUG() << "m_defaultSource is null"; }); + connect(ui->inputCards, static_cast(&QComboBox::currentIndexChanged), this, &InputPage::changeDefaultInputCard); + connect(ui->inputDevices, static_cast(&QComboBox::currentIndexChanged), this, &InputPage::setActivePort); + connect(ui->volumeSetting, &QSlider::valueChanged, this, &InputPage::setVolume); - connect(m_defaultSource, &AudioDeviceInterface::volumeChanged, this, &InputPage::handleVolumeChanged); - connect(m_defaultSource, &AudioDeviceInterface::active_portChanged, this, &InputPage::handleActivePortChanged); - - // Fix:SourceAdded 和 SourceDelete没有被激发 - connect(m_audioInterface, &AudioInterface::SourceAdded, this, &InputPage::handleSourceAdded); - connect(m_audioInterface, &AudioInterface::SourceDelete, this, &InputPage::handleSourceDelete); - connect(m_audioInterface, &AudioInterface::DefaultSourceChange, this, &InputPage::handleDefaultSourceChanged, Qt::QueuedConnection); + connect(m_audioInterface, &AudioInterface::SourceAdded, this, &InputPage::addSource); + connect(m_audioInterface, &AudioInterface::SourceDelete, this, &InputPage::deleteSource); + connect(m_audioInterface, &AudioInterface::DefaultSourceChange, this, &InputPage::onDefaultSourceChanged, Qt::QueuedConnection); } void InputPage::disableSettings() { + ui->inputDevices->blockSignals(true); + ui->volumeSetting->blockSignals(true); + m_isValidPort = false; ui->inputDevices->insertItem(0, tr("No input device detected")); - ui->inputDevices->setEnabled(false); + ui->inputDevices->setCurrentIndex(0); + ui->volumeSetting->setValue(0); + ui->inputVolume->setText(QString::number(0) + "%"); + + ui->inputDevices->setEnabled(false); ui->volumeSetting->setEnabled(false); + + ui->inputDevices->blockSignals(false); + ui->volumeSetting->blockSignals(false); + + ui->volumeScale->setPercent(0); + + clearFeedBack(); } -void InputPage::handleActivePortChanged(const QString &value) +void InputPage::onActivePortChanged(const QString &value) { - KLOG_DEBUG() << "handleActivePortChanged :" << value; - - QList portsInfo = m_defaultSource->getPortsInfo(); - - Q_FOREACH (auto portInfo, portsInfo) - { - if(m_defaultSource->active_port() == portInfo.name) - { - ui->inputDevices->clear(); - ui->inputDevices->addItem(portInfo.description,portInfo.name); - break; - } - } + KLOG_INFO() << "input device (active port) changed :" << value; + ui->inputDevices->blockSignals(true); + ui->inputDevices->clear(); + ui->inputDevices->blockSignals(false); + clearFeedBack(); + + initActivedPort(); } -void InputPage::handleVolumeChanged(double value) +void InputPage::onVolumeChanged(double value) { ui->volumeSetting->blockSignals(true); int currentVolume = round(value * 100); - KLOG_DEBUG() << "input-page:" << currentVolume; ui->inputVolume->setText(QString::number(currentVolume) + "%"); ui->volumeSetting->setValue(currentVolume); ui->volumeSetting->blockSignals(false); + KLOG_DEBUG() << "input volume changed:" << currentVolume; } -/* - * TODO: - * 1、处理快速拔插设备 - * 2、设备插入后是否需要等待设备准备好 - * */ - -void InputPage::handleDefaultSourceChanged(int index) +/** + * NOTE: + * 目前切换输入声卡实际只是切换了defaultSource + * 一个card可以有多个Soucre,选择了card的后,按以下步骤设置默认DefaultSource + * 1、遍历一个card的所有Source + * 2、获取单个Source->getPortsInfo,是否有可用的port,如果有,则按遍历顺序选择第一个port可用的Source + * 3、如果没有port可用的Source,则设置失败 + */ +void InputPage::changeDefaultInputCard(int index) { - KLOG_DEBUG() << "DefaultSourceChanged:" << index; - // delete and restart init defaultSource - m_defaultSource->deleteLater(); - m_defaultSource = nullptr; + int cardIndex = ui->inputCards->itemData(index, Qt::UserRole).toInt(); + KLOG_INFO() << "change default input card, current input card Index:" << cardIndex; + QDBusPendingReply getSources = m_audioInterface->GetSources(); + QStringList sourcesList = getSources.value(); - ui->inputDevices->blockSignals(true); - ui->inputDevices->clear(); - ui->inputDevices->blockSignals(false); - initInputDevice(); - initInputSettins(); + int sourceIndex = -1; + for (auto source : sourcesList) + { + AudioDeviceInterface audioSource(AUDIO_DBUS_NAME, source, QDBusConnection::sessionBus(), this); + if (cardIndex == audioSource.card_index()) + { + if (audioSource.isAvailablePorts()) + { + sourceIndex = audioSource.index(); + break; + } + } + } - ui->volumeScale->setPercent(0); + if (sourceIndex == -1) + { + KLOG_INFO() << "The source with an available port corresponding to the card index was not found"; + KLOG_INFO() << "set default source failed"; + disableSettings(); + return; + } - if (m_audioInfo != nullptr) + QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSource(); + QString defaultSourcePath = dbusReply.value(); + AudioDeviceInterface defaultSource(AUDIO_DBUS_NAME, defaultSourcePath, QDBusConnection::sessionBus(), this); + + if (sourceIndex == defaultSource.index()) { - m_audioInfo->stop(); - m_audioInfo->deleteLater(); - m_audioInfo = nullptr; + KLOG_INFO() << "current default source:" << sourceIndex; + reload(); + return; } - if (m_audioInput != nullptr) + + setDefaultSource(sourceIndex); +} + +void InputPage::setDefaultSource(int sourceIndex) +{ + /** + * NOTE: + * 由于SetDefaultSource不一定生效,且没有返回值表明是否切换DefaultSource成功。 + * 调用SetDefaultSource后统一禁用音量设置,等待 DefaultSinkChange 信号的接收 + * 接收到DefaultSourceChange信号后,确认SetDefaultSource生效后(即切换Source成功),界面再打开和更新设置 + */ + m_audioInterface->SetDefaultSource(sourceIndex); + KLOG_INFO() << QString("set default sourcee:%1").arg(sourceIndex); + disableSettings(); +} + +void InputPage::setVolume(int value) +{ + double volumeValue = static_cast(value) / static_cast(100); + if (m_defaultSource != nullptr) { - m_audioInput->deleteLater(); - m_audioInput = nullptr; + m_defaultSource->SetVolume(volumeValue); + KLOG_DEBUG() << "set input Volume:" << volumeValue; } - if (m_isValidPort) + else { - initVoulumeFeedBack(); + KLOG_INFO() << "set input volume failed, default source is null"; } +} - connect(m_defaultSource, &AudioDeviceInterface::volumeChanged, this, &InputPage::handleVolumeChanged); - connect(m_defaultSource, &AudioDeviceInterface::active_portChanged, this, &InputPage::handleActivePortChanged); +void InputPage::onDefaultSourceChanged(int index) +{ + KLOG_DEBUG() << "Default Source Changed:" << index; + // delete and restart init defaultSource + reload(); +} + +void InputPage::setActivePort(int index) +{ + QString namePort = ui->inputDevices->itemData(index, Qt::UserRole).toString(); + if (!namePort.isNull()) + { + if (m_defaultSource != nullptr) + { + m_defaultSource->SetActivePort(namePort); + KLOG_INFO() << " set source Active Port:" << namePort; + } + else + { + KLOG_DEBUG() << "set source active port failed, default Source is null"; + } + } + else + { + KLOG_DEBUG() << "namePort is null"; + } } -//暂时没有处理Source增加减少的需求 -void InputPage::handleSourceAdded(int index) +// 暂时没有处理Source增加减少的需求 +void InputPage::addSource(int index) { - KLOG_DEBUG() << "Source Added:" << index; + KLOG_INFO() << "Source Added:" << index; + reload(); } -void InputPage::handleSourceDelete(int index) +void InputPage::deleteSource(int index) { - KLOG_DEBUG() << "Source Delete:" << index; + KLOG_INFO() << "Source Delete:" << index; + reload(); } QSize InputPage::sizeHint() const @@ -365,9 +455,9 @@ QSize InputPage::sizeHint() const return {500, 657}; } -//通过QMultimedia模块获取反馈音量 -//首先使用QAudioFormat类设置音频流参数信息,然后从QIODevice中读取PCM数据 -//最后使用QAudioInput类接收从输入设备来的音频数据 +// 通过QMultimedia模块获取反馈音量 +// 首先使用QAudioFormat类设置音频流参数信息,然后从QIODevice中读取PCM数据 +// 最后使用QAudioInput类接收从输入设备来的音频数据 void InputPage::initVoulumeFeedBack() { initAudioFormat(); @@ -407,3 +497,47 @@ void InputPage::refreshFeedBack() { ui->volumeScale->setPercent(m_audioInfo->level()); } + +void InputPage::reload() +{ + KLOG_INFO() << "reload input settings"; + clear(); + initSettings(); +} + +void InputPage::clear() +{ + ui->volumeScale->setPercent(0); + + if (m_defaultSource != nullptr) + { + m_defaultSource->deleteLater(); + m_defaultSource = nullptr; + } + + ui->inputDevices->blockSignals(true); + ui->inputDevices->clear(); + ui->inputDevices->blockSignals(false); + + ui->inputCards->blockSignals(true); + ui->inputCards->clear(); + ui->inputCards->blockSignals(false); + + clearFeedBack(); +} + +void InputPage::clearFeedBack() +{ + if (m_audioInfo != nullptr) + { + m_audioInfo->stop(); + m_audioInfo->deleteLater(); + m_audioInfo = nullptr; + } + + if (m_audioInput != nullptr) + { + m_audioInput->deleteLater(); + m_audioInput = nullptr; + } +} diff --git a/plugins/audio/src/plugin/input-page.h b/plugins/audio/src/plugin/input-page.h index e9f69095..91b4b51e 100644 --- a/plugins/audio/src/plugin/input-page.h +++ b/plugins/audio/src/plugin/input-page.h @@ -65,8 +65,9 @@ public: private: void init(); - void initInputDevice(); - void initInputSettins(); + void initSettings(); + void initCardOptions(); + void initVolume(); void initActivedPort(); void initConnet(); void disableSettings(); @@ -75,12 +76,22 @@ private: void initAudioFormat(); void initAudioInput(); -public slots: - void handleActivePortChanged(const QString &value); - void handleSourceAdded(int index); - void handleSourceDelete(int index); - void handleDefaultSourceChanged(int index); - void handleVolumeChanged(double value); + void reload(); + void clear(); + void clearFeedBack(); + + void setDefaultSource(int sourceIndex); + +private slots: + void changeDefaultInputCard(int index); + void setVolume(int value); + void setActivePort(int index); + void addSource(int index); + void deleteSource(int index); + + void onActivePortChanged(const QString &value); + void onDefaultSourceChanged(int index); + void onVolumeChanged(double value); void refreshFeedBack(); @@ -88,9 +99,6 @@ private: Ui::InputPage *ui; AudioInterface *m_audioInterface; AudioDeviceInterface *m_defaultSource; - AudioDeviceInterface *m_activedSource; - QMap m_inputDevicesMap; - int m_defaultSourceIndex; bool m_isValidPort = false; QAudioInput *m_audioInput = nullptr; diff --git a/plugins/audio/src/plugin/input-page.ui b/plugins/audio/src/plugin/input-page.ui index c291ef06..30527657 100644 --- a/plugins/audio/src/plugin/input-page.ui +++ b/plugins/audio/src/plugin/input-page.ui @@ -21,7 +21,7 @@ 24 - 0 + 24 24 @@ -29,10 +29,34 @@ 0 + + + + 0 + + + + + Input cards + + + + + + + + + 10 + + + + + + - 24 + 16 diff --git a/plugins/audio/src/plugin/output-page.cpp b/plugins/audio/src/plugin/output-page.cpp index 72834cc2..438a4167 100644 --- a/plugins/audio/src/plugin/output-page.cpp +++ b/plugins/audio/src/plugin/output-page.cpp @@ -22,11 +22,12 @@ #include OutputPage::OutputPage(QWidget *parent) : QWidget(parent), - ui(new Ui::OutputPage), - m_audioInterface(nullptr), - m_defaultSink(nullptr) + ui(new Ui::OutputPage), + m_audioInterface(nullptr), + m_defaultSink(nullptr) { ui->setupUi(this); + m_audioInterface = AudioInterface::instance(); init(); m_dbusServiceWatcher = new QDBusServiceWatcher(); @@ -34,10 +35,10 @@ OutputPage::OutputPage(QWidget *parent) : QWidget(parent), m_dbusServiceWatcher->addWatchedService(AUDIO_DBUS_NAME); m_dbusServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); - connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered,[this](const QString &service){ - KLOG_DEBUG() << "serviceUnregistered:" << service; - disableSettings(); - }); + connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, [this](const QString &service) + { + KLOG_INFO() << "serviceUnregistered:" << service; + disableSettings(); }); } OutputPage::~OutputPage() @@ -57,152 +58,142 @@ void OutputPage::init() ui->volumeBalance->setSingleStep(1); ui->volumeBalance->setPageStep(1); - m_audioInterface = AudioInterface::instance(); - initOutputDevice(); + initSettins(); initConnect(); } -void OutputPage::initOutputDevice() +void OutputPage::initSettins() { - QDBusPendingReply defaultSinkPath = m_audioInterface->GetDefaultSink(); - KLOG_DEBUG() << "defaultSink" << defaultSinkPath; - KLOG_DEBUG() << "defaultSinkPath.isValid():" << defaultSinkPath.isValid(); + QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSink(); + KLOG_INFO() << "default Sink:" << dbusReply; - if(defaultSinkPath.isValid()) + if (!dbusReply.isValid()) { - QString defaultSinkPathString = defaultSinkPath.value(); - if(!defaultSinkPathString.isEmpty()) - { - m_defaultSink = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); - initActivedPort(); + KLOG_INFO() << "default Sink Path error:" << dbusReply.error(); + disableSettings(); + return; + } - connect(m_defaultSink, &AudioDeviceInterface::volumeChanged, this, &OutputPage::handleVolumeChanged); - connect(m_defaultSink, &AudioDeviceInterface::balanceChanged, this, &OutputPage::handleBalanceChanged); - connect(m_defaultSink, &AudioDeviceInterface::active_portChanged, this, &OutputPage::handleActivePortChanged); - } - else - { - disableSettings(); - } + QString defaultSinkPath = dbusReply.value(); + if (!defaultSinkPath.isEmpty()) + { + m_defaultSink = new AudioDeviceInterface(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); + initCardOptions(); + initActivedPort(); + + connect(m_defaultSink, &AudioDeviceInterface::volumeChanged, this, &OutputPage::changeVolumeSlider, Qt::UniqueConnection); + connect(m_defaultSink, &AudioDeviceInterface::balanceChanged, this, &OutputPage::changeBalanceSlider, Qt::UniqueConnection); + connect(m_defaultSink, &AudioDeviceInterface::active_portChanged, this, &OutputPage::onActivePortChanged, Qt::UniqueConnection); } else { - KLOG_DEBUG() << "defaultSinkPath error:" <outputCards->blockSignals(true); + QList cardsInfo = m_audioInterface->getCards(); + for (auto card : cardsInfo) + { + ui->outputCards->addItem(card.name, card.index); + } + int index = ui->outputCards->findData(m_defaultSink->card_index()); + ui->outputCards->setCurrentIndex(index); + ui->outputCards->blockSignals(false); +} + void OutputPage::initActivedPort() { - QList portsInfo = m_defaultSink->getPortsInfo(); - if(portsInfo.isEmpty()) + if(!m_defaultSink->isAvailablePorts()) { - //无激活端口则禁用音量设置和平衡 - KLOG_DEBUG() << "default sink ports is null"; + // 无激活端口则禁用音量设置和平衡 + KLOG_DEBUG() << "No available ports for current default sink"; disableSettings(); return; } - Q_FOREACH (auto portInfo, portsInfo) + ui->outputDevices->blockSignals(true); + ui->outputDevices->setEnabled(true); + + QList portsInfo = m_defaultSink->getPortsInfo(); + for (auto portInfo: portsInfo) { - if(m_defaultSink->active_port() == portInfo.name) + if (portInfo.available != PORT_AVAILABLE_NO) { - ui->outputDevices->addItem(portInfo.description,portInfo.name); - break; + ui->outputDevices->addItem(portInfo.description, portInfo.name); + } } - initOutputSettins(); -} + int currentIndex = ui->outputDevices->findData(m_defaultSink->active_port()); + ui->outputDevices->setCurrentIndex(currentIndex); + ui->outputDevices->blockSignals(false); -void OutputPage::initOutputSettins() -{ - ui->outputDevices->setEnabled(true); - ui->volumeSetting->setEnabled(true); - ui->volumeBalance->setEnabled(true); - initVolumeValue(); - initBalanceValue(); + /// 存在激活端口才初始化音量和平衡设置 + initVolumeAndBalance(); } -void OutputPage::initVolumeValue() +void OutputPage::initVolumeAndBalance() { + if (ui->outputDevices->isEnabled()) + { + ui->volumeSetting->setEnabled(true); + ui->volumeBalance->setEnabled(true); + } + + ui->volumeSetting->blockSignals(true); + ui->volumeBalance->blockSignals(true); + double currentVolumeDouble = m_defaultSink->volume() * 100; int currentVolume = round(currentVolumeDouble); ui->volumeSetting->setValue(currentVolume); ui->outputVolume->setText(QString::number(currentVolume) + "%"); -} -void OutputPage::initBalanceValue() -{ - KLOG_DEBUG() << "current balance:" << m_defaultSink->balance(); double currentBalanceDouble = m_defaultSink->balance() * 100; - int currentBalance = round(currentBalanceDouble); - ui->volumeBalance->setValue(currentBalance); + ui->volumeBalance->setValue(round(currentBalanceDouble)); + + ui->volumeSetting->blockSignals(false); + ui->volumeBalance->blockSignals(false); + + KLOG_DEBUG() << "current output volume:" << currentVolume; + KLOG_DEBUG() << "current output balance:" << round(currentBalanceDouble); } void OutputPage::initConnect() { - connect(m_audioInterface, &AudioInterface::SinkAdded, this, &OutputPage::handleSinkAdded); - connect(m_audioInterface, &AudioInterface::SinkDelete, this, &OutputPage::handleSinkDelete); - connect(m_audioInterface, &AudioInterface::DefaultSinkChange, this, &OutputPage::handleDefaultSinkChanged, Qt::QueuedConnection); + connect(m_audioInterface, &AudioInterface::SinkAdded, this, &OutputPage::addSink); + connect(m_audioInterface, &AudioInterface::SinkDelete, this, &OutputPage::deleteSink); + connect(m_audioInterface, &AudioInterface::DefaultSinkChange, this, &OutputPage::defaultSinkChanged, Qt::QueuedConnection); - connect(ui->outputDevices, static_cast(&QComboBox::currentIndexChanged), [this](int index) - { - QString namePort = ui->outputDevices->itemData(index, Qt::UserRole).toString(); - KLOG_DEBUG() << "SetActivePort:" << namePort; - if(m_defaultSink != nullptr) - m_defaultSink->SetActivePort(namePort); - else - KLOG_DEBUG() << "m_defaultSink is null"; }); - - connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) - { - double volumeValue = static_cast(ui->volumeSetting->sliderPosition()) / static_cast(100); - if(m_defaultSink != nullptr) - { - m_defaultSink->SetVolume(volumeValue); - KLOG_DEBUG() << "SetVolume:" << volumeValue; - } - else - KLOG_DEBUG() << "m_defaultSink is null"; }); - - connect(ui->volumeBalance, &QSlider::valueChanged, [this](int value) - { - double balanceValue = static_cast(value) / static_cast(100); - if (m_defaultSink != nullptr) - { - m_defaultSink->SetBalance(balanceValue); - KLOG_DEBUG() << "balanceValue" << balanceValue; - } - else - KLOG_DEBUG() << "m_defaultSink is null"; }); + connect(ui->outputCards, static_cast(&QComboBox::currentIndexChanged), this, &OutputPage::changeDefaultOutputCard); + connect(ui->outputDevices, static_cast(&QComboBox::currentIndexChanged), this, &OutputPage::setActivePort); + + connect(ui->volumeSetting, &QSlider::valueChanged, this, &OutputPage::setVolume); + connect(ui->volumeBalance, &QSlider::valueChanged, this, &OutputPage::setBalance); } -void OutputPage::handleActivePortChanged(const QString &value) +void OutputPage::onActivePortChanged(const QString &value) { - KLOG_DEBUG() << "handleActivePortChanged :" << value; - QList portsInfo = m_defaultSink->getPortsInfo(); - - Q_FOREACH (auto portInfo, portsInfo) - { - if(m_defaultSink->active_port() == portInfo.name) - { - ui->outputDevices->clear(); - ui->outputDevices->addItem(portInfo.description,portInfo.name); - break; - } - } + KLOG_INFO() << "output device (active Port) changed :" << value; + ui->outputDevices->blockSignals(true); + ui->outputDevices->clear(); + ui->outputDevices->blockSignals(false); + + initActivedPort(); } -void OutputPage::handleVolumeChanged(double value) +void OutputPage::changeVolumeSlider(double value) { - ui->volumeSetting->blockSignals(true); //为了避免拖动的同时设置位置会出现问题 + ui->volumeSetting->blockSignals(true); // 为了避免拖动的同时设置位置会出现问题 int currentVolume = round(value * 100); ui->outputVolume->setText(QString::number(currentVolume) + "%"); ui->volumeSetting->setValue(currentVolume); ui->volumeSetting->blockSignals(false); } -void OutputPage::handleBalanceChanged(double value) +void OutputPage::changeBalanceSlider(double value) { ui->volumeBalance->blockSignals(true); int currentBalance = round(value * 100); @@ -210,23 +201,138 @@ void OutputPage::handleBalanceChanged(double value) ui->volumeBalance->blockSignals(false); } +void OutputPage::setActivePort(int index) +{ + QString namePort = ui->outputDevices->itemData(index, Qt::UserRole).toString(); + KLOG_DEBUG() << "Set Active Port:" << namePort; + if (m_defaultSink != nullptr) + m_defaultSink->SetActivePort(namePort); + else + KLOG_DEBUG() << "m_defaultSink is null"; +} + +void OutputPage::setVolume(int value) +{ + double volumeValue = static_cast(ui->volumeSetting->sliderPosition()) / static_cast(100); + if (m_defaultSink != nullptr) + { + m_defaultSink->SetVolume(volumeValue); + KLOG_DEBUG() << "Set Volume:" << volumeValue; + } + else + { + KLOG_INFO() << "set volume failed, default Sink is null"; + } +} + +void OutputPage::setBalance(int value) +{ + double balanceValue = static_cast(value) / static_cast(100); + if (m_defaultSink != nullptr) + { + m_defaultSink->SetBalance(balanceValue); + KLOG_DEBUG() << "set balance" << balanceValue; + } + else + { + KLOG_INFO() << "set balance failed, default Sink is null"; + } +} + +/** + * NOTE: + * 目前切换声卡实际只是切换了defaultSink + */ +void OutputPage::changeDefaultOutputCard(int index) +{ + int cardIndex = ui->outputCards->itemData(index, Qt::UserRole).toInt(); + KLOG_INFO() << "change default output card, current output card Index:" << cardIndex; + QDBusPendingReply getSinks = m_audioInterface->GetSinks(); + QStringList sinksList = getSinks.value(); + + int sinkIndex = -1; + for (auto sink : sinksList) + { + AudioDeviceInterface audioSink(AUDIO_DBUS_NAME, sink, QDBusConnection::sessionBus(), this); + if (cardIndex == audioSink.card_index()) + { + if (audioSink.isAvailablePorts()) + { + sinkIndex = audioSink.index(); + break; + } + } + } + + if (sinkIndex == -1) + { + KLOG_INFO() << "The sink with an available port corresponding to the card index was not found"; + KLOG_INFO() << "set default sink failed"; + disableSettings(); + return; + } + + QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSink(); + QString defaultSinkPath = dbusReply.value(); + AudioDeviceInterface defaultSink(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); + if (sinkIndex == defaultSink.index()) + { + KLOG_DEBUG() << "current default sink:" << sinkIndex; + reload(); + return; + } + + setDefaultSink(sinkIndex); +} + void OutputPage::disableSettings() { + KLOG_INFO() << "disbale settings"; + ui->outputDevices->blockSignals(true); + ui->volumeSetting->blockSignals(true); + ui->volumeBalance->blockSignals(true); + ui->outputDevices->insertItem(0, tr("No output device detected")); - ui->outputDevices->setEnabled(false); + ui->outputDevices->setCurrentIndex(0); ui->volumeSetting->setValue(0); ui->outputVolume->setText(QString::number(0) + "%"); - ui->volumeSetting->setEnabled(false); - ui->volumeBalance->setValue(0); + + ui->outputDevices->setEnabled(false); + ui->volumeSetting->setEnabled(false); ui->volumeBalance->setEnabled(false); + + ui->outputDevices->blockSignals(false); + ui->volumeSetting->blockSignals(false); + ui->volumeBalance->blockSignals(false); +} + +void OutputPage::setDefaultSink(int sinkIndex) +{ + /** + * NOTE: + * 由于SetDefaultSink不一定生效,且没有返回值表明是否切换DefaultSink成功。 + * 调用SetDefaultSink后统一禁用音量设置,等待 DefaultSinkChange 信号的接收 + * 接收到DefaultSinkChange信号后,确认SetDefaultSink生效后(即切换sink成功),界面再打开和更新设置 + */ + + m_audioInterface->SetDefaultSink(sinkIndex); + KLOG_INFO() << QString("set default sink:%1").arg(sinkIndex); + disableSettings(); +} + +void OutputPage::reload() +{ + KLOG_INFO() << "reload output device and settings"; + // delete and restart init defaultSink + clear(); + initSettins(); } -void OutputPage::handleDefaultSinkChanged(int index) +void OutputPage::clear() { - // delete and restart init defaultSource - if(m_defaultSink != nullptr) + if (m_defaultSink != nullptr) { m_defaultSink->deleteLater(); m_defaultSink = nullptr; @@ -235,43 +341,35 @@ void OutputPage::handleDefaultSinkChanged(int index) ui->outputDevices->clear(); ui->outputDevices->blockSignals(false); - initOutputDevice(); - initOutputSettins(); + ui->outputCards->blockSignals(true); + ui->outputCards->clear(); + ui->outputCards->blockSignals(false); } - -void OutputPage::handleSinkAdded(int index) +/** + * NOTE: + * 一个sink对应一个输出设备,例如耳机、扬声器, + * 一个card对应一个声卡 + * card和sink应该是属于多对多的关系 + */ +// 默认sink变了,重新比对card_index,重新加载sink和界面 +void OutputPage::defaultSinkChanged(int index) { - KLOG_DEBUG() << "SinkAdded"; - //当已经存在defaultSink时,暂时不处理其他sink的添加 - if(m_defaultSink != nullptr) - { - //刷新界面 - initOutputSettins(); - } - else - { - //defaultSink不存在,则重新初始化设备 - initOutputDevice(); - } + KLOG_INFO() << "default sink changed"; + reload(); } -//当pulseAudio被kill时,会发出SinkDelete和SourceDelete信号 -void OutputPage::handleSinkDelete(uint index) +void OutputPage::addSink(int index) { - KLOG_DEBUG() << "SinkDelete"; - QDBusPendingReply getSinks = m_audioInterface->GetSinks(); - QStringList sinksList = getSinks.value(); + KLOG_DEBUG() << "Sink Added:" << index; + reload(); +} - //当前存在defaultSink - if(m_defaultSink != nullptr) - { - //删除的是defaultSink则进行处理,删除其他sink暂时不处理 - if(m_defaultSink->index() == index) - { - disableSettings(); - } - } +// 当pulseAudio被kill时,会发出SinkDelete和SourceDelete信号 +void OutputPage::deleteSink(uint index) +{ + KLOG_DEBUG() << "Sink Delete:" << index; + reload(); } QSize OutputPage::sizeHint() const diff --git a/plugins/audio/src/plugin/output-page.h b/plugins/audio/src/plugin/output-page.h index 11283695..84ea048a 100644 --- a/plugins/audio/src/plugin/output-page.h +++ b/plugins/audio/src/plugin/output-page.h @@ -37,29 +37,38 @@ public: ~OutputPage() override; QSize sizeHint() const override; -public slots: - void handleDefaultSinkChanged(int index); - void handleSinkAdded(int index); - void handleSinkDelete(uint index); - void handleActivePortChanged(const QString &value); - void handleVolumeChanged(double value); - void handleBalanceChanged(double value); +private slots: + void defaultSinkChanged(int index); + void addSink(int index); + void deleteSink(uint index); + + void changeDefaultOutputCard(int index); + void onActivePortChanged(const QString &value); + void changeVolumeSlider(double value); + void changeBalanceSlider(double value); + + void setActivePort(int index); + void setVolume(int value); + void setBalance(int value); private: void init(); - void initOutputDevice(); - void initOutputSettins(); void initConnect(); + + void initSettins(); + void initCardOptions(); void initActivedPort(); - void initVolumeValue(); - void initBalanceValue(); - + void initVolumeAndBalance(); void disableSettings(); + + void setDefaultSink(int sinkIndex); + + void reload(); + void clear(); private: Ui::OutputPage *ui; AudioInterface *m_audioInterface; - QMap m_outputDevicesMap; AudioDeviceInterface *m_defaultSink; QDBusServiceWatcher *m_dbusServiceWatcher; }; diff --git a/plugins/audio/src/plugin/output-page.ui b/plugins/audio/src/plugin/output-page.ui index f7f8de84..d5d68c60 100644 --- a/plugins/audio/src/plugin/output-page.ui +++ b/plugins/audio/src/plugin/output-page.ui @@ -21,7 +21,7 @@ 24 - 0 + 24 24 @@ -29,13 +29,37 @@ 0 + + + + 0 + + + + + Output cards + + + + + + + + + 10 + + + + + + 0 - 24 + 16 -- Gitee From b856e906df447cf1c4d0345fe9278edad7eac782 Mon Sep 17 00:00:00 2001 From: luoqing Date: Wed, 6 Dec 2023 16:24:33 +0800 Subject: [PATCH 05/17] feature(audio):After the volume back-end is set to mute, the volume value is no longer set to zero. Therefore, after clicking the mute button, the volume is set to 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 由于音量后端设置静音后,不再将音量值归零,因此点击静音按钮后,将音量设为0 --- plugins/audio/src/system-tray/volume-setting-page.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp index 4b34a3e3..01096636 100644 --- a/plugins/audio/src/system-tray/volume-setting-page.cpp +++ b/plugins/audio/src/system-tray/volume-setting-page.cpp @@ -196,18 +196,19 @@ void VolumeSettingPage::clickMuteButton(Audio *audio) if (currentVolume != 0) { - KLOG_DEBUG() << "m_sink->mute() :" << audio->mute(); + m_volumeBeforeMute = currentVolume; if (!audio->mute()) { - m_volumeBeforeMute = currentVolume; audio->SetMute(true); } + audio->SetVolume(0); + KLOG_DEBUG() << "current sink is mute :" << audio->mute(); } else { if (m_volumeBeforeMute != 0) { - KLOG_DEBUG() << "SetVolume m_volumeBeforeMute:" << m_volumeBeforeMute; + //重新设置音量时,会自动解除静音状态 audio->SetVolume(static_cast(m_volumeBeforeMute) / static_cast(100)); m_volumeBeforeMute = 0; } -- Gitee From ed05110f24fe60bfbb04b5cf01a5a376bfb38089 Mon Sep 17 00:00:00 2001 From: luoqing Date: Wed, 6 Dec 2023 17:21:33 +0800 Subject: [PATCH 06/17] feature(audio):Merge the volume translation file into kiran-control-panel.zh_CN.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将音量翻译文件合入kiran-control-panel.zh_CN.ts中,并修改相应的CMakeLists --- plugins/audio/CMakeLists.txt | 7 +- plugins/audio/src/plugin/audio-plugin.cpp | 2 +- plugins/audio/src/system-tray/main.cpp | 2 +- .../translations/kiran-cpanel-audio.bo_CN.ts | 156 ----------- .../translations/kiran-cpanel-audio.kk_KG.ts | 156 ----------- .../translations/kiran-cpanel-audio.kk_KZ.ts | 156 ----------- .../translations/kiran-cpanel-audio.mn_MN.ts | 156 ----------- .../translations/kiran-cpanel-audio.ug_CN.ts | 156 ----------- .../translations/kiran-cpanel-audio.zh_CN.ts | 156 ----------- translations/kiran-control-panel.zh_CN.ts | 260 +++++++++--------- 10 files changed, 138 insertions(+), 1069 deletions(-) delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.bo_CN.ts delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.kk_KG.ts delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.kk_KZ.ts delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.mn_MN.ts delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.ug_CN.ts delete mode 100644 plugins/audio/translations/kiran-cpanel-audio.zh_CN.ts diff --git a/plugins/audio/CMakeLists.txt b/plugins/audio/CMakeLists.txt index 21d6210b..9ebdad8c 100644 --- a/plugins/audio/CMakeLists.txt +++ b/plugins/audio/CMakeLists.txt @@ -1,8 +1,6 @@ set(TARGET_NAME kiran-cpanel-audio) file(GLOB_RECURSE AUDIO_TRANSLATION_SRC ./*.cpp ./*.h ./*.ui) -file(GLOB TS_FILES "translations/*.ts") -qt5_create_translation(AUDIO_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES} ${AUDIO_TRANSLATION_SRC}) file(GLOB_RECURSE COMMON_SRC "src/audio-node.h" "src/volume-slider.cpp" "src/volume-slider.h") file(GLOB_RECURSE DBUS_SRC "src/dbus/*.cpp" "src/dbus/*.h") @@ -15,7 +13,7 @@ add_library(${TARGET_NAME} SHARED ${DBUS_SRC} ${PLUGIN_SRC} ${QRC} - ${AUDIO_QM_FILES}) + ) target_include_directories(${TARGET_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/common @@ -44,7 +42,6 @@ add_executable(${TRAY_PROCESS} ${COMMON_SRC} ${DBUS_SRC} ${SYSTEM_TRAY_SRC} - ${AUDIO_QM_FILES} ${QRC} ${PROJECT_SOURCE_DIR}/include/dbus-tray-monitor.h) @@ -67,8 +64,6 @@ target_link_libraries(${TRAY_PROCESS} ${KLOG_LIBRARIES} ${KIRAN_STYLE_LIBRARIES}) -#安装翻译 -install(FILES ${AUDIO_QM_FILES} DESTINATION ${TRANSLATION_DIR}) set(AUTOSTART_DESKTOP_DIR /etc/xdg/autostart) #安装插件desktop文件 diff --git a/plugins/audio/src/plugin/audio-plugin.cpp b/plugins/audio/src/plugin/audio-plugin.cpp index e572f60a..c4ac0826 100644 --- a/plugins/audio/src/plugin/audio-plugin.cpp +++ b/plugins/audio/src/plugin/audio-plugin.cpp @@ -42,7 +42,7 @@ int AudioPlugin::init(KiranControlPanel::PanelInterface* interface) m_translator = new QTranslator(qApp); if (!m_translator->load(QLocale(), - "kiran-cpanel-audio", + "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) diff --git a/plugins/audio/src/system-tray/main.cpp b/plugins/audio/src/system-tray/main.cpp index 8c36383a..731a6d28 100644 --- a/plugins/audio/src/system-tray/main.cpp +++ b/plugins/audio/src/system-tray/main.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) KLOG_INFO() << "autostart!"; QTranslator translator; - if (translator.load(QLocale(), "kiran-cpanel-audio", ".", TRANSLATE_PREFIX, ".qm")) + if (translator.load(QLocale(), "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) { a.installTranslator(&translator); KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); diff --git a/plugins/audio/translations/kiran-cpanel-audio.bo_CN.ts b/plugins/audio/translations/kiran-cpanel-audio.bo_CN.ts deleted file mode 100644 index e6460490..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.bo_CN.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - སྒྲ་གདངས་དྲག་ཞན་དུ་བཙུགས་པ་འི། - - - - Mixed Setting - མཉམ་བསྲེས་ཀྱི་སྒྲིག་བཀོད། - - - - CPanelAudioWidget - - - CPanelAudioWidget - CPanelAudioWidget - - - - Output - ཕྱིར་གཏོང། - - - - Input - ནང་འདྲེན། - - - - InputPage - - - InputPage - ནང་འདྲེན་ཤོག་ལྷེ། - - - - Input devices - ནང་འདྲེན་སྒྲིག་ཆས། - - - - ComboBoxInputDevices - སྡེབ་སྒྲིག་框ནང་འདྲེན་སྒྲིག་ཆས། - - - - Input volume - ནང་འདྲེན་སྒྲ་གདངས་དྲག་ཞན། - - - - SliderVolumeSetting - འདྲེད་རྡོག་བམ་པོ་བཟོ། - - - - Feedback volume - ལྡོག་འདྲེན་ཚད། - - - - No input device detected - མ་ཚད་ལེན་བྱས་ནས་ནང་འདྲེན་སྒྲིག་ཆས། - - - - OutputPage - - - OutputPage - ཕྱིར་གཏོང་ཤོག་ལྷེ། - - - - Output devices - ཕྱིར་གཏོང་སྒྲིག་ཆས། - - - - ComboBoxOutputDevices - སྡེབ་སྒྲིག་框ཕྱིར་འདྲེན་བྱེད་པའི་སྒྲིག་ཆས། - - - - Output volume - ཕྱིར་གཏོང་སྒྲ་གདངས་དྲག་ཞན། - - - - SlilderVolumeSetting - SlilderVolumeSet - - - - Left/right balance - གཡོན་/གཡས་དོ་མཉམ། - - - - SliderVolumeBalance - འདྲེད་རྡོག་ལུས་བོངས་ལྷག་གྲངས། - - - - Left - གཡོན། - - - - Right - གཡས། - - - - No output device detected - མ་ཚད་ལེན་ནས་ཕྱིར་འདྲེན་བྱེད་པའི་སྒྲིག་ཆས། - - - - VolumeIntputSubItem - - - VolumeInput - སྒྲ་གདངས་དྲག་ཞན་ནང་འདྲེན། - - - - VolumeOutputSubItem - - - VolumeOutput - འབོར་གྲངས་ཕྱིར་གཏོང། - - - - VolumeSettingPage - - - VolumeSettingPage - བམ་པོ་བཟོ་ཤོག་ལྷེ། - - - - - Volume - དཔྱད། - - - diff --git a/plugins/audio/translations/kiran-cpanel-audio.kk_KG.ts b/plugins/audio/translations/kiran-cpanel-audio.kk_KG.ts deleted file mode 100644 index 92dd2061..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.kk_KG.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - Томду орнотуу - - - - Mixed Setting - Аралаш орнотуу - - - - CPanelAudioWidget - - - CPanelAudioWidget - CPanelAudioWidget - - - - Output - Чыгаруу - - - - Input - Киргизүү - - - - InputPage - - - InputPage - Кирүү Баракчасы - - - - Input devices - Кирүү түзмөктөрү - - - - ComboBoxInputDevices - ComboxInputDevices - - - - Input volume - Кирүү көлөмү - - - - SliderVolumeSetting - SliderVolumeSetting - - - - Feedback volume - Пикирлер көлөмү - - - - No input device detected - Кирүү түзмөк табылган жок - - - - OutputPage - - - OutputPage - Чыгуу Баракчасы - - - - Output devices - Чыгаруу түзмөктөрү - - - - ComboBoxOutputDevices - ComboxOutputDevices - - - - Output volume - Чыгаруу көлөмү - - - - SlilderVolumeSetting - SlilderVolumeSetting - - - - Left/right balance - Сол / оң балансы - - - - SliderVolumeBalance - SliderVolumeBalance - - - - Left - Солдо - - - - Right - Туура - - - - No output device detected - Чыгуу түзмөк табылган жок - - - - VolumeIntputSubItem - - - VolumeInput - ТомИнпут - - - - VolumeOutputSubItem - - - VolumeOutput - ТомУтпут - - - - VolumeSettingPage - - - VolumeSettingPage - ТомСеттингПидж - - - - - Volume - Том - - - diff --git a/plugins/audio/translations/kiran-cpanel-audio.kk_KZ.ts b/plugins/audio/translations/kiran-cpanel-audio.kk_KZ.ts deleted file mode 100644 index dc6431e7..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.kk_KZ.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - Көлемді белгілеу - - - - Mixed Setting - Аралас баптау - - - - CPanelAudioWidget - - - CPanelAudioWidget - CPanelAudioWidget - - - - Output - Шығу - - - - Input - Кіріспе - - - - InputPage - - - InputPage - Кіріспе - - - - Input devices - Кіріс құрылғылары - - - - ComboBoxInputDevices - ComboBoxInputDevices - - - - Input volume - Кіріс көлемі - - - - SliderVolumeSetting - SliderVolumeSeting - - - - Feedback volume - Кері байланыс көлемі - - - - No input device detected - Кіріс құрылғысы табылмады - - - - OutputPage - - - OutputPage - Шығу - - - - Output devices - Шығару құрылғылары - - - - ComboBoxOutputDevices - ComboBoxOutputDevices - - - - Output volume - Шығу көлемі - - - - SlilderVolumeSetting - SlilderVolumeSeting - - - - Left/right balance - Сол / оң баланс - - - - SliderVolumeBalance - SliderVolumeBalance - - - - Left - Сол - - - - Right - Оң - - - - No output device detected - Шығу құрылғысы табылмады - - - - VolumeIntputSubItem - - - VolumeInput - КөлемКіріспе - - - - VolumeOutputSubItem - - - VolumeOutput - FimeOutput - - - - VolumeSettingPage - - - VolumeSettingPage - TimeSetingPage - - - - - Volume - Көлемі - - - diff --git a/plugins/audio/translations/kiran-cpanel-audio.mn_MN.ts b/plugins/audio/translations/kiran-cpanel-audio.mn_MN.ts deleted file mode 100644 index 693779d7..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.mn_MN.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - Дууны тохиргоо - - - - Mixed Setting - Холих тохиргоо - - - - CPanelAudioWidget - - - CPanelAudioWidget - CPanelAudioWidget - - - - Output - Гаралт - - - - Input - Оруулна уу - - - - InputPage - - - InputPage - NPutage - - - - Input devices - Оролтын төхөөрөмж - - - - ComboBoxInputDevices - Combo box оролтын төхөөрөмж - - - - Input volume - Оролт - - - - SliderVolumeSetting - SliderVolumeSetting - - - - Feedback volume - Санал хүсэлт - - - - No input device detected - Оролтын төхөөрөмж илрээгүй байна - - - - OutputPage - - - OutputPage - Гаралтын хуудас - - - - Output devices - Гаралтын төхөөрөмж - - - - ComboBoxOutputDevices - Combo box гаралтын төхөөрөмж - - - - Output volume - Гаралт - - - - SlilderVolumeSetting - SlilderVolumeSetting - - - - Left/right balance - Зүүн/баруун баланс - - - - SliderVolumeBalance - SliderVolumeBalance - - - - Left - Зүүн - - - - Right - Тийм шүү - - - - No output device detected - Гаралтын төхөөрөмж илрээгүй байна - - - - VolumeIntputSubItem - - - VolumeInput - Эзлэхүүний оролт - - - - VolumeOutputSubItem - - - VolumeOutput - Газрын тосны үйлдвэрлэл - - - - VolumeSettingPage - - - VolumeSettingPage - VolumeSettingPage - - - - - Volume - Эзлэхүүн - - - diff --git a/plugins/audio/translations/kiran-cpanel-audio.ug_CN.ts b/plugins/audio/translations/kiran-cpanel-audio.ug_CN.ts deleted file mode 100644 index e7088f9d..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.ug_CN.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - ئاۋاز تەڭشەش - - - - Mixed Setting - ئارىلاشما تەڭشەش - - - - CPanelAudioWidget - - - CPanelAudioWidget - CPanelAudioWidget - - - - Output - چىقىرىش - - - - Input - كىرگۈزۈش - - - - InputPage - - - InputPage - كىرگۈزۈش - - - - Input devices - كىرگۈزۈش ئۈسكۈنىلىرى - - - - ComboBoxInputDevices - ComboBoxInputDevices - - - - Input volume - كىرگۈزۈش مىقدارى - - - - SliderVolumeSetting - سىيرىلما ئاۋاز - - - - Feedback volume - تەكلىپ مىقدارى - - - - No input device detected - كىرگۈزۈش ئۈسكۈنىسى بايقالمىدى - - - - OutputPage - - - OutputPage - چىقىرىش - - - - Output devices - چىقىرىش ئۈسكۈنىلىرى - - - - ComboBoxOutputDevices - ComboBoxOutputDevices - - - - Output volume - چىقىرىش مىقدارى - - - - SlilderVolumeSetting - SlilderVolumeSeting - - - - Left/right balance - سول / ئوڭ تەڭپۇڭلۇق - - - - SliderVolumeBalance - SliderVolumeBalance - - - - Left - سول سول سول - - - - Right - توغرا - - - - No output device detected - ھېچقانداق چىقىرىش ئۈسكۈنىسى بايقالمىدى - - - - VolumeIntputSubItem - - - VolumeInput - ھەجىمى - - - - VolumeOutputSubItem - - - VolumeOutput - ئاۋاز چىقىرىش - - - - VolumeSettingPage - - - VolumeSettingPage - ئاۋاز تەڭشەش بېتى - - - - - Volume - ھەجىمى - - - diff --git a/plugins/audio/translations/kiran-cpanel-audio.zh_CN.ts b/plugins/audio/translations/kiran-cpanel-audio.zh_CN.ts deleted file mode 100644 index 551262b5..00000000 --- a/plugins/audio/translations/kiran-cpanel-audio.zh_CN.ts +++ /dev/null @@ -1,156 +0,0 @@ - - - - - AudioSystemTray - - - Volume Setting - 声音设置 - - - - Mixed Setting - 混合设置 - - - - CPanelAudioWidget - - - CPanelAudioWidget - - - - - Output - 输出 - - - - Input - 输入 - - - - InputPage - - - InputPage - - - - - Input devices - 输入设备 - - - - ComboBoxInputDevices - - - - - Input volume - 输入音量 - - - - SliderVolumeSetting - - - - - Feedback volume - 反馈音量 - - - - No input device detected - 未检测到输入设备 - - - - OutputPage - - - OutputPage - - - - - Output devices - 输出设备 - - - - ComboBoxOutputDevices - - - - - Output volume - 输出音量 - - - - SlilderVolumeSetting - - - - - Left/right balance - 左/右平衡 - - - - SliderVolumeBalance - - - - - Left - - - - - Right - - - - - No output device detected - 未检测到输出设备 - - - - VolumeIntputSubItem - - - VolumeInput - 输入 - - - - VolumeOutputSubItem - - - VolumeOutput - 输出 - - - - VolumeSettingPage - - - VolumeSettingPage - - - - - - Volume - 音量 - - - diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts index 913c84f1..c3f18c07 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -1,6 +1,141 @@ + + AudioSystemTray + + Volume Setting + 声音设置 + + + Mixed Setting + 混合设置 + + + + CPanelAudioWidget + + CPanelAudioWidget + + + + Output + 输出 + + + Input + 输入 + + + + InputPage + + InputPage + + + + + Input cards + 输入声卡 + + + Input devices + 输入设备 + + + ComboBoxInputDevices + + + + Input volume + 输入音量 + + + SliderVolumeSetting + + + + Feedback volume + 反馈音量 + + + No input device detected + 未检测到输入设备 + + + + OutputPage + + OutputPage + + + + + Output cards + 输出声卡 + + + Output devices + 输出设备 + + + ComboBoxOutputDevices + + + + Output volume + 输出音量 + + + SlilderVolumeSetting + + + + Left/right balance + 左/右平衡 + + + SliderVolumeBalance + + + + Left + + + + Right + + + + No output device detected + 未检测到输出设备 + + + + VolumeIntputSubItem + + VolumeInput + 输入 + + + + VolumeOutputSubItem + + VolumeOutput + 输出 + + + + VolumeSettingPage + + VolumeSettingPage + + + + Volume + 音量 + + AccountItemWidget @@ -254,17 +389,6 @@ 开机启动 - - AudioSystemTray - - Volume Setting - 声音设置 - - - Mixed Setting - 混合设置 - - AuthManagerPage @@ -498,21 +622,6 @@ 添加 - - CPanelAudioWidget - - CPanelAudioWidget - - - - Output - 输出 - - - Input - 输入 - - CPanelNetworkWidget @@ -2211,37 +2320,6 @@ 取消 - - InputPage - - InputPage - - - - Input devices - 输入设备 - - - ComboBoxInputDevices - - - - Input volume - 输入音量 - - - SliderVolumeSetting - - - - Feedback volume - 反馈音量 - - - No input device detected - 未检测到输入设备 - - Ipv4Widget @@ -3394,49 +3472,6 @@ This is line 50 of the test text 无线网卡: %1 不可用 - - OutputPage - - OutputPage - - - - Output devices - 输出设备 - - - ComboBoxOutputDevices - - - - Output volume - 输出音量 - - - SlilderVolumeSetting - - - - Left/right balance - 左/右平衡 - - - SliderVolumeBalance - - - - Left - - - - Right - - - - No output device detected - 未检测到输出设备 - - PanelWindow @@ -4975,31 +5010,6 @@ This is line 50 of the test text 暂无 - - VolumeIntputSubItem - - VolumeInput - 输入 - - - - VolumeOutputSubItem - - VolumeOutput - 输出 - - - - VolumeSettingPage - - VolumeSettingPage - - - - Volume - 音量 - - VpnIPsec -- Gitee From dd7c00815fa819eccb4410da1d1f64056ee219b1 Mon Sep 17 00:00:00 2001 From: luoqing Date: Thu, 30 Nov 2023 16:19:54 +0800 Subject: [PATCH 07/17] fix(network):Fixed incomplete display of network details and added logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复网络详情显示不全的问题并增加日志 Close #22716 --- .../connection-details-widget.cpp | 13 ++- .../details-page/connection-details-widget.h | 2 + .../src/plugin/details-page/details-page.cpp | 95 +++++++++++++------ .../src/plugin/details-page/details-page.h | 26 +++-- plugins/network/src/utils.cpp | 10 ++ plugins/network/src/utils.h | 3 + 6 files changed, 110 insertions(+), 39 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 235c48d4..f05df2c3 100644 --- a/plugins/network/src/plugin/details-page/connection-details-widget.cpp +++ b/plugins/network/src/plugin/details-page/connection-details-widget.cpp @@ -21,7 +21,9 @@ #include #include #include "ui_connection-details-widget.h" +#include "utils.h" using namespace NetworkManager; +using namespace NetworkUtils; ConnectionDetailsWidget::ConnectionDetailsWidget(Device::Ptr device, QWidget *parent) : QWidget(parent), ui(new Ui::ConnectionDetailsWidget) @@ -81,7 +83,7 @@ void ConnectionDetailsWidget::initUI() for (auto label : labels) { - if(m_device == nullptr) + if (m_device == nullptr) label->setText("-"); label->setStyleSheet("color:#919191;font-family: \"Noto Sans CJK SC Light\";"); } @@ -142,6 +144,8 @@ void ConnectionDetailsWidget::setWirelessSpecificDetails() void ConnectionDetailsWidget::setIpDetails() { + KLOG_INFO() << m_device << "ip details"; + IpConfig ipV4Config = m_activeConnection->ipV4Config(); IpAddress ipv4Address = ipV4Config.addresses().value(0); QString address = ipv4Address.ip().toString(); @@ -206,4 +210,11 @@ void ConnectionDetailsWidget::setIpDetails() int prefix = ipv6Address.prefixLength(); ui->ipv6->setText(ipv6); ui->prefix->setText(QString::number(prefix)); + + KLOG_INFO() << "active connection state:" << m_activeConnection->state(); + KLOG_INFO() << "ipv4:" << address; + KLOG_INFO() << "netmask:" << netmask; + KLOG_INFO() << "gateway:" << gateway; + KLOG_INFO() << "dhcp options:" << dhcpOptions; + KLOG_INFO() << "ipv6:" << ipv6; } diff --git a/plugins/network/src/plugin/details-page/connection-details-widget.h b/plugins/network/src/plugin/details-page/connection-details-widget.h index 7af3c430..c7ebcd53 100644 --- a/plugins/network/src/plugin/details-page/connection-details-widget.h +++ b/plugins/network/src/plugin/details-page/connection-details-widget.h @@ -33,6 +33,8 @@ class ConnectionDetailsWidget : public QWidget public: explicit ConnectionDetailsWidget(NetworkManager::Device::Ptr device, QWidget *parent = nullptr); ~ConnectionDetailsWidget() override; + +private: void init(); void initUI(); void setWirelessSpecificDetails(); diff --git a/plugins/network/src/plugin/details-page/details-page.cpp b/plugins/network/src/plugin/details-page/details-page.cpp index c879a83d..167b67de 100644 --- a/plugins/network/src/plugin/details-page/details-page.cpp +++ b/plugins/network/src/plugin/details-page/details-page.cpp @@ -14,16 +14,22 @@ #include "details-page.h" #include -#include + #include "connection-details-widget.h" #include "ui_details-page.h" +#include "utils.h" + using namespace NetworkManager; +using namespace NetworkUtils; DetailsPage::DetailsPage(QWidget *parent) : QWidget(parent), ui(new Ui::DetailsPage) { ui->setupUi(this); initUI(); + initDeviceConnect(); initConnect(); + m_reloadTimer.setInterval(1000); + QObject::connect(&m_reloadTimer, &QTimer::timeout, this, &DetailsPage::reload); } DetailsPage::~DetailsPage() @@ -86,26 +92,11 @@ void DetailsPage::handleActivatedConnectionComboBoxActivated(int index) void DetailsPage::initConnect() { - connect(notifier(), &Notifier::deviceAdded, this, &DetailsPage::handleDeviceAdded); - connect(notifier(), &Notifier::deviceRemoved, this, &DetailsPage::handleDeviceRemoved); + connect(notifier(), &Notifier::deviceAdded, this, &DetailsPage::updateDetails); + connect(notifier(), &Notifier::deviceRemoved, this, &DetailsPage::updateDetails); connect(notifier(), &Notifier::activeConnectionAdded, this, &DetailsPage::handleActiveConnectionAdded); - connect(notifier(), &Notifier::activeConnectionRemoved, this, &DetailsPage::handleActiveConnectionRemoved); - connect(notifier(), &Notifier::activeConnectionsChanged, this, &DetailsPage::handleActiveConnectionChanged); -} - -void DetailsPage::handleDeviceAdded(const QString &devicePath) -{ - reload(); -} - -void DetailsPage::handleDeviceRemoved(const QString &devicePath) -{ - reload(); -} - -void DetailsPage::handleActiveConnectionChanged() -{ - reload(); + connect(notifier(), &Notifier::activeConnectionRemoved, this, &DetailsPage::updateDetails); + connect(notifier(), &Notifier::activeConnectionsChanged, this, &DetailsPage::updateDetails); } void DetailsPage::handleActiveConnectionAdded(const QString &activeConnectionPath) @@ -118,19 +109,52 @@ void DetailsPage::handleActiveConnectionAdded(const QString &activeConnectionPat connect(activeConnection.data(), &ActiveConnection::stateChanged, this, &DetailsPage::handleActiveConnectionStateChanged, Qt::UniqueConnection); } -void DetailsPage::handleActiveConnectionRemoved(const QString &activeConnectionPath) +void DetailsPage::handleActiveConnectionStateChanged(ActiveConnection::State state) { - reload(); + if (state == ActiveConnection::Activated) + { + updateDetails(); + } } -void DetailsPage::handleActiveConnectionStateChanged(ActiveConnection::State state) +void DetailsPage::deviceStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) { - if (state == ActiveConnection::Activated) + if (newstate == Device::State::Activated && oldstate != Device::State::Activated) { - reload(); + updateDetails(); } } +void DetailsPage::changeIpV4Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG() << device << "ipV4 Config Changed"; + updateDetails(); +} +void DetailsPage::changeIpV6Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG() << device << "ipV6 Config Changed"; + updateDetails(); +} +void DetailsPage::changeDhcp4Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG() << device << "dhcp4 config changed"; + updateDetails(); +} +void DetailsPage::changeDhcp6Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG() << device << "dhcp6 config changed"; + updateDetails(); +} + +void DetailsPage::updateDetails() +{ + m_reloadTimer.start(); +} + void DetailsPage::clear() { m_deviceList.clear(); @@ -146,8 +170,21 @@ void DetailsPage::clear() void DetailsPage::reload() { - QTimer::singleShot(1000, this, [=]() - { - clear(); - initUI(); }); + KLOG_DEBUG() << "refresh details page"; + m_reloadTimer.stop(); + clear(); + initUI(); + initDeviceConnect(); +} + +void DetailsPage::initDeviceConnect() +{ + for (auto device : m_deviceList) + { + connect(device.data(), &Device::stateChanged, this, &DetailsPage::deviceStateChanged, Qt::UniqueConnection); + connect(device.data(), &Device::ipV4ConfigChanged, this, &DetailsPage::changeIpV4Config, Qt::UniqueConnection); + connect(device.data(), &Device::ipV6ConfigChanged, this, &DetailsPage::changeIpV6Config, Qt::UniqueConnection); + connect(device.data(), &Device::dhcp4ConfigChanged, this, &DetailsPage::changeDhcp4Config, Qt::UniqueConnection); + connect(device.data(), &Device::dhcp6ConfigChanged, this, &DetailsPage::changeDhcp6Config, Qt::UniqueConnection); + } } diff --git a/plugins/network/src/plugin/details-page/details-page.h b/plugins/network/src/plugin/details-page/details-page.h index 604d3f8e..19fdd02d 100644 --- a/plugins/network/src/plugin/details-page/details-page.h +++ b/plugins/network/src/plugin/details-page/details-page.h @@ -16,6 +16,7 @@ #include #include +#include QT_BEGIN_NAMESPACE namespace Ui @@ -32,25 +33,32 @@ public: explicit DetailsPage(QWidget *parent = nullptr); ~DetailsPage() override; +private slots: + void handleActivatedConnectionComboBoxActivated(int index); + void handleActiveConnectionAdded(const QString &activeConnectionPath); + void handleActiveConnectionStateChanged(NetworkManager::ActiveConnection::State state); + + void deviceStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); + void changeIpV4Config(); + void changeIpV6Config(); + void changeDhcp4Config(); + void changeDhcp6Config(); + + void updateDetails(); + +private: void initUI(); void initMultiConnectionDetailsWidget(); void initConnect(); void clear(); void reload(); - -public slots: - void handleActivatedConnectionComboBoxActivated(int index); - void handleDeviceAdded(const QString &devicePath); - void handleDeviceRemoved(const QString &devicePath); - void handleActiveConnectionAdded(const QString &activeConnectionPath); - void handleActiveConnectionRemoved(const QString &activeConnectionPath); - void handleActiveConnectionChanged(); - void handleActiveConnectionStateChanged(NetworkManager::ActiveConnection::State state); + void initDeviceConnect(); private: Ui::DetailsPage *ui; NetworkManager::Device::List m_deviceList; NetworkManager::ActiveConnection::List m_activatedConnectionList; + QTimer m_reloadTimer; }; #endif // KIRAN_CPANEL_NETWORK_DETAILS_PAGE_H diff --git a/plugins/network/src/utils.cpp b/plugins/network/src/utils.cpp index 2c58ec4d..0c606fa3 100644 --- a/plugins/network/src/utils.cpp +++ b/plugins/network/src/utils.cpp @@ -93,3 +93,13 @@ Device::List NetworkUtils::getManagedDeviceList(NetworkManager::Device::Type typ } return list; } + +QDebug NetworkUtils::operator<<(QDebug dbg, NetworkManager::Device *device) +{ + dbg << "device:" << device->interfaceName() + << "path:" << device->uni() + << "type:" << device->type() + << "state:" << device->state(); + return dbg.maybeSpace(); +} + diff --git a/plugins/network/src/utils.h b/plugins/network/src/utils.h index a4c84412..f253fd2b 100644 --- a/plugins/network/src/utils.h +++ b/plugins/network/src/utils.h @@ -17,6 +17,7 @@ #include #include +#include namespace NetworkUtils { @@ -31,6 +32,8 @@ NetworkManager::Device::List getAvailableDeviceList(NetworkManager::Device::Type NetworkManager::Device::List getManagedDeviceList(NetworkManager::Device::Type type); +QDebug operator<<(QDebug dbg, NetworkManager::Device *device); + } // namespace NetworkUtils #endif // KIRAN_CPANEL_NETWORK_UTILS_H -- Gitee From 4b7febfb4d8bce4e8afe75d99e41b76c45572e30 Mon Sep 17 00:00:00 2001 From: luoqing Date: Thu, 7 Dec 2023 16:55:10 +0800 Subject: [PATCH 08/17] feature(network):The cable network configuration mode is adjusted;Wireless network interface adjustment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 有线网络配置方式调整 无线网络界面调整 Closes #20295, #22263 --- plugins/network/CMakeLists.txt | 11 +- plugins/network/data/network.conf | 2 +- .../kcp-network-images/wired-connection.svg | 2 +- .../kcp-network-images/wired-disconnected.svg | 5 +- plugins/network/src/connection-list.cpp | 3 +- plugins/network/src/connection-list.h | 20 +- plugins/network/src/general.h | 24 + .../src/plugin/connection-itemwidget.cpp | 398 +- .../src/plugin/connection-itemwidget.h | 52 +- .../src/plugin/cpanel-network-widget.cpp | 405 +- .../src/plugin/cpanel-network-widget.h | 44 +- .../device-available-connection-widget.cpp | 506 ++ .../device-available-connection-widget.h | 98 + plugins/network/src/plugin/device-list.cpp | 182 + plugins/network/src/plugin/device-list.h | 66 + plugins/network/src/plugin/manager/manager.h | 16 +- .../src/plugin/manager/wired-manager.cpp | 169 +- .../src/plugin/manager/wired-manager.h | 28 +- .../src/plugin/manager/wired-manager.ui | 16 +- .../src/plugin/manager/wireless-manager.cpp | 361 +- .../src/plugin/manager/wireless-manager.h | 41 +- .../src/plugin/manager/wireless-manager.ui | 16 +- plugins/network/src/plugin/network-plugin.cpp | 2 +- .../src/plugin/plugin-connection-list.cpp | 10 +- .../plugin/setting-widget/ethernet-widget.cpp | 94 +- .../plugin/setting-widget/ethernet-widget.h | 1 + .../wireless-security-widget.cpp | 67 +- .../plugin/settings/wired-setting-page.cpp | 16 + .../src/plugin/settings/wired-setting-page.h | 2 + plugins/network/src/signal-forward.cpp | 77 + plugins/network/src/signal-forward.h | 25 + plugins/network/src/tray/main.cpp | 2 +- plugins/network/src/tray/network-tray.cpp | 8 +- .../network/src/tray/wired-tray-widget.cpp | 5 +- plugins/network/src/utils.cpp | 160 +- plugins/network/src/utils.h | 10 +- .../kiran-cpanel-network.bo_CN.ts | 1560 ----- .../kiran-cpanel-network.kk_KG.ts | 1560 ----- .../kiran-cpanel-network.kk_KZ.ts | 1560 ----- .../kiran-cpanel-network.mn_MN.ts | 1560 ----- .../kiran-cpanel-network.ug_CN.ts | 1560 ----- .../kiran-cpanel-network.zh_CN.ts | 1488 ---- resources/control-panel-resources.qrc | 1 + resources/images/more-options.svg | 39 + translations/kiran-control-panel.zh_CN.ts | 5973 +++++++++-------- 45 files changed, 5124 insertions(+), 13121 deletions(-) create mode 100644 plugins/network/src/plugin/device-available-connection-widget.cpp create mode 100644 plugins/network/src/plugin/device-available-connection-widget.h create mode 100644 plugins/network/src/plugin/device-list.cpp create mode 100644 plugins/network/src/plugin/device-list.h delete mode 100644 plugins/network/translations/kiran-cpanel-network.bo_CN.ts delete mode 100644 plugins/network/translations/kiran-cpanel-network.kk_KG.ts delete mode 100644 plugins/network/translations/kiran-cpanel-network.kk_KZ.ts delete mode 100644 plugins/network/translations/kiran-cpanel-network.mn_MN.ts delete mode 100644 plugins/network/translations/kiran-cpanel-network.ug_CN.ts delete mode 100644 plugins/network/translations/kiran-cpanel-network.zh_CN.ts create mode 100644 resources/images/more-options.svg diff --git a/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt index 68d6345a..d2fc4704 100644 --- a/plugins/network/CMakeLists.txt +++ b/plugins/network/CMakeLists.txt @@ -1,7 +1,5 @@ set(TARGET_NAME kiran-cpanel-network) -file(GLOB TS_FILES "translations/*.ts") -qt5_create_translation(NETWORK_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES}) file(GLOB_RECURSE PLUGIN_SRC "src/plugin/*.cpp" "src/plugin/*.h" "src/plugin/*.ui") file(GLOB_RECURSE TRAY_SRC "src/tray/*.cpp" "src/tray/*.h" "src/tray/*.ui") @@ -13,7 +11,7 @@ add_library(${TARGET_NAME} SHARED ${PLUGIN_SRC} ${COMMON_SRC} ${QRC} - ${NETWORK_QM_FILES}) + ) find_package(KF5NetworkManagerQt REQUIRED) pkg_search_module(LIBNOTIFY REQUIRED libnotify) @@ -54,7 +52,6 @@ add_executable(${TRAY_PROCESS} ${PLUGIN_SRC} ${COMMON_SRC} ${QRC} - ${NETWORK_QM_FILES} ${PROJECT_SOURCE_DIR}/include/dbus-tray-monitor.h ) @@ -87,18 +84,20 @@ target_link_libraries(${TRAY_PROCESS} KF5::NetworkManagerQt ) -#安装翻译 -install(FILES ${NETWORK_QM_FILES} DESTINATION ${TRANSLATION_DIR}/) set(AUTOSTART_DESKTOP_DIR /etc/xdg/autostart) #安装插件desktop文件 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/kiran-network-status-icon.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/kiran-network-status-icon.desktop @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kiran-network-status-icon.desktop DESTINATION ${AUTOSTART_DESKTOP_DIR}/) +#安装配置文件 set(NETWORK_SERVER_CONF /etc/NetworkManager/conf.d) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/00-server.conf.in ${CMAKE_CURRENT_BINARY_DIR}/00-server.conf @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/00-server.conf DESTINATION ${NETWORK_SERVER_CONF}/) +set(NETWORK_PLUGIN_CONF /etc/kiran-control-panel/plugins) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/network.conf DESTINATION ${NETWORK_PLUGIN_CONF}/) + #安装插件和二进制文件 install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) install(TARGETS ${TRAY_PROCESS} DESTINATION ${INSTALL_BINDIR}) diff --git a/plugins/network/data/network.conf b/plugins/network/data/network.conf index af9b9e58..dd5a52be 100644 --- a/plugins/network/data/network.conf +++ b/plugins/network/data/network.conf @@ -1,4 +1,4 @@ [CheckInternetConnectivity] Enable=true -Address=gitee.com +Address=www.kylinsec.com.cn Port=80 \ No newline at end of file diff --git a/plugins/network/resources/kcp-network-images/wired-connection.svg b/plugins/network/resources/kcp-network-images/wired-connection.svg index b1838c03..f911b583 100644 --- a/plugins/network/resources/kcp-network-images/wired-connection.svg +++ b/plugins/network/resources/kcp-network-images/wired-connection.svg @@ -36,6 +36,6 @@ - + diff --git a/plugins/network/resources/kcp-network-images/wired-disconnected.svg b/plugins/network/resources/kcp-network-images/wired-disconnected.svg index 19fc887b..690b0760 100644 --- a/plugins/network/resources/kcp-network-images/wired-disconnected.svg +++ b/plugins/network/resources/kcp-network-images/wired-disconnected.svg @@ -36,9 +36,6 @@ - - - - + diff --git a/plugins/network/src/connection-list.cpp b/plugins/network/src/connection-list.cpp index dbd7a35c..19314368 100644 --- a/plugins/network/src/connection-list.cpp +++ b/plugins/network/src/connection-list.cpp @@ -18,6 +18,7 @@ #include #include "general.h" #include +#include "utils.h" using namespace NetworkManager; @@ -96,9 +97,9 @@ QList ConnectionList::itemWidgetList() void ConnectionList::showConnectionList(NetworkManager::ConnectionSettings::ConnectionType type) { - Connection::List connectionList = NetworkManager::listConnections(); if (type == ConnectionSettings::Wired) { + Connection::List connectionList = NetworkUtils::getAvailableWiredConnections(m_devicePath); Device::Ptr device = findNetworkInterface(m_devicePath); QString devicePath = device->uni(); for (Connection::Ptr conn : connectionList) diff --git a/plugins/network/src/connection-list.h b/plugins/network/src/connection-list.h index 8725ed06..14b937cc 100644 --- a/plugins/network/src/connection-list.h +++ b/plugins/network/src/connection-list.h @@ -23,25 +23,7 @@ #include #include #include - -struct WirelessConnectionInfo -{ - int signalStrength; - QString accessPointPath; - QString ssid; - bool securitySetting; -}; - -struct NetworkConnectionInfo -{ - QString id; - QString uuid; - QString connectionPath; - QString devicePath; - QString activeConnectionPath; - bool isWireless = false; - WirelessConnectionInfo wirelessInfo; -}; +#include "general.h" Q_DECLARE_METATYPE(NetworkConnectionInfo) Q_DECLARE_METATYPE(NetworkManager::Status) diff --git a/plugins/network/src/general.h b/plugins/network/src/general.h index 8d8cc139..9423b9c4 100644 --- a/plugins/network/src/general.h +++ b/plugins/network/src/general.h @@ -15,7 +15,31 @@ #ifndef KIRAN_CPANEL_NETWORK_GENERAL_H #define KIRAN_CPANEL_NETWORK_GENERAL_H +#include + #define PROPERTY_NETWORK_CONNECTION_INFO "NetworkConnectionInfo" #define TRAY_ITEM_NORAML_HIEGHT 50 +#define MAX_WAIT_COUNTS 10 +#define PLUGIN_ITEM_WIDGET_HEIGHT 36 + +struct WirelessConnectionInfo +{ + int signalStrength = 0; + QString accessPointPath; + QString ssid; + bool securitySetting; +}; + +struct NetworkConnectionInfo +{ + QString id; + QString uuid; + QString connectionPath; + QString devicePath; + QString activeConnectionPath; + bool isWireless = false; + WirelessConnectionInfo wirelessInfo; + int type; +}; #endif // KIRAN_CPANEL_NETWORK_GENERAL_H \ No newline at end of file diff --git a/plugins/network/src/plugin/connection-itemwidget.cpp b/plugins/network/src/plugin/connection-itemwidget.cpp index 6735e7bb..1adf30d4 100644 --- a/plugins/network/src/plugin/connection-itemwidget.cpp +++ b/plugins/network/src/plugin/connection-itemwidget.cpp @@ -13,21 +13,44 @@ */ #include "connection-itemwidget.h" +#include #include +#include +#include +#include +#include +#include +#include #include #include +#include #include #include #include #include "animation-loading-label.h" +#include "signal-forward.h" +#include "status-notification.h" +#include "text-input-dialog.h" #include "utils.h" +using namespace NetworkManager; // 使用默认析构函数,父对象被释放时,会释放子对象 ConnectionItemWidget::ConnectionItemWidget(QWidget* parent) : KiranFrame(parent) { initUI(); } +ConnectionItemWidget::ConnectionItemWidget(NetworkConnectionInfo connectionInfo, QWidget* parent) : KiranFrame(parent) +{ + m_connectionInfo = connectionInfo; + initUI(); + if (!m_connectionInfo.connectionPath.isEmpty()) + { + m_connection = findConnection(m_connectionInfo.connectionPath); + connect(m_connection.data(), &Connection::updated, this, &ConnectionItemWidget::updateConnection, Qt::UniqueConnection); + } +} + void ConnectionItemWidget::initUI() { setFixedHeight(36); @@ -35,7 +58,11 @@ void ConnectionItemWidget::initUI() setDrawBroder(false); setAttribute(Qt::WA_Hover); connect(Kiran::StylePalette::instance(), &Kiran::StylePalette::themeChanged, this, &ConnectionItemWidget::handleThemeChanged); + // TODO:obsolete connect(m_editButton, &QPushButton::clicked, this, &ConnectionItemWidget::editButtonClicked); + + connect(m_editButton, &QPushButton::clicked, this, &ConnectionItemWidget::editConnection); + connect(m_disconnectAction, &QAction::triggered, this, &ConnectionItemWidget::disconnectConnection); } void ConnectionItemWidget::initPluginItemWidget() @@ -45,26 +72,60 @@ void ConnectionItemWidget::initPluginItemWidget() m_horizonLayout = new QHBoxLayout(this); m_editButton = new QPushButton(this); m_activatedLabel = new AnimationLoadingLabel(this); + m_moreOptions = new QPushButton(this); + + m_menu = new QMenu(this); + m_disconnectAction = new QAction(tr("disconnect"), this); + m_menu->addAction(m_disconnectAction); m_connectionName->setElideMode(Qt::TextElideMode::ElideRight); m_connectionTypeIcon->setVisible(false); - m_activatedLabel->setVisible(false); - // auto pixmap = QApplication::style()->standardPixmap(QStyle::SP_ArrowRight); m_editButton->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/details-info.svg")); m_editButton->setIconSize(QSize(16, 16)); m_editButton->setFixedSize(30, 36); m_editButton->setFlat(true); + m_moreOptions->setMenu(m_menu); + m_moreOptions->setIcon(QIcon(":/kiran-control-panel/images/more-options.svg")); + m_moreOptions->setIconSize(QSize(16, 16)); + m_moreOptions->setFixedSize(30, 36); + m_moreOptions->setFlat(true); + m_moreOptions->setStyleSheet("QPushButton::menu-indicator{image:none}"); + + m_horizonLayout->addWidget(m_activatedLabel); m_horizonLayout->addWidget(m_connectionTypeIcon); m_horizonLayout->addWidget(m_connectionName); m_horizonLayout->addStretch(); - m_horizonLayout->addWidget(m_activatedLabel); - m_horizonLayout->addWidget(m_editButton); + + m_horizonEditAndMoreOptions = new QHBoxLayout(); + m_horizonEditAndMoreOptions->addWidget(m_editButton); + m_horizonEditAndMoreOptions->addWidget(m_moreOptions); + m_horizonEditAndMoreOptions->setMargin(0); + m_horizonEditAndMoreOptions->setSpacing(0); + + m_horizonLayout->addLayout(m_horizonEditAndMoreOptions); + m_horizonLayout->setMargin(0); + m_horizonLayout->setSpacing(12); this->setLayout(m_horizonLayout); - this->setContentsMargins(10, 0, 3, 0); + // this->setContentsMargins(10, 0, 3, 0); + + if (type() == ConnectionSettings::Wireless) + { + setEditButtonVisible(false); + setMoreOptionsVisible(false); + m_ignoreAction = new QAction(tr("ignore"), this); + m_menu->addAction(m_ignoreAction); + connect(m_ignoreAction, &QAction::triggered, this, &ConnectionItemWidget::ignoreWirelessNetwork); + } + else + { + m_removeAction = new QAction(tr("remove"), this); + m_menu->addAction(m_removeAction); + connect(m_removeAction, &QAction::triggered, this, &ConnectionItemWidget::removeConnection); + } } // TODO:名称过长进行缩略 @@ -81,11 +142,6 @@ void ConnectionItemWidget::setName(const QString& name) m_editButton->setAccessibleName(QString("ButtonEditConnectionName::%1").arg(nameStr)); } -QString ConnectionItemWidget::getName() -{ - return m_connectionName->text(); -} - // TODO:其他状态信息的显示,以及优化 void ConnectionItemWidget::activatedStatus() { @@ -97,7 +153,9 @@ void ConnectionItemWidget::activatedStatus() void ConnectionItemWidget::deactivateStatus() { - m_activatedLabel->setVisible(false); + m_activatedLabel->setPixmap(QPixmap()); + setLoadingStatus(false); + setActiveConnectionPath(""); } void ConnectionItemWidget::setLoadingStatus(bool isLoading) @@ -136,7 +194,6 @@ void ConnectionItemWidget::setWirelessStatusIcon(bool security, int signal) svgPath = ":/kcp-network-images/wireless-4.svg"; } QPixmap pixmap = NetworkUtils::trayIconColorSwitch(svgPath); - KLOG_DEBUG() << "svgPath:" << svgPath; m_connectionTypeIcon->setPixmap(pixmap); m_connectionTypeIcon->setAlignment(Qt::AlignCenter); m_connectionTypeIcon->setVisible(true); @@ -166,6 +223,310 @@ void ConnectionItemWidget::setOtherNetworkIcon() m_connectionTypeIcon->setVisible(true); } +void ConnectionItemWidget::setMoreOptionsVisible(bool isVisible) +{ + m_moreOptions->setVisible(isVisible); +} + +void ConnectionItemWidget::setActiveStatus(NetworkManager::ActiveConnection::State state) +{ + switch (state) + { + case NetworkManager::ActiveConnection::State::Unknown: + + break; + case NetworkManager::ActiveConnection::State::Activating: + setLoadingStatus(true); + setLabelVisible(true); + break; + case NetworkManager::ActiveConnection::State::Activated: + setLoadingStatus(false); + activatedStatus(); + setEditButtonVisible(true); + setMoreOptionsVisible(true); + break; + case NetworkManager::ActiveConnection::State::Deactivating: + break; + case NetworkManager::ActiveConnection::State::Deactivated: + deactivateStatus(); + break; + default: + break; + } +} + +void ConnectionItemWidget::activeConnectionStateChanged(NetworkManager::ActiveConnection::State state) +{ + setActiveStatus(state); + if (state == NetworkManager::ActiveConnection::State::Deactivated) + { + // 赋值为空,清空已激活路径 + setActiveConnectionPath(""); + if (type() == ConnectionSettings::Wireless) + { + setEditButtonVisible(false); + setMoreOptionsVisible(false); + } + } +} + +void ConnectionItemWidget::activateConnection(const QString& connectionPath, const QString& connectionParameter) +{ + if (!m_connectionInfo.activeConnectionPath.isEmpty()) + { + return; + } + + KLOG_DEBUG() << "Will activate the device:" << m_connectionInfo.devicePath; + QString connectionUni = connectionPath.isEmpty() ? m_connectionInfo.connectionPath : connectionPath; + QString devicePath = m_connectionInfo.devicePath; + + if(!devicePath.isEmpty()) + { + Device::Ptr device = NetworkManager::findNetworkInterface(devicePath); + auto devicestate = device->state(); + KLOG_DEBUG() << "current device state:" << devicestate; + if (devicestate == Device::Unavailable) + { + StatusNotification::connectitonFailedNotifyByReason(tr("The current device:%1 is not available").arg(device->interfaceName())); + return; + } + } + + QDBusPendingReply reply = + NetworkManager::activateConnection(connectionUni, 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")) + { + StatusNotification::connectitonFailedNotifyByReason(tr("The carrier is pulled out")); + } + else + { + StatusNotification::connectitonFailedNotify(connectionUni); + } + } + else + { + KLOG_DEBUG() << "activateConnection reply:" << reply.reply(); + } +} + +void ConnectionItemWidget::activateHiddenNetwork(const QString& ssid) +{ + m_connectionInfo.wirelessInfo.ssid = ssid; + QString devicePath = m_connectionInfo.devicePath; + auto device = findNetworkInterface(devicePath); + WirelessDevice::Ptr wirelessDevice = qobject_cast(device); + // 若要连接的隐藏网络已经被显式探测到了,则返回 + if (wirelessDevice->findNetwork(ssid) != nullptr) + { + KLOG_DEBUG() << "Hidden networks have been explicitly detected,return"; + StatusNotification::connectitonHiddenNetworkFailedNotify(ssid); + return; + } + /** Note:连接隐藏网络时不指定AccessPointPath*/ + QString accessPointPath = ""; + Connection::Ptr connection = NetworkUtils::getAvailableConnectionBySsid(devicePath, ssid); + if (!connection.isNull()) + { + activateConnection(connection->path(), accessPointPath); + } + else + { + m_connnectionSettings = NetworkUtils::createWirelessConnectionSettings(ssid, devicePath, accessPointPath); + requireInputPassword(); + } +} + +void ConnectionItemWidget::updateConnection() +{ + QString connectionPath = m_connectionInfo.connectionPath; + Connection::Ptr connection = findConnection(connectionPath); + auto type = connection->settings()->connectionType(); + + if (type == ConnectionSettings::ConnectionType::Wired) + { + WiredSetting::Ptr wiredSetting = connection->settings()->setting(Setting::SettingType::Wired).dynamicCast(); + QString mac = wiredSetting->macAddress().toHex(':').toUpper(); + QString devicePath = m_connectionInfo.devicePath; + auto device = findNetworkInterface(devicePath); + WiredDevice::Ptr wiredDevice = qobject_cast(device); + QString hardwareAddress = wiredDevice->permanentHardwareAddress(); + // 检查绑定的设备信息是否改变 + if (!mac.isEmpty() && + (mac != hardwareAddress)) + { + KLOG_INFO() << "绑定的设备地址发生改变"; + SignalForward::instance()->connectionMacChanged(connectionPath, hardwareAddress); + return; + } + } + + setName(connection->name()); +} + +void ConnectionItemWidget::disconnectConnection() +{ + if (activeConnectionPath().isEmpty()) + { + return; + } + + QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activeConnectionPath()); + reply.waitForFinished(); + if (reply.isError()) + { + KLOG_INFO() << "Disconnect failed:" << reply.error(); + } + else + { + KLOG_INFO() << "DeactivateConnection reply:" << reply.reply(); + } +} + +void ConnectionItemWidget::removeConnection() +{ + QString tip = QString(tr("Are you sure you want to delete the connection %1")).arg(m_connection->name()); + KiranMessageBox::KiranStandardButton btn = KiranMessageBox::message(this, tr("Warning"), + tip, + KiranMessageBox::Yes | KiranMessageBox::No); + if (btn != KiranMessageBox::Yes) + { + return; + } + QString connectionName = m_connection->name(); + QDBusPendingReply<> reply = m_connection->remove(); + reply.waitForFinished(); + StatusNotification::connectionDeleteNotify(connectionName); + if (reply.isError()) + { + KLOG_INFO() << "Delete the connection failed:" << reply.error(); + } + else + { + KLOG_INFO() << "remove the connection :" << this->connectionPath(); + } +} + +void ConnectionItemWidget::setSecurityPskAndActivateWirelessConnection(const QString& password) +{ + WirelessSecuritySetting::Ptr wirelessSecurity = + m_connnectionSettings->setting(Setting::WirelessSecurity).dynamicCast(); + wirelessSecurity->setPsk(password); + wirelessSecurity->setPskFlags(Setting::SecretFlagType::None); // default: Save password for all users + wirelessSecurity->setInitialized(true); + + addAndActivateWirelessConnection(m_connnectionSettings); +} + + +// NOTE:ignore无线网络会删除配置,功能目前与remove重合 +void ConnectionItemWidget::ignoreWirelessNetwork() +{ + QString devicePath = m_connectionInfo.devicePath; + Connection::Ptr connection = NetworkUtils::getAvailableConnectionBySsid(devicePath, ssid()); + if(connection.isNull()) + { + return; + } + + QDBusPendingReply<> reply = connection->remove(); + reply.waitForFinished(); + if (reply.isError()) + { + KLOG_INFO() << "remove the connection failed:" << reply.error(); + } + else + { + KLOG_INFO() << "ignore the wireless network:" << ssid(); + } +} + +void ConnectionItemWidget::requireInputPassword() +{ + TextInputDialog inputDialog; + inputDialog.setTitle(tr("Tips")); + QString tips = QString(tr("Password required to connect to %1.")).arg(ssid()); + inputDialog.setText(tips); + inputDialog.setlineEditEchoMode(QLineEdit::Password); + connect(&inputDialog, &TextInputDialog::password, this, &ConnectionItemWidget::setSecurityPskAndActivateWirelessConnection); + + inputDialog.exec(); +} + +void ConnectionItemWidget::requireHiddenNetworkName() +{ + KLOG_DEBUG() << "connect hidden network"; + TextInputDialog ssidInputDialog; + ssidInputDialog.setTitle(tr("Tips")); + QString tips = QString(tr("Please input a network name")); + ssidInputDialog.setText(tips); + connect(&ssidInputDialog, &TextInputDialog::ssid, this, &ConnectionItemWidget::activateHiddenNetwork); + ssidInputDialog.exec(); +} + +void ConnectionItemWidget::addAndActivateWirelessConnection(NetworkManager::ConnectionSettings::Ptr connectionSettings) +{ + const QString ssid = m_connectionInfo.wirelessInfo.ssid; + const QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; + const QString devicePath = m_connectionInfo.devicePath; + KLOG_DEBUG() << "accessPointPath" << accessPointPath; + + QDBusPendingReply reply = + NetworkManager::addAndActivateConnection(connectionSettings->toMap(), devicePath, accessPointPath); + + reply.waitForFinished(); + if (reply.isError()) + { + KLOG_DEBUG() << "Connection failed: " << reply.error(); + StatusNotification::connectitonFailedNotifyByName(ssid); + } +} + +void ConnectionItemWidget::activateWirelessNetwork() +{ + QString ssid = m_connectionInfo.wirelessInfo.ssid; + KLOG_DEBUG() << "Activate Selected Wireless Network:" << ssid; + QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; + + // 连接隐藏网络 + if (ssid.isEmpty() && accessPointPath.isEmpty()) + { + requireHiddenNetworkName(); + return; + } + + QString devicePath = m_connectionInfo.devicePath; + Connection::Ptr connection = NetworkUtils::getAvailableConnectionBySsid(devicePath, ssid); + + // 在已存在WirelessSetting配置的情况下,激活连接.(连接过一次后会创建WirelessSetting配置) + if (!connection.isNull()) + { + activateConnection(connection->path(), accessPointPath); + } + else + { + m_connnectionSettings = NetworkUtils::createWirelessConnectionSettings(ssid, devicePath, accessPointPath); + WirelessSecuritySetting::Ptr wirelessSecurity = + m_connnectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); + WirelessSecuritySetting::KeyMgmt keyMgmt = wirelessSecurity->keyMgmt(); + if (keyMgmt != WirelessSecuritySetting::KeyMgmt::WpaNone) + { + requireInputPassword(); + } + else + { + addAndActivateWirelessConnection(m_connnectionSettings); + } + } +} + void ConnectionItemWidget::handleThemeChanged(Kiran::PaletteType paletteType) { QImage image = m_connectionTypeIcon->pixmap()->toImage(); @@ -179,6 +540,19 @@ void ConnectionItemWidget::mousePressEvent(QMouseEvent* event) if (event->button() == Qt::LeftButton) { emit clicked(); + if (type() == ConnectionSettings::Wireless) + { + activateWirelessNetwork(); + } + else if(type() == ConnectionSettings::Wired) + { + activateConnection(); + } } QWidget::mousePressEvent(event); } + +void ConnectionItemWidget::editConnection() +{ + SignalForward::instance()->editConnection(m_connectionInfo); +} \ No newline at end of file diff --git a/plugins/network/src/plugin/connection-itemwidget.h b/plugins/network/src/plugin/connection-itemwidget.h index 56a12412..1915b7e7 100644 --- a/plugins/network/src/plugin/connection-itemwidget.h +++ b/plugins/network/src/plugin/connection-itemwidget.h @@ -15,14 +15,17 @@ #ifndef KIRAN_CPANEL_NETWORK_CUSTOMITEMWIDGET_H #define KIRAN_CPANEL_NETWORK_CUSTOMITEMWIDGET_H +#include +#include +#include #include #include #include #include #include #include +#include "general.h" #include "kiran-frame/kiran-frame.h" -#include class AnimationLoadingLabel; class ConnectionItemWidget : public KiranFrame @@ -30,13 +33,14 @@ class ConnectionItemWidget : public KiranFrame Q_OBJECT public: explicit ConnectionItemWidget(QWidget *parent = nullptr); + explicit ConnectionItemWidget(NetworkConnectionInfo connectionInfo, QWidget *parent = nullptr); public: void initUI(); void initPluginItemWidget(); void setName(const QString &name); - QString getName(); + QString name() { return m_connectionName->text(); }; void activatedStatus(); void deactivateStatus(); void setLoadingStatus(bool isLoading); @@ -45,9 +49,42 @@ public: void setWirelessStatusIcon(bool security, int signal); void setWiredStatusIcon(); void setOtherNetworkIcon(); + void setMoreOptionsVisible(bool isVisible); + void setConnectionInfo(NetworkConnectionInfo connectionInfo) { m_connectionInfo = connectionInfo; }; + + NetworkConnectionInfo connectionInfo() { return m_connectionInfo; }; + int type() { return m_connectionInfo.type; }; + QString uuid() { return m_connectionInfo.uuid; }; + QString connectionPath() { return m_connectionInfo.connectionPath; }; + QString ssid() { return m_connectionInfo.wirelessInfo.ssid; }; + int signalStrength() { return m_connectionInfo.wirelessInfo.signalStrength; }; + QString activeConnectionPath() { return m_connectionInfo.activeConnectionPath; }; + + void setActiveConnectionPath(QString path) { m_connectionInfo.activeConnectionPath = path; }; + void setActiveStatus(NetworkManager::ActiveConnection::State state); public slots: + void activeConnectionStateChanged(NetworkManager::ActiveConnection::State state); + void disconnectConnection(); + +private slots: void handleThemeChanged(Kiran::PaletteType paletteType); + void editConnection(); + void updateConnection(); + void removeConnection(); + void activateConnection(const QString &connectionPath = QString(), const QString &connectionParameter = QString()); + + void activateHiddenNetwork(const QString &ssid); + void ignoreWirelessNetwork(); + + void setSecurityPskAndActivateWirelessConnection(const QString &password); + +private: + void requireInputPassword(); + void requireHiddenNetworkName(); + + void addAndActivateWirelessConnection(NetworkManager::ConnectionSettings::Ptr connectionSettings); + void activateWirelessNetwork(); signals: void editButtonClicked(); @@ -61,7 +98,7 @@ private: KiranLabel *m_connectionName; QLabel *m_connectionStatus; QHBoxLayout *m_horizonLayout; - QHBoxLayout *m_horizonIconAndNameLayout; + QHBoxLayout *m_horizonEditAndMoreOptions; QHBoxLayout *m_horizonActivateStatusLabelLayout; QSpacerItem *horizontalSpacer; QVBoxLayout *m_verticalLayout; @@ -69,6 +106,15 @@ private: AnimationLoadingLabel *m_activatedLabel; QWidget *m_activeStatusWidget; + QPushButton *m_moreOptions; + QMenu *m_menu; + QAction *m_disconnectAction; + QAction *m_removeAction; + QAction *m_ignoreAction; + + NetworkConnectionInfo m_connectionInfo; + NetworkManager::Connection::Ptr m_connection; + NetworkManager::ConnectionSettings::Ptr m_connnectionSettings; }; #endif // KIRAN_CPANEL_NETWORK_CUSTOMITEMWIDGET_H diff --git a/plugins/network/src/plugin/cpanel-network-widget.cpp b/plugins/network/src/plugin/cpanel-network-widget.cpp index 24b8b1ee..bc60f333 100644 --- a/plugins/network/src/plugin/cpanel-network-widget.cpp +++ b/plugins/network/src/plugin/cpanel-network-widget.cpp @@ -16,6 +16,7 @@ #include #include #include "details-page/details-page.h" +#include "signal-forward.h" #include "ui_cpanel-network-widget.h" #include "utils.h" #include "vpn-manager.h" @@ -25,13 +26,16 @@ using namespace NetworkManager; #define MAX_WAIT_COUNTS 10 -enum NetworkSettingsPages +enum NetworkSidebarItems { - PAGE_WIRED, - PAGE_WIRELESS, - PAGE_VPN + ITEM_WIRED, + ITEM_WIRELESS, + ITEM_VPN, + ITEM_DETAILS, }; +#define NETWORK_SIDEBAR_ITEM "NetworkSidebarItem" + CPanelNetworkWidget::CPanelNetworkWidget(QWidget *parent) : QWidget(parent), ui(new Ui::CPanelNetworkWidget) { qRegisterMetaType("NetworkConnectionInfo"); @@ -51,211 +55,227 @@ void CPanelNetworkWidget::init() initConnect(); } -// ui->stackedWidget与ui->sidebar的index对应 void CPanelNetworkWidget::initPage() { m_subItemsList.clear(); - m_wiredDeviceList = NetworkUtils::getManagedDeviceList(Device::Ethernet); - m_wirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); - int row = 0; - for (int i = 0; i < m_wiredDeviceList.count(); i++) - { - Device::Ptr device = m_wiredDeviceList.value(i); - QString devicePath = device->uni(); - QString deviceName = device->interfaceName(); - WiredManager *wiredManager = new WiredManager(devicePath, this); - ui->stackedWidget->insertWidget(row, wiredManager); - - KiranSidebarItem *sidebarItem = new KiranSidebarItem(); - sidebarItem->setText(deviceName); - m_subItemsList << deviceName; - ui->sidebar->insertItem(row, sidebarItem); - m_deviceToSidebarItem.insert(devicePath, sidebarItem); - sidebarItem->setData(Qt::UserRole, row); - sidebarItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired.svg")); - setSidebarItemStatus(sidebarItem, device->state()); - row++; - - connect(device.data(), &Device::managedChanged, this, &CPanelNetworkWidget::handleManagedChanged, Qt::UniqueConnection); - connect(device.data(), &Device::stateChanged, this, &CPanelNetworkWidget::handleStateChanged, Qt::UniqueConnection); - } + initWiredManager(); + initWirelessManager(); - for (int i = 0; i < m_wirelessDeviceList.count(); i++) - { - Device::Ptr device = m_wirelessDeviceList.value(i); - QString devicePath = device->uni(); - QString deviceName = device->interfaceName(); - WirelessManager *wirelessManager = new WirelessManager(devicePath, this); - ui->stackedWidget->insertWidget(row, wirelessManager); - - KiranSidebarItem *sidebarItem = new KiranSidebarItem(); - sidebarItem->setText(deviceName); - m_subItemsList << deviceName; - ui->sidebar->insertItem(row, sidebarItem); - - m_deviceToSidebarItem.insert(devicePath, sidebarItem); - sidebarItem->setData(Qt::UserRole, row); - sidebarItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wireless.svg")); - setSidebarItemStatus(sidebarItem, device->state()); - row++; - - connect(device.data(), &Device::managedChanged, this, &CPanelNetworkWidget::handleManagedChanged, Qt::UniqueConnection); - connect(device.data(), &Device::stateChanged, this, &CPanelNetworkWidget::handleStateChanged, Qt::UniqueConnection); - } - - // TODO:是否要添加VPN的sidebarItem状态描述 VpnManager *vpnManager = new VpnManager(this); - ui->stackedWidget->insertWidget(row, vpnManager); + vpnManager->setProperty(NETWORK_SIDEBAR_ITEM, ITEM_VPN); + + ui->stackedWidget->addWidget(vpnManager); KiranSidebarItem *sidebarItem = new KiranSidebarItem(tr("VPN")); - ui->sidebar->insertItem(row, sidebarItem); - ui->sidebar->item(row)->setData(Qt::UserRole, row); - ui->sidebar->item(row)->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/vpn.svg")); + ui->sidebar->addItem(sidebarItem); + sidebarItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/vpn.svg")); m_subItemsList << tr("VPN"); - row++; DetailsPage *networkDetails = new DetailsPage(this); - ui->stackedWidget->insertWidget(row, networkDetails); - ui->sidebar->insertItem(row, tr("Network Details")); - ui->sidebar->item(row)->setData(Qt::UserRole, row); - ui->sidebar->item(row)->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/network-details.svg")); + networkDetails->setProperty(NETWORK_SIDEBAR_ITEM, ITEM_DETAILS); + + ui->stackedWidget->addWidget(networkDetails); + ui->sidebar->addItem(tr("Network Details")); + auto lastItem = ui->sidebar->item(ui->sidebar->count() - 1); + lastItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/network-details.svg")); m_subItemsList << tr("Network Details"); - row++; - ui->sidebar->setCurrentRow(0); + setCurrentSubItem(0); } //Note: 处理设备插拔情况,使用deviceAdded/deviceRemoved,但之前偶现过插拔时没有deviceAdded/deviceRemoved信号发出 // 增加Device::managedChanged 信号处理设备插拔,增加冗余度 void CPanelNetworkWidget::initConnect() { - m_Timer.setInterval(500); - m_Timer.setSingleShot(true); - m_waitCounts = 1; // Note:新设备插入后,需要等待一段时间,Device::List networkInterfaces() 来不及更新 // Note:DeviceAdded signal is emitted when a new network interface is available. // XXX:当发出deviceAdded信号时,应该已经managed,需要修改并重新测试 // deviceAdded信号发出时,根据信号的定义,此时device state为managed,但实际上并为unmanaged - connect(notifier(), &Notifier::deviceAdded, this, [this](const QString &uni) - { - m_addDevicePath = uni; - Device::Ptr device = findNetworkInterface(m_addDevicePath); - if(device.isNull()) - { - KLOG_DEBUG() << "this device interface is not found"; - return; - } - if(device->managed()) - { - handleDeviceAdded(m_addDevicePath); - } - else - { - KLOG_INFO() << "this device interface is invalid!"; - m_Timer.start(); - KLOG_INFO() << "wait counts:" << m_waitCounts; - } }); - - connect(&m_Timer, &QTimer::timeout, this, [this]() - { - Device::Ptr device = findNetworkInterface(m_addDevicePath); - if(device->managed()) - { - handleDeviceAdded(m_addDevicePath); - m_Timer.stop(); - } - else - { - KLOG_INFO() << "this device interface is invalid!"; - m_Timer.start(); - } - m_waitCounts++; - if(m_waitCounts > MAX_WAIT_COUNTS) - { - KLOG_INFO() << "This device is currently invalid by NetworkManager"; - m_Timer.stop(); - } }); - - connect(notifier(), &Notifier::deviceRemoved, this, &CPanelNetworkWidget::handleDeviceRemoved); + + connect(SignalForward::instance(), &SignalForward::wirelessDeviceAdded, this, &CPanelNetworkWidget::addWirelessDevice); + connect(SignalForward::instance(), &SignalForward::wiredDeviceAdded, this, &CPanelNetworkWidget::addWiredDevice); + + connect(notifier(), &Notifier::deviceRemoved, this, &CPanelNetworkWidget::removeDevice); connect(notifier(), &Notifier::wirelessEnabledChanged, this, &CPanelNetworkWidget::handleWirelessEnabledChanged); connect(notifier(), &Notifier::networkingEnabledChanged, this, &CPanelNetworkWidget::handleNetworkingEnabledChanged); - connect(ui->sidebar, &QListWidget::itemClicked, this, &CPanelNetworkWidget::handleSideBarItemClicked); + connect(ui->sidebar, &QListWidget::currentItemChanged, this, &CPanelNetworkWidget::changeSideBarItem); - connect(Kiran::StylePalette::instance(), &Kiran::StylePalette::themeChanged, this, &CPanelNetworkWidget::handleThemeChanged); + connect(Kiran::StylePalette::instance(), &Kiran::StylePalette::themeChanged, this, &CPanelNetworkWidget::changeTheme); } +void CPanelNetworkWidget::initWiredManager() +{ + auto wiredDeviceList = NetworkUtils::getManagedDeviceList(Device::Ethernet); + if (wiredDeviceList.count() == 0) + { + return; + } + + WiredManager *wiredManager = new WiredManager("", this); + wiredManager->setProperty(NETWORK_SIDEBAR_ITEM, ITEM_WIRED); + ui->stackedWidget->insertWidget(0, wiredManager); + + KiranSidebarItem *wiredSidebarItem = new KiranSidebarItem(); + wiredSidebarItem->setText(tr("Wired Network")); + m_subItemsList << tr("Wired Network"); + ui->sidebar->insertItem(0, wiredSidebarItem); + m_kiranSidebarItems << wiredSidebarItem; + + wiredSidebarItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired.svg")); + setSidebarItemStatus(wiredSidebarItem, Device::State::Disconnected); + + for (int i = 0; i < wiredDeviceList.count(); i++) + { + Device::Ptr device = wiredDeviceList.value(i); + connect(device.data(), &Device::stateChanged, this, &CPanelNetworkWidget::changeDeviceState, Qt::UniqueConnection); -void CPanelNetworkWidget::handleManagedChanged() + if (device->state() == Device::Activated) + { + setSidebarItemStatus(wiredSidebarItem, Device::State::Activated); + } + } +} + +void CPanelNetworkWidget::initWirelessManager() { - auto device = qobject_cast(sender()); - if (device != nullptr) + auto wirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); + if (wirelessDeviceList.count() == 0) { - if (device->managed()) + return; + } + + WirelessManager *wirelessManager = new WirelessManager("", this); + wirelessManager->setProperty(NETWORK_SIDEBAR_ITEM, ITEM_WIRELESS); + ui->stackedWidget->insertWidget(0, wirelessManager); + + KiranSidebarItem *wirelessSidebarItem = new KiranSidebarItem(); + wirelessSidebarItem->setText(tr("Wireless Network")); + m_subItemsList << tr("Wireless Network"); + ui->sidebar->insertItem(0, wirelessSidebarItem); + m_kiranSidebarItems << wirelessSidebarItem; + + wirelessSidebarItem->setIcon(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wireless.svg")); + setSidebarItemStatus(wirelessSidebarItem, Device::State::Disconnected); + + for (int i = 0; i < wirelessDeviceList.count(); i++) + { + Device::Ptr device = wirelessDeviceList.value(i); + connect(device.data(), &Device::stateChanged, this, &CPanelNetworkWidget::changeDeviceState, Qt::UniqueConnection); + + if (device->state() == Device::Activated) { + setSidebarItemStatus(wirelessSidebarItem, Device::State::Activated); } } - KLOG_DEBUG() << "Device Managed Changed"; - reload(); - emit subItemsChanged(); } -void CPanelNetworkWidget::handleStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) +void CPanelNetworkWidget::changeDeviceState(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) { - KLOG_DEBUG() << "---------newstate:" << newstate; - KLOG_DEBUG() << "---------oldstate:" << oldstate; - KLOG_DEBUG() << "---------reason:" << reason; + KLOG_DEBUG() << "new state:" << newstate; + KLOG_DEBUG() << "old state:" << oldstate; + KLOG_DEBUG() << "reason:" << reason; auto device = qobject_cast(sender()); if (device == nullptr) { - KLOG_DEBUG() << "device ptr is null"; + KLOG_DEBUG() << "device is null"; return; } - QString devicePath = device->uni(); - KiranSidebarItem *item = m_deviceToSidebarItem.value(devicePath); - setSidebarItemStatus(item, newstate); + updateSidebarItemStatus(device->type()); } -void CPanelNetworkWidget::setSidebarItemStatus(KiranSidebarItem *sidebarItem, NetworkManager::Device::State state) +void CPanelNetworkWidget::addWirelessDevice(const QString &devicePath) +{ + auto wirelessDevice = findNetworkInterface(devicePath); + connect(wirelessDevice.data(), &Device::stateChanged, this, &CPanelNetworkWidget::changeDeviceState, Qt::UniqueConnection); + if (!isExistWirelessItem()) + { + initWirelessManager(); + emit subItemsChanged(); + } +} + +void CPanelNetworkWidget::addWiredDevice(const QString &devicePath) { - if (sidebarItem != nullptr) + auto wiredDevice = findNetworkInterface(devicePath); + connect(wiredDevice.data(), &Device::stateChanged, this, &CPanelNetworkWidget::changeDeviceState, Qt::UniqueConnection); + if (!isExistWiredItem()) { - if (state == Device::State::Activated) + initWiredManager(); + emit subItemsChanged(); + } +} + +// TODO:需要优化 +void CPanelNetworkWidget::updateSidebarItemStatus(NetworkManager::Device::Type deviceType) +{ + QString sidebarItemText; + Device::State state = Device::Disconnected; + + auto wiredDeviceList = NetworkUtils::getManagedDeviceList(Device::Ethernet); + auto wirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); + + if (deviceType == Device::Wifi) + { + sidebarItemText = tr("Wireless Network"); + for (auto device : wirelessDeviceList) { - sidebarItem->setStatusDesc(tr("Connected"), ""); + if (device->state() == Device::State::Activated) + { + state = Device::State::Activated; + break; + } } - else if (state == Device::State::Unavailable) //对应拔出网线 -- 对应禁用 + } + else + { + sidebarItemText = tr("Wired Network"); + for (auto device : wiredDeviceList) { - sidebarItem->setStatusDesc(tr("Unavailable"), ""); + if (device->state() == Device::State::Activated) + { + state = Device::State::Activated; + break; + } } - else + } + + KiranSidebarItem *sidebarItem; + for (auto item : m_kiranSidebarItems) + { + if (item->text() == sidebarItemText) { - sidebarItem->setStatusDesc(tr("Disconnected"), ""); + sidebarItem = item; + break; } } + + setSidebarItemStatus(sidebarItem, state); } -void CPanelNetworkWidget::reload() +void CPanelNetworkWidget::setSidebarItemStatus(KiranSidebarItem *sidebarItem, NetworkManager::Device::State state) { - - KLOG_DEBUG() << "reload"; - for (int i = 0; i < ui->stackedWidget->count(); i++) + if (sidebarItem == nullptr) { - auto widget = ui->stackedWidget->widget(i); - ui->stackedWidget->removeWidget(widget); - delete widget; + return; } - ui->sidebar->clear(); - m_wiredDeviceList.clear(); - m_wirelessDeviceList.clear(); - - initPage(); - ui->stackedWidget->setCurrentIndex(0); + if (state == Device::State::Activated) + { + sidebarItem->setStatusDesc(tr("Connected"), ""); + } + else if (state == Device::State::Unavailable) // 对应拔出网线 -- 对应禁用 + { + sidebarItem->setStatusDesc(tr("Unavailable"), ""); + } + else + { + sidebarItem->setStatusDesc(tr("Disconnected"), ""); + } } QStringList CPanelNetworkWidget::subItemNameList() @@ -266,10 +286,10 @@ QStringList CPanelNetworkWidget::subItemNameList() void CPanelNetworkWidget::setCurrentSubItem(int index) { ui->sidebar->setCurrentRow(index); - handleSideBarItemClicked(ui->sidebar->currentItem()); + changeSideBarItem(ui->sidebar->currentItem()); } -void CPanelNetworkWidget::handleThemeChanged(Kiran::PaletteType paletteType) +void CPanelNetworkWidget::changeTheme(Kiran::PaletteType paletteType) { for (int i = 0; i < ui->sidebar->count(); ++i) { @@ -282,16 +302,16 @@ void CPanelNetworkWidget::handleThemeChanged(Kiran::PaletteType paletteType) } } -void CPanelNetworkWidget::handleSideBarItemClicked(QListWidgetItem *item) +// ui->stackedWidget与ui->sidebar的index对应 +void CPanelNetworkWidget::changeSideBarItem(QListWidgetItem *item) { - ui->stackedWidget->setCurrentIndex(item->data(Qt::UserRole).toInt()); + ui->stackedWidget->setCurrentIndex(ui->sidebar->row(item)); QString itemText = item->text(); - KLOG_DEBUG() << "item clicked:" << item->text(); if (itemText.contains(tr("Wireless Network"))) { - KLOG_DEBUG() << "item clicked wireless"; - foreach (auto device , m_wirelessDeviceList) + auto wirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); + foreach (auto device, wirelessDeviceList) { WirelessDevice::Ptr wirelessDevice = qobject_cast(device); QDBusPendingReply<> replyRequestScan = wirelessDevice->requestScan(); @@ -301,27 +321,80 @@ void CPanelNetworkWidget::handleSideBarItemClicked(QListWidgetItem *item) { KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); } - else - { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan reply:" << replyRequestScan.reply(); - } } } } -// XXX:需要优化,改成动态增减侧边栏subItems,而不是全部重新加载 -void CPanelNetworkWidget::handleDeviceAdded(const QString &devicePath) +void CPanelNetworkWidget::removeDevice(const QString &devicePath) { - KLOG_DEBUG() << "DeviceAdded :" << devicePath; - reload(); - emit subItemsChanged(); + KLOG_DEBUG() << "DeviceRemoved: " << devicePath; + + auto newWiredDeviceList = NetworkUtils::getManagedDeviceList(Device::Ethernet); + auto newWirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); + + if (newWiredDeviceList.count() == 0 && isExistWiredItem()) + { + QString text = tr("Wired Network"); + removeSidebarItem(text, ITEM_WIRED); + emit subItemsChanged(); + } + + if (newWirelessDeviceList.count() == 0 && isExistWirelessItem()) + { + QString text = tr("Wireless Network"); + removeSidebarItem(text, ITEM_WIRELESS); + emit subItemsChanged(); + } } -void CPanelNetworkWidget::handleDeviceRemoved(const QString &devicePath) +void CPanelNetworkWidget::removeSidebarItem(const QString &text, int index) { - KLOG_DEBUG() << "DeviceRemoved: " << devicePath; - reload(); - emit subItemsChanged(); + for (auto item : m_kiranSidebarItems) + { + if (item->text() == text) + { + m_kiranSidebarItems.removeOne(item); + delete item; + break; + } + } + m_subItemsList.removeAll(text); + + for (int i = 0; i < ui->stackedWidget->count(); i++) + { + auto widget = ui->stackedWidget->widget(i); + if (widget->property(NETWORK_SIDEBAR_ITEM).toInt() == index) + ; + { + ui->stackedWidget->removeWidget(widget); + delete widget; + break; + } + } +} + +bool CPanelNetworkWidget::isExistWiredItem() +{ + for (auto item : m_kiranSidebarItems) + { + if (item->text() == tr("Wired Network")) + { + return true; + } + } + return false; +} + +bool CPanelNetworkWidget::isExistWirelessItem() +{ + for (auto item : m_kiranSidebarItems) + { + if (item->text() == tr("Wireless Network")) + { + return true; + } + } + return false; } void CPanelNetworkWidget::handleWirelessEnabledChanged(bool enable) diff --git a/plugins/network/src/plugin/cpanel-network-widget.h b/plugins/network/src/plugin/cpanel-network-widget.h index e9b11d59..68f3537c 100644 --- a/plugins/network/src/plugin/cpanel-network-widget.h +++ b/plugins/network/src/plugin/cpanel-network-widget.h @@ -35,41 +35,45 @@ class CPanelNetworkWidget : public QWidget public: explicit CPanelNetworkWidget(QWidget *parent = nullptr); - ~CPanelNetworkWidget() override; - void init(); - - void initPage(); - void initConnect(); - void setSidebarItemStatus(KiranSidebarItem *sidebarItem, NetworkManager::Device::State state); - - void reload(); QStringList subItemNameList(); void setCurrentSubItem(int index); -public slots: - void handleDeviceAdded(const QString &devicePath); - void handleDeviceRemoved(const QString &devicePath); - void handleThemeChanged(Kiran::PaletteType paletteType); - void handleSideBarItemClicked(QListWidgetItem *item); - void handleManagedChanged(); +private slots: + void removeDevice(const QString &devicePath); + void changeTheme(Kiran::PaletteType paletteType); + + void changeSideBarItem(QListWidgetItem *item); + void addWirelessDevice(const QString &devicePath); + void addWiredDevice(const QString &devicePath); + void handleWirelessEnabledChanged(bool enable); void handleNetworkingEnabledChanged(bool enable); - void handleStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); + void changeDeviceState(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); + +private: + void init(); + void initPage(); + void initConnect(); + void initWiredManager(); + void initWirelessManager(); + + void updateSidebarItemStatus(NetworkManager::Device::Type deviceType); + void setSidebarItemStatus(KiranSidebarItem *sidebarItem, NetworkManager::Device::State state); + void removeSidebarItem(const QString &text,int index); + + bool isExistWiredItem(); + bool isExistWirelessItem(); signals: void subItemsChanged(); private: Ui::CPanelNetworkWidget *ui; - QList m_wiredDeviceList; - QList m_wirelessDeviceList; QStringList m_subItemsList; - QMap m_deviceToSidebarItem; - QTimer m_Timer; + QList m_kiranSidebarItems; QString m_addDevicePath; - int m_waitCounts; }; #endif // KIRAN_CPANEL_NETWORK_CPANEL_NETWORK_WIDGET_H diff --git a/plugins/network/src/plugin/device-available-connection-widget.cpp b/plugins/network/src/plugin/device-available-connection-widget.cpp new file mode 100644 index 00000000..8ae8362f --- /dev/null +++ b/plugins/network/src/plugin/device-available-connection-widget.cpp @@ -0,0 +1,506 @@ +/** + * 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 + */ + +#include "device-available-connection-widget.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "connection-itemwidget.h" +#include "general.h" +#include "signal-forward.h" +#include "utils.h" + +using namespace NetworkManager; +using namespace NetworkUtils; + +DeviceAvailableConnectionWidget::DeviceAvailableConnectionWidget(const QString &devicePath, QWidget *parent) : KiranCollapse(parent) +{ +} + +DeviceAvailableConnectionWidget::DeviceAvailableConnectionWidget(NetworkManager::Device::Ptr device, QWidget *parent) : KiranCollapse(parent) +{ + m_device = device; + m_devicePath = m_device->uni(); + m_deviceType = m_device->type(); + KLOG_DEBUG() << m_device; + + initUI(); + initConnect(); + + if (m_deviceType == Device::Ethernet) + { + m_wiredDevice = qobject_cast(m_device); + initWiredAvailableConnections(); + initWiredDeviceConnect(); + } + else if (m_deviceType == Device::Wifi) + { + m_wirelessDevice = qobject_cast(m_device); + initWirelessAppearNetwork(); + initWirelessDeviceConnect(); + } + + toggledSwitchButton(true); +} + +DeviceAvailableConnectionWidget::~DeviceAvailableConnectionWidget() +{ +} + +void DeviceAvailableConnectionWidget::onAddConnection(Connection::Ptr connection) +{ + NetworkConnectionInfo connectionInfo; + connectionInfo.id = connection->name(); + connectionInfo.uuid = connection->uuid(); + connectionInfo.connectionPath = connection->path(); + connectionInfo.devicePath = m_devicePath; + connectionInfo.type = connection->settings()->connectionType(); + + ConnectionItemWidget *connectionItemWidget = new ConnectionItemWidget(connectionInfo); + connectionItemWidget->setName(connection->name()); + connectionItemWidget->setFixedHeight(PLUGIN_ITEM_WIDGET_HEIGHT); + + updateConnectionItemStatus(connectionItemWidget); + addConnectionItem(connectionItemWidget); + + // this->sort(); +} + +void DeviceAvailableConnectionWidget::onAddWirelessNetwork(NetworkManager::WirelessNetwork::Ptr network) +{ + AccessPoint::Ptr accessPoint = network->referenceAccessPoint(); + NetworkConnectionInfo connectionInfo; + connectionInfo.devicePath = m_devicePath; + connectionInfo.type = ConnectionSettings::Wireless; + connectionInfo.isWireless = true; + connectionInfo.wirelessInfo.ssid = network->ssid(); + connectionInfo.wirelessInfo.accessPointPath = accessPoint->uni(); + connectionInfo.wirelessInfo.signalStrength = accessPoint->signalStrength(); + KLOG_DEBUG() << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; + + if (accessPoint->capabilities() == AccessPoint::Capability::None) + connectionInfo.wirelessInfo.securitySetting = false; + else + connectionInfo.wirelessInfo.securitySetting = true; + + ConnectionItemWidget *connectionItemWidget = new ConnectionItemWidget(connectionInfo); + connectionItemWidget->setName(network->ssid()); + connectionItemWidget->setWirelessStatusIcon(connectionInfo.isWireless, connectionInfo.wirelessInfo.signalStrength); + connectionItemWidget->setFixedHeight(PLUGIN_ITEM_WIDGET_HEIGHT); + + updateConnectionItemStatus(connectionItemWidget); + addConnectionItem(connectionItemWidget); +} + +// NOTE:什么情况下activatedConnection会为空 +// 无线网络连接不存在的隐藏网络时,有时会出现 findActiveConnection 为空的情况 +void DeviceAvailableConnectionWidget::addActiveConnection(const QString &activePath) +{ + ActiveConnection::Ptr activatedConnection = findActiveConnection(activePath); + KLOG_DEBUG() << "add activatedConnection id:" << activatedConnection->id(); + QStringList deviceList = activatedConnection->devices(); + if (!deviceList.contains(m_devicePath)) + { + return; + } + + ConnectionItemWidget *activeItem; + QString uuid = activatedConnection->uuid(); + KLOG_DEBUG() << "add activatedConnection uuid:" << uuid; + activeItem = findConnectionItemByUuid(uuid); + if (activeItem == nullptr) + { + ConnectionSettings::Ptr settings = activatedConnection->connection()->settings(); + WirelessSetting::Ptr wirelessSetting = settings->setting(Setting::Wireless).dynamicCast(); + QString ssid = wirelessSetting->ssid(); + KLOG_DEBUG() << "add activatedConnection ssid:" << ssid; + activeItem = findConnectionItemBySsid(ssid); + } + + if (activeItem == nullptr) + { + KLOG_DEBUG() << "no found connection by uuid and ssid"; + return; + } + + KLOG_DEBUG() << "Active Connection State:" << activatedConnection->state(); + activeItem->setActiveConnectionPath(activePath); + activeItem->setActiveStatus(activatedConnection->state()); + + m_switchButton->setChecked(true); + + // TODO:排序 + // sort(); + + connect(activatedConnection.data(), &ActiveConnection::stateChanged, activeItem, &ConnectionItemWidget::activeConnectionStateChanged, Qt::UniqueConnection); +} + +// 断开网络时,会自动触发rescan搜索无线网络 +void DeviceAvailableConnectionWidget::removeActiveConnection(const QString &activePath) +{ + ConnectionItemWidget *activeItem = findConnectionItemByActivePath(activePath); + if (activeItem == nullptr) + { + return; + } + activeItem->activeConnectionStateChanged(ActiveConnection::State::Deactivated); +} + +void DeviceAvailableConnectionWidget::addConnection(const QString &path) +{ + Connection::Ptr connection = findConnection(path); + KLOG_DEBUG() << "add connection::" << connection->name(); + + if (deviceType() == Device::Ethernet) + { + if (NetworkUtils::isAvailableConnection(m_devicePath, connection)) + { + onAddConnection(connection); + } + } + else + { + onAddConnection(connection); + } +} + +void DeviceAvailableConnectionWidget::removeConnection(const QString &path) +{ + ConnectionItemWidget *connectionItem = findConnectionItemByPath(path); + if (connectionItem == nullptr) + { + return; + } + removeConnectionItem(connectionItem); + connectionItem->deleteLater(); +} + +void DeviceAvailableConnectionWidget::createConnection() +{ + emit SignalForward::instance()->createConnection(devicePath()); +} + +void DeviceAvailableConnectionWidget::updateConnection(const QString &connectionPath, const QString &mac) +{ + ConnectionItemWidget *connectionItem = findConnectionItemByPath(connectionPath); + if (connectionItem == nullptr) + { + return; + } + + if (m_wiredDevice->permanentHardwareAddress() == mac) + { + auto connection = findConnection(connectionPath); + onAddConnection(connection); + } + else + { + removeConnectionItem(connectionItem); + connectionItem->deleteLater(); + } +} + +void DeviceAvailableConnectionWidget::disappearNetwork(const QString &ssid) +{ + ConnectionItemWidget *connectionItem = findConnectionItemBySsid(ssid); + if (connectionItem == nullptr) + { + return; + } + removeConnectionItem(connectionItem); + connectionItem->deleteLater(); +} + +void DeviceAvailableConnectionWidget::appearNetwork(const QString &ssid) +{ + KLOG_DEBUG() << "appear network:" << ssid; + WirelessNetwork::Ptr network = m_wirelessDevice->findNetwork(ssid); + onAddWirelessNetwork(network); +} + +void DeviceAvailableConnectionWidget::changeDeviceState(Device::State newstate, Device::State oldstate, Device::StateChangeReason reason) +{ + if (newstate == Device::State::Activated) + { + auto activeConnection = m_device->activeConnection(); + m_activateLabel->setText(activeConnection->id()); + } + else if (newstate == Device::Disconnected) + { + m_activateLabel->clear(); + } +} + +void DeviceAvailableConnectionWidget::toggledSwitchButton(bool checked) +{ + if (!checked) + { + if (getIsExpand()) + { + setCollapse(); + } + for (auto connectionItem : m_connectionItemList) + { + connectionItem->disconnectConnection(); + } + } + + if (checked && !getIsExpand()) + { + setExpand(); + } +} + +void DeviceAvailableConnectionWidget::initUI() +{ + m_contentWidget = new QWidget(); + m_contentWidgetLayout = new QVBoxLayout(m_contentWidget); + m_contentWidgetLayout->setContentsMargins(0, 0, 0, 0); + m_contentWidgetLayout->setSpacing(0); + addExpansionSpaceWidget(m_contentWidget); + setTobBarFixedHeight(36); + + setTitle(tr("Network card: %1").arg(m_device->interfaceName())); + + m_switchButton = new KiranSwitchButton(this); + m_switchButton->setChecked(true); + + m_activateLabel = new QLabel(); + m_activateLabel->setStyleSheet("color:#919191;font-family: \"Noto Sans CJK SC Light\";"); + addTopBarWidget(m_activateLabel); + addTopBarWidget(m_switchButton); + + if (m_deviceType == Device::Ethernet) + { + m_createConnectionButton = new QPushButton(m_contentWidget); + Kiran::StylePropertyHelper::setButtonType(m_createConnectionButton, Kiran::BUTTON_Default); + m_createConnectionButton->setIcon(QIcon(":/kcp-network-images/connection-add.svg")); + m_contentWidgetLayout->addWidget(m_createConnectionButton); + connect(m_createConnectionButton, &QPushButton::clicked, this, &DeviceAvailableConnectionWidget::createConnection); + } + else + { + addHiddenNetworkItem(); + } +} + +void DeviceAvailableConnectionWidget::initConnect() +{ + connect(SignalForward::instance(), &SignalForward::activeConnectionRemoved, this, &DeviceAvailableConnectionWidget::removeActiveConnection); + connect(SignalForward::instance(), &SignalForward::connectionRemoved, this, &DeviceAvailableConnectionWidget::removeConnection); + + connect(m_device.data(), &Device::stateChanged, this, &DeviceAvailableConnectionWidget::changeDeviceState, Qt::UniqueConnection); + + connect(m_switchButton, &KiranSwitchButton::toggled, this, &DeviceAvailableConnectionWidget::toggledSwitchButton); +} + +void DeviceAvailableConnectionWidget::initWiredAvailableConnections() +{ + /** + * NOTE:NetworkManager::availableConnections()是从org.freedesktop.NetworkManager中获取availableConnections属性。 + * NetworkManager源码中通过_nm_device_check_connection_available函数进行检查: + * 1、如果连接配置中指定的MAC地址与当前设备的地址不一致,那么就不会出现在availableConnections列表中 + * 2、`an unrealized software device is always available, hardware devices never.` + * 一个不可用的硬件设备是没有可用的连接。因此,但设备不可用时,仍要显示与设备相关的连接配置需要手动过滤处理。 + * + */ + auto availableConnections = NetworkUtils::getAvailableWiredConnections(m_devicePath); + for (auto connection : availableConnections) + { + onAddConnection(connection); + } +} + +void DeviceAvailableConnectionWidget::initWiredDeviceConnect() +{ + connect(SignalForward::instance(), &SignalForward::wiredActiveConnectionAdded, this, &DeviceAvailableConnectionWidget::addActiveConnection); + connect(SignalForward::instance(), &SignalForward::wiredConnectionAdded, this, &DeviceAvailableConnectionWidget::addConnection); + connect(SignalForward::instance(), &SignalForward::connectionMacChanged, this, &DeviceAvailableConnectionWidget::updateConnection); +} + +void DeviceAvailableConnectionWidget::initWirelessAppearNetwork() +{ + WirelessNetwork::List wirelessNetworkList = m_wirelessDevice->networks(); + for (WirelessNetwork::Ptr network : wirelessNetworkList) + { + onAddWirelessNetwork(network); + } +} + +void DeviceAvailableConnectionWidget::initWirelessDeviceConnect() +{ + connect(SignalForward::instance(), &SignalForward::wirelessActiveConnectionAdded, this, &DeviceAvailableConnectionWidget::addActiveConnection); + connect(m_wirelessDevice.data(), &WirelessDevice::networkAppeared, this, &DeviceAvailableConnectionWidget::appearNetwork); + connect(m_wirelessDevice.data(), &WirelessDevice::networkDisappeared, this, &DeviceAvailableConnectionWidget::disappearNetwork); +} + +void DeviceAvailableConnectionWidget::addConnectionItem(ConnectionItemWidget *newItem) +{ + // 排序 + int insertPosition = 0; + if (deviceType() == Device::Wifi) + { + QList list; + int signalStrength = newItem->signalStrength(); + list << signalStrength; + for (auto item : m_connectionItemList) + { + list << item->signalStrength(); + } + // 从小到大 + std::sort(list.begin(), list.end()); + // 反转为从大到小 + std::reverse(list.begin(), list.end()); + insertPosition = list.indexOf(signalStrength); + } + else + { + QCollator collator; + collator.setNumericMode(true); + QStringList names; + names << newItem->name(); + for (auto item : m_connectionItemList) + { + names << item->name(); + } + std::sort(names.begin(), names.end(), collator); + insertPosition = names.indexOf(newItem->name()); + } + + m_contentWidgetLayout->insertWidget(insertPosition, newItem); + m_connectionItemList << newItem; +} + +void DeviceAvailableConnectionWidget::removeConnectionItem(ConnectionItemWidget *item) +{ + m_contentWidgetLayout->removeWidget(item); + m_connectionItemList.removeOne(item); +} + +void DeviceAvailableConnectionWidget::addHiddenNetworkItem() +{ + NetworkConnectionInfo connectionInfo; + connectionInfo.devicePath = m_devicePath; + connectionInfo.type = ConnectionSettings::Wireless; + connectionInfo.isWireless = true; + // 隐藏网络信号设为-1,以方便排序在最底层 + connectionInfo.wirelessInfo.signalStrength = -1; + + ConnectionItemWidget *connectionItemWidget = new ConnectionItemWidget(connectionInfo); + connectionItemWidget->setName(tr("Other WiFi networks")); + connectionItemWidget->setEditButtonVisible(false); + connectionItemWidget->setMoreOptionsVisible(false); + connectionItemWidget->setOtherNetworkIcon(); + connectionItemWidget->setFixedHeight(PLUGIN_ITEM_WIDGET_HEIGHT); + + m_contentWidgetLayout->addWidget(connectionItemWidget); +} + +// TODO:需要优化 +void DeviceAvailableConnectionWidget::updateConnectionItemStatus(ConnectionItemWidget *item) +{ + NetworkConnectionInfo connectionInfo = item->connectionInfo(); + // 已连接的情况 + ActiveConnection::List activeConnectionList = activeConnections(); + for (ActiveConnection::Ptr activeConnection : activeConnectionList) + { + QStringList deviceList = activeConnection->devices(); + if (!deviceList.contains(m_devicePath)) + { + continue; + } + + if ((activeConnection->type() != ConnectionSettings::Wireless) && + (activeConnection->type() != ConnectionSettings::Wired)) + { + continue; + } + + if (connectionInfo.isWireless) + { + ConnectionSettings::Ptr settings = activeConnection->connection()->settings(); + WirelessSetting::Ptr wirelessSetting = settings->setting(Setting::SettingType::Wireless).dynamicCast(); + QString ssid = QString(wirelessSetting->ssid()); + if (ssid == connectionInfo.wirelessInfo.ssid) + { + item->setActiveConnectionPath(activeConnection->path()); + item->setActiveStatus(activeConnection->state()); + m_activateLabel->setText(activeConnection->id()); + KLOG_DEBUG() << "current activeConnection state:" << activeConnection->state(); + connect(activeConnection.data(), &ActiveConnection::stateChanged, item, &ConnectionItemWidget::activeConnectionStateChanged, Qt::UniqueConnection); + } + } + else if (activeConnection->uuid() == connectionInfo.uuid) + { + item->setActiveConnectionPath(activeConnection->path()); + item->setActiveStatus(activeConnection->state()); + m_activateLabel->setText(activeConnection->id()); + connect(activeConnection.data(), &ActiveConnection::stateChanged, item, &ConnectionItemWidget::activeConnectionStateChanged, Qt::UniqueConnection); + } + } +} + +ConnectionItemWidget *DeviceAvailableConnectionWidget::findConnectionItemByUuid(const QString &uuid) +{ + for (auto item : m_connectionItemList) + { + if (item->uuid() == uuid) + { + return item; + } + } + return nullptr; +} + +ConnectionItemWidget *DeviceAvailableConnectionWidget::findConnectionItemByActivePath(const QString &activePath) +{ + for (auto item : m_connectionItemList) + { + if (item->activeConnectionPath() == activePath) + { + return item; + } + } + return nullptr; +} + +ConnectionItemWidget *DeviceAvailableConnectionWidget::findConnectionItemByPath(const QString &connectionPath) +{ + for (auto item : m_connectionItemList) + { + if (item->connectionPath() == connectionPath) + { + return item; + } + } + return nullptr; +} + +ConnectionItemWidget *DeviceAvailableConnectionWidget::findConnectionItemBySsid(const QString &ssid) +{ + for (auto item : m_connectionItemList) + { + if (item->ssid() == ssid) + { + return item; + } + } + return nullptr; +} diff --git a/plugins/network/src/plugin/device-available-connection-widget.h b/plugins/network/src/plugin/device-available-connection-widget.h new file mode 100644 index 00000000..20bf5261 --- /dev/null +++ b/plugins/network/src/plugin/device-available-connection-widget.h @@ -0,0 +1,98 @@ +/** + * 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 +#include "kiran-collapse/kiran-collapse.h" +#include + +class KiranSwitchButton; +class ConnectionItemWidget; + +class DeviceAvailableConnectionWidget : public KiranCollapse +{ + Q_OBJECT +public: + explicit DeviceAvailableConnectionWidget(const QString &devicePath, QWidget *parent = nullptr); + explicit DeviceAvailableConnectionWidget(NetworkManager::Device::Ptr device, QWidget *parent = nullptr); + + ~DeviceAvailableConnectionWidget(); + + QString devicePath() { return m_devicePath; }; + int deviceType() {return m_deviceType;} + +private slots: + void addActiveConnection(const QString &activePath); + void removeActiveConnection(const QString &activePath); + + void addConnection(const QString &path); + void removeConnection(const QString &path); + void createConnection(); + + void updateConnection(const QString &connectionPath,const QString &mac); + + void disappearNetwork(const QString &ssid); + void appearNetwork(const QString &ssid); + + void changeDeviceState(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); + + + void toggledSwitchButton(bool checked); + +private: + void initUI(); + void initConnect(); + + void initWiredAvailableConnections(); + void initWiredDeviceConnect(); + + void initWirelessAppearNetwork(); + void initWirelessDeviceConnect(); + + void onAddConnection(NetworkManager::Connection::Ptr connection); + void onAddWirelessNetwork(NetworkManager::WirelessNetwork::Ptr network); + + void addConnectionItem(ConnectionItemWidget *item); + void removeConnectionItem(ConnectionItemWidget *item); + void addHiddenNetworkItem(); + + void updateConnectionItemStatus(ConnectionItemWidget *item); + + ConnectionItemWidget *findConnectionItemByUuid(const QString &uuid); + ConnectionItemWidget *findConnectionItemByActivePath(const QString &activePath); + ConnectionItemWidget *findConnectionItemByPath(const QString &connectionPath); + ConnectionItemWidget *findConnectionItemBySsid(const QString &ssid); + +private: + QWidget *m_contentWidget; + QList m_connectionItemList; + QVBoxLayout *m_contentWidgetLayout; + + NetworkManager::Device::Ptr m_device; + NetworkManager::WiredDevice::Ptr m_wiredDevice; + NetworkManager::WirelessDevice::Ptr m_wirelessDevice; + QString m_devicePath; + int m_deviceType; + + KiranSwitchButton *m_switchButton; + QLabel *m_activateLabel; + QPushButton *m_createConnectionButton; +}; diff --git a/plugins/network/src/plugin/device-list.cpp b/plugins/network/src/plugin/device-list.cpp new file mode 100644 index 00000000..0d315584 --- /dev/null +++ b/plugins/network/src/plugin/device-list.cpp @@ -0,0 +1,182 @@ +#include "device-list.h" +#include +#include +#include +#include "device-available-connection-widget.h" +#include "signal-forward.h" +#include "utils.h" + +using namespace NetworkManager; +using namespace NetworkUtils; + +DeviceList::DeviceList(QWidget *parent) : QWidget(parent) +{ +} + +DeviceList::DeviceList(NetworkManager::Device::Type type, QWidget *parent) : QWidget(parent) +{ + init(type); +} + +DeviceList::~DeviceList() +{ +} + +void DeviceList::init(NetworkManager::Device::Type type) +{ + m_deviceType = type; + initUI(); + initConnect(); + + auto managedDeviceList = NetworkUtils::getManagedDeviceList(type); + for (auto device : managedDeviceList) + { + auto widget = new DeviceAvailableConnectionWidget(device, m_scrollAreaWidgetContents); + m_managedDevicePaths << device->uni(); + addWidget(widget); + } + + // 在最后添加Spacer + m_verticalSpacer = new QSpacerItem(40, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); + m_widgetContentsLayout->addItem(m_verticalSpacer); + + if (m_deviceType == Device::Wifi) + { + for (auto device : managedDeviceList) + { + WirelessDevice::Ptr wirelessDevice = qobject_cast(device); + QDBusPendingReply<> replyRequestScan = wirelessDevice->requestScan(); + replyRequestScan.waitForFinished(); + if (replyRequestScan.isError()) + { + KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); + } + else + { + KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan reply:" << replyRequestScan.reply(); + } + } + } +} + +void DeviceList::addWidget(QWidget *widget) +{ + m_widgetContentsLayout->insertWidget(0, widget); + m_itemWidgetList << widget; +} + +void DeviceList::removeWidget(QWidget *widget) +{ + m_widgetContentsLayout->removeWidget(widget); + m_itemWidgetList.removeOne(widget); + widget->deleteLater(); +} + +void DeviceList::addDevice(const QString &devicePath) +{ + Device::Ptr device = findNetworkInterface(devicePath); + if(m_deviceType == device->type()) + { + KLOG_INFO() << "add new device:" << device; + auto widget = new DeviceAvailableConnectionWidget(device, m_scrollAreaWidgetContents); + addWidget(widget); + m_managedDevicePaths << devicePath; + } +} + +void DeviceList::removeDevice(const QString &devicePath) +{ + if (!m_managedDevicePaths.contains(devicePath)) + { + return; + } + + for (auto item : m_itemWidgetList) + { + auto deviceItem = qobject_cast(item); + if (deviceItem->devicePath() == devicePath) + { + removeWidget(deviceItem); + m_managedDevicePaths.removeOne(devicePath); + KLOG_INFO() << "removed device:" << devicePath; + return; + } + } +} + +QWidget *DeviceList::itemWidget(int row) +{ + return m_itemWidgetList.value(row); +} + +QList DeviceList::itemWidgetList() +{ + return m_itemWidgetList; +} + +bool DeviceList::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_scrollArea) + { + if (event->type() == QEvent::Resize) + { + m_scrollAreaWidgetContents->setMaximumWidth(this->size().width()); + return true; + } + } + return QWidget::eventFilter(watched, event); +} + +void DeviceList::initUI() +{ + m_verticalLayout = new QVBoxLayout(this); + + QString text; + if (m_deviceType == Device::Ethernet) + { + text = tr("Wired Network Adapter"); + } + else + { + text = tr("Wireless Network Adapter"); + } + m_title = new QLabel(text, this); + m_horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + m_horizontalLayout = new QHBoxLayout(); + m_horizontalLayout->addWidget(m_title); + m_horizontalLayout->addItem(m_horizontalSpacer); + + m_verticalLayout->addLayout(m_horizontalLayout); + + m_scrollArea = new QScrollArea(this); + m_scrollArea->setWidgetResizable(true); + m_scrollArea->setContentsMargins(0, 0, 0, 0); + m_scrollArea->setFrameShape(QFrame::NoFrame); + + m_scrollAreaWidgetContents = new QWidget(); + m_widgetContentsLayout = new QVBoxLayout(m_scrollAreaWidgetContents); + m_widgetContentsLayout->setContentsMargins(0, 0, 0, 0); + m_widgetContentsLayout->setSpacing(8); + + // QScrollArea::setWidget会更改传入的widget的parentWidget + m_scrollArea->setWidget(m_scrollAreaWidgetContents); + m_scrollArea->setAlignment(Qt::AlignTop); + m_scrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + m_scrollArea->installEventFilter(this); + + m_verticalLayout->addWidget(m_scrollArea); + m_verticalLayout->setContentsMargins(0, 0, 0, 0); + m_verticalLayout->setSpacing(8); + + m_verticalLayout->setStretch(1, 1); +} + +void DeviceList::initConnect() +{ + connect(SignalForward::instance(), &SignalForward::wiredDeviceAdded, this, &DeviceList::addDevice); + connect(SignalForward::instance(), &SignalForward::wirelessDeviceAdded, this, &DeviceList::addDevice); + + connect(notifier(), &Notifier::deviceRemoved, this, &DeviceList::removeDevice); +} diff --git a/plugins/network/src/plugin/device-list.h b/plugins/network/src/plugin/device-list.h new file mode 100644 index 00000000..793799d4 --- /dev/null +++ b/plugins/network/src/plugin/device-list.h @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2022 KylinSec Co., Ltd. + * kiran-cpanel-network 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 + +class DeviceList : public QWidget +{ + Q_OBJECT +public: + explicit DeviceList(QWidget *parent = nullptr); + + DeviceList(NetworkManager::Device::Type type, QWidget *parent = nullptr); + ~DeviceList(); + + void init(NetworkManager::Device::Type type); + + QWidget *itemWidget(int row); + QList itemWidgetList(); + +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + +private: + void initUI(); + void initConnect(); + + void addWidget(QWidget *widget); + void removeWidget(QWidget *widget); + +private slots: + void addDevice(const QString &devicePath); + void removeDevice(const QString &devicePath); + +private: + QStringList m_managedDevicePaths; + int m_deviceType; + + QScrollArea *m_scrollArea; + QVBoxLayout *m_verticalLayout; + QWidget *m_scrollAreaWidgetContents; + QVBoxLayout *m_widgetContentsLayout; + QList m_itemWidgetList; + QLabel *m_title; + QWidget *m_titleWidget; + QSpacerItem *m_horizontalSpacer; + QHBoxLayout *m_horizontalLayout; + QSpacerItem *m_verticalSpacer; +}; diff --git a/plugins/network/src/plugin/manager/manager.h b/plugins/network/src/plugin/manager/manager.h index 7ba5b469..1b004b48 100644 --- a/plugins/network/src/plugin/manager/manager.h +++ b/plugins/network/src/plugin/manager/manager.h @@ -33,14 +33,14 @@ public: public slots: virtual void refreshConnectionLists(); - virtual void handleNotifierConnectionAdded(const QString &path) = 0; - virtual void handleNotifierConnectionRemoved(const QString &path) = 0; - virtual void handleActiveConnectionAdded(const QString &activepath) = 0; - virtual void handleActiveConnectionRemoved(const QString &activepath) = 0; - - virtual void handleStateActivated(const QString &activatedPath) = 0; - virtual void handleStateActivating(const QString &activatedPath) = 0; - virtual void handleStateDeactivated(const QString &deactivatedPath) = 0; + virtual void handleNotifierConnectionAdded(const QString &path) {}; + virtual void handleNotifierConnectionRemoved(const QString &path) {}; + virtual void handleActiveConnectionAdded(const QString &activepath) {}; + virtual void handleActiveConnectionRemoved(const QString &activepath) {}; + + virtual void handleStateActivated(const QString &activatedPath) {}; + virtual void handleStateActivating(const QString &activatedPath) {}; + virtual void handleStateDeactivated(const QString &deactivatedPath) {}; virtual void handleActiveConnectionStateChanged(NetworkManager::ActiveConnection::State state); virtual void handleDeviceStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); diff --git a/plugins/network/src/plugin/manager/wired-manager.cpp b/plugins/network/src/plugin/manager/wired-manager.cpp index 32ac2276..64f84ef9 100644 --- a/plugins/network/src/plugin/manager/wired-manager.cpp +++ b/plugins/network/src/plugin/manager/wired-manager.cpp @@ -23,12 +23,15 @@ #include "signal-forward.h" #include "status-notification.h" #include "ui_wired-manager.h" +#include "device-list.h" +#include + using namespace NetworkManager; WiredManager::WiredManager(const QString &devicePath, QWidget *parent) : Manager(parent), ui(new Ui::WiredManager) { ui->setupUi(this); - m_devicePath = devicePath; + ui->wiredDeviceList->init(Device::Ethernet); initUI(); initConnection(); } @@ -41,41 +44,28 @@ WiredManager::~WiredManager() void WiredManager::initUI() { - ui->connectionShowPage->init(ConnectionSettings::Wired, m_devicePath); - ui->connectionShowPage->setTitle(tr("Wired Network Adapter")); - ui->connectionShowPage->setSwitchButtonVisible(false); Kiran::StylePropertyHelper::setButtonType(ui->saveButton, Kiran::BUTTON_Default); } void WiredManager::initConnection() { - connect(ui->connectionShowPage, &ConnectionShowPage::creatConnection, this, &WiredManager::handleCreatConnection); - connect(ui->connectionShowPage, &ConnectionShowPage::editConnection, this, &WiredManager::handleEditConnection); - - connect(ui->returnButton, &QPushButton::clicked, this, &WiredManager::handleReturnPreviousPage); - connect(ui->saveButton, &QPushButton::clicked, this, &WiredManager::handleSaveButtonClicked); - - connect(ui->wiredSettingPage, &WiredSettingPage::returnPreviousPage, this, &WiredManager::handleReturnPreviousPage); - - connect(ui->connectionShowPage, &ConnectionShowPage::connectionUpdated, this, &WiredManager::handleConnectionUpdated); - connect(ui->connectionShowPage, &ConnectionShowPage::activateSelectedConnection, this, &WiredManager::handleActivateSelectedConnection); + connect(ui->returnButton, &QPushButton::clicked, this, &WiredManager::returnPreviousPage); + connect(ui->saveButton, &QPushButton::clicked, this, &WiredManager::saveConnectionSettings); + connect(ui->wiredSettingPage, &WiredSettingPage::returnPreviousPage, this, &WiredManager::returnPreviousPage); - connect(SignalForward::instance(), &SignalForward::wiredConnectionAdded, this, &WiredManager::handleNotifierConnectionAdded); - connect(SignalForward::instance(), &SignalForward::wiredActiveConnectionAdded, this, &WiredManager::handleActiveConnectionAdded); - - connect(SignalForward::instance(), &SignalForward::connectionRemoved, this, &WiredManager::handleNotifierConnectionRemoved); - connect(SignalForward::instance(), &SignalForward::activeConnectionRemoved, this, &WiredManager::handleActiveConnectionRemoved); + connect(SignalForward::instance(), &SignalForward::wiredConnectionEdited, this, &WiredManager::editConnection); + connect(SignalForward::instance(), &SignalForward::createConnection,this, &WiredManager::creatConnection); } -void WiredManager::handleCreatConnection() +void WiredManager::creatConnection(const QString &devicePath) { - ui->wiredSettingPage->showSettingPage(); + ui->wiredSettingPage->createSettingPage(devicePath); QPointer scrollBar = ui->scrollArea->verticalScrollBar(); scrollBar->setValue(0); ui->stackedWidget->setCurrentIndex(PAGE_SETTING); } -void WiredManager::handleEditConnection(const QString &uuid, QString activeConnectionPath) +void WiredManager::editConnection(const QString &uuid, QString activeConnectionPath) { ui->wiredSettingPage->initConnectionSettings(ConnectionSettings::ConnectionType::Wired, uuid); ui->wiredSettingPage->initSettingPage(); @@ -85,131 +75,18 @@ void WiredManager::handleEditConnection(const QString &uuid, QString activeConne ui->stackedWidget->setCurrentIndex(PAGE_SETTING); } -void WiredManager::handleActivateSelectedConnection(const QString &connectionPath, const QString &connectionParameter) -{ - Device::Ptr device = NetworkManager::findNetworkInterface(m_devicePath); - - auto devicestate = device->state(); - KLOG_DEBUG() << "device state:" << devicestate ; - if(devicestate == Device::Unavailable) - { - StatusNotification::connectitonFailedNotifyByReason(tr("The current device is not available")); - return; - } - - 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")) - { - StatusNotification::connectitonFailedNotifyByReason(tr("The carrier is pulled out")); - } - else - { - StatusNotification::connectitonFailedNotify(connectionPath); - } - } - else - { - KLOG_DEBUG() << "activateConnection reply:" << reply.reply(); - } -} - -// 获取到当前激活对象后,开启等待动画,判断完激活状态后停止等待动画 -void WiredManager::handleActiveConnectionAdded(const QString &path) -{ - ActiveConnection::Ptr activatedConnection = findActiveConnection(path); - if (activatedConnection.isNull()) - return; - QStringList deviceList = activatedConnection->devices(); - if (deviceList.contains(m_devicePath)) - { - QString uuid = activatedConnection->uuid(); - auto *activeItemWidget = ui->connectionShowPage->findItemWidgetByUuid(uuid); - if (activeItemWidget != nullptr) - { - ui->connectionShowPage->updateItemWidgetActivePath(activeItemWidget, path); - KLOG_DEBUG() << "activatedConnection->state():" << activatedConnection->state(); - switch (activatedConnection->state()) - { - case ActiveConnection::State::Activating: - handleStateActivating(path); - break; - case ActiveConnection::State::Activated: - handleStateActivated(path); - break; - default: - break; - } - } - connect(activatedConnection.data(), &ActiveConnection::stateChanged, this, &WiredManager::handleActiveConnectionStateChanged, Qt::UniqueConnection); - } -} - -void WiredManager::handleStateActivating(const QString &activePath) -{ - // 加载等待动画 - ui->connectionShowPage->setItemWidgetStatus(activePath, ActiveConnection::State::Activating); -} - -void WiredManager::handleActiveConnectionRemoved(const QString &path) -{ - ui->connectionShowPage->handleActiveStateDeactivated(path); -} - -// TODO:提升代码,增强复用性 -void WiredManager::handleStateActivated(const QString &activePath) -{ - ActiveConnection::Ptr activeConnection = findActiveConnection(activePath); - if (activeConnection.isNull()) - { - return; - } - QStringList deviceList = activeConnection->devices(); - if (deviceList.contains(m_devicePath) && (activeConnection->type() == ConnectionSettings::Wired)) - { - ui->connectionShowPage->setItemWidgetStatus(activePath, ActiveConnection::State::Activated); - ui->connectionShowPage->sort(); - } -} - -void WiredManager::handleStateDeactivated(const QString &deactivatedPath) -{ - ui->connectionShowPage->handleActiveStateDeactivated(deactivatedPath); -} - -void WiredManager::handleReturnPreviousPage() +void WiredManager::returnPreviousPage() { ui->wiredSettingPage->clearPtr(); ui->stackedWidget->setCurrentIndex(PAGE_SHOW); } -void WiredManager::handleNotifierConnectionAdded(const QString &path) -{ - KLOG_DEBUG() << "Connection Added :" << path; - Connection::Ptr connection = findConnection(path); - ui->connectionShowPage->addConnection(connection, m_devicePath); -} - -// Note:当connection被移除时,由于连接可能已经被删除,所有并不能通过findConnection(path)找到该连接对象,进而知道连接类型 -void WiredManager::handleNotifierConnectionRemoved(const QString &path) -{ - KLOG_DEBUG() << "Connection Removed :" << path; - ui->connectionShowPage->removeConnectionFromList(path); -} - -void WiredManager::handleSaveButtonClicked() +void WiredManager::saveConnectionSettings() { if (ui->wiredSettingPage->isInputValid()) { ui->wiredSettingPage->handleSaveButtonClicked(ConnectionSettings::ConnectionType::Wired); - handleReturnPreviousPage(); + returnPreviousPage(); } else { @@ -217,20 +94,4 @@ void WiredManager::handleSaveButtonClicked() } } -void WiredManager::handleConnectionUpdated(const QString &path) -{ - KLOG_DEBUG() << "Connection updated:" << path; - Connection::Ptr updateConnection = findConnection(path); - if (updateConnection->settings()->connectionType() != ConnectionSettings::Wired) - { - return; - } - //移除后再加载进来以更新信息 - ui->connectionShowPage->removeConnectionFromList(path); - ui->connectionShowPage->addConnection(updateConnection, ""); - if (ui->stackedWidget->currentIndex() != PAGE_SETTING) - { - handleReturnPreviousPage(); - } -} diff --git a/plugins/network/src/plugin/manager/wired-manager.h b/plugins/network/src/plugin/manager/wired-manager.h index db78bdf2..e16195ab 100644 --- a/plugins/network/src/plugin/manager/wired-manager.h +++ b/plugins/network/src/plugin/manager/wired-manager.h @@ -18,6 +18,7 @@ #include #include #include "manager.h" +#include "general.h" QT_BEGIN_NAMESPACE namespace Ui @@ -34,32 +35,19 @@ public: explicit WiredManager(const QString &devicePath, QWidget *parent = nullptr); ~WiredManager() override; +public slots: + void creatConnection(const QString &devicePath); + void editConnection(const QString &uuid, QString activeConnectionPath); + void returnPreviousPage(); + void saveConnectionSettings(); + +private: void initUI(); void initConnection(); -public slots: - void handleCreatConnection(); - void handleEditConnection(const QString &uuid, QString activeConnectionPath); - void handleActivateSelectedConnection(const QString &connectionPath, const QString &connectionParameter); - - void handleStateDeactivated(const QString &deactivatedPath) override; - void handleStateActivated(const QString &activatedPath) override; - void handleStateActivating(const QString &activePath) override; - void handleReturnPreviousPage(); - - void handleNotifierConnectionAdded(const QString &path) override; - void handleNotifierConnectionRemoved(const QString &path) override; - - void handleActiveConnectionAdded(const QString &path) override; - void handleActiveConnectionRemoved(const QString &path) override; - - void handleSaveButtonClicked(); - void handleConnectionUpdated(const QString &path); - private: Ui::WiredManager *ui; NetworkManager::WiredDevice::Ptr m_wiredDevice; - QString m_devicePath; }; #endif // KIRAN_CPANEL_NETWORK_WIRED_MANAGER_H diff --git a/plugins/network/src/plugin/manager/wired-manager.ui b/plugins/network/src/plugin/manager/wired-manager.ui index 8e1903cf..ebfee870 100644 --- a/plugins/network/src/plugin/manager/wired-manager.ui +++ b/plugins/network/src/plugin/manager/wired-manager.ui @@ -40,19 +40,19 @@ 0 - 0 + 24 - 0 + 16 - 0 + 24 0 - + @@ -86,8 +86,8 @@ 0 0 - 867 - 562 + 100 + 30 @@ -229,9 +229,9 @@ 1 - ConnectionShowPage + DeviceList QWidget -
connection-show-page.h
+
device-list.h
1
diff --git a/plugins/network/src/plugin/manager/wireless-manager.cpp b/plugins/network/src/plugin/manager/wireless-manager.cpp index 9f238500..4796e241 100644 --- a/plugins/network/src/plugin/manager/wireless-manager.cpp +++ b/plugins/network/src/plugin/manager/wireless-manager.cpp @@ -14,6 +14,7 @@ #include "wireless-manager.h" #include #include +#include #include #include #include @@ -29,9 +30,9 @@ using namespace NetworkManager; WirelessManager::WirelessManager(const QString &devicePath, QWidget *parent) : Manager(parent), ui(new Ui::WirelessManager) { ui->setupUi(this); - m_devicePath = devicePath; - m_devicePtr = findNetworkInterface(m_devicePath); - m_wirelessDevice = qobject_cast(m_devicePtr); + + ui->wirelessDeviceList->init(Device::Wifi); + initUI(); initConnection(); } @@ -43,107 +44,22 @@ WirelessManager::~WirelessManager() void WirelessManager::initUI() { - ui->connectionShowPage->init(ConnectionSettings::Wireless, m_devicePath); - ui->connectionShowPage->setTitle(tr("Wireless Network Adapter")); - ui->connectionShowPage->setSwitchButtonVisible(true); - ui->connectionShowPage->setCreateButtonVisible(false); - Kiran::StylePropertyHelper::setButtonType(ui->saveButton, Kiran::BUTTON_Default); - - // XXX:由于存在switchButton,所以特别修改一下topMargin - // ui->connectionShowPage->setContentsMargins(0,-12,0,0); } void WirelessManager::initConnection() { - connect(ui->connectionShowPage, &ConnectionShowPage::creatConnection, this, &WirelessManager::handleCreatConnection); - connect(ui->connectionShowPage, &ConnectionShowPage::editConnection, this, &WirelessManager::handleEditConnection); + connect(SignalForward::instance(), &SignalForward::wirelessConnectionEdited, this, &WirelessManager::editConnection); - connect(ui->returnButton, &QPushButton::clicked, this, &WirelessManager::handleReturnPreviousPage); + connect(ui->returnButton, &QPushButton::clicked, this, &WirelessManager::returnPreviousPage); connect(ui->saveButton, &QPushButton::clicked, this, [this]() { ui->wirelessSettingPage->handleSaveButtonClicked(ConnectionSettings::ConnectionType::Wireless); - handleReturnPreviousPage(); }); - - connect(ui->wirelessSettingPage, &WirelessSettingPage::returnPreviousPage, this, &WirelessManager::handleReturnPreviousPage); - // XXX:更改信号 - connect(ui->wirelessSettingPage, &WirelessSettingPage::settingUpdated, this, [this]() - { - KLOG_DEBUG() << "WiredSettingPage::settingUpdated"; - handleReturnPreviousPage(); - refreshConnectionLists(); }); - - connect(ui->connectionShowPage, &ConnectionShowPage::activateSelectedWirelessNetwork, this, &WirelessManager::handleActivateSelectedWirelessNetwork); - connect(ui->connectionShowPage, &ConnectionShowPage::sendSsidToWireless, this, &WirelessManager::handleActivateHiddenNetwork); - - connect(m_wirelessDevice.data(), &WirelessDevice::networkDisappeared, this, &WirelessManager::handleNetworkDisappeared, Qt::QueuedConnection); - connect(m_wirelessDevice.data(), &WirelessDevice::networkAppeared, this, &WirelessManager::handleNetworkAppeared); - - // Note:插件与托盘都对该设备的信号进行了连接,容易干扰重复,因此,插件暂未实现该函数 - connect(m_devicePtr.data(), &Device::stateChanged, this, &WirelessManager::handleDeviceStateChanged, Qt::UniqueConnection); - - connect(SignalForward::instance(), &SignalForward::wirelessConnectionAdded, this, &WirelessManager::handleNotifierConnectionAdded); - connect(SignalForward::instance(), &SignalForward::wirelessActiveConnectionAdded, this, &WirelessManager::handleActiveConnectionAdded); - - connect(SignalForward::instance(), &SignalForward::connectionRemoved, this, &WirelessManager::handleNotifierConnectionRemoved); - connect(SignalForward::instance(), &SignalForward::activeConnectionRemoved, this, &WirelessManager::handleActiveConnectionRemoved); -} - -//在已存在WirelessSetting配置的情况下,激活连接.(连接过一次后会创建WirelessSetting配置) -void WirelessManager::activateWirelessConnection(const QString &connectionPath, const QString &devicePath, const QString &accessPointPath) -{ - KLOG_DEBUG() << "connectionPath:" << connectionPath; - KLOG_DEBUG() << "devicePath:" << devicePath; - KLOG_DEBUG() << "accessPointPath:" << accessPointPath; - if (!connectionPath.isEmpty()) - { - Device::Ptr device = findNetworkInterface(devicePath); - if(device->state() != Device::Unavailable) - { - QDBusPendingReply reply = - NetworkManager::activateConnection(connectionPath, devicePath, accessPointPath); - - reply.waitForFinished(); - if (reply.isError()) - { - KLOG_ERROR() << "activate connection failed:" << reply.error(); - StatusNotification::connectitonFailedNotify(connectionPath); - } - else - { - KLOG_DEBUG() << "reply.reply():" << reply.reply(); - QString activatedPath = reply.value().path(); - } - } - else - StatusNotification::connectitonFailedNotifyByReason(tr("The current device is not available")); - } -} + returnPreviousPage(); }); -void WirelessManager::getWirelessAvailableConnections(const QString &devicePath) -{ - Connection::List availableConnectionList = m_devicePtr->availableConnections(); - m_wirelssConnectionMap.clear(); - for (Connection::Ptr conn : availableConnectionList) - { - if (conn->settings()->connectionType() == ConnectionSettings::Wireless) - { - WirelessSetting::Ptr wirelessSetting = conn->settings()->setting(Setting::SettingType::Wireless).dynamicCast(); - QString ssid = QString(wirelessSetting->ssid()); - KLOG_DEBUG() << "Wireless Available Connections wirelessSetting->ssid():" << ssid; - m_wirelssConnectionMap.insert(ssid, conn); - } - } + connect(ui->wirelessSettingPage, &WirelessSettingPage::returnPreviousPage, this, &WirelessManager::returnPreviousPage); } -void WirelessManager::handleCreatConnection() -{ - ui->wirelessSettingPage->showSettingPage(); - QPointer scrollBar = ui->scrollArea->verticalScrollBar(); - scrollBar->setValue(0); - ui->stackedWidget->setCurrentIndex(PAGE_SETTING); -} - -void WirelessManager::handleEditConnection(const QString &uuid, QString activeConnectionPath) +void WirelessManager::editConnection(const QString &uuid, QString activeConnectionPath) { ActiveConnection::Ptr activeConnection = findActiveConnection(activeConnectionPath); if (activeConnection.isNull()) @@ -160,265 +76,8 @@ void WirelessManager::handleEditConnection(const QString &uuid, QString activeCo ui->stackedWidget->setCurrentIndex(PAGE_SETTING); } -void WirelessManager::handleActivateSelectedWirelessNetwork(const NetworkConnectionInfo &connectionInfo) -{ - m_connectionInfo = connectionInfo; - QString ssid = connectionInfo.wirelessInfo.ssid; - KLOG_DEBUG() << "Activate Selected Wireless Network:" << ssid; - QString accessPointPath = connectionInfo.wirelessInfo.accessPointPath; - - getWirelessAvailableConnections(m_devicePath); - if (m_wirelssConnectionMap.contains(ssid)) - { - Connection::Ptr connection = m_wirelssConnectionMap.value(ssid); - QString connectionPath = connection->path(); - activateWirelessConnection(connectionPath, m_devicePath, accessPointPath); - } - else - { - createConnectionSettings(ssid, accessPointPath); - WirelessSecuritySetting::Ptr wirelessSecurity = - m_connectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); - WirelessSecuritySetting::KeyMgmt keyMgmt = wirelessSecurity->keyMgmt(); - if (keyMgmt != WirelessSecuritySetting::KeyMgmt::WpaNone) - { - requireInputPassword(ssid); - } - else - addAndActivateWirelessConnection(m_connectionSettings); - } -} - -// TODO:什么情况下activatedConnection会为空 -//无线网络连接不存在的隐藏网络时,有时会出现 findActiveConnection 为空的情况 -void WirelessManager::handleActiveConnectionAdded(const QString &path) -{ - KLOG_DEBUG() << "Active Connection Added:" << path; - ActiveConnection::Ptr activatedConnection = findActiveConnection(path); - if (activatedConnection.isNull()) - { - KLOG_DEBUG() << "new add activatedConnection is nullptr"; - return; - } - QStringList deviceList = activatedConnection->devices(); - if (deviceList.contains(m_devicePath)) - { - ConnectionSettings::Ptr settings = activatedConnection->connection()->settings(); - WirelessSetting::Ptr wirelessSetting = settings->setting(Setting::Wireless).dynamicCast(); - QString ssid = wirelessSetting->ssid(); - auto *activeItemWidget = ui->connectionShowPage->findItemWidgetBySsid(ssid); - if (activeItemWidget != nullptr) - { - //更新item信息 - ui->connectionShowPage->updateItemWidgetActivePath(activeItemWidget, path); - switch (activatedConnection->state()) - { - case ActiveConnection::State::Activating: - handleStateActivating(path); - break; - case ActiveConnection::State::Activated: - handleStateActivated(path); - break; - default: - break; - } - } - connect(activatedConnection.data(), &ActiveConnection::stateChanged, this, &WirelessManager::handleActiveConnectionStateChanged, Qt::UniqueConnection); - } -} - -//断开网络时,会自动触发rescan搜索无线网络 -void WirelessManager::handleActiveConnectionRemoved(const QString &path) -{ - ui->connectionShowPage->handleActiveStateDeactivated(path); -} - -void WirelessManager::handleStateActivating(const QString &activePath) -{ - //加载等待动画 - ui->connectionShowPage->setItemWidgetStatus(activePath, ActiveConnection::State::Activating); -} - -void WirelessManager::handleStateActivated(const QString &activePath) -{ - ActiveConnection::Ptr activeConnection = findActiveConnection(activePath); - if (activeConnection.isNull()) - return; - QStringList deviceList = activeConnection->devices(); - if (deviceList.contains(m_devicePath) && (activeConnection->type() == ConnectionSettings::Wireless)) - { - KLOG_DEBUG() << "handleStateActivated activatedPath:" << activePath; - ui->connectionShowPage->setItemWidgetStatus(activePath, ActiveConnection::State::Activated); - ui->connectionShowPage->sort(); - ui->connectionShowPage->update(); - } -} - -void WirelessManager::handleStateDeactivated(const QString &deactivatedPath) -{ - ui->connectionShowPage->handleActiveStateDeactivated(deactivatedPath); -} - -void WirelessManager::handleNotifierConnectionAdded(const QString &path) -{ -} - -void WirelessManager::handleNotifierConnectionRemoved(const QString &path) -{ - KLOG_DEBUG() << "WirelessManager::handleNotifierConnectionRemoved :" << path; -} - -void WirelessManager::handleReturnPreviousPage() +void WirelessManager::returnPreviousPage() { ui->wirelessSettingPage->clearPtr(); ui->stackedWidget->setCurrentIndex(PAGE_SHOW); } - -void WirelessManager::refreshConnectionLists() -{ - // QEventLoop eventLoop; - // QTimer::singleShot(10000, &eventLoop, &QEventLoop::quit); - // eventLoop.exec(); - ui->connectionShowPage->clearConnectionList(); - ui->connectionShowPage->showWirelessNetworkList(); - // m_currentWirelessDevice->requestScan(); -} - -void WirelessManager::handleNetworkDisappeared(const QString &ssid) -{ - ui->connectionShowPage->removeWirelessNetworkFromList(ssid); -} - -void WirelessManager::handleNetworkAppeared(const QString &ssid) -{ - WirelessNetwork::Ptr network = m_wirelessDevice->findNetwork(ssid); - QString devicePath = m_wirelessDevice->uni(); - ui->connectionShowPage->addWirelessNetwork(network, devicePath); -} - -void WirelessManager::createConnectionSettings(const QString &ssid, const QString &accessPointPath) -{ - m_connectionSettings = ConnectionSettings::Ptr(new ConnectionSettings(ConnectionSettings::Wireless)); - m_connectionSettings->setId(ssid); - m_connectionSettings->setUuid(NetworkManager::ConnectionSettings::createNewUuid()); - - WirelessSetting::Ptr wirelessSetting = m_connectionSettings->setting(Setting::Wireless).dynamicCast(); - wirelessSetting->setInitialized(true); - wirelessSetting->setSsid(ssid.toUtf8()); - - WirelessSecuritySetting::Ptr wirelessSecurity = - m_connectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); - wirelessSecurity->setInitialized(true); - wirelessSetting->setSecurity(QStringLiteral("802-11-wireless-security")); - - Ipv4Setting::Ptr ipv4Setting = m_connectionSettings->setting(Setting::Ipv4).dynamicCast(); - ipv4Setting->setMethod(NetworkManager::Ipv4Setting::Automatic); - - // 处理不同验证的情况 - // accessPointPath路径为空,对应隐藏网络情况,则默认为WpaPsk - if (accessPointPath.isEmpty()) - { - wirelessSetting->setHidden(true); - WirelessSecuritySetting::KeyMgmt keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaPsk; - wirelessSecurity->setKeyMgmt(keyMgmt); - } - else - { - AccessPoint::Ptr accessPoint = m_wirelessDevice->findAccessPoint(accessPointPath); - AccessPoint::Capabilities capabilities = accessPoint->capabilities(); - AccessPoint::WpaFlags wpaFlags = accessPoint->wpaFlags(); - AccessPoint::WpaFlags rsnFlags = accessPoint->rsnFlags(); - - WirelessSecuritySetting::KeyMgmt keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaNone; - - if (capabilities.testFlag(AccessPoint::Capability::Privacy) && - !wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk) && - !wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x)) - { - keyMgmt = WirelessSecuritySetting::KeyMgmt::Wep; - } - - if (wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk) || - rsnFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk)) - { - keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaPsk; - } - - if (wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x) || - rsnFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x)) - { - keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaEap; - } - wirelessSecurity->setKeyMgmt(keyMgmt); - } -} - -void WirelessManager::addAndActivateWirelessConnection(ConnectionSettings::Ptr connectionSettings) -{ - const QString ssid = m_connectionInfo.wirelessInfo.ssid; - const QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; - KLOG_DEBUG() << "accessPointPath" << accessPointPath; - - QDBusPendingReply reply = - NetworkManager::addAndActivateConnection(connectionSettings->toMap(), m_devicePath, accessPointPath); - - reply.waitForFinished(); - if (reply.isError()) - { - KLOG_DEBUG() << "Connection failed: " << reply.error(); - StatusNotification::connectitonFailedNotifyByName(ssid); - } -} - -void WirelessManager::requireInputPassword(const QString &ssid) -{ - TextInputDialog inputDialog; - inputDialog.setTitle(tr("Tips")); - QString tips = QString(tr("Password required to connect to %1.")).arg(ssid); - inputDialog.setText(tips); - inputDialog.setlineEditEchoMode(QLineEdit::Password); - connect(&inputDialog, &TextInputDialog::password, this, &WirelessManager::setSecurityPskAndActivateWirelessConnection); - - inputDialog.exec(); -} - -void WirelessManager::setSecurityPskAndActivateWirelessConnection(const QString &password) -{ - WirelessSecuritySetting::Ptr wirelessSecurity = - m_connectionSettings->setting(Setting::WirelessSecurity).dynamicCast(); - - wirelessSecurity->setPsk(password); - wirelessSecurity->setPskFlags(Setting::SecretFlagType::None); // default: Save password for all users - wirelessSecurity->setInitialized(true); - addAndActivateWirelessConnection(m_connectionSettings); -} - -void WirelessManager::handleActivateHiddenNetwork(const QString &ssid) -{ - m_connectionInfo.wirelessInfo.ssid = ssid; - //若要连接的隐藏网络已经被显式探测到了,则返回 - if (m_wirelessDevice->findNetwork(ssid) != nullptr) - { - KLOG_DEBUG() << "Hidden networks have been explicitly detected,return"; - StatusNotification::connectitonHiddenNetworkFailedNotify(ssid); - return; - } - /** Note:连接隐藏网络时不指定AccessPointPath*/ - QString accessPointPath = ""; - getWirelessAvailableConnections(m_devicePath); - if (m_wirelssConnectionMap.contains(ssid)) - { - Connection::Ptr connection = m_wirelssConnectionMap.value(ssid); - QString connectionPath = connection->path(); - activateWirelessConnection(connectionPath, m_devicePath, accessPointPath); - } - else - { - createConnectionSettings(ssid, accessPointPath); - requireInputPassword(ssid); - } -} - -void WirelessManager::handleDeviceStateChanged(Device::State newstate, Device::State oldstate, Device::StateChangeReason reason) -{ -} diff --git a/plugins/network/src/plugin/manager/wireless-manager.h b/plugins/network/src/plugin/manager/wireless-manager.h index fe210c70..7b749700 100644 --- a/plugins/network/src/plugin/manager/wireless-manager.h +++ b/plugins/network/src/plugin/manager/wireless-manager.h @@ -37,48 +37,17 @@ public: explicit WirelessManager(const QString &devicePath, QWidget *parent = nullptr); ~WirelessManager() override; - void initUI(); - void initConnection(); - void requireInputPassword(const QString &ssid); - public slots: - void handleCreatConnection(); - void handleEditConnection(const QString &uuid, QString activeConnectionPath); - - void handleActivateSelectedWirelessNetwork(const NetworkConnectionInfo &connectionInfo); - void getWirelessAvailableConnections(const QString &devicePath); - void activateWirelessConnection(const QString &connectionPath, const QString &devicePath, const QString &accessPointPath); - void addAndActivateWirelessConnection(NetworkManager::ConnectionSettings::Ptr connectionSettings); - - void createConnectionSettings(const QString &ssid, const QString &accessPointPath); - void setSecurityPskAndActivateWirelessConnection(const QString &password); - - void handleActivateHiddenNetwork(const QString &ssid); - - void handleActiveConnectionAdded(const QString &path) override; - void handleActiveConnectionRemoved(const QString &path) override; + void editConnection(const QString &uuid, QString activeConnectionPath); + void returnPreviousPage(); - void handleStateActivating(const QString &activePath) override; - void handleStateActivated(const QString &activatedPath) override; - void handleStateDeactivated(const QString &deactivatedPath) override; - - void handleNotifierConnectionAdded(const QString &path) override; - void handleNotifierConnectionRemoved(const QString &path) override; - - void handleNetworkDisappeared(const QString &ssid); - void handleNetworkAppeared(const QString &ssid); - - void handleDeviceStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) override; - - void handleReturnPreviousPage(); - void refreshConnectionLists() override; +private: + void initUI(); + void initConnection(); private: Ui::WirelessManager *ui; - QMap m_wirelssConnectionMap; NetworkManager::WirelessDevice::Ptr m_wirelessDevice; - NetworkManager::ConnectionSettings::Ptr m_connectionSettings; - NetworkConnectionInfo m_connectionInfo; QString m_devicePath; }; diff --git a/plugins/network/src/plugin/manager/wireless-manager.ui b/plugins/network/src/plugin/manager/wireless-manager.ui index 8c744919..49c21024 100644 --- a/plugins/network/src/plugin/manager/wireless-manager.ui +++ b/plugins/network/src/plugin/manager/wireless-manager.ui @@ -37,19 +37,19 @@ 0 - 0 + 24 - 0 + 16 - 0 + 24 0 - + @@ -83,8 +83,8 @@ 0 0 - 755 - 442 + 100 + 30 @@ -214,9 +214,9 @@ - ConnectionShowPage + DeviceList QWidget -
connection-show-page.h
+
device-list.h
1
diff --git a/plugins/network/src/plugin/network-plugin.cpp b/plugins/network/src/plugin/network-plugin.cpp index ba9ee3ff..402d0d54 100644 --- a/plugins/network/src/plugin/network-plugin.cpp +++ b/plugins/network/src/plugin/network-plugin.cpp @@ -38,7 +38,7 @@ int NetworkPlugin::init(KiranControlPanel::PanelInterface* interface) m_translator = new QTranslator(qApp); if (!m_translator->load(QLocale(), - "kiran-cpanel-network", + "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) diff --git a/plugins/network/src/plugin/plugin-connection-list.cpp b/plugins/network/src/plugin/plugin-connection-list.cpp index c6970729..3090fb7d 100644 --- a/plugins/network/src/plugin/plugin-connection-list.cpp +++ b/plugins/network/src/plugin/plugin-connection-list.cpp @@ -52,15 +52,18 @@ void PluginConnectionList::addConnection(NetworkManager::Connection::Ptr ptr, co } // TODO:确定new ConnectionItemWidget() 的parentWidget - ConnectionItemWidget* connectionItemWidget = new ConnectionItemWidget(); - connectionItemWidget->setName(ptr->name()); - connectionItemWidget->setFixedHeight(PLUGIN_ITEM_WIDGET_HEIGHT); + NetworkConnectionInfo connectionInfo; connectionInfo.id = ptr->name(); connectionInfo.uuid = ptr->uuid(); connectionInfo.connectionPath = ptr->path(); connectionInfo.devicePath = devicePath; + connectionInfo.type = ptr->settings()->connectionType(); + + ConnectionItemWidget* connectionItemWidget = new ConnectionItemWidget(connectionInfo); + connectionItemWidget->setName(ptr->name()); + connectionItemWidget->setFixedHeight(PLUGIN_ITEM_WIDGET_HEIGHT); ActiveConnection::List activeConnectionList = activeConnections(); for (ActiveConnection::Ptr activeConnection : activeConnectionList) @@ -243,6 +246,7 @@ void PluginConnectionList::setItemWidgetStatus(const QString& activePath, Networ connectionItemWidget->setLoadingStatus(false); connectionItemWidget->activatedStatus(); connectionItemWidget->setEditButtonVisible(true); + connectionItemWidget->setActiveConnectionPath(activePath); break; case ActiveConnection::State::Deactivating: break; diff --git a/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp b/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp index 7e09a546..f9ff73ef 100644 --- a/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp @@ -83,58 +83,60 @@ void EthernetWidget::setErrorTips(KiranTips *errorTips) void EthernetWidget::saveSettings() { - if (m_wiredSetting != nullptr) + if(m_wiredSetting.isNull()) { - QString macAddress = ui->deviceMac->currentData().toString(); - QString cloneMac = ui->cloneDeviceMac->text(); - KLOG_DEBUG() << "macAddress:" << macAddress; - KLOG_DEBUG() << "cloneMac:" << cloneMac; - - m_wiredSetting->setMacAddress(QByteArray::fromHex(macAddress.toUtf8())); - - if(cloneMac.isEmpty()) - { - /** - * assigned-mac-address: - * The new field for the cloned MAC address. - * It can be either a hardware address in ASCII representation, - * or one of the special values "preserve", "permanent", "random" or "stable". - * This field replaces the deprecated "cloned-mac-address" on D-Bus, - * which can only contain explicit hardware addresses. - * Note that this property only exists in D-Bus API. - * libnm and nmcli continue to call this property "cloned-mac-address". - */ - // m_wiredSetting->setAssignedMacAddress(QString()); - m_wiredSetting->setClonedMacAddress(QByteArray()); - } - else - { - m_wiredSetting->setClonedMacAddress(QByteArray::fromHex(cloneMac.toUtf8())); - } - m_wiredSetting->setMtu(ui->customMTU->value()); + return; + } + + QString macAddress = ui->deviceMac->currentData().toString(); + QString cloneMac = ui->cloneDeviceMac->text(); + KLOG_DEBUG() << "save ethernet setting: macAddress:" << macAddress << "cloneMac:" << cloneMac; + + m_wiredSetting->setMacAddress(QByteArray::fromHex(macAddress.toUtf8())); + + if(cloneMac.isEmpty()) + { + /** + * assigned-mac-address: + * The new field for the cloned MAC address. + * It can be either a hardware address in ASCII representation, + * or one of the special values "preserve", "permanent", "random" or "stable". + * This field replaces the deprecated "cloned-mac-address" on D-Bus, + * which can only contain explicit hardware addresses. + * Note that this property only exists in D-Bus API. + * libnm and nmcli continue to call this property "cloned-mac-address". + */ + // m_wiredSetting->setAssignedMacAddress(QString()); + m_wiredSetting->setClonedMacAddress(QByteArray()); } + else + { + m_wiredSetting->setClonedMacAddress(QByteArray::fromHex(cloneMac.toUtf8())); + } + m_wiredSetting->setMtu(ui->customMTU->value()); + } void EthernetWidget::showSettings() { - if (m_wiredSetting != nullptr) + if(m_wiredSetting.isNull()) { - QString deviceMac = m_wiredSetting->macAddress().toHex(':').toUpper(); - QString cloneDeviceMac = m_wiredSetting->clonedMacAddress().toHex(':').toUpper(); - quint32 mtu = m_wiredSetting->mtu(); - - int deviceMacIndex = ui->deviceMac->findData(deviceMac); - ui->deviceMac->setCurrentIndex(deviceMacIndex); - ui->cloneDeviceMac->setText(cloneDeviceMac); - - if (mtu != 0) - ui->customMTU->setVisible(true); - else - ui->customMTU->setVisible(false); - ui->customMTU->setValue(mtu); + resetSettings(); + return; } + QString deviceMac = m_wiredSetting->macAddress().toHex(':').toUpper(); + QString cloneDeviceMac = m_wiredSetting->clonedMacAddress().toHex(':').toUpper(); + quint32 mtu = m_wiredSetting->mtu(); + + int deviceMacIndex = ui->deviceMac->findData(deviceMac); + ui->deviceMac->setCurrentIndex(deviceMacIndex); + ui->cloneDeviceMac->setText(cloneDeviceMac); + + if (mtu != 0) + ui->customMTU->setVisible(true); else - resetSettings(); + ui->customMTU->setVisible(false); + ui->customMTU->setValue(mtu); } void EthernetWidget::handleCustomMTUChanged(bool checked) @@ -181,3 +183,9 @@ bool EthernetWidget::isCloneMacValid(const QString &cloneMac) return matched; } + +void EthernetWidget::setDefaultMacAddress(const QString &macAddress) +{ + int deviceMacIndex = ui->deviceMac->findData(macAddress); + ui->deviceMac->setCurrentIndex(deviceMacIndex); +} diff --git a/plugins/network/src/plugin/setting-widget/ethernet-widget.h b/plugins/network/src/plugin/setting-widget/ethernet-widget.h index 9d96dbfa..6d036c1c 100644 --- a/plugins/network/src/plugin/setting-widget/ethernet-widget.h +++ b/plugins/network/src/plugin/setting-widget/ethernet-widget.h @@ -39,6 +39,7 @@ public: void setWiredSetting(const NetworkManager::WiredSetting::Ptr &wiredSetting); void setErrorTips(KiranTips *errorTips); bool isCloneMacValid(const QString &cloneMac); + void setDefaultMacAddress(const QString &macAddress); public slots: void handleCustomMTUChanged(bool checked); diff --git a/plugins/network/src/plugin/setting-widget/wireless-security-widget.cpp b/plugins/network/src/plugin/setting-widget/wireless-security-widget.cpp index 4936be1f..9a5aa18d 100644 --- a/plugins/network/src/plugin/setting-widget/wireless-security-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/wireless-security-widget.cpp @@ -132,45 +132,46 @@ void WirelessSecurityWidget::saveSettings() void WirelessSecurityWidget::showSettings() { - if (m_wirelessSecuritySetting != nullptr) + if(m_wirelessSecuritySetting.isNull()) { - WirelessSecuritySetting::KeyMgmt keyMgmt = m_wirelessSecuritySetting->keyMgmt(); - int index = ui->securityOption->findData(keyMgmt); - ui->securityOption->setCurrentIndex(index); + resetSettings(); + return; + } - if (keyMgmt == WirelessSecuritySetting::KeyMgmt::WpaNone) - ui->stackedWidget->setVisible(false); - else if (WirelessSecuritySetting::KeyMgmt::WpaPsk) + WirelessSecuritySetting::KeyMgmt keyMgmt = m_wirelessSecuritySetting->keyMgmt(); + int index = ui->securityOption->findData(keyMgmt); + ui->securityOption->setCurrentIndex(index); + + if (keyMgmt == WirelessSecuritySetting::KeyMgmt::WpaNone) + ui->stackedWidget->setVisible(false); + else if (keyMgmt == WirelessSecuritySetting::KeyMgmt::WpaPsk) + { + ui->stackedWidget->setVisible(true); + //待修改枚举值 + ui->stackedWidget->setCurrentIndex(0); + Setting::SecretFlags pskFlags = m_wirelessSecuritySetting->pskFlags(); + int secretFlagIndex; + if (pskFlags == Setting::SecretFlagType::NotSaved) { - ui->stackedWidget->setVisible(true); - //待修改枚举值 - ui->stackedWidget->setCurrentIndex(0); - Setting::SecretFlags pskFlags = m_wirelessSecuritySetting->pskFlags(); - int secretFlagIndex; - if (pskFlags == Setting::SecretFlagType::NotSaved) - { - secretFlagIndex = ui->passwordOption->findData(Setting::NotSaved); - ui->passwordOption->setCurrentIndex(secretFlagIndex); - ui->passwordWidget->setVisible(false); - return; - } - - if (pskFlags == Setting::SecretFlagType::AgentOwned) - { - secretFlagIndex = ui->passwordOption->findData(Setting::AgentOwned); - } - else if (pskFlags == Setting::SecretFlagType::NotRequired) - { - secretFlagIndex = ui->passwordOption->findData(Setting::NotRequired); - } - //暂时隐藏passwordWidget -// ui->passwordWidget->setVisible(true); + secretFlagIndex = ui->passwordOption->findData(Setting::NotSaved); ui->passwordOption->setCurrentIndex(secretFlagIndex); - ui->passwordEdit->setText(m_wirelessSecuritySetting->psk()); + ui->passwordWidget->setVisible(false); + return; } + + if (pskFlags == Setting::SecretFlagType::AgentOwned) + { + secretFlagIndex = ui->passwordOption->findData(Setting::AgentOwned); + } + else if (pskFlags == Setting::SecretFlagType::NotRequired) + { + secretFlagIndex = ui->passwordOption->findData(Setting::NotRequired); + } + //暂时隐藏passwordWidget +// ui->passwordWidget->setVisible(true); + ui->passwordOption->setCurrentIndex(secretFlagIndex); + ui->passwordEdit->setText(m_wirelessSecuritySetting->psk()); } - else - resetSettings(); } void WirelessSecurityWidget::clearPtr() diff --git a/plugins/network/src/plugin/settings/wired-setting-page.cpp b/plugins/network/src/plugin/settings/wired-setting-page.cpp index c1d2c3d9..0015df7a 100644 --- a/plugins/network/src/plugin/settings/wired-setting-page.cpp +++ b/plugins/network/src/plugin/settings/wired-setting-page.cpp @@ -21,6 +21,7 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_wired-setting-page.h" +#include using namespace NetworkManager; @@ -114,6 +115,21 @@ void WiredSettingPage::clearPtr() ui->ethernetWidget->clearPtr(); } +void WiredSettingPage::createSettingPage(const QString &devicePath) +{ + showSettingPage(); + + auto device = findNetworkInterface(devicePath); + WiredDevice::Ptr wiredDevice = qobject_cast(device); + QString macAddress = wiredDevice->permanentHardwareAddress(); + if(macAddress.isEmpty()) + { + macAddress = wiredDevice->hardwareAddress(); + } + KLOG_DEBUG() << "binding MAC Address:" << macAddress; + ui->ethernetWidget->setDefaultMacAddress(macAddress); +} + bool WiredSettingPage::isInputValid() { if (ui->ipv4Widget->isInputValid() && diff --git a/plugins/network/src/plugin/settings/wired-setting-page.h b/plugins/network/src/plugin/settings/wired-setting-page.h index 3096d62d..e19f317a 100644 --- a/plugins/network/src/plugin/settings/wired-setting-page.h +++ b/plugins/network/src/plugin/settings/wired-setting-page.h @@ -39,6 +39,8 @@ public: void initSpecificSettings() override; void clearPtr() override; + void createSettingPage(const QString &devicePath); + public slots: void saveSettingPage() override; bool isInputValid() override; diff --git a/plugins/network/src/signal-forward.cpp b/plugins/network/src/signal-forward.cpp index 0b53db10..9b19bc6c 100644 --- a/plugins/network/src/signal-forward.cpp +++ b/plugins/network/src/signal-forward.cpp @@ -54,6 +54,34 @@ void SignalForward::initConnect() connect(notifier(), &Notifier::activeConnectionRemoved, this, &SignalForward::handleActiveConnectionRemoved, Qt::UniqueConnection); connect(settingsNotifier(), &SettingsNotifier::connectionAdded, this, &SignalForward::handleNotifierConnectionAdded, Qt::UniqueConnection); connect(settingsNotifier(), &SettingsNotifier::connectionRemoved, this, &SignalForward::handleNotifierConnectionRemoved, Qt::UniqueConnection); + + m_Timer.setInterval(3000); + m_Timer.setSingleShot(true); + // Note:新设备插入后,需要等待一段时间,Device::List networkInterfaces() 来不及更新 + // Note:DeviceAdded signal is emitted when a new network interface is available. + + // XXX:当发出deviceAdded信号时,应该已经managed,需要修改并重新测试 + // deviceAdded信号发出时,根据信号的定义,此时device state为managed,但实际上并为unmanaged + connect(notifier(), &Notifier::deviceAdded, this, &SignalForward::addDevice); + connect(&m_Timer, &QTimer::timeout, this, [this]() + { + Device::Ptr device = findNetworkInterface(m_tmpDevicePath); + if(device->managed()) + { + addDevice(m_tmpDevicePath); + m_Timer.stop(); + } + else + { + KLOG_INFO() << "this device interface is invalid!"; + m_Timer.start(); + } + m_waitCounts++; + if(m_waitCounts > MAX_WAIT_COUNTS) + { + KLOG_INFO() << "This device is currently invalid by NetworkManager"; + m_Timer.stop(); + } }); } void SignalForward::handleActiveConnectionAdded(const QString &activePath) @@ -111,3 +139,52 @@ void SignalForward::handleActiveConnectionRemoved(const QString &activepath) { Q_EMIT activeConnectionRemoved(activepath); } + +//TODO:暂时使用uuid,之后统一使用path进行查询 +//是否考虑可以直接传递Connection::Ptr +void SignalForward::editConnection(NetworkConnectionInfo &connectionInfo) +{ + auto type = connectionInfo.type; + switch (type) + { + case ConnectionSettings::ConnectionType::Wired: + emit wiredConnectionEdited(connectionInfo.uuid,connectionInfo.activeConnectionPath); + break; + case ConnectionSettings::ConnectionType::Wireless: + emit wirelessConnectionEdited(connectionInfo.uuid,connectionInfo.activeConnectionPath); + break; + case ConnectionSettings::ConnectionType::Vpn: + emit vpnConnectionEdited(); + break; + default: + break; + } +} + +void SignalForward::addDevice(const QString &uni) +{ + Device::Ptr device = findNetworkInterface(uni); + m_tmpDevicePath = uni; + if(device->managed()) + { + KLOG_INFO() << "add device:" << uni; + switch (device->type()) + { + case Device::Type::Ethernet: + emit wiredDeviceAdded(uni);; + break; + case Device::Type::Wifi: + emit wirelessDeviceAdded(uni);; + break; + default: + emit otherDeviceAdded(uni); + break; + } + } + else + { + KLOG_INFO() << "this device interface is invalid!"; + m_Timer.start(); + KLOG_INFO() << "wait device managed counts:" << m_waitCounts; + } +} \ No newline at end of file diff --git a/plugins/network/src/signal-forward.h b/plugins/network/src/signal-forward.h index e7c62afd..2fd07465 100644 --- a/plugins/network/src/signal-forward.h +++ b/plugins/network/src/signal-forward.h @@ -16,6 +16,9 @@ #define KIRAN_CPANEL_SIGNAL_FORWARD_H #include +#include +#include "general.h" + class SignalForward : public QObject { Q_OBJECT @@ -29,12 +32,17 @@ public: void initConnect(); public slots: + void editConnection(NetworkConnectionInfo &connectionInfo); + +private slots: void handleActiveConnectionAdded(const QString &activepath); void handleNotifierConnectionAdded(const QString &path); void handleNotifierConnectionRemoved(const QString &path); void handleActiveConnectionRemoved(const QString &activepath); + void addDevice(const QString &uni); + signals: void wiredConnectionAdded(const QString &path); void vpnConnectionAdded(const QString &path); @@ -53,6 +61,23 @@ signals: void vpnActiveConnectionRemoved(const QString &activepath); void wirelessActiveConnectionRemoved(const QString &activepath); void activeConnectionRemoved(const QString &activepath); + + void wiredDeviceAdded(const QString &devicePath); + void wirelessDeviceAdded(const QString &devicePath); + void otherDeviceAdded(const QString &devicePath); + + void wiredConnectionEdited(const QString &uuid, QString activeConnectionPath); + void wirelessConnectionEdited(const QString &uuid, QString activeConnectionPath); + void vpnConnectionEdited(); + + void createConnection(const QString &devicePath); + + void connectionMacChanged(const QString &connectionPath,const QString &mac); + +private: + QTimer m_Timer; + int m_waitCounts = 1; + QString m_tmpDevicePath; }; #endif // KIRAN_CPANEL_SIGNAL_FORWARD_H \ No newline at end of file diff --git a/plugins/network/src/tray/main.cpp b/plugins/network/src/tray/main.cpp index 5c4bb65b..130eef30 100644 --- a/plugins/network/src/tray/main.cpp +++ b/plugins/network/src/tray/main.cpp @@ -31,7 +31,7 @@ int main(int argc, char* argv[]) KLOG_INFO() << "autostart!"; QTranslator translator; - if (translator.load(QLocale(), "kiran-cpanel-network", ".", TRANSLATE_PREFIX, ".qm")) + if (translator.load(QLocale(), "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) { a.installTranslator(&translator); KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp index 4547a7e3..8cbd7220 100644 --- a/plugins/network/src/tray/network-tray.cpp +++ b/plugins/network/src/tray/network-tray.cpp @@ -370,6 +370,7 @@ void NetworkTray::updateTrayIcon() ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); if (primaryActiveConnection.isNull()) { + KLOG_INFO() << "update tray icon failed, primary active connection is null"; return; } @@ -383,8 +384,7 @@ void NetworkTray::updateTrayIcon() checkInternetConnectivity(); return; } - - if (NetworkManager::primaryConnectionType() == ConnectionSettings::Wireless) + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) { iconPath = ":/kcp-network-images/wireless-error.svg"; } @@ -601,6 +601,7 @@ void NetworkTray::handleNetworkManagerStatusChanged(NetworkManager::Status statu void NetworkTray::handlePrimaryConnectionChanged(const QString &uni) { KLOG_DEBUG() << "primary connection changed: " << uni; + updateTrayIcon(); } void NetworkTray::UnavailableTrayPage() @@ -734,7 +735,8 @@ void NetworkTray::internetConnected() { KLOG_DEBUG() << "Connectivity check pass"; QString iconPath; - if (primaryConnectionType() == ConnectionSettings::Wireless) + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) { iconPath = ":/kcp-network-images/wireless-4.svg"; } diff --git a/plugins/network/src/tray/wired-tray-widget.cpp b/plugins/network/src/tray/wired-tray-widget.cpp index 67b2224f..9372dad3 100644 --- a/plugins/network/src/tray/wired-tray-widget.cpp +++ b/plugins/network/src/tray/wired-tray-widget.cpp @@ -131,7 +131,10 @@ void WiredTrayWidget::handleActivateSelectedConnection(const QString &connection void WiredTrayWidget::handleNotifierConnectionAdded(const QString &path) { Connection::Ptr connection = findConnection(path); - m_connectionList->addConnection(connection, m_devicePath); + if(NetworkUtils::isAvailableConnection(m_devicePath,connection)) + { + m_connectionList->addConnection(connection, m_devicePath); + } } void WiredTrayWidget::handleNotifierConnectionRemoved(const QString &path) diff --git a/plugins/network/src/utils.cpp b/plugins/network/src/utils.cpp index 0c606fa3..f9976cf1 100644 --- a/plugins/network/src/utils.cpp +++ b/plugins/network/src/utils.cpp @@ -13,9 +13,17 @@ */ #include "utils.h" +#include #include +#include +#include +#include +#include +#include +#include +#include + #include -#include using namespace NetworkManager; QPixmap NetworkUtils::trayIconColorSwitch(const QString &iconPath, const int iconSize) @@ -43,14 +51,13 @@ QPixmap NetworkUtils::trayIconColorSwitch(QPixmap pixmap) return QPixmap(); } - NetworkManager::Device::List NetworkUtils::getDeviceList(NetworkManager::Device::Type type) { const Device::List deviceList = networkInterfaces(); Device::List list; for (Device::Ptr dev : deviceList) { - if(dev->type() == type) + if (dev->type() == type) { list << dev; } @@ -58,14 +65,13 @@ NetworkManager::Device::List NetworkUtils::getDeviceList(NetworkManager::Device: return list; } - Device::List NetworkUtils::getAvailableDeviceList(NetworkManager::Device::Type type) { const Device::List deviceList = networkInterfaces(); Device::List list; for (Device::Ptr dev : deviceList) { - if(dev->type() == type) + if (dev->type() == type) { if (dev->state() == Device::Unmanaged) continue; @@ -83,7 +89,7 @@ Device::List NetworkUtils::getManagedDeviceList(NetworkManager::Device::Type typ Device::List list; for (Device::Ptr dev : deviceList) { - if(dev->type() == type) + if (dev->type() == type) { if (dev->state() == Device::Unmanaged) continue; @@ -103,3 +109,145 @@ QDebug NetworkUtils::operator<<(QDebug dbg, NetworkManager::Device *device) return dbg.maybeSpace(); } +NetworkManager::Connection::Ptr NetworkUtils::getAvailableConnectionBySsid(const QString &devicePath, const QString &ssid) +{ + auto device = findNetworkInterface(devicePath); + Connection::List availableConnectionList = device->availableConnections(); + for (Connection::Ptr conn : availableConnectionList) + { + if (conn->settings()->connectionType() == ConnectionSettings::Wireless) + { + WirelessSetting::Ptr wirelessSetting = conn->settings()->setting(Setting::SettingType::Wireless).dynamicCast(); + if (ssid == QString(wirelessSetting->ssid())) + { + return conn; + } + } + } + return NetworkManager::Connection::Ptr(); +} + +NetworkManager::ConnectionSettings::Ptr NetworkUtils::createWirelessConnectionSettings(const QString &ssid, const QString &devicePath, const QString &accessPointPath) +{ + ConnectionSettings::Ptr connectionSettings = ConnectionSettings::Ptr(new ConnectionSettings(ConnectionSettings::Wireless)); + connectionSettings->setId(ssid); + connectionSettings->setUuid(NetworkManager::ConnectionSettings::createNewUuid()); + + WirelessSetting::Ptr wirelessSetting = connectionSettings->setting(Setting::Wireless).dynamicCast(); + wirelessSetting->setInitialized(true); + wirelessSetting->setSsid(ssid.toUtf8()); + + WirelessSecuritySetting::Ptr wirelessSecurity = + connectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); + wirelessSecurity->setInitialized(true); + wirelessSetting->setSecurity(QStringLiteral("802-11-wireless-security")); + + Ipv4Setting::Ptr ipv4Setting = connectionSettings->setting(Setting::Ipv4).dynamicCast(); + ipv4Setting->setMethod(NetworkManager::Ipv4Setting::Automatic); + + // 处理不同验证的情况 + // accessPointPath路径为空,对应隐藏网络情况,则默认为WpaPsk + if (accessPointPath.isEmpty()) + { + wirelessSetting->setHidden(true); + WirelessSecuritySetting::KeyMgmt keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaPsk; + wirelessSecurity->setKeyMgmt(keyMgmt); + } + else + { + auto device = findNetworkInterface(devicePath); + WirelessDevice::Ptr wirelessDevice = qobject_cast(device); + AccessPoint::Ptr accessPoint = wirelessDevice->findAccessPoint(accessPointPath); + AccessPoint::Capabilities capabilities = accessPoint->capabilities(); + AccessPoint::WpaFlags wpaFlags = accessPoint->wpaFlags(); + AccessPoint::WpaFlags rsnFlags = accessPoint->rsnFlags(); + + WirelessSecuritySetting::KeyMgmt keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaNone; + + if (capabilities.testFlag(AccessPoint::Capability::Privacy) && + !wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk) && + !wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x)) + { + keyMgmt = WirelessSecuritySetting::KeyMgmt::Wep; + } + + if (wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk) || + rsnFlags.testFlag(AccessPoint::WpaFlag::KeyMgmtPsk)) + { + keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaPsk; + } + + if (wpaFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x) || + rsnFlags.testFlag(AccessPoint::WpaFlag::KeyMgmt8021x)) + { + keyMgmt = WirelessSecuritySetting::KeyMgmt::WpaEap; + } + wirelessSecurity->setKeyMgmt(keyMgmt); + } + + return connectionSettings; +} + +bool NetworkUtils::isAvailableConnection(const QString &devicePath, NetworkManager::Connection::Ptr connection) +{ + auto device = findNetworkInterface(devicePath); + if (device->type() == Device::Ethernet) + { + auto settings = connection->settings(); + WiredSetting::Ptr wiredSetting = settings->setting(Setting::SettingType::Wired).dynamicCast(); + QString mac = wiredSetting->macAddress().toHex(':').toUpper(); + auto wiredDevice = device->as(); + QString permanentHardwareAddress = wiredDevice->permanentHardwareAddress(); + + if (mac == permanentHardwareAddress || mac.isEmpty()) + { + return true; + } + else + { + return false; + } + } + else + { + return true; + } +} + + +NetworkManager::Connection::List NetworkUtils::getAvailableWiredConnections(const QString &devicePath) +{ + auto device = findNetworkInterface(devicePath); + if(device->type() != Device::Ethernet) + { + return NetworkManager::Connection::List(); + } + + Connection::List availableConnections; + if (device->state() > Device::Unavailable) + { + availableConnections = device->availableConnections(); + } + else + { + auto wiredDevice = device->as(); + QString permanentHardwareAddress = wiredDevice->permanentHardwareAddress(); + + auto allConnections = listConnections(); + for (auto connection : allConnections) + { + auto settings = connection->settings(); + if (settings->connectionType() != ConnectionSettings::Wired) + { + continue; + } + WiredSetting::Ptr wiredSetting = settings->setting(Setting::SettingType::Wired).dynamicCast(); + QString mac = wiredSetting->macAddress().toHex(':').toUpper(); + if (mac == permanentHardwareAddress || mac.isEmpty()) + { + availableConnections << connection; + } + } + } + return availableConnections; +} diff --git a/plugins/network/src/utils.h b/plugins/network/src/utils.h index f253fd2b..f52ecc41 100644 --- a/plugins/network/src/utils.h +++ b/plugins/network/src/utils.h @@ -15,9 +15,9 @@ #ifndef KIRAN_CPANEL_NETWORK_UTILS_H #define KIRAN_CPANEL_NETWORK_UTILS_H -#include #include #include +#include namespace NetworkUtils { @@ -32,6 +32,14 @@ NetworkManager::Device::List getAvailableDeviceList(NetworkManager::Device::Type NetworkManager::Device::List getManagedDeviceList(NetworkManager::Device::Type type); +NetworkManager::Connection::Ptr getAvailableConnectionBySsid(const QString &devicePath, const QString &ssid); + +NetworkManager::ConnectionSettings::Ptr createWirelessConnectionSettings(const QString &ssid, const QString &devicePath, const QString &accessPointPath); + +bool isAvailableConnection(const QString &devicePath, NetworkManager::Connection::Ptr connection); + +NetworkManager::Connection::List getAvailableWiredConnections(const QString &devicePath); + QDebug operator<<(QDebug dbg, NetworkManager::Device *device); } // namespace NetworkUtils diff --git a/plugins/network/translations/kiran-cpanel-network.bo_CN.ts b/plugins/network/translations/kiran-cpanel-network.bo_CN.ts deleted file mode 100644 index 50d02b7c..00000000 --- a/plugins/network/translations/kiran-cpanel-network.bo_CN.ts +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - CPanlen workWidget - - - Wired Connection %1 - སྐུད་ཡོད་འབྲེལ་མཐུད་བརྒྱ་ཆ་1། - - - Wired Connection - སྐུད་སྦྲེལ་ - - - Wireless Connection %1 - སྐུད་མེད་འབྲེལ་མཐུད།1% - - - Wireless Connection - སྐུད་མེད་འབྲེལ་མཐུད། - - - - Wired Network %1 - སྐུད་ཡོད་དྲ་རྒྱ།1% - - - - Wired Network - སྐུད་ལྡན་དྲ་རྒྱ་ - - - - Wireless Network %1 - སྐུད་མེད་དྲ་རྒྱ།1% - - - - - Wireless Network - སྐུད་མེད་དྲ་རྒྱ་ - - - - - VPN - རྟོག་བཟོས་ཆེད་སྤྱོད་དྲ་བ་ - - - - - Network Details - དྲ་རྒྱའི་ཞིབ་ཕྲའི་ཆ་འཕྲིན། - - - - Connected - འབྲེལ་མཐུད་ - - - - Unavailable - སྤྱོད་མི་རུང་བ་ - - - - Disconnected - ཆད་པ་རེད། - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - ConnectonDetailsWidget - - - - Security type - བདེ་འཇགས་རིགས་ - - - - - - - - - - - - - - - - TextLabel - ཡིག་དེབ་ཤོག་བྱང་ - - - - Frequency band - ཟློས་ཐགས་ - - - - Channel - ཐབས་ལམ་ - - - - Interface - མཐུད་ཁ་ - - - - MAC - ཀུ་ཤུ། - - - - IPv4 - IPV 4 - - - - - Gateway - ཝང་ཀོན་ - - - - Preferred DNS - སྔོན་འདེམས་DNS - - - - Subnet mask - བུ་དྲ་གབ་ཨང་། - - - - IPv6 - IPV 6 - - - - Prefix - མིང་མཐའ་ - - - - Rate - འགྲོས་ཕྱོད། - - - - ConnectionLists - - Tips - གསལ་འདེབས་ - - - Please input a network name - དྲ་རྒྱའི་མིང་ནང་འཇུག་རོགས་། - - - Other WiFi networks - WiFiགཞན་དག་གི་དྲ་རྒྱ། - - - - ConnectionNameWidget - - - ConnectionNameWidget - ConnectonNameWidget - - - - TextLabel - ཡིག་དེབ་ཤོག་བྱང་ - - - - EditConnectionName - རྩོམ་སྒྲིག་འབྲེལ་མཐུད་ - - - - Auto Connection - རང་འགུལ་འབྲེལ་མཐུད། - - - - Required - དགོས་ངེས་ཅན། - - - - Wired Connection %1 - སྐུད་ཡོད་འབྲེལ་མཐུད་བརྒྱ་ཆ་1། - - - - VPN L2TP %1 - VPN L2TP1% - - - - VPN PPTP %1 - VPN PPTP1% - - - - Connection name can not be empty - འབྲེལ་མཐུད་ཀྱི་མིང་སྟོང་བར་བྱས་ན་མི་འགྲིག - - - Error - ནོར་འཁྲུལ། - - - - ConnectionShowPage - - - ConnectionShowPage - སྦྲེལ་མཐུད་འཆར་ངོས། - - - - TextLabel - ཡིག་དེབ་ཤོག་བྱང་ - - - - ButtonCreateConnection - མཐེབ་གནོན་གསར་འཛུགས་འབྲེལ་མཐུད་ - - - Create - གསར་སྐྲུན་ - - - - DetailsPage - - - DetailsPage - ཞིབ་ཕྲའི་ཆ་འཕྲིན་ལྡེབ་ངོས། - - - - Network Details - དྲ་རྒྱའི་ཞིབ་ཕྲའི་ཆ་འཕྲིན། - - - - Please select a connection - འབྲེལ་མཐུད་ཅིག་འདེམས་རོགས་། - - - - ComboBoxDetailsSelectConnection - སྡེབ་སྒྲིག་སྒྲོམ་གྱི་ཆ་འཕྲིན་ཞིབ་འདེམས་འབྲེལ་མཐུད། - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - DisconnectAndDeteBuomon - - - - ButtonDisconnect - མཐེབ་གནོན་གཅོད་པ། - - - - Disconnect - གཅོད་པ་ - - - - ButtonDelete - མཐེབ་གནོན་སུབ་པ་ - - - - Delete - སུབ་པ་ - - - - ButtonIgnore - མཐེབ་གནོན་སྣང་མེད་ - - - - Ignore - སྣང་མེད་ - - - - Are you sure you want to delete the connection %1 - དངོས་གནས་བསུབ་དགོས་།སྦྲེལ་མཐུད་1%དམ་། - - - - Warning - ཐ་ཚིག་ - - - - DnsWidget - - - DnsWidget - DnsWidget - - - - Preferred DNS - སྔོན་འདེམས་DNS - - - - Alternate DNS - གྲབས་གཤོམ་DNS་ - - - - DslManager - - - DslManager - DslManager - - - - DSL - DSL - - - - DslSettingPage - - - DslSettingPage - DslSettingPage - - - - Save - ཉར་ཚགས། - - - - Return - ཕྱིར་ལོག - - - - EthernetWidget - - - EthernetWidget - EthernetWidget - - - - MAC Address Of Ethernet Device - ཐའེ་ཝང་དྲ་བའི་སྒྲིག་ཆས་ཀྱི་MACཤག་གནས་། - - - - ComboBoxDeviceMac - ComboBoxDeviceMac - - - - Ethernet Clone MAC Address - ཐེ་ཝང་གི་ཁུ་ལོན་MACཤག་གནས། - - - - EditDeviceMac - EditDeviceMac - - - - Custom MTU - རང་གི་མཚན་ཉིདMTU - - - - SpinBoxCustomMTU - SpinBoxCབྱེད་སེམས་MTU - - - - No device specified - དམིགས་འཛུགས་མ་བྱས་པའི་སྒྲིག་ཆས་ - - - - Clone Mac invalid - རྒྱུད་བཤུས་Macནུས་མེད་། - - - Error - ནོར་འཁྲུལ། - - - - Ipv4Widget - - - Ipv4Widget - IPVལྷུ་ལག་ཆུང་བ4 - - - - IPV4 Method - IPVཐབས། - - - - ComboBoxIpv4Method - ComboBoxIPVཐབས། - - - - IP Address - IPཤག་གནས་ - - - - EditIpv4Address - EditIPVཤག་གནས་ - - - - Net Mask - དྲ་རྒྱའི་གབ་ཨང་ - - - - EditIpv4Netmask - EditIPVདྲ་རྒྱའི་གབ་ཨང་ - - - - Gateway - ཝང་ཀོན་ - - - - EditIpv4Gateway - EditIPVདྲ་འགག་ - - - - Preferred DNS - སྔོན་འདེམས་DNS - - - - EditIpv4PreferredDNS - EditIPVཨང་བཞི་པར་སྔོན་འདེམས་DNS - - - - Alternate DNS - གྲབས་གཤོམ་DNS་ - - - - EditIpv4AlternateDNS - EditIPVཚབ་བྱེད་པར་གཞི་ns - - - - Auto - རང་འགུལ་ཅན། - - - - Manual - ལག་འགུལ་ཅན། - - - - - Required - དགོས་ངེས་ཅན། - - - - Ipv4 address can not be empty - IPVཤག་གནས་སྟོང་པ་མི་རུང་། - - - Error - ནོར་འཁྲུལ། - - - - Ipv4 Address invalid - IPVཤག་གནས་ནུས་མེད། - - - - NetMask can not be empty - དྲ་རྒྱའི་གབ་ཨང་སྟོང་མི་རུང་། - - - - Netmask invalid - དྲ་རྒྱའི་གབ་ཨང་ནུས་མེད་། - - - - Ipv4 Gateway invalid - IPVདྲ་བའི་འགག་སྒོ་ནུས་པ་མི་འདུག - - - - Ipv4 Preferred DNS invalid - IPVཨང་བཞི་པར་སྔོན་འདེམས་DNSནུས་མེད་ - - - - Ipv4 Alternate DNS invalid - IPVགྲབས་སྤྱོད་DNSནུས་མེད་ - - - - Ipv6Widget - - - Ipv6Widget - IPVལྷུ་ཆུང་6 - - - - IPV6 Method - IPV 6ཐབས། - - - - ComboBoxIpv6Method - ComboBoxIPVབྱ་ཐབས་ - - - - IP Address - IPཤག་གནས་ - - - - EditIpv6Address - EditIPVཤག་གནས་6 - - - - Prefix - མིང་མཐའ་ - - - - SpinBoxIpv6Prefix - SpinBoxIpv6Prefix - - - - Gateway - ཝང་ཀོན་ - - - - EditIpv6Gateway - EditIPVདྲ་མཚམས་ - - - - Preferred DNS - སྔོན་འདེམས་DNS - - - - EditIpv6PreferredDNS - EditIPV 6སྔོན་འདེམས་DNS - - - - Alternate DNS - གྲབས་གཤོམ་DNS་ - - - - EditIpv6AlternateDNS - EditIPVཚབ་བྱེད་པར་གཞི་ns - - - - Auto - རང་འགུལ་ཅན། - - - - Manual - ལག་འགུལ་ཅན། - - - - Ignored - སྣང་མེད་ - - - - Required - དགོས་ངེས་ཅན། - - - - Ipv6 address can not be empty - IPVཤག་གནས་6སྟོང་པ་མི་རུང་། - - - Error - ནོར་འཁྲུལ། - - - - Ipv6 address invalid - IPVཤག་གནས་6ནུས་མེད་། - - - - Ipv6 Gateway invalid - IPVདྲ་བའི་འགག་སྒོ་ནུས་པ་མི་འདུག - - - - Ipv6 Preferred DNS invalid - IPV 6སྔོན་འདེམས་DNSནུས་མེད་ - - - - Ipv6 Alternate DNS invalid - IPVགྲབས་སྤྱོད་DNSནུས་མེད་ - - - - ManagerTray - - Network settings - དྲ་རྒྱའི་སྒྲིག་འགོད་ - - - - NetworkSubItem - - - Wired Network %1 - སྐུད་ཡོད་དྲ་རྒྱ།1% - - - - Wired Network - སྐུད་ལྡན་དྲ་རྒྱ་ - - - - Wireless Network %1 - སྐུད་མེད་དྲ་རྒྱ།1% - - - - Wireless Network - སྐུད་མེད་དྲ་རྒྱ་ - - - - VPN - རྟོག་བཟོས་ཆེད་སྤྱོད་དྲ་བ་ - - - - Network Details - དྲ་རྒྱའི་ཞིབ་ཕྲའི་ཆ་འཕྲིན། - - - - NetworkTray - - - Network settings - དྲ་རྒྱའི་སྒྲིག་འགོད་ - - - - Network unavailable - དྲ་རྒྱ་སྤྱོད་མི་ཆོག - - - - PluginConnectionList - - - Other WiFi networks - WiFiགཞན་དག་གི་དྲ་རྒྱ། - - - - Tips - གསལ་འདེབས་ - - - - Please input a network name - དྲ་རྒྱའི་མིང་ནང་འཇུག་རོགས་། - - - - StatusNotification - - - - - - - Connection Failed - འབྲེལ་མཐུད་ཕམ་པ། - - - Failed to connect to the network - དྲ་སྦྲེལ་མི་ཐུབ་། - - - - the network not found - དྲ་བ་རྙེད་མ་བྱུང་། - - - - The hidden network "%1" to be connected has been detected and exists in the network list - ཞིབ་དཔྱད་ཚད་ལེན་ཟིན་ནས་སྦྲེལ་མཐུད་ཀྱི་དྲ་རྒྱ་“1%”དང་།དྲ་རྒྱ་དེ་དྲ་རྒྱའི་རེའུ་མིག་ནང་གནས་ཡོད་། - - - - - Failed to connect to the network "%1" - དྲ་སྦྲེལ་གྱི“བརྒྱ་ཆ་1”དང་འབྲེལ་མཐུད་བྱེད་ཐབས་བྲལ་བ། - - - - Connection activated - འབྲེལ་མཐུད་གྲུང་སྐུལ་ - - - - You are now connected to the network "%1" - ཁྱེད་རང་ད་ལྟ་འབྲེལ་མཐུད་བྱས་ནས་དྲ་རྒྱའི་1%”། - - - - Connection deactivated - འབྲེལ་མཐུད་མཚམས་བཞག་པ་ - - - - You have now disconnected the network "%1" - ཁྱེད་རང་ད་ལྟ་དྲ་རྒྱའི་“1%”ཀྱི་སྦྲེལ་མཐུད་བཅད་། - - - - Connection deleted - གསུབ་ཟིན་འབྲེལ་མཐུད། - - - - The connection has been deleted "%1" - ༄༅།།“བརྒྱ་ཆ་1”བསུབ་ཟིན། - - - - TextInputDialog - - - Tips - གསལ་འདེབས་ - - - - Yes - རེད། - - - - Cancel - མེད་པར་བཟོ་བ་ - - - - TrayConnectionList - - - Other WiFi networks - WiFiགཞན་དག་གི་དྲ་རྒྱ། - - - - TrayItemWidget - - - TrayItemWidget - TrayItemWidget - - - - Icon - རིས་རྟགས་ - - - - Name - མིང་། - - - - Status - རྣམ་པ་ - - - - Ignore - སྣང་མེད་ - - - - Disconnect - གཅོད་པ་ - - - - - Cancel - མེད་པར་བཟོ་བ་ - - - - - Connect - སྦྲེལ་བ་ - - - - Connected - འབྲེལ་མཐུད་ - - - - Unconnected - མ་སྦྲེལ་བའི་ - - - - Please input password - གསང་ཨང་ནང་འཇུག་རོགས་། - - - - Please input a network name - དྲ་རྒྱའི་མིང་ནང་འཇུག་རོགས་། - - - - TrayPage - - - TrayPage - སྡེར་ལྡེབ་ - - - - TextLabel - ཡིག་དེབ་ཤོག་བྱང་ - - - - Select wired network card - སྐུད་ཡོད་དྲ་བྱང་འདེམས་། - - - - Select wireless network card - སྐུད་མེད་དྲ་བྱང་འདེམས་། - - - - VpnIPsec - - - VpnIPsec - VpnIPsec - - - - Enable IPsec - IPsecསྤྱོད་པ། - - - - Group Name - ཚོ་མིང་ - - - - EditGroupName - ལྕགས་སྐུད་དྲ་རྒྱ། - - - - Group ID - ཚོ་ཚོID - - - - EditGroupId - EditGrupId་ - - - - Pre-Shared Key - སྔོན་ལ་མཉམ་སྤྱོད་གསང་ལྡེ་ - - - - EditPreSharedKey - རྩོམ་སྒྲིག་མཉམ་སྤྱོད་གསང་ལྡེ་མཉམ་སྤྱོད་བྱེད། - - - - Show Password - གསང་ཨང་མངོན་པ། - - - - Internet Key Exchange Protocol - Internetགསང་བའི་ལྡེ་མིག་བརྗེ་རེས་གྲོས་མཐུན་ - - - - EditIpsecIKE - རིགས་འདྲའི་རྩོམ་སྒྲིག་ - - - - Encapsulating Security Payload - བཏུམ་པའི་བདེ་འཇགས་ཁུར་པོ། - - - - EditIpsecESP - བདེ་འཇགས་རྩོམ་སྒྲིག་བྱེད། - - - - VpnIpvx - - - VpnIpvx - VpnIpvx - - - - IPV4 Method - IPVཐབས། - - - - ComboBoxVPNIpv4Method - ComboBoxVPNIPVཐབས། - - - - Only applied in corresponding resources - བབ་མཚུངས་ཀྱི་ཐོན་ཁུངས་ཁྲོད་ཉེར་སྤྱོད་། - - - - Preferred DNS - སྔོན་འདེམས་DNS - - - - EditVPNIpv4PreferredDNS - DITPVreferred་ - - - - Alternate DNS - གྲབས་གཤོམ་DNS་ - - - - EditIpv4AlternateDNS - EditIPVཚབ་བྱེད་པར་གཞི་ns - - - - Auto - རང་འགུལ་ཅན། - - - - VpnL2tpSetting - - - VpnL2tpSetting - VPNL 2 TSསྒྲིག་འགོད་ - - - - VPN name - VPNམིང་ - - - - VpnManager - - - - VpnManager - VpnManager - - - - VPN type - VPNརིགས་ - - - - Save - ཉར་ཚགས། - - - - Return - ཕྱིར་ལོག - - - - VPN - རྟོག་བཟོས་ཆེད་སྤྱོད་དྲ་བ་ - - - - L2TP - L 2 TP - - - - Tips - གསལ་འདེབས་ - - - - Password required to connect to %1. - 1%ལ་སྦྲེལ་ན་གསང་གྲངས་དགོས། - - - - VpnPpp - - - VpnPpp - VpnPpp - - - - Use MPPE - MPPEབཀོལ་བ། - - - - Security - བདེ་འཇགས་ - - - - ComboBoxMppeSecurity - ComboBoxMpeSeecurity - - - - Stateful MPPE - རྣམ་པ་ཡོད་MPPE - - - - All available (default) - སྤྱོད་རུང་བ། - - - - 40-bit (less secure) - 40(བདེ་འཇགས་རང་བཞིན་ཅུང་དམའ)། - - - - 128-bit (most secure) - 12(ཆེས་བདེ་འཇགས) - - - - Refuse EAP Authentication - EAPཐོབ་ཐང་ར་སྤྲོད་དང་ལེན་མ་བྱས་ - - - - Refuse PAP Authentication - PAPཐོབ་ཐང་ར་སྤྲོད་དང་ལེན་མ་བྱས་ - - - - Refuse CHAP Authentication - CHAPཐོབ་ཐང་ར་སྤྲོད་ཁས་མ་བླངས་པ། - - - - Refuse MSCHAP Authentication - MSCHAPཐོབ་ཐང་ར་སྤྲོད་དང་ལེན་མ་བྱས་ - - - - Refuse MSCHAPv2 Authentication - MSCHSDVཐོབ་ཐང་ཚོད་ལྟས་ར་སྤྲོད་དང་ལེན་མ་བྱས་པ། - - - - No BSD Data Compression - BSDམེད་པའི་གཞི་གྲངས་སྡུད་སྒྲིལ། - - - - No Deflate Data Compression - ལྷོད་གཡེང་མེད་པའི་གཞི་གྲངས་སྡུད་སྒྲིལ། - - - - No TCP Header Compression - TCPམེད་པའི་ཚགས་པར་མགོ་སྡུད་ - - - - No Protocol Field Compression - གྲོས་ཆིངས་མེད་པའི་ཡིག་དུམ། - - - - No Address/Control Compression - ཤག་མེད་/ཚོད་འཛིན་སྡུད་སྒྲིལ། - - - - Send PPP Echo Packets - PPPཕྱིར་འཆར་གཞི་གྲངས་ཐུམ། - - - - VpnPptpSetting - - - VpnPptpSetting - VpnPptpSetting - - - - VPN name - VPNམིང་ - - - - VpnWidget - - - VpnWidget - VpnWidget - - - - Gateway - ཝང་ཀོན་ - - - - EditVPNGateway - གཞི་གྲངས། - - - - User Name - སྤྱོད་མཁན་གྱི་མིང་ - - - - EditVPNUserName - སྤྱོད་མཁན་གྱི་མིང་རྩོམ་སྒྲིག་བྱེད། - - - - Password Options - གསང་ཨང་འདེམས་ཚན་ - - - - ComboBoxVPNPasswordOptions - ComboBoxVPNasswordOptons - - - - Password - གསང་ཨང་ - - - - EditVPNPassword - DitasWord - - - - ButtonPasswordVisual - མཐེབ་གནོན་གསང་ཨང་མཐོང་འཛིན་ - - - - Show Password - གསང་ཨང་མངོན་པ། - - - - NT Domain - ཐའེ་དབན་གྱི་དངུལ་ལོར་གསར་པ་ - - - - EditNTDomain - ཐ་སྙད། - - - - - - Required - དགོས་ངེས་ཅན། - - - - Saved - ཉར་ཚགས་བྱས་ཟིན་པ་ - - - - Ask - འདྲི་བ་ - - - - Not required - མི་དགོས། - - - - Gateway can not be empty - ཝང་ཀོན་སྟོང་པ་བྱས་ན་མི་འགྲིག - - - Error - ནོར་འཁྲུལ། - - - - Gateway invalid - དྲ་བའི་འགག་སྒོ་རྩིས་འགྲོ་མེད་། - - - - user name can not be empty - སྤྱོད་མཁན་གྱི་མིང་སྟོང་མི་ཆོག - - - - password can not be empty - གསང་ཨང་སྟོང་མི་རུང་། - - - - WiredManager - - - WiredManager - སྐུད་ལྡན་དོ་དམ་ཆས་ - - - - ButtonSave - མཐེབ་གནོན་ཉར་ཚགས་ - - - - Save - ཉར་ཚགས། - - - - ButtonReturn - མཐེབ་གནོན་ཕྱིར་ལོག - - - - Return - ཕྱིར་ལོག - - - - Wired Network Adapter - སྐུད་ཡོད་དྲ་རྒྱ་འཚམ་སྒྲིག་ཆས། - - - - The carrier is pulled out - འདེགས་སྒྲོམ་ཕྱིར་འཐེན། - - - - The current device is not available - མིག་སྔའི་སྒྲིག་ཆས་སྤྱོད་མི་ཆོག - - - - WiredSettingPage - - - WiredSettingPage - ཝེ་ལེ་ཏེ་སའེ་ཏིན་ཕེ་ཆི། - - - - Network name - དྲ་རྒྱའི་མིང་། - - - - WiredTrayWidget - - Wired network unavailable - སྐུད་ཡོད་དྲ་རྒྱ་བཀོལ་མི་རུང་། - - - - WirelessManager - - - WirelessManager - སྐུད་མེད་དོ་དམ་ཆས་ - - - - Save - ཉར་ཚགས། - - - - Return - ཕྱིར་ལོག - - - - Wireless Network Adapter - སྐུད་མེད་དྲ་རྒྱ་འཚམ་སྒྲིག་ཆས། - - - - The current device is not available - མིག་སྔའི་སྒྲིག་ཆས་སྤྱོད་མི་ཆོག - - - - Tips - གསལ་འདེབས་ - - - - Password required to connect to %1. - 1%ལ་སྦྲེལ་ན་གསང་གྲངས་དགོས། - - - the network "%1" not found - རྙེད་མ་བྱུང་།དྲ་རྒྱའི་1%། - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - སྐུད་མེད་SecurityWidget - - - - Security - བདེ་འཇགས་ - - - - ComboBoxWirelessSecurityOption - ComboBoxWrlessSecurityOpton - - - - Password Options - གསང་ཨང་འདེམས་ཚན་ - - - - ComboBoxWirelessPasswordOption - ComboBoxWrlessPasswordOpton - - - - Password - གསང་ཨང་ - - - - EditWirelessPassword - སྐུད་མེད་གསང་ཨང་རྩོམ་སྒྲིག་བྱེད། - - - - ButtonWirelessPasswordVisual - BuomonWlessPaswordVisual - - - - PushButton - མཐེབ་གནོན་ - - - - None - མེད་པ་ - - - - WPA/WPA2 Personal - WPA/WPAམི་2 - - - - Save password for all users - སྤྱོད་མཁན་གྱི་གསང་ཨང་ཡོད་ཚད་ཉར་ཚགས་། - - - - Save password for this user - སྤྱོད་མཁན་གྱི་གསང་ཨང་ཉར་ཚགས་། - - - - Ask me always - རྒྱུན་དུ་ང་ལ་དྲིས་། - - - - Required - དགོས་ངེས་ཅན། - - - - WirelessSettingPage - - - WirelessSettingPage - སྐུད་མེད་ལྡེབ་ངོས་འགོད་པ་ - - - - Wireless name - སྐུད་མེད་མིང་། - - - - WirelessTrayWidget - - - the network "%1" not found - རྙེད་མ་བྱུང་།དྲ་རྒྱའི་1%། - - - - WirelessWidget - - - WirelessWidget - WrlesWidget - - - - SSID - SSID - - - - EditSsid - SIDརྩོམ་སྒྲིག་བྱེད། - - - - MAC Address Of Device - སྒྲིག་ཆས་ཀྱི་MACཤག་གནས། - - - - ComboBoxWirelessMacAddress - ComboBoxWrlessMacAdress - - - - Custom MTU - རང་གི་མཚན་ཉིདMTU - - - - SpinBoxWirelessCustomMTU - SpinBoxWileessCulomMTU - - - - Required - དགོས་ངེས་ཅན། - - - - No device specified - དམིགས་འཛུགས་མ་བྱས་པའི་སྒྲིག་ཆས་ - - - diff --git a/plugins/network/translations/kiran-cpanel-network.kk_KG.ts b/plugins/network/translations/kiran-cpanel-network.kk_KG.ts deleted file mode 100644 index 84a320bc..00000000 --- a/plugins/network/translations/kiran-cpanel-network.kk_KG.ts +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - CPanelNetworkWidget - - - Wired Connection %1 - %1 зымдуу туташуу - - - Wired Connection - Зымдуу туташуу - - - Wireless Connection %1 - %1 зымсыз туташуу - - - Wireless Connection - Зымсыз туташуу - - - - Wired Network %1 - %1 зымдуу тармак - - - - Wired Network - Зымдуу тармак - - - - Wireless Network %1 - %1 зымсыз тармак - - - - - Wireless Network - Зымсыз тармак - - - - - VPN - ВПН - - - - - Network Details - Тармак тууралуу маалымат - - - - Connected - Туташтырылган - - - - Unavailable - Жеткиликтүү эмес - - - - Disconnected - Өчүрүү - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - ConnectionDetailsWidget - - - - Security type - Коопсуздук түрү - - - - - - - - - - - - - - - - TextLabel - ТекстЛабель - - - - Frequency band - Жыштык тобу - - - - Channel - Канал - - - - Interface - Интерфейс - - - - MAC - MAC - - - - IPv4 - IPv4 - - - - - Gateway - Шлюз - - - - Preferred DNS - Артыкчылыктуу ДНС - - - - Subnet mask - Субнет маскасы - - - - IPv6 - IPv6 - - - - Prefix - Префикс - - - - Rate - Чен - - - - ConnectionLists - - Tips - Кеңештер - - - Please input a network name - Тармактын атын киргизүүнү суранабыз - - - Other WiFi networks - Башка WiFi тармактары - - - - ConnectionNameWidget - - - ConnectionNameWidget - ConnectionNameWidget - - - - TextLabel - ТекстЛабель - - - - EditConnectionName - EditConnectionName - - - - Auto Connection - Авто туташуу - - - - Required - Талап кылынат - - - - Wired Connection %1 - %1 зымдуу туташуу - - - - VPN L2TP %1 - VPN L2TP %1 - - - - VPN PPTP %1 - VPN PPTP %1 - - - - Connection name can not be empty - Туташуу аты бош болушу мүмкүн эмес - - - Error - Ката - - - - ConnectionShowPage - - - ConnectionShowPage - ConnectionShowPage - - - - TextLabel - ТекстЛабель - - - - ButtonCreateConnection - Баскыч кнопкалуу коннексия - - - Create - Жаратуу - - - - DetailsPage - - - DetailsPage - Маалымат Баракчасы - - - - Network Details - Тармак тууралуу маалымат - - - - Please select a connection - Байланышты тандаңыз - - - - ComboBoxDetailsSelectConnection - ComboxDetailsSelectConnection - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - АжыратууAndDeleteButton - - - - ButtonDisconnect - Кнопка-Дисконнект - - - - Disconnect - Ажыратуу - - - - ButtonDelete - Кнопка-Делет - - - - Delete - Жоготуу - - - - ButtonIgnore - БастионИньоре - - - - Ignore - Четке кагуу - - - - Are you sure you want to delete the connection %1 - %1 туташтырууну жоготууну каалайсызбы? - - - - Warning - Эскертүү - - - - DnsWidget - - - DnsWidget - DnsWidget - - - - Preferred DNS - Артыкчылыктуу ДНС - - - - Alternate DNS - Альтернативалык ДНС - - - - DslManager - - - DslManager - DslManager - - - - DSL - DSL - - - - DslSettingPage - - - DslSettingPage - DslSettingPage - - - - Save - Сактоо - - - - Return - Кайтып келүү - - - - EthernetWidget - - - EthernetWidget - EthernetWidget - - - - MAC Address Of Ethernet Device - Ethernet орнотмосунун MAC дареги - - - - ComboBoxDeviceMac - ComboxDeviceMac - - - - Ethernet Clone MAC Address - Ethernet Clone MAC дареги - - - - EditDeviceMac - DitDeviceMac - - - - Custom MTU - Колдонуучу МТУ - - - - SpinBoxCustomMTU - SpinBoxCustomMTU - - - - No device specified - Түзмөк көрсөтүлгөн жок - - - - Clone Mac invalid - Клон Мак жараксыз - - - Error - Ката - - - - Ipv4Widget - - - Ipv4Widget - Ipv4Widget - - - - IPV4 Method - IPV4 ыкмасы - - - - ComboBoxIpv4Method - ComboxIpv4Method - - - - IP Address - IP-дарек - - - - EditIpv4Address - EditIpv4Address - - - - Net Mask - Нет маска - - - - EditIpv4Netmask - EditIpv4Netmask - - - - Gateway - Шлюз - - - - EditIpv4Gateway - EditIpv4Gateway - - - - Preferred DNS - Артыкчылыктуу ДНС - - - - EditIpv4PreferredDNS - EditIpv4PreferredDNS - - - - Alternate DNS - Альтернативалык ДНС - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Машине - - - - Manual - Колдонмо - - - - - Required - Талап кылынат - - - - Ipv4 address can not be empty - Ipv4 дареги бош болушу мүмкүн эмес - - - Error - Ката - - - - Ipv4 Address invalid - Ipv4 дареги жараксыз - - - - NetMask can not be empty - NetMask бош болушу мүмкүн эмес - - - - Netmask invalid - Нетмаск жараксыз - - - - Ipv4 Gateway invalid - Ипв4 шлюз жараксыз - - - - Ipv4 Preferred DNS invalid - Ipv4 артыкчылыктуу ДНС жараксыз - - - - Ipv4 Alternate DNS invalid - Ipv4 альтернативалык ДНС жараксыз - - - - Ipv6Widget - - - Ipv6Widget - Ipv6Widget - - - - IPV6 Method - IPV6 ыкмасы - - - - ComboBoxIpv6Method - ComboxIpv6Method - - - - IP Address - IP-дарек - - - - EditIpv6Address - EditIpv6Address - - - - Prefix - Префикс - - - - SpinBoxIpv6Prefix - SpinBoxIpv6Prefix - - - - Gateway - Шлюз - - - - EditIpv6Gateway - EditIpv6Gateway - - - - Preferred DNS - Артыкчылыктуу ДНС - - - - EditIpv6PreferredDNS - EditIpv6PreferredDNS - - - - Alternate DNS - Альтернативалык ДНС - - - - EditIpv6AlternateDNS - EditIpv6AlternateDNS - - - - Auto - Машине - - - - Manual - Колдонмо - - - - Ignored - Эске алынбагандар - - - - Required - Талап кылынат - - - - Ipv6 address can not be empty - Ipv6 дареги бош болушу мүмкүн эмес - - - Error - Ката - - - - Ipv6 address invalid - Ipv6 дареги жараксыз - - - - Ipv6 Gateway invalid - Ипв6 шлюз жараксыз - - - - Ipv6 Preferred DNS invalid - Ipv6 Артыкчылыктуу ДНС жараксыз - - - - Ipv6 Alternate DNS invalid - Ipv6 альтернативалык ДНС жараксыз - - - - ManagerTray - - Network settings - Тармак параметрлери - - - - NetworkSubItem - - - Wired Network %1 - %1 зымдуу тармак - - - - Wired Network - Зымдуу тармак - - - - Wireless Network %1 - %1 зымсыз тармак - - - - Wireless Network - Зымсыз тармак - - - - VPN - ВПН - - - - Network Details - Тармак тууралуу маалымат - - - - NetworkTray - - - Network settings - Тармак параметрлери - - - - Network unavailable - Тармак жеткиликтүү эмес - - - - PluginConnectionList - - - Other WiFi networks - Башка WiFi тармактары - - - - Tips - Кеңештер - - - - Please input a network name - Тармактын атын киргизүүнү суранабыз - - - - StatusNotification - - - - - - - Connection Failed - Туташуу ишке ашпады - - - Failed to connect to the network - Тармакка туташуу ишке ашпады - - - - the network not found - тармак табылган жок - - - - The hidden network "%1" to be connected has been detected and exists in the network list - Туташууга тийиш жашыруун тармак "%1" аныкталып, тармак тизмесинде бар - - - - - Failed to connect to the network "%1" - "%1" тармагына туташууга болбоду - - - - Connection activated - Туташуу активдештирилди - - - - You are now connected to the network "%1" - Сиз азыр тармакка туташтырылган "%1" - - - - Connection deactivated - Туташуу өчүрүлдү - - - - You have now disconnected the network "%1" - "%1" тармагын өчүрдүңөр - - - - Connection deleted - Туташуу жоготулган - - - - The connection has been deleted "%1" - Туташуу "%1" жоготулган - - - - TextInputDialog - - - Tips - Кеңештер - - - - Yes - Ооба - - - - Cancel - Жокко чыгаруу - - - - TrayConnectionList - - - Other WiFi networks - Башка WiFi тармактары - - - - TrayItemWidget - - - TrayItemWidget - TrayItemWidget - - - - Icon - Икона - - - - Name - Аты-жөнү - - - - Status - Абалы - - - - Ignore - Четке кагуу - - - - Disconnect - Ажыратуу - - - - - Cancel - Жокко чыгаруу - - - - - Connect - Туташуу - - - - Connected - Туташтырылган - - - - Unconnected - Байланышы жок - - - - Please input password - Сураныч, сырсөз киргизүү - - - - Please input a network name - Тармактын атын киргизүүнү суранабыз - - - - TrayPage - - - TrayPage - TrayPage - - - - TextLabel - ТекстЛабель - - - - Select wired network card - Зымдуу тармак картасын тандоо - - - - Select wireless network card - Зымсыз тармактык картаны тандоо - - - - VpnIPsec - - - VpnIPsec - ВпниПсек - - - - Enable IPsec - IPsec-ты ачуу - - - - Group Name - Топтун аты - - - - EditGroupName - EditGroupName - - - - Group ID - Топтун идентификату - - - - EditGroupId - EditGroupid - - - - Pre-Shared Key - Алдын ала бөлүштүрүлгөн ачкыч - - - - EditPreSharedKey - EditPreSharedKey - - - - Show Password - Сырсөз көрсөтүү - - - - Internet Key Exchange Protocol - Интернет ачкыч алмашуу протоколу - - - - EditIpsecIKE - EditIpsecIKE - - - - Encapsulating Security Payload - Коопсуздук жүктөлүшүн капсулалоо - - - - EditIpsecESP - EditIpsecESP - - - - VpnIpvx - - - VpnIpvx - Впнипвкс - - - - IPV4 Method - IPV4 ыкмасы - - - - ComboBoxVPNIpv4Method - ComboxVPNIpv4Method - - - - Only applied in corresponding resources - Тиешелүү ресурстарда гана колдонулат - - - - Preferred DNS - Артыкчылыктуу ДНС - - - - EditVPNIpv4PreferredDNS - EditVPPNipv4PreferredDNS - - - - Alternate DNS - Альтернативалык ДНС - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Машине - - - - VpnL2tpSetting - - - VpnL2tpSetting - VpnL2tpSetting - - - - VPN name - ВПН аты - - - - VpnManager - - - - VpnManager - ВпнМанажер - - - - VPN type - ВПН түрү - - - - Save - Сактоо - - - - Return - Кайтып келүү - - - - VPN - ВПН - - - - L2TP - L2TP - - - - Tips - Кеңештер - - - - Password required to connect to %1. - %1 туташтыруу үчүн сырсөз талап кылынат. - - - - VpnPpp - - - VpnPpp - ВпнПпп - - - - Use MPPE - МПП колдонуу - - - - Security - Коопсуздук - - - - ComboBoxMppeSecurity - ComboBoxMppeSecurity - - - - Stateful MPPE - Мамлекеттик МПП - - - - All available (default) - Бардык жеткиликтүү (дефолт) - - - - 40-bit (less secure) - 40-бит (аз коопсуз) - - - - 128-bit (most secure) - 128-бит (эң коопсуз) - - - - Refuse EAP Authentication - ЕАП аутентификациясын четке кагуу - - - - Refuse PAP Authentication - ПАП аутентификациясын четке кагуу - - - - Refuse CHAP Authentication - ЧАП аутентификациясын четке кагуу - - - - Refuse MSCHAP Authentication - MSCHAP аутентификациясын четке кагуу - - - - Refuse MSCHAPv2 Authentication - MSCHAPv2 аутентификациясын четке кагуу - - - - No BSD Data Compression - БСД маалыматтарын кысуу жок - - - - No Deflate Data Compression - Дефлят маалыматтарын кысуу жок - - - - No TCP Header Compression - TCP Header кысуу жок - - - - No Protocol Field Compression - Протокол талаасын кысуу жок - - - - No Address/Control Compression - Дарек / башкаруу кысуу жок - - - - Send PPP Echo Packets - PPP Echo пакеттерин жөнөтүү - - - - VpnPptpSetting - - - VpnPptpSetting - VpnPptpSetting - - - - VPN name - ВПН аты - - - - VpnWidget - - - VpnWidget - ВпнВиджет - - - - Gateway - Шлюз - - - - EditVPNGateway - EditVPNGateway - - - - User Name - Колдонуучунун аты - - - - EditVPNUserName - EditVPNUserName - - - - Password Options - Сырсөз параметрлери - - - - ComboBoxVPNPasswordOptions - ComboxVPNPasswordOptions - - - - Password - Сырсөз - - - - EditVPNPassword - EditVPNPassword - - - - ButtonPasswordVisual - КнопкаПасвордВизуал - - - - Show Password - Сырсөз көрсөтүү - - - - NT Domain - НТ Домен - - - - EditNTDomain - Эдитнтомэйн - - - - - - Required - Талап кылынат - - - - Saved - Сакталды - - - - Ask - Суроо - - - - Not required - Талап кылынбайт - - - - Gateway can not be empty - Шлюз бош болушу мүмкүн эмес - - - Error - Ката - - - - Gateway invalid - Шлюз жараксыз - - - - user name can not be empty - колдонуучунун аты бош болушу мүмкүн эмес - - - - password can not be empty - сырсөз бош болушу мүмкүн эмес - - - - WiredManager - - - WiredManager - WiredManager - - - - ButtonSave - БастионСаве - - - - Save - Сактоо - - - - ButtonReturn - КнопкаРетурн - - - - Return - Кайтып келүү - - - - Wired Network Adapter - Зымдуу тармак адаптер - - - - The carrier is pulled out - Ташуучу чыгарылып жатат - - - - The current device is not available - Учурдагы аппарат жеткиликтүү эмес - - - - WiredSettingPage - - - WiredSettingPage - WiredSettingPage - - - - Network name - Тармактын аты - - - - WiredTrayWidget - - Wired network unavailable - Зымдуу тармак жеткиликтүү эмес - - - - WirelessManager - - - WirelessManager - WirelessManager - - - - Save - Сактоо - - - - Return - Кайтып келүү - - - - Wireless Network Adapter - Зымсыз тармак адаптер - - - - The current device is not available - Учурдагы аппарат жеткиликтүү эмес - - - - Tips - Кеңештер - - - - Password required to connect to %1. - %1 туташтыруу үчүн сырсөз талап кылынат. - - - the network "%1" not found - "%1" тармагы табылган жок - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - WirelessSecurityWidget - - - - Security - Коопсуздук - - - - ComboBoxWirelessSecurityOption - ComboxWirelessSecurityOption - - - - Password Options - Сырсөз параметрлери - - - - ComboBoxWirelessPasswordOption - ComboxWirelessPasswordOption - - - - Password - Сырсөз - - - - EditWirelessPassword - EditWirelessPassword - - - - ButtonWirelessPasswordVisual - БаскычыWirelessPasswordViswordVisual - - - - PushButton - ПушБуттон - - - - None - Жок - - - - WPA/WPA2 Personal - WPA/WPA2 Жеке - - - - Save password for all users - Бардык колдонуучулар үчүн сырсөз сактоо - - - - Save password for this user - Бул колдонуучу үчүн сырсөз сактоо - - - - Ask me always - Менден ар дайым сурагыла - - - - Required - Талап кылынат - - - - WirelessSettingPage - - - WirelessSettingPage - WirelessSettingPage - - - - Wireless name - Зымсыз аты - - - - WirelessTrayWidget - - - the network "%1" not found - "%1" тармагы табылган жок - - - - WirelessWidget - - - WirelessWidget - WirelessWidget - - - - SSID - ССИД - - - - EditSsid - Редецсид - - - - MAC Address Of Device - ТҮЗМӨКТҮН MAC дареги - - - - ComboBoxWirelessMacAddress - ComboxWirelessMacAddress - - - - Custom MTU - Колдонуучу МТУ - - - - SpinBoxWirelessCustomMTU - SpinBoxWirelessCustomMTU - - - - Required - Талап кылынат - - - - No device specified - Түзмөк көрсөтүлгөн жок - - - diff --git a/plugins/network/translations/kiran-cpanel-network.kk_KZ.ts b/plugins/network/translations/kiran-cpanel-network.kk_KZ.ts deleted file mode 100644 index 9cc240a6..00000000 --- a/plugins/network/translations/kiran-cpanel-network.kk_KZ.ts +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - CPanelNetworkWidget - - - Wired Connection %1 - Сымды байланыс% 1 - - - Wired Connection - Сымды қосылым - - - Wireless Connection %1 - Сымсыз байланыс% 1 - - - Wireless Connection - Сымсыз қосылу - - - - Wired Network %1 - Сымды желі% 1 - - - - Wired Network - Сымды желі - - - - Wireless Network %1 - Сымсыз желі% 1 - - - - - Wireless Network - Сымсыз желі - - - - - VPN - VPN - - - - - Network Details - Желілік мәліметтер - - - - Connected - Қосылған - - - - Unavailable - Қол жетімді емес - - - - Disconnected - Ажыратылды - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - ҚосылымДетельсВиджет - - - - Security type - Қауіпсіздік түрі - - - - - - - - - - - - - - - - TextLabel - TextLabel - - - - Frequency band - Жиілік диапазоны - - - - Channel - Арна - - - - Interface - Интерфейс - - - - MAC - ШРК - - - - IPv4 - IPv4 - - - - - Gateway - Шлюз - - - - Preferred DNS - Ұсынылған DNS - - - - Subnet mask - Ішкі маска - - - - IPv6 - IPv6 - - - - Prefix - Префикс - - - - Rate - Бағасы - - - - ConnectionLists - - Tips - Кеңестер - - - Please input a network name - Желі атауын енгізіңіз - - - Other WiFi networks - WiFi басқа желілері - - - - ConnectionNameWidget - - - ConnectionNameWidget - ConnectNameWidget - - - - TextLabel - TextLabel - - - - EditConnectionName - EditConnectionName - - - - Auto Connection - Автоматты қосу - - - - Required - Талап етіледі - - - - Wired Connection %1 - Сымды байланыс% 1 - - - - VPN L2TP %1 - VPN L2TP% 1 - - - - VPN PPTP %1 - VPN PPTP% 1 - - - - Connection name can not be empty - Қосылым атауы бос болмайды - - - Error - Қате - - - - ConnectionShowPage - - - ConnectionShowPage - ҚосылуShowPage - - - - TextLabel - TextLabel - - - - ButtonCreateConnection - ButtonCreateConnection - - - Create - Жасау - - - - DetailsPage - - - DetailsPage - МәліметтерPage - - - - Network Details - Желілік мәліметтер - - - - Please select a connection - Қосылымды таңдаңыз - - - - ComboBoxDetailsSelectConnection - ComboBoxDetailsSelectConnection - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - Ажырату - - - - ButtonDisconnect - ButtonDisconnect - - - - Disconnect - Ажырату - - - - ButtonDelete - ButtonDelete - - - - Delete - Жою - - - - ButtonIgnore - ButtonIgnore - - - - Ignore - Елемеу - - - - Are you sure you want to delete the connection %1 - Қосылымды% 1 жойғыңыз келетініне сенімдісіз бе? - - - - Warning - Ескерту - - - - DnsWidget - - - DnsWidget - DnsWidget - - - - Preferred DNS - Ұсынылған DNS - - - - Alternate DNS - Балама DNS - - - - DslManager - - - DslManager - DslManager - - - - DSL - DSL - - - - DslSettingPage - - - DslSettingPage - DslSetingPage - - - - Save - Сақтандырыңыз - - - - Return - Қайтару - - - - EthernetWidget - - - EthernetWidget - EthernetWidget - - - - MAC Address Of Ethernet Device - Ethernet құрылғысының MAC мекен-жайы - - - - ComboBoxDeviceMac - ComboBoxDeviceMac - - - - Ethernet Clone MAC Address - Ethernet Clone MAC мекен-жайы - - - - EditDeviceMac - EditDeviceMac - - - - Custom MTU - Жеке MTU - - - - SpinBoxCustomMTU - SpinBoxCustomMTU - - - - No device specified - Құрылғы көрсетілмеген - - - - Clone Mac invalid - Clone Mac жарамсыз - - - Error - Қате - - - - Ipv4Widget - - - Ipv4Widget - Ipv4Widget - - - - IPV4 Method - IPV4 әдісі - - - - ComboBoxIpv4Method - ComboBoxIpv4Method - - - - IP Address - IP мекен-жайы - - - - EditIpv4Address - EditIpv4Adddress - - - - Net Mask - Таза маска - - - - EditIpv4Netmask - EditIpv4Netmask - - - - Gateway - Шлюз - - - - EditIpv4Gateway - EditIpv4Gateway - - - - Preferred DNS - Ұсынылған DNS - - - - EditIpv4PreferredDNS - EditIpv4PrespredDNS - - - - Alternate DNS - Балама DNS - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Авто - - - - Manual - Қолмен - - - - - Required - Талап етіледі - - - - Ipv4 address can not be empty - Ipv4 мекенжайы бос болмайды - - - Error - Қате - - - - Ipv4 Address invalid - Ipv4 мекен-жайы жарамсыз - - - - NetMask can not be empty - NetMask бос болмайды - - - - Netmask invalid - Нетмаска жарамсыз - - - - Ipv4 Gateway invalid - Ipv4 шлюзі жарамсыз - - - - Ipv4 Preferred DNS invalid - Ipv4 Қиырланған DNS жарамсыз - - - - Ipv4 Alternate DNS invalid - Ipv4 балама DNS жарамсыз - - - - Ipv6Widget - - - Ipv6Widget - Ipv6Widget - - - - IPV6 Method - IPV6 әдісі - - - - ComboBoxIpv6Method - ComboBoxIpv6Methode - - - - IP Address - IP мекен-жайы - - - - EditIpv6Address - EditIpv6Adddress - - - - Prefix - Префикс - - - - SpinBoxIpv6Prefix - SpinBoxIf6Prefix - - - - Gateway - Шлюз - - - - EditIpv6Gateway - EditIpv6Gateway - - - - Preferred DNS - Ұсынылған DNS - - - - EditIpv6PreferredDNS - EditIpv6PrespredDNS - - - - Alternate DNS - Балама DNS - - - - EditIpv6AlternateDNS - EditIpv6AlternateDNS - - - - Auto - Авто - - - - Manual - Қолмен - - - - Ignored - Елемеді - - - - Required - Талап етіледі - - - - Ipv6 address can not be empty - Ipv6 мекенжайы бос болмайды - - - Error - Қате - - - - Ipv6 address invalid - Ipv6 мекен-жайы жарамсыз - - - - Ipv6 Gateway invalid - Ipv6 шлюз жарамсыз - - - - Ipv6 Preferred DNS invalid - Ipv6 Ұсынылған DNS жарамсыз - - - - Ipv6 Alternate DNS invalid - Ipv6 балама DNS жарамсыз - - - - ManagerTray - - Network settings - Желілік параметрлер - - - - NetworkSubItem - - - Wired Network %1 - Сымды желі% 1 - - - - Wired Network - Сымды желі - - - - Wireless Network %1 - Сымсыз желі% 1 - - - - Wireless Network - Сымсыз желі - - - - VPN - VPN - - - - Network Details - Желілік мәліметтер - - - - NetworkTray - - - Network settings - Желілік параметрлер - - - - Network unavailable - Желі қол жетімді емес - - - - PluginConnectionList - - - Other WiFi networks - WiFi басқа желілері - - - - Tips - Кеңестер - - - - Please input a network name - Желі атауын енгізіңіз - - - - StatusNotification - - - - - - - Connection Failed - Қосылу сәтсіз аяқталды - - - Failed to connect to the network - Желіге қосыла алмады - - - - the network not found - желі табылмады - - - - The hidden network "%1" to be connected has been detected and exists in the network list - Қосылатын «% 1» жасырын желісі анықталды және желілік тізімде бар - - - - - Failed to connect to the network "%1" - «% 1» желісіне қосыла алмады" - - - - Connection activated - Қосу іске қосылды - - - - You are now connected to the network "%1" - Сіз қазір «% 1» желісіне қосылдыңыз" - - - - Connection deactivated - Қосылған ажыратылған - - - - You have now disconnected the network "%1" - Енді сіз «% 1» желісін ажыраттыңыз" - - - - Connection deleted - Қосылым жойылды - - - - The connection has been deleted "%1" - Байланыс жойылды «% 1»" - - - - TextInputDialog - - - Tips - Кеңестер - - - - Yes - Иә - - - - Cancel - Бас тарту - - - - TrayConnectionList - - - Other WiFi networks - WiFi басқа желілері - - - - TrayItemWidget - - - TrayItemWidget - TrayItemWidget - - - - Icon - Икон - - - - Name - Аты - - - - Status - Күй - - - - Ignore - Елемеу - - - - Disconnect - Ажырату - - - - - Cancel - Бас тарту - - - - - Connect - Қосылыңыз - - - - Connected - Қосылған - - - - Unconnected - Байланыспаған - - - - Please input password - Парольді енгізіңіз - - - - Please input a network name - Желі атауын енгізіңіз - - - - TrayPage - - - TrayPage - TrayPage - - - - TextLabel - TextLabel - - - - Select wired network card - Сымды желілік картаны таңдаңыз - - - - Select wireless network card - Сымсыз желі картасын таңдаңыз - - - - VpnIPsec - - - VpnIPsec - VpnIPsec - - - - Enable IPsec - IPsec қол жетімді - - - - Group Name - Топ атауы - - - - EditGroupName - EditGroupName - - - - Group ID - Топтық жеке куәлік - - - - EditGroupId - EditGroupId - - - - Pre-Shared Key - Бөліскен кілт - - - - EditPreSharedKey - EditPreSHaredKey - - - - Show Password - Парольді көрсетіңіз - - - - Internet Key Exchange Protocol - Интернет алмасу туралы негізгі хаттама - - - - EditIpsecIKE - EditIpsecIKE - - - - Encapsulating Security Payload - Қауіпсіздікті жүктеуді инкапсуляциялау - - - - EditIpsecESP - EditIpsecESP - - - - VpnIpvx - - - VpnIpvx - VpnIpvx - - - - IPV4 Method - IPV4 әдісі - - - - ComboBoxVPNIpv4Method - ComboBoxVPNIPv4Method - - - - Only applied in corresponding resources - Тек тиісті ресурстарда қолданылады - - - - Preferred DNS - Ұсынылған DNS - - - - EditVPNIpv4PreferredDNS - EditVPNIpv4PrestedDNS - - - - Alternate DNS - Балама DNS - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Авто - - - - VpnL2tpSetting - - - VpnL2tpSetting - VpnL2tpSeting - - - - VPN name - VPN атауы - - - - VpnManager - - - - VpnManager - VpnManager - - - - VPN type - VPN түрі - - - - Save - Сақтандырыңыз - - - - Return - Қайтару - - - - VPN - VPN - - - - L2TP - L2TP - - - - Tips - Кеңестер - - - - Password required to connect to %1. - % 1-ге қосу үшін қажет пароль. - - - - VpnPpp - - - VpnPpp - VpnPpp - - - - Use MPPE - MPPE қолданыңыз - - - - Security - Қауіпсіздік - - - - ComboBoxMppeSecurity - ComboBoxMpeSecurity - - - - Stateful MPPE - Мемлекеттік MPPE - - - - All available (default) - Барлық қол жетімді ( дефолт ) - - - - 40-bit (less secure) - 40 биттік ( аз қауіпсіз ) - - - - 128-bit (most secure) - 128 биттік ( ең қауіпсіз ) - - - - Refuse EAP Authentication - EAP аутентификациясынан бас тарту - - - - Refuse PAP Authentication - PAP аутентификациясынан бас тарту - - - - Refuse CHAP Authentication - CHAP аутентификациясынан бас тарту - - - - Refuse MSCHAP Authentication - MSCHAP аутентификациясынан бас тарту - - - - Refuse MSCHAPv2 Authentication - MSCHAPv2 аутентификациядан бас тарту - - - - No BSD Data Compression - BSD деректерін сығу жоқ - - - - No Deflate Data Compression - Deflate Data сығымдалуы жоқ - - - - No TCP Header Compression - TCP басшысының қысылуы жоқ - - - - No Protocol Field Compression - Хаттама өрісі жоқ - - - - No Address/Control Compression - Мекен-жайы жоқ / бақылау қысымы жоқ - - - - Send PPP Echo Packets - МЖӘ пакеттерін жіберіңіз - - - - VpnPptpSetting - - - VpnPptpSetting - VpnPptpSeting - - - - VPN name - VPN атауы - - - - VpnWidget - - - VpnWidget - VpnWidget - - - - Gateway - Шлюз - - - - EditVPNGateway - EditVPNG шлюзі - - - - User Name - Пайдаланушы аты - - - - EditVPNUserName - EditVPNUserName - - - - Password Options - Парольдер - - - - ComboBoxVPNPasswordOptions - ComboBoxVPNPswordOctions - - - - Password - Пароль - - - - EditVPNPassword - EditVPNPassword - - - - ButtonPasswordVisual - ButtonPasswordVisual - - - - Show Password - Парольді көрсетіңіз - - - - NT Domain - NT Domain - - - - EditNTDomain - EditNTDomain - - - - - - Required - Талап етіледі - - - - Saved - Сақталды - - - - Ask - Сұраңыз - - - - Not required - Талап етілмейді - - - - Gateway can not be empty - Шлюз бос болмайды - - - Error - Қате - - - - Gateway invalid - Шлюз жарамсыз - - - - user name can not be empty - пайдаланушы аты бос болмайды - - - - password can not be empty - пароль бос болмайды - - - - WiredManager - - - WiredManager - Сымды адамгер - - - - ButtonSave - ButtonSave - - - - Save - Сақтандырыңыз - - - - ButtonReturn - ButtonReturn - - - - Return - Қайтару - - - - Wired Network Adapter - Сымды желі Adapter - - - - The carrier is pulled out - Тасымалдаушы шығарылды - - - - The current device is not available - Қазіргі құрылғы жоқ - - - - WiredSettingPage - - - WiredSettingPage - Сымды анықтау - - - - Network name - Желілік атау - - - - WiredTrayWidget - - Wired network unavailable - Сымды желі қол жетімді емес - - - - WirelessManager - - - WirelessManager - Сымсыз менеджер - - - - Save - Сақтандырыңыз - - - - Return - Қайтару - - - - Wireless Network Adapter - Сымсыз желі адаптері - - - - The current device is not available - Қазіргі құрылғы жоқ - - - - Tips - Кеңестер - - - - Password required to connect to %1. - % 1-ге қосу үшін қажет пароль. - - - the network "%1" not found - «% 1» желісі табылмады - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - Сымсыз қауіпсіздікWidget - - - - Security - Қауіпсіздік - - - - ComboBoxWirelessSecurityOption - ComboBoxWirelessSecurityOption - - - - Password Options - Парольдер - - - - ComboBoxWirelessPasswordOption - ComboBoxWirelessPasswordPpord опционы - - - - Password - Пароль - - - - EditWirelessPassword - EditWirelessPassword - - - - ButtonWirelessPasswordVisual - ButtonWirelessPasswordVisual - - - - PushButton - PushButton - - - - None - Ешқайсысы жоқ - - - - WPA/WPA2 Personal - WPA / WPA2 Жеке - - - - Save password for all users - Барлық пайдаланушылар үшін парольді сақтаңыз - - - - Save password for this user - Осы пайдаланушы үшін парольді сақтаңыз - - - - Ask me always - Мені әрдайым сұраңыз - - - - Required - Талап етіледі - - - - WirelessSettingPage - - - WirelessSettingPage - Сымсыз ақпарат беру - - - - Wireless name - Сымсыз атау - - - - WirelessTrayWidget - - - the network "%1" not found - «% 1» желісі табылмады - - - - WirelessWidget - - - WirelessWidget - СымсызWidget - - - - SSID - SSID - - - - EditSsid - EditSid - - - - MAC Address Of Device - MAC Құрылғы мекен-жайы - - - - ComboBoxWirelessMacAddress - ComboBoxWirelessMacAddress - - - - Custom MTU - Жеке MTU - - - - SpinBoxWirelessCustomMTU - SpinBoxWirelessCustomTU - - - - Required - Талап етіледі - - - - No device specified - Құрылғы көрсетілмеген - - - diff --git a/plugins/network/translations/kiran-cpanel-network.mn_MN.ts b/plugins/network/translations/kiran-cpanel-network.mn_MN.ts deleted file mode 100644 index c399071f..00000000 --- a/plugins/network/translations/kiran-cpanel-network.mn_MN.ts +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - CPanelNetworkWidget - - - Wired Connection %1 - Утастай холболт% 1 - - - Wired Connection - Утастай холболт - - - Wireless Connection %1 - Утасгүй холболт% 1 - - - Wireless Connection - Утасгүй холболт - - - - Wired Network %1 - Утастай сүлжээ% 1 - - - - Wired Network - Утастай сүлжээ - - - - Wireless Network %1 - Утасгүй сүлжээ% 1 - - - - - Wireless Network - Утасгүй - - - - - VPN - VPN - - - - - Network Details - Сүлжээний дэлгэрэнгүй - - - - Connected - Холбогдсон - - - - Unavailable - Боломжгүй - - - - Disconnected - Холбогдсон - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - ХолболтДетэйл - - - - Security type - Аюулгүй байдал - - - - - - - - - - - - - - - - TextLabel - Текст - - - - Frequency band - Давтамжийн хамтлаг - - - - Channel - Суваг - - - - Interface - Интерфейс - - - - MAC - МАК - - - - IPv4 - IPv4 - - - - - Gateway - Хаалга - - - - Preferred DNS - DNS-ийг илүүд үздэг - - - - Subnet mask - Дэд маск - - - - IPv6 - IPv6 - - - - Prefix - Зөв - - - - Rate - Үнэлгээ - - - - ConnectionLists - - Tips - Зөвлөмж - - - Please input a network name - Сүлжээний нэрийг оруулна уу - - - Other WiFi networks - Бусад WiFi сүлжээ - - - - ConnectionNameWidget - - - ConnectionNameWidget - ХолболтНameWidget - - - - TextLabel - Текст - - - - EditConnectionName - EditConnectionName - - - - Auto Connection - Авто холболт - - - - Required - Шаардлагатай - - - - Wired Connection %1 - Утастай холболт% 1 - - - - VPN L2TP %1 - VPN L2TP% 1 - - - - VPN PPTP %1 - VPN PPTP% 1 - - - - Connection name can not be empty - Холболтын нэр хоосон байж болохгүй - - - Error - Алдаа - - - - ConnectionShowPage - - - ConnectionShowPage - ХолболтShowPage - - - - TextLabel - Текст - - - - ButtonCreateConnection - ButtonCreateConconnect - - - Create - Үүсгэх - - - - DetailsPage - - - DetailsPage - Дэлгэрэнгүй - - - - Network Details - Сүлжээний дэлгэрэнгүй - - - - Please select a connection - Холболтыг сонгоно уу - - - - ComboBoxDetailsSelectConnection - ComboBoxDetailSelectConnection - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - DisconnectAndDeleteButton - - - - ButtonDisconnect - Товч - - - - Disconnect - Холбоос - - - - ButtonDelete - ButtonDeelte - - - - Delete - Устгах - - - - ButtonIgnore - ButtonIgnore - - - - Ignore - Үл тоомсорлох - - - - Are you sure you want to delete the connection %1 - Та холболтыг % 1 устгахыг хүсч байгаа гэдэгтээ итгэлтэй байна уу - - - - Warning - Анхааруулга - - - - DnsWidget - - - DnsWidget - DnsWidget - - - - Preferred DNS - DNS-ийг илүүд үздэг - - - - Alternate DNS - Өөр DNS - - - - DslManager - - - DslManager - Дсланжер - - - - DSL - DSL - - - - DslSettingPage - - - DslSettingPage - DslSettingPage - - - - Save - Хадгалах - - - - Return - Буцах - - - - EthernetWidget - - - EthernetWidget - EthernetWidget - - - - MAC Address Of Ethernet Device - Ethernet төхөөрөмжийн MAC хаяг - - - - ComboBoxDeviceMac - ComboBoxDeviceMac - - - - Ethernet Clone MAC Address - Ethernet Clone MAC хаяг - - - - EditDeviceMac - EditDeviceMac - - - - Custom MTU - Захиалгат MTU - - - - SpinBoxCustomMTU - SpinBoxCustMTU - - - - No device specified - Төхөөрөмж байхгүй - - - - Clone Mac invalid - Clone Mac хүчингүй - - - Error - Алдаа - - - - Ipv4Widget - - - Ipv4Widget - Ipv4Widget - - - - IPV4 Method - IPV4 арга - - - - ComboBoxIpv4Method - ComboBoxIpv4Method - - - - IP Address - IP хаяг - - - - EditIpv4Address - EditIpv4Address - - - - Net Mask - Цэвэр маск - - - - EditIpv4Netmask - EditIpv4Netmask - - - - Gateway - Хаалга - - - - EditIpv4Gateway - EditIpv4Gateway - - - - Preferred DNS - DNS-ийг илүүд үздэг - - - - EditIpv4PreferredDNS - EditIpv4PreferredDNS - - - - Alternate DNS - Өөр DNS - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Авто - - - - Manual - Гарын авлага - - - - - Required - Шаардлагатай - - - - Ipv4 address can not be empty - Ipv4 хаяг хоосон байж чадахгүй - - - Error - Алдаа - - - - Ipv4 Address invalid - Ipv4 Хаяг хүчингүй - - - - NetMask can not be empty - NetMask хоосон байж чадахгүй - - - - Netmask invalid - Нетмаск хүчингүй - - - - Ipv4 Gateway invalid - Ipv4 Gateway хүчингүй - - - - Ipv4 Preferred DNS invalid - Ipv4 Урьдчилан сонгосон DNS хүчингүй - - - - Ipv4 Alternate DNS invalid - Ipv4 Өөр хувилбар DNS хүчингүй - - - - Ipv6Widget - - - Ipv6Widget - Ipv6Widget - - - - IPV6 Method - IPV6 арга - - - - ComboBoxIpv6Method - ComboBoxIpv6Method - - - - IP Address - IP хаяг - - - - EditIpv6Address - EditIpv6Address - - - - Prefix - Зөв - - - - SpinBoxIpv6Prefix - SpinBoxIfv6Prefix - - - - Gateway - Хаалга - - - - EditIpv6Gateway - EditIpv6Gateway - - - - Preferred DNS - DNS-ийг илүүд үздэг - - - - EditIpv6PreferredDNS - EditIpv6PreferredDNS - - - - Alternate DNS - Өөр DNS - - - - EditIpv6AlternateDNS - EditIpv6AlternateDNS - - - - Auto - Авто - - - - Manual - Гарын авлага - - - - Ignored - Үл тоомсорлож байна - - - - Required - Шаардлагатай - - - - Ipv6 address can not be empty - Ipv6 хаяг хоосон байж чадахгүй - - - Error - Алдаа - - - - Ipv6 address invalid - Ipv6 хаяг хүчингүй - - - - Ipv6 Gateway invalid - Ipv6 Gateway хүчингүй - - - - Ipv6 Preferred DNS invalid - Ipv6 Урьдчилан сонгосон DNS хүчингүй - - - - Ipv6 Alternate DNS invalid - Ipv6 Өөр хувилбар DNS хүчингүй - - - - ManagerTray - - Network settings - Сүлжээний тохиргоо - - - - NetworkSubItem - - - Wired Network %1 - Утастай сүлжээ% 1 - - - - Wired Network - Утастай сүлжээ - - - - Wireless Network %1 - Утасгүй сүлжээ% 1 - - - - Wireless Network - Утасгүй - - - - VPN - VPN - - - - Network Details - Сүлжээний дэлгэрэнгүй - - - - NetworkTray - - - Network settings - Сүлжээний тохиргоо - - - - Network unavailable - Сүлжээ боломжгүй - - - - PluginConnectionList - - - Other WiFi networks - Бусад WiFi сүлжээ - - - - Tips - Зөвлөмж - - - - Please input a network name - Сүлжээний нэрийг оруулна уу - - - - StatusNotification - - - - - - - Connection Failed - Холбоос - - - Failed to connect to the network - Сүлжээнд холбогдох боломжгүй - - - - the network not found - сүлжээ олдсонгүй - - - - The hidden network "%1" to be connected has been detected and exists in the network list - Холбогдох "% 1" далд сүлжээ илрүүлсэн бөгөөд сүлжээний жагсаалтад орсон байна - - - - - Failed to connect to the network "%1" - "% 1" сүлжээнд холбогдож чадсангүй" - - - - Connection activated - Холболт идэвхжсэн - - - - You are now connected to the network "%1" - Та одоо "% 1" сүлжээнд холбогдсон байна" - - - - Connection deactivated - Холболт идэвхгүй - - - - You have now disconnected the network "%1" - Та одоо "% 1" сүлжээг салгасан" - - - - Connection deleted - Холбоос устгасан - - - - The connection has been deleted "%1" - Холболт "% 1" -ийг устгасан" - - - - TextInputDialog - - - Tips - Зөвлөмж - - - - Yes - Тийм - - - - Cancel - Цуцлах - - - - TrayConnectionList - - - Other WiFi networks - Бусад WiFi сүлжээ - - - - TrayItemWidget - - - TrayItemWidget - TrayItemWidget - - - - Icon - Икон - - - - Name - Нэр - - - - Status - Стат - - - - Ignore - Үл тоомсорлох - - - - Disconnect - Холбоос - - - - - Cancel - Цуцлах - - - - - Connect - Холбох - - - - Connected - Холбогдсон - - - - Unconnected - Холбогдсон - - - - Please input password - Нууц үг оруулна уу - - - - Please input a network name - Сүлжээний нэрийг оруулна уу - - - - TrayPage - - - TrayPage - Ачаа - - - - TextLabel - Текст - - - - Select wired network card - Утастай сүлжээний картыг сонгоно уу - - - - Select wireless network card - Утасгүй сүлжээний картыг сонгоно уу - - - - VpnIPsec - - - VpnIPsec - VpnIPsec - - - - Enable IPsec - IPs - - - - Group Name - Бүлгийн нэр - - - - EditGroupName - EditGroupName - - - - Group ID - Бүлгийн дугаар - - - - EditGroupId - EditGroupId - - - - Pre-Shared Key - Урьдчилан хуваалцах түлхүүр - - - - EditPreSharedKey - EditPreSharedKey - - - - Show Password - Нууц үг - - - - Internet Key Exchange Protocol - Интернетийн түлхүүр солилцооны протокол - - - - EditIpsecIKE - EditIpsecIKE - - - - Encapsulating Security Payload - Аюулгүй байдлын ачааллыг идэвхжүүлэх - - - - EditIpsecESP - EditIpsecESP - - - - VpnIpvx - - - VpnIpvx - VpnIpvx - - - - IPV4 Method - IPV4 арга - - - - ComboBoxVPNIpv4Method - ComboBoxVPNIPv4Method - - - - Only applied in corresponding resources - Зөвхөн холбогдох нөөцөд хэрэглэнэ - - - - Preferred DNS - DNS-ийг илүүд үздэг - - - - EditVPNIpv4PreferredDNS - EditVPNIpv4PreferredDNS - - - - Alternate DNS - Өөр DNS - - - - EditIpv4AlternateDNS - EditIpv4AlternateDNS - - - - Auto - Авто - - - - VpnL2tpSetting - - - VpnL2tpSetting - VpnL2tpSetting - - - - VPN name - VPN нэр - - - - VpnManager - - - - VpnManager - VpnManager - - - - VPN type - VPN - - - - Save - Хадгалах - - - - Return - Буцах - - - - VPN - VPN - - - - L2TP - L2TP - - - - Tips - Зөвлөмж - - - - Password required to connect to %1. - % 1-тэй холбогдоход шаардлагатай нууц үг. - - - - VpnPpp - - - VpnPpp - VpnPpp - - - - Use MPPE - MPPE ашиглах - - - - Security - Аюулгүй байдал - - - - ComboBoxMppeSecurity - ComboBoxMppeSecurity - - - - Stateful MPPE - Төрийн УИХ-ын - - - - All available (default) - Бүх боломжтой ( үндсэн ) - - - - 40-bit (less secure) - 40 битийн ( бага аюулгүй ) - - - - 128-bit (most secure) - 128 битийн ( хамгийн аюулгүй ) - - - - Refuse EAP Authentication - EAP-ийн баталгааг татгалзах - - - - Refuse PAP Authentication - PAP-ийн баталгааг арилгах - - - - Refuse CHAP Authentication - ЧАП-ийн баталгааг татгалзах - - - - Refuse MSCHAP Authentication - MSCHAP-ийн гэрчлэлээс татгалзах - - - - Refuse MSCHAPv2 Authentication - MSCHAPv2 Баталгаажуулах - - - - No BSD Data Compression - BSD мэдээллийн шахалт байхгүй - - - - No Deflate Data Compression - Дефлатын мэдээллийн шахалт байхгүй - - - - No TCP Header Compression - TCP-ийн дарга - - - - No Protocol Field Compression - Протоколын талбарын шахалт байхгүй - - - - No Address/Control Compression - Хаяг / Хяналтын шахалт байхгүй - - - - Send PPP Echo Packets - PPP Echo багц илгээх - - - - VpnPptpSetting - - - VpnPptpSetting - VpnPptpSetting - - - - VPN name - VPN нэр - - - - VpnWidget - - - VpnWidget - VpnWidget - - - - Gateway - Хаалга - - - - EditVPNGateway - Засах - - - - User Name - Хэрэглэгчийн нэр - - - - EditVPNUserName - EditVPNUserName - - - - Password Options - Нууц үг - - - - ComboBoxVPNPasswordOptions - ComboBoxVPNPassword - - - - Password - Нууц - - - - EditVPNPassword - Засах - - - - ButtonPasswordVisual - ButtonPasswordVisual - - - - Show Password - Нууц үг - - - - NT Domain - NT домэйн - - - - EditNTDomain - EditNTDomain - - - - - - Required - Шаардлагатай - - - - Saved - Хадгалсан - - - - Ask - Асуу - - - - Not required - Шаардлагагүй - - - - Gateway can not be empty - Хаалга хоосон байж чадахгүй - - - Error - Алдаа - - - - Gateway invalid - Гарц - - - - user name can not be empty - хэрэглэгчийн нэр хоосон байж чадахгүй - - - - password can not be empty - нууц үг хоосон байж болохгүй - - - - WiredManager - - - WiredManager - WiredManager - - - - ButtonSave - ButtonSave - - - - Save - Хадгалах - - - - ButtonReturn - Товч - - - - Return - Буцах - - - - Wired Network Adapter - Утастай сүлжээний адаптер - - - - The carrier is pulled out - Тээвэрлэгчийг татаж байна - - - - The current device is not available - Одоогийн төхөөрөмж байхгүй байна - - - - WiredSettingPage - - - WiredSettingPage - WiredSettingPage - - - - Network name - Сүлжээний нэр - - - - WiredTrayWidget - - Wired network unavailable - Утастай сүлжээ боломжгүй - - - - WirelessManager - - - WirelessManager - Утасгүй - - - - Save - Хадгалах - - - - Return - Буцах - - - - Wireless Network Adapter - Утасгүй сүлжээний адаптер - - - - The current device is not available - Одоогийн төхөөрөмж байхгүй байна - - - - Tips - Зөвлөмж - - - - Password required to connect to %1. - % 1-тэй холбогдоход шаардлагатай нууц үг. - - - the network "%1" not found - "% 1" сүлжээ олдсонгүй - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - Утасгүй аюулгүй байдал - - - - Security - Аюулгүй байдал - - - - ComboBoxWirelessSecurityOption - ComboBoxWirelessSecurityOption - - - - Password Options - Нууц үг - - - - ComboBoxWirelessPasswordOption - ComboBoxWirelessPasswordOption - - - - Password - Нууц - - - - EditWirelessPassword - ЗасахWirelessPassword - - - - ButtonWirelessPasswordVisual - ButtonWirelessPasswordVisual - - - - PushButton - ПушБуттон - - - - None - Аль нь ч биш - - - - WPA/WPA2 Personal - WPA / WPA2 Хувийн - - - - Save password for all users - Бүх хэрэглэгчдэд нууц үг хадгалах - - - - Save password for this user - Энэ хэрэглэгчийн нууц үгийг хадгалах - - - - Ask me always - Надаас үргэлж асуу - - - - Required - Шаардлагатай - - - - WirelessSettingPage - - - WirelessSettingPage - Утасгүй - - - - Wireless name - Утасгүй нэр - - - - WirelessTrayWidget - - - the network "%1" not found - "% 1" сүлжээ олдсонгүй - - - - WirelessWidget - - - WirelessWidget - Утасгүй - - - - SSID - SSID - - - - EditSsid - EditSsid - - - - MAC Address Of Device - Төхөөрөмжийн MAC хаяг - - - - ComboBoxWirelessMacAddress - ComboBoxWirelessMacAddress - - - - Custom MTU - Захиалгат MTU - - - - SpinBoxWirelessCustomMTU - SpinBoxWirelessCustMTU - - - - Required - Шаардлагатай - - - - No device specified - Төхөөрөмж байхгүй - - - diff --git a/plugins/network/translations/kiran-cpanel-network.ug_CN.ts b/plugins/network/translations/kiran-cpanel-network.ug_CN.ts deleted file mode 100644 index ed65b116..00000000 --- a/plugins/network/translations/kiran-cpanel-network.ug_CN.ts +++ /dev/null @@ -1,1560 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - CPanelNetworkWidget - - - Wired Connection %1 - سىملىق ئۇلاش% 1 - - - Wired Connection - سىملىق ئۇلاش - - - Wireless Connection %1 - سىمسىز ئۇلىنىش% 1 - - - Wireless Connection - سىمسىز ئۇلاش - - - - Wired Network %1 - سىملىق تور% 1 - - - - Wired Network - سىملىق تور - - - - Wireless Network %1 - سىمسىز تور% 1 - - - - - Wireless Network - سىمسىز تور - - - - - VPN - مەۋھۇم مەخسۇس تور - - - - - Network Details - تور تەپسىلىي ئۇچۇر - - - - Connected - ئۇلانغان - - - - Unavailable - ئىشلەتكىلى بولماسلىق - - - - Disconnected - ئۈزۈلگەن - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - ConnectionDetailsWidget - - - - Security type - بىخەتەرلىك تىپى - - - - - - - - - - - - - - - - TextLabel - تېكىست يارلىقى - - - - Frequency band - چاستوتا بەلۋېغى - - - - Channel - ئۆستەڭ - - - - Interface - ئۇلاش ئېغىزى - - - - MAC - ئالما - - - - IPv4 - IPV 4 - - - - - Gateway - تور ئۆتكىلى - - - - Preferred DNS - ئالدى بىلەن DNS - - - - Subnet mask - تارماق تور نىقابلاش كودى - - - - IPv6 - IPV 6 - - - - Prefix - ئالدى قوشۇمچە - - - - Rate - تېزلىك - - - - ConnectionLists - - Tips - ئەسكەرتىش - - - Please input a network name - تور نامىنى كىرگۈزۈڭ - - - Other WiFi networks - باشقا WiFi تورى - - - - ConnectionNameWidget - - - ConnectionNameWidget - ConnectionNameWidget - - - - TextLabel - تېكىست يارلىقى - - - - EditConnectionName - تەھرىرلەپ ئۇلاش - - - - Auto Connection - ئاپتوماتىك ئۇلاش - - - - Required - زۆرۈر - - - - Wired Connection %1 - سىملىق ئۇلاش% 1 - - - - VPN L2TP %1 - VPN L2TP %1 - - - - VPN PPTP %1 - VPN PPTP %1 - - - - Connection name can not be empty - ئۇلاش نامى قۇرۇق بولمايدۇ - - - Error - خاتالىق - - - - ConnectionShowPage - - - ConnectionShowPage - ئۇلاش كۆرسىتىش بەت - - - - TextLabel - تېكىست يارلىقى - - - - ButtonCreateConnection - كۇنۇپكا بەرپا قىلىش ئۇلاش - - - Create - ئىجاد قىلماق - - - - DetailsPage - - - DetailsPage - تەپسىلىي ئۇچۇر بەت - - - - Network Details - تور تەپسىلىي ئۇچۇر - - - - Please select a connection - بىر ئۇلاش تاللاڭ - - - - ComboBoxDetailsSelectConnection - بىرىكمە رامكا تەپسىلىي ئۇچۇر تاللاش ئۇلاش - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - DisconnectAndDeleteButton - - - - ButtonDisconnect - كۇنۇپكىنى ئۈزۈۋېتىش - - - - Disconnect - ئۈزۈلۈش - - - - ButtonDelete - كۇنۇپكىلىق ئۆچۈرۈش - - - - Delete - ئۆچۈرۈش - - - - ButtonIgnore - كۇنۇپكىنى نەزەردىن ساقىت قىلىش - - - - Ignore - سەل قارىماق - - - - Are you sure you want to delete the connection %1 - ھەقىقەتەن ئۆچۈرۈش ئۇلىنىش% 1 بارمۇ - - - - Warning - ئاگاھلاندۇرۇش - - - - DnsWidget - - - DnsWidget - DnsWidget - - - - Preferred DNS - ئالدى بىلەن DNS - - - - Alternate DNS - زاپاس DNS - - - - DslManager - - - DslManager - DslManager - - - - DSL - DSL - - - - DslSettingPage - - - DslSettingPage - DslSettingPage - - - - Save - ساقلاش - - - - Return - قايتىش - - - - EthernetWidget - - - EthernetWidget - EthernetWidget - - - - MAC Address Of Ethernet Device - ئېفىر تورى ئۈسكۈنىسى MAC ئادرېسى - - - - ComboBoxDeviceMac - ComboBoxDeviceMac - - - - Ethernet Clone MAC Address - ئېفىر تورى كلون MAC ئادرېسى - - - - EditDeviceMac - EditDeviceMac - - - - Custom MTU - ئۆزى بەلگىلىگەن MTU - - - - SpinBoxCustomMTU - SpinBoxCustomMTU - - - - No device specified - بېكىتىلمىگەن ئۈسكۈنە - - - - Clone Mac invalid - كلون ئىناۋەتسىز - - - Error - خاتالىق - - - - Ipv4Widget - - - Ipv4Widget - IPV 4 كىچىك بۆلىكى - - - - IPV4 Method - IPV 4 ئۇسۇلى - - - - ComboBoxIpv4Method - ComboBoxIPV 4 ئۇسۇلى - - - - IP Address - IP ئادرېسى - - - - EditIpv4Address - EditIPV 4 ئادرېسى - - - - Net Mask - تور ماسكا كودى - - - - EditIpv4Netmask - EditIPV 4 تور ماسكا كودى - - - - Gateway - تور ئۆتكىلى - - - - EditIpv4Gateway - EditIPV 4 تور ئۆتكىلى - - - - Preferred DNS - ئالدى بىلەن DNS - - - - EditIpv4PreferredDNS - EditIPV 4 ئالدى بىلەن DNS - - - - Alternate DNS - زاپاس DNS - - - - EditIpv4AlternateDNS - EditIPV 4 سەپلىمە نۇسخىسى ns - - - - Auto - ئاپتوماتىك - - - - Manual - قول بىلەن ھەرىكەتلەندۈرۈلىدىغان - - - - - Required - زۆرۈر - - - - Ipv4 address can not be empty - IPV 4 ئادرېسى قۇرۇق بولسا بولمايدۇ - - - Error - خاتالىق - - - - Ipv4 Address invalid - IPV 4 ئادرېسى ئىناۋەتسىز - - - - NetMask can not be empty - تور ماسكا كودى قۇرۇق بولمايدۇ - - - - Netmask invalid - تور ماسكا كودى ئىناۋەتسىز - - - - Ipv4 Gateway invalid - IPV 4 تور ئۆتكىلى ئىناۋەتسىز - - - - Ipv4 Preferred DNS invalid - IPV 4 ئالدى بىلەن DNS ئىناۋەتسىز - - - - Ipv4 Alternate DNS invalid - IPV 4 زاپاس DNS ئىناۋەتسىز - - - - Ipv6Widget - - - Ipv6Widget - IPV 6 كىچىك بۆلىكى - - - - IPV6 Method - IPV 6 ئۇسۇلى - - - - ComboBoxIpv6Method - ComboBoxIPV 6 ئۇسۇلى - - - - IP Address - IP ئادرېسى - - - - EditIpv6Address - EditIPV 6 ئادرېسى - - - - Prefix - ئالدى قوشۇمچە - - - - SpinBoxIpv6Prefix - SpinBoxIpv6Prefix - - - - Gateway - تور ئۆتكىلى - - - - EditIpv6Gateway - EditIPV 6 تور ئۆتكىلى - - - - Preferred DNS - ئالدى بىلەن DNS - - - - EditIpv6PreferredDNS - EditIPV 6 ئالدى بىلەن DNS - - - - Alternate DNS - زاپاس DNS - - - - EditIpv6AlternateDNS - EditIPV 6 سەپلىمە نۇسخىسى ns - - - - Auto - ئاپتوماتىك - - - - Manual - قول بىلەن ھەرىكەتلەندۈرۈلىدىغان - - - - Ignored - سەل قارىماق - - - - Required - زۆرۈر - - - - Ipv6 address can not be empty - IPV 6 ئادرېسى قۇرۇق بولسا بولمايدۇ - - - Error - خاتالىق - - - - Ipv6 address invalid - IPV 6 ئادرېسى ئىناۋەتسىز - - - - Ipv6 Gateway invalid - IPV 6 تور ئۆتكىلى ئىناۋەتسىز - - - - Ipv6 Preferred DNS invalid - IPV 6 ئالدى بىلەن DNS ئىناۋەتسىز - - - - Ipv6 Alternate DNS invalid - IPV 6 زاپاس DNS ئىناۋەتسىز - - - - ManagerTray - - Network settings - تور تەسىس قىلىش - - - - NetworkSubItem - - - Wired Network %1 - سىملىق تور% 1 - - - - Wired Network - سىملىق تور - - - - Wireless Network %1 - سىمسىز تور% 1 - - - - Wireless Network - سىمسىز تور - - - - VPN - مەۋھۇم مەخسۇس تور - - - - Network Details - تور تەپسىلىي ئۇچۇر - - - - NetworkTray - - - Network settings - تور تەسىس قىلىش - - - - Network unavailable - تور ئىشلەتكىلى بولمايدۇ - - - - PluginConnectionList - - - Other WiFi networks - باشقا WiFi تورى - - - - Tips - ئەسكەرتىش - - - - Please input a network name - تور نامىنى كىرگۈزۈڭ - - - - StatusNotification - - - - - - - Connection Failed - ئۇلاش مەغلۇپ بولدى - - - Failed to connect to the network - تورغا ئۇلاشقا ئامالسىز - - - - the network not found - تور تاپالمىدىم - - - - The hidden network "%1" to be connected has been detected and exists in the network list - ئۇلانغان يوشۇرۇن تور «%1» تېپىلدى، بۇ تور تور تىزىملىكىدە مەۋجۇت - - - - - Failed to connect to the network "%1" - تورغا ئۇلاشقا ئامالسىز «%1» - - - - Connection activated - ئۇلاش ئاكتىپلاشتۇرۇش - - - - You are now connected to the network "%1" - سىز ھازىر تورغا ئۇلاندىڭىز% 1 - - - - Connection deactivated - ئۇلاش توختىتىلدى - - - - You have now disconnected the network "%1" - سىز ھازىر تور «%1» ئۇلىنىش - - - - Connection deleted - ئۆچۈرۈلگەن ئۇلاش - - - - The connection has been deleted "%1" - ئۆچۈرۈلگەن ئۇلىنىش «%1» - - - - TextInputDialog - - - Tips - ئەسكەرتىش - - - - Yes - شۇنداق - - - - Cancel - ئەمەلدىن قالدۇرۇش - - - - TrayConnectionList - - - Other WiFi networks - باشقا WiFi تورى - - - - TrayItemWidget - - - TrayItemWidget - TrayItemWidget - - - - Icon - سىنبەلگە - - - - Name - نام - - - - Status - ھالەت - - - - Ignore - سەل قارىماق - - - - Disconnect - ئۈزۈلۈش - - - - - Cancel - ئەمەلدىن قالدۇرۇش - - - - - Connect - ئۇلاش - - - - Connected - ئۇلانغان - - - - Unconnected - ئۇلانمىغان - - - - Please input password - مەخپىي نومۇر كىرگۈزۈڭ - - - - Please input a network name - تور نامىنى كىرگۈزۈڭ - - - - TrayPage - - - TrayPage - پەتنۇس بەت - - - - TextLabel - تېكىست يارلىقى - - - - Select wired network card - سىملىق تور كارتىسى تاللاش - - - - Select wireless network card - سىمسىز تور كارتىسى تاللاش - - - - VpnIPsec - - - VpnIPsec - VpnIPsec - - - - Enable IPsec - قوزغىتىش IPsec - - - - Group Name - گۇرۇپپا نامى - - - - EditGroupName - سىم تور - - - - Group ID - گۇرۇپپا ID - - - - EditGroupId - EditGroupId - - - - Pre-Shared Key - ئالدىن ئورتاق بەھرىلىنىدىغان ئاچقۇچ - - - - EditPreSharedKey - تەھرىرلەش ئورتاق بەھرىمەن بولىدىغان ئاچقۇچ - - - - Show Password - مەخپىي نومۇر كۆرسىتىش - - - - Internet Key Exchange Protocol - Internet مەخپىي ئاچقۇچ ئالماشتۇرۇش كېلىشىمى - - - - EditIpsecIKE - مۇشۇنىڭغا ئوخشاش تەھرىرلەش - - - - Encapsulating Security Payload - ھىملانغان بىخەتەر يۈك - - - - EditIpsecESP - تەھرىرلەش بىخەتەرلىكى - - - - VpnIpvx - - - VpnIpvx - VpnIpvx - - - - IPV4 Method - IPV 4 ئۇسۇلى - - - - ComboBoxVPNIpv4Method - ComboBoxVPNIPV 4 ئۇسۇلى - - - - Only applied in corresponding resources - پەقەت مۇناسىپ بايلىق جەريانىدا قوللىنىش - - - - Preferred DNS - ئالدى بىلەن DNS - - - - EditVPNIpv4PreferredDNS - DITPV4referred - - - - Alternate DNS - زاپاس DNS - - - - EditIpv4AlternateDNS - EditIPV 4 سەپلىمە نۇسخىسى ns - - - - Auto - ئاپتوماتىك - - - - VpnL2tpSetting - - - VpnL2tpSetting - VPNL 2 TPS تەسىس قىلىش - - - - VPN name - VPN نامى - - - - VpnManager - - - - VpnManager - VpnManager - - - - VPN type - VPN تىپى - - - - Save - ساقلاش - - - - Return - قايتىش - - - - VPN - مەۋھۇم مەخسۇس تور - - - - L2TP - L2TP - - - - Tips - ئەسكەرتىش - - - - Password required to connect to %1. - %1 گە ئۇلاشقا مەخپىي نومۇر كېتىدۇ. - - - - VpnPpp - - - VpnPpp - VpnPpp - - - - Use MPPE - MPPE ئىشلىتىش - - - - Security - بىخەتەرلىك - - - - ComboBoxMppeSecurity - ComboBoxMppeSecurity - - - - Stateful MPPE - ھالەت MPPE - - - - All available (default) - ھەممىنى ئىشلىتىشكە بولىدۇ ( كۆڭۈلدىكى ) - - - - 40-bit (less secure) - 40 خانىلىق ( بىخەتەرلىكى بىر قەدەر تۆۋەن ) - - - - 128-bit (most secure) - 128 ئورۇن ( ئەڭ بىخەتەر ) - - - - Refuse EAP Authentication - EAP رەت سالاھىيەت تەكشۈرۈش - - - - Refuse PAP Authentication - PAP رەت سالاھىيەت تەكشۈرۈش - - - - Refuse CHAP Authentication - CHAP رەت سالاھىيەت تەكشۈرۈش - - - - Refuse MSCHAP Authentication - MSCHAP رەت سالاھىيەت تەكشۈرۈش - - - - Refuse MSCHAPv2 Authentication - MSCHAPV 2 رەت سالاھىيەت تەكشۈرۈش - - - - No BSD Data Compression - BSD سانلىق مەلۇماتنى قىسىش يوق - - - - No Deflate Data Compression - گاز قويۇپ بېرىش سانلىق مەلۇماتىنى قىسىش يوق - - - - No TCP Header Compression - TCP گېزىت بېشى قىسىش يوق - - - - No Protocol Field Compression - كېلىشىمسىز سۆز بۆلىكىنى قىسىش - - - - No Address/Control Compression - ئادرېسسىز/كونترول قىسىش - - - - Send PPP Echo Packets - PPP يوللاش قايتا كۆرسىتىش سانلىق مەلۇمات بوغچىسى - - - - VpnPptpSetting - - - VpnPptpSetting - VpnPptpSetting - - - - VPN name - VPN نامى - - - - VpnWidget - - - VpnWidget - VpnWidget - - - - Gateway - تور ئۆتكىلى - - - - EditVPNGateway - سانلىق مەلۇمات - - - - User Name - سكيپە نامى - - - - EditVPNUserName - سكيپە نامىنى تەھرىرلەش - - - - Password Options - مەخپىي نومۇر تاللاش تۈرى - - - - ComboBoxVPNPasswordOptions - ComboBoxVPNPasswordOptions - - - - Password - مەخپىي نومۇر - - - - EditVPNPassword - DitassWord - - - - ButtonPasswordVisual - كۇنۇپكىلىق مەخپىي نومۇر كۆرۈش سېزىمى - - - - Show Password - مەخپىي نومۇر كۆرسىتىش - - - - NT Domain - يېڭى تەيۋەن پۇلى - - - - EditNTDomain - ئىسىم - - - - - - Required - زۆرۈر - - - - Saved - ساقلانغان - - - - Ask - سورىماق - - - - Not required - 【该条信息存在敏感词汇,根据国家相关规定予以过滤】 - - - - Gateway can not be empty - تور ئۆتكىلى قۇرۇق بولمايدۇ - - - Error - خاتالىق - - - - Gateway invalid - تور ئۆتكىلى ئىناۋەتسىز - - - - user name can not be empty - سكيپە نامى قۇرۇق بولمايدۇ - - - - password can not be empty - مەخپىي نومۇر قۇرۇق بولمايدۇ - - - - WiredManager - - - WiredManager - سىملىق باشقۇرغۇچ - - - - ButtonSave - كۇنۇپكىلىق ساقلاش - - - - Save - ساقلاش - - - - ButtonReturn - كۇنۇپكىلىق قايتىش - - - - Return - قايتىش - - - - Wired Network Adapter - سىملىق تور ماسلاشتۇرغۇچ - - - - The carrier is pulled out - تىرەك تارتىپ چىقىرىلدى - - - - The current device is not available - نۆۋەتتىكى ئۈسكۈنە ئىشلەتكىلى بولمايدۇ - - - - WiredSettingPage - - - WiredSettingPage - ۋىرېد سەيدىنپېچ - - - - Network name - تور نامى - - - - WiredTrayWidget - - Wired network unavailable - سىملىق تور ئىشلەتكىلى بولمايدۇ - - - - WirelessManager - - - WirelessManager - سىمسىز باشقۇرغۇچ - - - - Save - ساقلاش - - - - Return - قايتىش - - - - Wireless Network Adapter - سىمسىز تور ماسلاشتۇرغۇچ - - - - The current device is not available - نۆۋەتتىكى ئۈسكۈنە ئىشلەتكىلى بولمايدۇ - - - - Tips - ئەسكەرتىش - - - - Password required to connect to %1. - %1 گە ئۇلاشقا مەخپىي نومۇر كېتىدۇ. - - - the network "%1" not found - تورنى تاپالمىدىم %1 - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - سىمسىز SecurityWidget - - - - Security - بىخەتەرلىك - - - - ComboBoxWirelessSecurityOption - ComboBoxWirelessSecurityOption - - - - Password Options - مەخپىي نومۇر تاللاش تۈرى - - - - ComboBoxWirelessPasswordOption - ComboBoxWirelessPasswordOption - - - - Password - مەخپىي نومۇر - - - - EditWirelessPassword - سىمسىز مەخپىي نومۇر تەھرىرلەش - - - - ButtonWirelessPasswordVisual - ButtonWirelessPasswordVisual - - - - PushButton - كۇنۇپكا - - - - None - يوق - - - - WPA/WPA2 Personal - WPA/WPA 2 ئادەم - - - - Save password for all users - بارلىق ئابونتلارنىڭ مەخپىي نومۇرىنى ساقلاش - - - - Save password for this user - بۇ ئابونتنىڭ مەخپىي نومۇرىنى ساقلاش - - - - Ask me always - دائىم مەندىن - - - - Required - زۆرۈر - - - - WirelessSettingPage - - - WirelessSettingPage - سىمسىز تەسىس قىلىش بەت - - - - Wireless name - سىمسىز نام - - - - WirelessTrayWidget - - - the network "%1" not found - تورنى تاپالمىدىم %1 - - - - WirelessWidget - - - WirelessWidget - WirelessWidget - - - - SSID - SSID - - - - EditSsid - SID تەھرىرلەش - - - - MAC Address Of Device - ئۈسكۈنە MAC ئادرېسى - - - - ComboBoxWirelessMacAddress - ComboBoxWirelessMacAddress - - - - Custom MTU - ئۆزى بەلگىلىگەن MTU - - - - SpinBoxWirelessCustomMTU - SpinBoxWirelessCustomMTU - - - - Required - زۆرۈر - - - - No device specified - بېكىتىلمىگەن ئۈسكۈنە - - - diff --git a/plugins/network/translations/kiran-cpanel-network.zh_CN.ts b/plugins/network/translations/kiran-cpanel-network.zh_CN.ts deleted file mode 100644 index a50574b7..00000000 --- a/plugins/network/translations/kiran-cpanel-network.zh_CN.ts +++ /dev/null @@ -1,1488 +0,0 @@ - - - - - CPanelNetworkWidget - - - CPanelNetworkWidget - - - - - Wireless Network - 无线网络 - - - - - VPN - VPN - - - - - Network Details - 网络详情 - - - - Connected - 已连接 - - - - Unavailable - 已禁用 - - - - Disconnected - 已断开 - - - - ConnectionDetailsWidget - - - ConnectionDetailsWidget - - - - - Security type - 安全类型 - - - - - - - - - - - - - - - - TextLabel - - - - - Frequency band - 频段 - - - - Channel - 网络通道 - - - - Interface - 接口 - - - - MAC - - - - - IPv4 - - - - - - Gateway - 网关 - - - - Preferred DNS - 首选DNS - - - - Subnet mask - 子网掩码 - - - - IPv6 - - - - - Prefix - 前缀 - - - - Rate - 速率 - - - - ConnectionNameWidget - - - ConnectionNameWidget - - - - - TextLabel - - - - - EditConnectionName - - - - - Auto Connection - 自动连接 - - - - Required - 必填 - - - - Wired Connection %1 - 有线网络%1 - - - - VPN L2TP %1 - - - - - VPN PPTP %1 - - - - - Connection name can not be empty - 网络名称不能为空 - - - - ConnectionShowPage - - - ConnectionShowPage - - - - - TextLabel - - - - - ButtonCreateConnection - - - - - DetailsPage - - - DetailsPage - - - - - Network Details - 网络详情 - - - - Please select a connection - 请选择连接 - - - - ComboBoxDetailsSelectConnection - - - - - DisconnectAndDeleteButton - - - DisconnectAndDeleteButton - - - - - ButtonDisconnect - - - - - Disconnect - 断开 - - - - ButtonDelete - - - - - Delete - 删除 - - - - ButtonIgnore - - - - - Ignore - 忽略 - - - - Are you sure you want to delete the connection %1 - 您是否确定要删除连接 "%1" - - - - Warning - 警告 - - - - DnsWidget - - - DnsWidget - - - - - Preferred DNS - 首选DNS - - - - Alternate DNS - 备选DNS - - - - DslManager - - - DslManager - - - - - DSL - - - - - DslSettingPage - - - DslSettingPage - - - - - Save - 保存 - - - - Return - 返回 - - - - EthernetWidget - - - EthernetWidget - - - - - MAC Address Of Ethernet Device - 设备MAC地址 - - - - ComboBoxDeviceMac - - - - - Ethernet Clone MAC Address - 克隆MAC地址 - - - - EditDeviceMac - - - - - Custom MTU - 自定义MTU - - - - SpinBoxCustomMTU - - - - - No device specified - 不指定设备 - - - - Clone Mac invalid - 无效的克隆MAC地址 - - - - Ipv4Widget - - - Ipv4Widget - - - - - IPV4 Method - IPV4方法 - - - - ComboBoxIpv4Method - - - - - IP Address - IP地址 - - - - EditIpv4Address - - - - - Net Mask - 子网掩码 - - - - EditIpv4Netmask - - - - - Gateway - 网关 - - - - EditIpv4Gateway - - - - - Preferred DNS - 首选DNS - - - - EditIpv4PreferredDNS - - - - - Alternate DNS - 备选DNS - - - - EditIpv4AlternateDNS - - - - - Auto - 自动 - - - - Manual - 手动 - - - - - Required - 必填 - - - - Ipv4 address can not be empty - Ipv4地址不能为空 - - - - Ipv4 Address invalid - 无效的Ipv4地址 - - - - NetMask can not be empty - 子网掩码不能为空 - - - - Netmask invalid - 无效的子网掩码 - - - - Ipv4 Gateway invalid - 无效的Ipv4网关 - - - - Ipv4 Preferred DNS invalid - 无效的Ipv4首选DNS - - - - Ipv4 Alternate DNS invalid - 无效的Ipv4备选DNS - - - - Ipv6Widget - - - Ipv6Widget - - - - - IPV6 Method - IPV6方法 - - - - ComboBoxIpv6Method - - - - - IP Address - IP地址 - - - - EditIpv6Address - - - - - Prefix - 前缀 - - - - SpinBoxIpv6Prefix - - - - - Gateway - 网关 - - - - EditIpv6Gateway - - - - - Preferred DNS - 首选DNS - - - - EditIpv6PreferredDNS - - - - - Alternate DNS - 备选DNS - - - - EditIpv6AlternateDNS - - - - - Auto - 自动 - - - - Manual - 手动 - - - - Ignored - 忽略 - - - - Required - 必填 - - - - Ipv6 address can not be empty - Ipv6地址不能为空 - - - - Ipv6 address invalid - 无效的Ipv6地址 - - - - Ipv6 Gateway invalid - 无效的Ipv6网关 - - - - Ipv6 Preferred DNS invalid - 无效的Ipv6首选DNS - - - - Ipv6 Alternate DNS invalid - 无效的Ipv6备选DNS - - - - NetworkSubItem - - - Wired Network %1 - 有线网络 %1 - - - - Wired Network - 有线网络 - - - - Wireless Network %1 - 无线网络 %1 - - - - Wireless Network - 无线网络 - - - - VPN - VPN - - - - Network Details - 网络详情 - - - - NetworkTray - - - Network settings - 网络设置 - - - - - Network unavailable - 网络不可用 - - - - Wired network card: %1 available - 有线网卡: %1 可用 - - - - Wireless network card: %1 available - 无线网卡: %1 可用 - - - - Wired network card: %1 unavailable - 有线网卡: %1 不可用 - - - - Wireless network card: %1 unavailable - 无线网卡: %1 不可用 - - - - PluginConnectionList - - - Other WiFi networks - 其它WIFI网络 - - - - Tips - 提示 - - - - Please input a network name - 请输入网络名称 - - - - StatusNotification - - - - - - - Connection Failed - 连接失败 - - - - the network not found - 未找到网络 - - - - The hidden network "%1" to be connected has been detected and exists in the network list - 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 - - - - - Failed to connect to the network "%1" - 无法连接到网络 "%1" - - - - Connection activated - 网络已连接 - - - - You are now connected to the network "%1" - 您已连接到网络 "%1" - - - - Connection deactivated - 连接断开 - - - - You have now disconnected the network "%1" - 您已断开网络连接 "%1" - - - - Connection deleted - 连接已删除 - - - - The connection has been deleted "%1" - 已删除连接 "%1" - - - - TextInputDialog - - - Tips - 提示 - - - - Yes - 确认 - - - - Cancel - 取消 - - - - TrayConnectionList - - - Other WiFi networks - 其它WIFI网络 - - - - TrayItemWidget - - - TrayItemWidget - - - - - Icon - - - - - Name - 名称 - - - - Status - 状态 - - - - Ignore - 忽略 - - - - Disconnect - 断开 - - - - - Cancel - 取消 - - - - - Connect - 连接 - - - - Connected - 已连接 - - - - Unconnected - 未连接 - - - - Please input password - 请输入密码 - - - - Please input a network name - 请输入网络名称 - - - - TrayPage - - - TrayPage - - - - - TextLabel - - - - - Select wired network card - 请选择有线网卡 - - - - Select wireless network card - 请选择无线网卡 - - - - VpnIPsec - - - VpnIPsec - - - - - Enable IPsec - 启用IPsec - - - - Group Name - 组名 - - - - EditGroupName - - - - - Group ID - 组ID - - - - EditGroupId - - - - - Pre-Shared Key - 预共享密钥 - - - - EditPreSharedKey - - - - - Show Password - 显示密码 - - - - Internet Key Exchange Protocol - 密钥交换协议 - - - - EditIpsecIKE - - - - - Encapsulating Security Payload - 安全封装协议 - - - - EditIpsecESP - - - - - VpnIpvx - - - VpnIpvx - - - - - IPV4 Method - IPV4方法 - - - - ComboBoxVPNIpv4Method - - - - - Only applied in corresponding resources - 仅用于相对应的网络上的资源 - - - - Preferred DNS - 首选DNS - - - - EditVPNIpv4PreferredDNS - - - - - Alternate DNS - 备选DNS - - - - EditIpv4AlternateDNS - - - - - Auto - 自动 - - - - VpnL2tpSetting - - - VpnL2tpSetting - - - - - VPN name - VPN名称 - - - - VpnManager - - - - VpnManager - - - - - VPN type - VPN类型 - - - - Save - 保存 - - - - Return - 返回 - - - - VPN - VPN - - - - L2TP - - - - - Tips - 提示 - - - - Password required to connect to %1. - 连接网络 "%1" 需要密码 - - - - VpnPpp - - - VpnPpp - - - - - Use MPPE - 使用MPPE - - - - Security - 安全 - - - - ComboBoxMppeSecurity - - - - - Stateful MPPE - 使用带状态的MPPE - - - - All available (default) - 都可用(默认) - - - - 40-bit (less secure) - 40位(较安全) - - - - 128-bit (most secure) - 128位(最安全) - - - - Refuse EAP Authentication - 拒绝EAP认证 - - - - Refuse PAP Authentication - 拒绝PAP认证 - - - - Refuse CHAP Authentication - 拒绝CHAP认证 - - - - Refuse MSCHAP Authentication - 拒绝MSCHAP认证 - - - - Refuse MSCHAPv2 Authentication - 拒绝MSCHAPv2认证 - - - - No BSD Data Compression - 无BSD数据压缩 - - - - No Deflate Data Compression - 无Deflate数据压缩 - - - - No TCP Header Compression - 无TCP头压缩 - - - - No Protocol Field Compression - 无协议字段压缩 - - - - No Address/Control Compression - 无地址/控制压缩 - - - - Send PPP Echo Packets - 发送PPP回响包 - - - - VpnPptpSetting - - - VpnPptpSetting - - - - - VPN name - VPN名称 - - - - VpnWidget - - - VpnWidget - - - - - Gateway - 网关 - - - - EditVPNGateway - - - - - User Name - 用户名 - - - - EditVPNUserName - - - - - Password Options - 密码选项 - - - - ComboBoxVPNPasswordOptions - - - - - Password - 密码 - - - - EditVPNPassword - - - - - ButtonPasswordVisual - - - - - Show Password - 显示密码 - - - - NT Domain - NT域 - - - - EditNTDomain - - - - - - - Required - 必填 - - - - Saved - 已保存的 - - - - Ask - 总是询问 - - - - Not required - 不要求 - - - - Gateway can not be empty - 网关不能为空 - - - - Gateway invalid - 无效的网关 - - - - user name can not be empty - 用户名不能为空 - - - - password can not be empty - 密码不能为空 - - - - WiredManager - - - WiredManager - - - - - ButtonSave - - - - - Save - 保存 - - - - ButtonReturn - - - - - Return - 返回 - - - - Wired Network Adapter - 有线网络配置 - - - - The carrier is pulled out - 网线被拔出 - - - - The current device is not available - 当前设备不可用 - - - - WiredSettingPage - - - WiredSettingPage - - - - - Network name - 网络名称 - - - - WirelessManager - - - WirelessManager - - - - - Save - 保存 - - - - Return - 返回 - - - - Wireless Network Adapter - 无线网卡 - - - - The current device is not available - 当前设备不可用 - - - - Tips - 提示 - - - - Password required to connect to %1. - 连接网络 "%1" 需要密码 - - - - WirelessSecurityWidget - - - WirelessSecurityWidget - - - - - Security - 安全 - - - - ComboBoxWirelessSecurityOption - - - - - Password Options - 密码选项 - - - - ComboBoxWirelessPasswordOption - - - - - Password - 密码 - - - - EditWirelessPassword - - - - - ButtonWirelessPasswordVisual - - - - - PushButton - - - - - None - - - - - WPA/WPA2 Personal - WPA/WPA2个人版 - - - - Save password for all users - 仅为该用户存储密码 - - - - Save password for this user - 存储所有用户密码 - - - - Ask me always - 总是询问 - - - - Required - 必填 - - - - WirelessSettingPage - - - WirelessSettingPage - - - - - Wireless name - 无线网络名称 - - - - WirelessTrayWidget - - - the network "%1" not found - 未找到网络 "%1" - - - - WirelessWidget - - - WirelessWidget - - - - - SSID - - - - - EditSsid - - - - - MAC Address Of Device - 设备MAC地址 - - - - ComboBoxWirelessMacAddress - - - - - Custom MTU - 自定义MTU - - - - SpinBoxWirelessCustomMTU - - - - - Required - 必填 - - - - No device specified - 不指定设备 - - - diff --git a/resources/control-panel-resources.qrc b/resources/control-panel-resources.qrc index 12f1c2ae..2fc9eeae 100644 --- a/resources/control-panel-resources.qrc +++ b/resources/control-panel-resources.qrc @@ -14,6 +14,7 @@ images/indicator-selected.png images/current-avatar-indicator.svg images/error-indicator.svg + images/more-options.svg diff --git a/resources/images/more-options.svg b/resources/images/more-options.svg new file mode 100644 index 00000000..503cb70b --- /dev/null +++ b/resources/images/more-options.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts index c3f18c07..5d355f60 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -2,2531 +2,2622 @@ - AudioSystemTray - - Volume Setting - 声音设置 - + CPanelNetworkWidget - Mixed Setting - 混合设置 + CPanelNetworkWidget + - - - CPanelAudioWidget - CPanelAudioWidget - + VPN + VPN - Output - 输出 + Network Details + 网络详情 - Input - 输入 + Wired Network + 有线网络 - - - InputPage - InputPage - + Wireless Network + 无线网络 - - Input cards - 输入声卡 + Connected + 已连接 - Input devices - 输入设备 + Unavailable + 已禁用 - ComboBoxInputDevices - + Disconnected + 已断开 - Input volume - 输入音量 + Wired Network %1 + 有线网络 %1 - SliderVolumeSetting - + Wireless Network %1 + 无线网络 %1 + + + ConnectionDetailsWidget - Feedback volume - 反馈音量 + ConnectionDetailsWidget + - No input device detected - 未检测到输入设备 + Security type + 安全类型 - - - OutputPage - OutputPage - + TextLabel + - - Output cards - 输出声卡 + Frequency band + 频段 - Output devices - 输出设备 + Channel + 网络通道 - ComboBoxOutputDevices - + Interface + 接口 - Output volume - 输出音量 + MAC + - SlilderVolumeSetting - + IPv4 + - Left/right balance - 左/右平衡 + Gateway + 网关 - SliderVolumeBalance - + DNS + - Left - + Subnet mask + 子网掩码 - Right - + IPv6 + - No output device detected - 未检测到输出设备 + Prefix + 前缀 - - - VolumeIntputSubItem - VolumeInput - 输入 + Rate + 速率 - - - VolumeOutputSubItem - VolumeOutput - 输出 + Preferred DNS + 首选DNS - VolumeSettingPage + ConnectionItemWidget - VolumeSettingPage - + + disconnect + 断开 - Volume - 音量 + + ignore + 忽略 - - - AccountItemWidget - Create new user - 创建新用户 + + remove + 移除 - disable - 禁用 + + The current device:%1 is not available + 当前设备:%1 不可用 - enable - 启用 + + The carrier is pulled out + 网线被拔出 - - - AccountSubItem - account - 帐户 + + Are you sure you want to delete the connection %1 + 您是否确定要删除连接 "%1" - New User - 创建新用户 + + Warning + 警告 - - - AccountWidget - disable - 禁用 + + + Tips + 提示 - enable - 启用 + + Password required to connect to %1. + 连接网络 "%1" 需要密码 - Create new user - 创建新用户 + + Please input a network name + 请输入网络名称 - ActGuideWidget + ConnectionNameWidget - Please choose activation mode: - 请选择激活方式: + ConnectionNameWidget + - Next - 下一步 + TextLabel + - Current machine code: - 当前系统机器码: + EditConnectionName + - Please input activation code: - 请输入激活码: + Auto Connection + 自动连接 - Back - 上一步 + Required + 必填 - Please insert the UsbKey device first! - 请先插入UsbKey设备! + Wired Connection %1 + 有线网络%1 - Activate online - 在线激活 + VPN L2TP %1 + - Activate with the input activation code - 输入激活码激活 + VPN PPTP %1 + - Activate with insert UsbKey - 插入UsbKey设备激活 + Connection name can not be empty + 网络名称不能为空 + + + ConnectionShowPage - Activate - 激活 + ConnectionShowPage + - Please enter the activate server address: - 请输入激活服务器地址: + TextLabel + - Activating...... - 正在激活...... + ButtonCreateConnection + + + + DetailsPage - System activate successful! - 系统激活成功! + DetailsPage + - server activation and remaining points: - 服务器版激活点数和剩余点数: + Network Details + 网络详情 - development activation and remaining points: - 开发版激活点数和剩余点数: + Please select a connection + 请选择连接 - industrial activation and remaining points: - 工控版激活点数和剩余点数: + ComboBoxDetailsSelectConnection + + + + DeviceAvailableConnectionWidget - desktop activation and remaining points: - 桌面版激活点数和剩余点数: + + Network card: %1 + 网卡:%1 - activation points: - 激活点数: + + Other WiFi networks + 其它WIFI网络 + + + DeviceList - remaining points: - 剩余点数: + + Wired Network Adapter + 有线网络配置 - Close - 关闭 + + Wireless Network Adapter + 无线网络配置 + + + DisconnectAndDeleteButton - System activate failed! - 系统激活失败! + DisconnectAndDeleteButton + - unknow - 未知 + ButtonDisconnect + - Activation Mode - 选择激活方式 + Disconnect + 断开 - Start Activation - 开始激活 + ButtonDelete + - Activation Complete - 激活完成 + Delete + 删除 - Activation Guide - 激活向导 + ButtonIgnore + - Server IP address or Domain name - 服务器IP地址或域名 + Ignore + 忽略 - - - AdvanceSettings - Advance Settings - 高级设置 + Are you sure you want to delete the connection %1 + 您是否确定要删除连接 "%1" - Automatically generated by system - 由系统自动生成 + Warning + 警告 + + + DnsWidget - Please enter the correct path - 请输入正确的路径 + DnsWidget + - Please enter specify user Id - 请输入用户ID + Preferred DNS + 首选DNS - Please enter an integer above 1000 - 请输入一个大于或等于1000的整数 + Alternate DNS + 备选DNS + + + DslManager - Please enter the correct home directory - 请输入正确的用户目录 + DslManager + - Form - + DSL + + + + DslSettingPage - Login shell - 登录Shell + DslSettingPage + - EditLoginShell - + Save + 保存 - Specify user id (needs to be greater than 1000) - 指定用户ID(需大于或等于1000) + Return + 返回 + + + EthernetWidget - EditSpecifyUserID + EthernetWidget - Specify user home - 指定用户目录 + MAC Address Of Ethernet Device + 设备MAC地址 - EditSpecifyUserHome + ComboBoxDeviceMac - ButtonConfirm + Ethernet Clone MAC Address + 克隆MAC地址 + + + EditDeviceMac - confirm - 确认 + Custom MTU + 自定义MTU - ButtonCancel + SpinBoxCustomMTU - cancel - 取消 + No device specified + 不指定设备 - Specify user id - 指定用户ID + Clone Mac invalid + 无效的克隆MAC地址 - AppearancePlugin + Ipv4Widget - Theme - 主题 + Ipv4Widget + - Wallpaper - 壁纸 + IPV4 Method + IPV4方法 - Font - 字体 + ComboBoxIpv4Method + - - - ApplicationPlugin - DefaultApp - 默认程序 + IP Address + IP地址 - AutoStart - 开机启动 + EditIpv4Address + - - - AuthManagerPage - Fingerprint Authentication - 指纹认证 + Net Mask + 子网掩码 - Face Authentication - 人脸认证 + EditIpv4Netmask + - Password Authentication - 密码认证 + Gateway + 网关 - save - 保存 + EditIpv4Gateway + - return - 返回 + + DNS + - add fingerprint - 录入指纹数据 + EditIpv4PreferredDNS + - add face - 录入人脸数据 + Auto + 自动 - error - 错误 + Manual + 手动 - please ensure that at least one authentication option exists - 请确保至少一个认证选项打开 + Required + 必填 - fingerprint_ - 指纹_ + + Please separate multiple DNS entries by semicolon + 请用分号分隔多个DNS - face_ - 人脸_ + + Ipv4 DNS invalid + 无效的Ipv4 DNS - - - AuthPlugin - Fingerprint - 指纹 + Ipv4 address can not be empty + Ipv4地址不能为空 - FingerVein - 指静脉 + Ipv4 Address invalid + 无效的Ipv4地址 - Driver Manager - 驱动管理 + NetMask can not be empty + 子网掩码不能为空 - Prefs - 配置 + Netmask invalid + 无效的子网掩码 - UKey - UKey + Ipv4 Gateway invalid + 无效的Ipv4网关 - Iris - 虹膜 + Preferred DNS + 首选DNS - Face - 人脸 + Alternate DNS + 备选DNS - - - AutoStartPage - Boot Setup - 开机启动设置 + EditIpv4AlternateDNS + - Desktop files(*.desktop) - 桌面类型(*.desktop) + Ipv4 Preferred DNS invalid + 无效的Ipv4首选DNS - select autostart desktop - 选择自启动应用 + Ipv4 Alternate DNS invalid + 无效的Ipv4备选DNS - Select - 选择 + DNS 1 + - Cancel - 取消 + DNS 2 + + + + Ipv6Widget - Error - 错误 + Ipv6Widget + - Desktop has existed - 该程序已存在 + IPV6 Method + IPV6方法 - Desktop cant permit to join - 该程序不允许添加 + ComboBoxIpv6Method + - Desktop dont support - 不支持该程序 + IP Address + IP地址 - - - AutostartPage - Boot Setup - 开机启动设置 + EditIpv6Address + - Desktop files(*.desktop) - 桌面类型(*.desktop) + Prefix + 前缀 - select autostart desktop - 选择自启动应用 + SpinBoxIpv6Prefix + - Select - 选择 + Gateway + 网关 - Cancel - 取消 + EditIpv6Gateway + - Error - 错误 + + DNS + - Desktop has existed - 该程序已存在 + EditIpv6PreferredDNS + - Desktop cant permit to join - 该程序不允许添加 + Auto + 自动 - Desktop dont support - 不支持该程序 + Manual + 手动 - - - BatterySettingsPage - BatterySettingsPage - 电池设置 + Ignored + 忽略 - After idle for more than the following time, the computer will execute - 空闲超过以下时间后,计算机将执行 + Required + 必填 - ComboIdleTime - + + Please separate multiple DNS entries by semicolon + 请用分号分隔多个DNS - ComboIdleAction - + + Ipv6 DNS invalid + 无效的Ipv6 DNS - When the battery is lit up, it will be executed - 电池电量将用尽时 + Ipv6 address can not be empty + Ipv6地址不能为空 - ComboLowBatteryAction - + Ipv6 address invalid + 无效的Ipv6地址 - The monitor will turn off when it is idle - 显示器空闲以下时间关闭 + Ipv6 Gateway invalid + 无效的Ipv6网关 - ComboMonitorTurnOffIdleTime - + Preferred DNS + 首选DNS - Reduce screen brightness when idle - 空闲时减少亮度 + Alternate DNS + 备选DNS - Reduce screen brightness when no power - 低点亮时减少亮度 + EditIpv6AlternateDNS + - The energy saving mode is enabled when the power is low - 低电量时自动开启节能模式 + Ipv6 Preferred DNS invalid + 无效的Ipv6首选DNS - Suspend - 待机 + Ipv6 Alternate DNS invalid + 无效的Ipv6备选DNS + + + NetworkSubItem - Shutdown - 关机 + Wired Network %1 + 有线网络 %1 - Hibernate - 休眠 + Wired Network + 有线网络 - Do nothing - 不执行操作 + Wireless Network %1 + 无线网络 %1 - - - BatterySubItem - Battery Settings - 电池设置 + Wireless Network + 无线网络 - - - BiometricItem - add - 添加 + VPN + VPN + + + Network Details + 网络详情 - CPanelNetworkWidget + NetworkTray - CPanelNetworkWidget - + Network settings + 网络设置 - VPN - VPN + Network unavailable + 网络不可用 - Network Details - 网络详情 + + + The network is connected, but you cannot access the Internet + 网络已连接,但不能访问互联网 - Connected - 已连接 + + + Network not connected + 网络已断开 - Unavailable - 已禁用 + Wired network card: %1 available + 有线网卡: %1 可用 - Disconnected - 已断开 + Wireless network card: %1 available + 无线网卡: %1 可用 - Wireless Network - 无线网络 + Wired network card: %1 unavailable + 有线网卡: %1 不可用 - Wired Network %1 - 有线网络 %1 + Wireless network card: %1 unavailable + 无线网卡: %1 不可用 - Wired Network - 有线网络 + + Network connected + 网络已连接 + + + PluginConnectionList - Wireless Network %1 - 无线网络 %1 + Other WiFi networks + 其它WIFI网络 + + + Tips + 提示 + + + Please input a network name + 请输入网络名称 - ChangeHostNameWidget + StatusNotification - Form - + Connection Failed + 连接失败 - Host Name: - 主机名: + the network not found + 未找到网络 - EditHostName - + The hidden network "%1" to be connected has been detected and exists in the network list + 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 - ButtonSaveHostName - + Failed to connect to the network "%1" + 无法连接到网络 "%1" - Save - 保存 + Connection activated + 网络已连接 - ButtonCancelChangeHostName - + You are now connected to the network "%1" + 您已连接到网络 "%1" - Cancel - 取消 + Connection deactivated + 连接断开 - Host Name - 主机名 + You have now disconnected the network "%1" + 您已断开网络连接 "%1" - Warning - 警告 + Connection deleted + 连接已删除 - Change host name failed! Please check the Dbus service! - 修改主机名失败!请 检查Dbus服务! + The connection has been deleted "%1" + 已删除连接 "%1" - CheckpasswdDialog + TextInputDialog - Check password - 校验当前用户密码 + Tips + 提示 - Check the current password before you enroll the feature - 录入特征之前需要校验当前密码 + Yes + 确认 + + + Cancel + 取消 - ChooseItem + TrayConnectionList - Form - + Other WiFi networks + 其它WIFI网络 - ConnectionDetailsWidget + TrayItemWidget - ConnectionDetailsWidget + TrayItemWidget - Security type - 安全类型 - - - TextLabel + Icon - Frequency band - 频段 + Name + 名称 - Channel - 网络通道 + Status + 状态 - Interface - 接口 + Ignore + 忽略 - MAC - + Disconnect + 断开 - IPv4 - + Cancel + 取消 - Gateway - 网关 + Connect + 连接 - Preferred DNS - 首选DNS + Connected + 已连接 - Subnet mask - 子网掩码 + Unconnected + 未连接 - IPv6 - + Please input password + 请输入密码 - Prefix - 前缀 + Please input a network name + 请输入网络名称 + + + TrayPage - Rate - 速率 + TrayPage + - DNS + TextLabel + + Select wired network card + 请选择有线网卡 + + + Select wireless network card + 请选择无线网卡 + - ConnectionNameWidget + VpnIPsec - ConnectionNameWidget + VpnIPsec - TextLabel - + Enable IPsec + 启用IPsec - EditConnectionName + Group Name + 组名 + + + EditGroupName - Auto Connection - 自动连接 + Group ID + 组ID - Required - 必填 + EditGroupId + - Wired Connection %1 - 有线网络%1 + Pre-Shared Key + 预共享密钥 - VPN L2TP %1 + EditPreSharedKey - VPN PPTP %1 - + Show Password + 显示密码 - Connection name can not be empty - 网络名称不能为空 + Internet Key Exchange Protocol + 密钥交换协议 - - - ConnectionShowPage - ConnectionShowPage + EditIpsecIKE - TextLabel - + Encapsulating Security Payload + 安全封装协议 - ButtonCreateConnection + EditIpsecESP - CreateGroupPage + VpnIpvx - CreateGroupPage + VpnIpvx - Create Group - + IPV4 Method + IPV4方法 - Add Group Members + ComboBoxVPNIpv4Method - Confirm - + Only applied in corresponding resources + 仅用于相对应的网络上的资源 - Please enter your group name - + Preferred DNS + 首选DNS - group name cannot be a pure number + EditVPNIpv4PreferredDNS - group name already exists + Alternate DNS + 备选DNS + + + EditIpv4AlternateDNS - Error - 错误 + Auto + 自动 - CreateUserPage + VpnL2tpSetting - Account type - 帐户类型 + VpnL2tpSetting + - standard - 普通用户 + VPN name + VPN名称 + + + VpnManager - administrator - 管理员 + VpnManager + - Please enter user name first - 请输入用户名 + VPN type + VPN类型 - Please enter your user name - 请输入用户名 + Save + 保存 - user name cannot be a pure number - 用户名不能全为数字 + Return + 返回 - user name already exists - 用户名已存在 + VPN + VPN - Please enter your password - 请输出密码 + L2TP + - Please enter the password again - 请再次输入密码 + Tips + 提示 - The password you enter must be the same as the former one - 两次密码不相同,请核对后,再次输入 + Password required to connect to %1. + 连接网络 "%1" 需要密码 + + + VpnPpp - Error - 错误 + VpnPpp + - Password encryption failed - 密码加密失败 + Use MPPE + 使用MPPE - Form - + Security + 安全 - UserAvatarWidget + ComboBoxMppeSecurity - User name - 用户名 + Stateful MPPE + 使用带状态的MPPE - EditUserName - + All available (default) + 都可用(默认) - User type - 用户类型 + 40-bit (less secure) + 40位(较安全) - ComboUserType - + 128-bit (most secure) + 128位(最安全) - Password - 用户密码 + Refuse EAP Authentication + 拒绝EAP认证 - EditPasswd - + Refuse PAP Authentication + 拒绝PAP认证 - Confirm password - 确认密码 + Refuse CHAP Authentication + 拒绝CHAP认证 - EditPasswdConfirm - + Refuse MSCHAP Authentication + 拒绝MSCHAP认证 - ButtonAdvanceSetting - + Refuse MSCHAPv2 Authentication + 拒绝MSCHAPv2认证 - Advance setting - 高级设置 + No BSD Data Compression + 无BSD数据压缩 - ButtonConfirm - + No Deflate Data Compression + 无Deflate数据压缩 - Confirm - 创建 + No TCP Header Compression + 无TCP头压缩 - ButtonCancel - + No Protocol Field Compression + 无协议字段压缩 - Cancel - 取消 + No Address/Control Compression + 无地址/控制压缩 - Please enter account name first - 请先输入帐户名 + Send PPP Echo Packets + 发送PPP回响包 + + + VpnPptpSetting - Please enter your account name - 请输入帐户名 + VpnPptpSetting + - Account cannot be a pure number - 帐户名不能全为数字 + VPN name + VPN名称 + + + VpnWidget - Account already exists - 帐户名已存在 - + VpnWidget + + - Please enter your userName name - 请输入用户名 + Gateway + 网关 - - - CursorThemePage - Cursor Themes Settings - 光标主题设置 + EditVPNGateway + - - - CursorThemes - Cursor Themes Settings - 光标主题设置 + User Name + 用户名 - Faild - 失败 + EditVPNUserName + - Set cursor themes failed! - 设置光标主题失败! + Password Options + 密码选项 - - - DateTimeSettings - DateTimeSettings - 日期时间设置 + ComboBoxVPNPasswordOptions + - Select Time - 选择时间 + Password + 密码 - Select Date - 选择日期 + EditVPNPassword + - ButtonSave + ButtonPasswordVisual - save - 保存 + Show Password + 显示密码 - ButtonReset - + NT Domain + NT域 - reset - 重置 + EditNTDomain + - - - DaySpinBox - %1 - %1日 + Required + 必填 - - - DefaultApp - DefaultApp - 默认程序 + Saved + 已保存的 - Web Browser - web浏览器 + Ask + 总是询问 - Email - 电子邮件 + Not required + 不要求 - Text - 文档查看器 + Gateway can not be empty + 网关不能为空 - Music - 音乐播放器 + Gateway invalid + 无效的网关 - Video - 视频播放器 + user name can not be empty + 用户名不能为空 - Image - 图片查看器 + password can not be empty + 密码不能为空 - DefaultappPlugin + WiredManager - Email - 电子邮件 + WiredManager + - Text - 文档查看器 + ButtonSave + - Music - 音乐播放器 + Save + 保存 - Video - 视频播放器 + ButtonReturn + - Image - 图片查看器 + Return + 返回 - DefaultApp - 默认程序 + Wired Network Adapter + 有线网络配置 - - - DetailsPage - DetailsPage - + The carrier is pulled out + 网线被拔出 - Network Details - 网络详情 + The current device is not available + 当前设备不可用 + + + WiredSettingPage - Please select a connection - 请选择连接 + WiredSettingPage + - ComboBoxDetailsSelectConnection - + Network name + 网络名称 - DevicePanel + WirelessManager - Form + WirelessManager - Rotate left 90 degrees - 左旋转90度 + Save + 保存 - ButtonLeft - + Return + 返回 - Rotate right 90 degrees - 右旋转90度 + Wireless Network Adapter + 无线网卡 - ButtonRight - + The current device is not available + 当前设备不可用 - Turn left and right - 左右翻转 + Tips + 提示 - ButtonHorizontal + Password required to connect to %1. + 连接网络 "%1" 需要密码 + + + + WirelessSecurityWidget + + WirelessSecurityWidget - upside down - 上下翻转 + Security + 安全 - ButtonVertical + ComboBoxWirelessSecurityOption - Identification display - 标识显示器 + Password Options + 密码选项 - ButtonIdentifying + ComboBoxWirelessPasswordOption - - - DisconnectAndDeleteButton - DisconnectAndDeleteButton - + Password + 密码 - ButtonDisconnect + EditWirelessPassword - Disconnect - 断开 + ButtonWirelessPasswordVisual + - ButtonDelete + PushButton - Delete - 删除 + None + - ButtonIgnore - + WPA/WPA2 Personal + WPA/WPA2个人版 - Ignore - 忽略 + Save password for all users + 仅为该用户存储密码 - Are you sure you want to delete the connection %1 - 您是否确定要删除连接 "%1" + Save password for this user + 存储所有用户密码 - Warning - 警告 + Ask me always + 总是询问 + + + Required + 必填 - DisplayFormatSettings + WirelessSettingPage - DisplayFormatSettings - 日期时间格式设置 + WirelessSettingPage + - Long date display format - 长日期显示格式 + Wireless name + 无线网络名称 + + + + WirelessTrayWidget + + the network "%1" not found + 未找到网络 "%1" + + + WirelessWidget - ComboLongDateDisplayFormat + WirelessWidget - Short date display format - 短日期显示格式 + SSID + - ComboShortDateDisplayFormat + EditSsid - Time format - 时间格式 + MAC Address Of Device + 设备MAC地址 - ComboTimeFormat + ComboBoxWirelessMacAddress - Show time witch seconds - 时间显示秒 - - - 24-hours - 二十四小时制 - - - 12-hours - 十二小时制 - - - - DisplayPage - - DisplayPage - + Custom MTU + 自定义MTU - ButtonCopyDisplay + SpinBoxWirelessCustomMTU - Copy display - 复制显示 - - - ButtonExtendedDisplay - + Required + 必填 - Extended display - 扩展显示 + No device specified + 不指定设备 + + + AudioSystemTray - Resolution ratio - 分辨率 + Volume Setting + 声音设置 - ComboResolutionRatio - + Mixed Setting + 混合设置 + + + CPanelAudioWidget - Refresh rate - 刷新率 + CPanelAudioWidget + - ComboRefreshRate - + Output + 输出 - Zoom rate - 缩放率 + Input + 输入 + + + InputPage - ComboZoomRate - + InputPage + - Automatic - 自动 + + Input cards + 输入声卡 - 100% (recommended) - 100% (推荐) + Input devices + 输入设备 - 200% - + ComboBoxInputDevices + - Open - 开启 + Input volume + 输入音量 - Set as main display - 设为主显示器 + SliderVolumeSetting + - SwitchExtraPrimary - + Feedback volume + 反馈音量 - ComboExtraResolutionRatio - + No input device detected + 未检测到输入设备 + + + OutputPage - ComboExtraRefreshRate - + OutputPage + - ComboExtraZoomRate - + + Output cards + 输出声卡 - ButtonExtraApply - + Output devices + 输出设备 - Apply - 应用 + ComboBoxOutputDevices + - ButtonExtraCancel - + Output volume + 输出音量 - Close - 关闭 + SlilderVolumeSetting + - (recommended) - (推荐) + Left/right balance + 左/右平衡 - Is the display normal? - 显示是否正常? + SliderVolumeBalance + - Save current configuration(K) - 保存当前配置(K) + Left + - Restore previous configuration(R) - 恢复之前的配置(R) + Right + - The display will resume the previous configuration in %1 seconds - 显示将会在 %1 秒后恢复之前的配置 + No output device detected + 未检测到输出设备 - DisplaySubitem + VolumeIntputSubItem - Display - 显示 + VolumeInput + 输入 - DnsWidget + VolumeOutputSubItem - DnsWidget - + VolumeOutput + 输出 + + + VolumeSettingPage - Preferred DNS - 首选DNS + VolumeSettingPage + - Alternate DNS - 备选DNS + Volume + 音量 - DriverPage + AccountItemWidget - device type - 设备类型 + Create new user + 创建新用户 - driver list - 驱动列表 + disable + 禁用 - Fingerprint - 指纹 + enable + 启用 + + + AccountSubItem - FingerVein - 指静脉 + account + 帐户 - Fingervein - 指静脉 + New User + 创建新用户 + + + AccountWidget - iris - 虹膜 + disable + 禁用 - ukey - UKey + enable + 启用 - face - 人脸 + Create new user + 创建新用户 - DslManager + ActGuideWidget - DslManager - + Please choose activation mode: + 请选择激活方式: - DSL - + Next + 下一步 - - - DslSettingPage - DslSettingPage - + Current machine code: + 当前系统机器码: - Save - 保存 + Please input activation code: + 请输入激活码: - Return - 返回 + Back + 上一步 - - - EthernetWidget - EthernetWidget - + Please insert the UsbKey device first! + 请先插入UsbKey设备! - MAC Address Of Ethernet Device - 设备MAC地址 + Activate online + 在线激活 - ComboBoxDeviceMac - + Activate with the input activation code + 输入激活码激活 - Ethernet Clone MAC Address - 克隆MAC地址 + Activate with insert UsbKey + 插入UsbKey设备激活 - EditDeviceMac - + Activate + 激活 - Custom MTU - 自定义MTU + Please enter the activate server address: + 请输入激活服务器地址: - SpinBoxCustomMTU - + Activating...... + 正在激活...... - No device specified - 不指定设备 + System activate successful! + 系统激活成功! - Clone Mac invalid - 无效的克隆MAC地址 + server activation and remaining points: + 服务器版激活点数和剩余点数: - - - FaceEnrollDialog - 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 - 开始采集失败 + remaining points: + 剩余点数: - - - FaceInputDialog - save - 保存 + Close + 关闭 - cancel - 取消 + System activate failed! + 系统激活失败! - initializing face collection environment... - 正在初始化人脸采集环境,请稍后 + unknow + 未知 - failed to initialize face collection environment! - 初始化人脸采集环境失败! + Activation Mode + 选择激活方式 - Failed to start collection - 开始采集失败 + Start Activation + 开始激活 - - - FacePage - Default face device - 默认人脸设备 + Activation Complete + 激活完成 - face feature list - 人脸特征列表 + Activation Guide + 激活向导 - face - 人脸 + Server IP address or Domain name + 服务器IP地址或域名 + + + AdvanceSettings - Cancel - 取消 + Advance Settings + 高级设置 - Start enroll failed,%1 - 开始录入失败,%1 + Automatically generated by system + 由系统自动生成 - Error - 错误 + Please enter the correct path + 请输入正确的路径 - The biometric features were successfully recorded. The feature name is:%1 - 特征已成功录入,特征名为:%1 + Please enter specify user Id + 请输入用户ID - Tips - 提示 + Please enter an integer above 1000 + 请输入一个大于或等于1000的整数 - Failed to record biometrics(%1), Please try again - 录入特征失败(%1),请重试 + Please enter the correct home directory + 请输入正确的用户目录 - - - FingerPage - Cancel - 取消 + Form + - fingerprint - 指纹 + Login shell + 登录Shell - fingervein - 指静脉 + EditLoginShell + - default %1 device - 默认%1设备 + Specify user id (needs to be greater than 1000) + 指定用户ID(需大于或等于1000) - %1 list - %1列表 + EditSpecifyUserID + - Start enroll failed,%1 - 开始录入失败,%1 + Specify user home + 指定用户目录 - Error - 错误 + EditSpecifyUserHome + - The biometric features were successfully recorded. The feature name is:%1 - 特征已成功录入,特征名为:%1 + ButtonConfirm + - Tips - 提示 + confirm + 确认 - Failed to record biometrics(%1), Please try again - 录入特征失败(%1),请重试 + ButtonCancel + - %1list - %1列表 + cancel + 取消 - Default %1 device - 默认%1设备 + Specify user id + 指定用户ID - FingerprintEnrollDialog - - save - 保存 - + AppearancePlugin - cancel - 取消 + Theme + 主题 - Finger Enroll - 指纹录入 + Wallpaper + 壁纸 - This fingerprint is bound to the user(%1) - 该指纹已绑定用户(%1) + Font + 字体 + + + ApplicationPlugin - Info - 提示 + DefaultApp + 默认程序 - Error - 错误 + AutoStart + 开机启动 - FingerprintInputDialog + AuthManagerPage - save - 保存 + Fingerprint Authentication + 指纹认证 - cancel - 取消 + Face Authentication + 人脸认证 - Finger Enroll - 指纹录入 + Password Authentication + 密码认证 - Error - 错误 + save + 保存 - - - FingerprintInputWorker - initializing fingerprint collection environment... - 正在初始化指纹采集环境,请稍等 + return + 返回 - - - Fonts - Form - + add fingerprint + 录入指纹数据 - Application Font Settings - 应用程序字体设置 + add face + 录入人脸数据 - ComboAppFontName - + error + 错误 - ComboAppFontSize - + please ensure that at least one authentication option exists + 请确保至少一个认证选项打开 - Titlebar Font Settings - 窗口标题字体设置 + fingerprint_ + 指纹_ - ComboTitleFontName - + face_ + 人脸_ + + + AuthPlugin - ComboTitleFontSize - + Fingerprint + 指纹 - Monospace Font Settings - 等宽字体设置 + FingerVein + 指静脉 - ComboMonospaceFontName - + Driver Manager + 驱动管理 - ComboMonospaceFontSize - + Prefs + 配置 - Word size - 字号 + UKey + UKey - System font - 系统字体 + Iris + 虹膜 - Monospaced font - 等宽字体 + Face + 人脸 - GeneralBioPage + AutoStartPage - default device - 默认设备 + Boot Setup + 开机启动设置 - feature list - 特征列表 + Desktop files(*.desktop) + 桌面类型(*.desktop) - 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中的信息将不会被删除 + select autostart desktop + 选择自启动应用 - Are you sure you want to delete the feature called %1 - 您确定要删除特征名为%1的特征吗 + Select + 选择 - tips - 提示 + Cancel + 取消 Error - 错误 + 错误 - Failed to enroll feature because the password verification failed! - 由于密码校验失败,录入特征失败! + Desktop has existed + 该程序已存在 - Rename Feature - 重命名特征值 + Desktop cant permit to join + 该程序不允许添加 - Please enter the renamed feature name - 请输入特征名 + Desktop dont support + 不支持该程序 - GeneralPage + AutostartPage - Form - + Boot Setup + 开机启动设置 - Capslock Tip - 大写锁定提示 + Desktop files(*.desktop) + 桌面类型(*.desktop) - Numlock Tip - 数字键盘锁定提示 + select autostart desktop + 选择自启动应用 - Repeat Key - 重复键 + Select + 选择 - (Repeat a key while holding it down) - (按住某一键时重复该键) + Cancel + 取消 - SwitchRepeatKey - + Error + 错误 - Delay - 延时 + Desktop has existed + 该程序已存在 - SliderRepeatDelay - + Desktop cant permit to join + 该程序不允许添加 - Short - + Desktop dont support + 不支持该程序 + + + BatterySettingsPage - Long - + BatterySettingsPage + 电池设置 - Interval - 速度 + After idle for more than the following time, the computer will execute + 空闲超过以下时间后,计算机将执行 - SliderRepeatInterval - + ComboIdleTime + - Slow - + ComboIdleAction + - Fast - + When the battery is lit up, it will be executed + 电池电量将用尽时 - Enter repeat characters to test - 输入重复字符测试 + ComboLowBatteryAction + - EditTestRepeatKey - + The monitor will turn off when it is idle + 显示器空闲以下时间关闭 - Enter characters to test the settings - 输入重复字符测试 + ComboMonitorTurnOffIdleTime + - - - GeneralSettingsPage - GeneralSettingsPage - 通用设置页面 + Reduce screen brightness when idle + 空闲时减少亮度 - When the power button is pressed - 按下电源按钮时 + Reduce screen brightness when no power + 低点亮时减少亮度 - ComboPowerButtonAction - + The energy saving mode is enabled when the power is low + 低电量时自动开启节能模式 - When the suspend button is pressed - 按下挂起按钮时 + Suspend + 待机 - ComboSuspendAction - + Shutdown + 关机 - When closing the lid - 合上盖子操作 + Hibernate + 休眠 - ComboCloseLidAction - + Do nothing + 不执行操作 + + + BatterySubItem - Computer Mode - 计算机模式 + Battery Settings + 电池设置 + + + BiometricItem - Display brightness setting - 显示亮度设置 + add + 添加 + + + ChangeHostNameWidget - 0% - + Form + - SliderDisplayBrightness - + Host Name: + 主机名: - Color temperature - 色温 + EditHostName + - Automatic color temperature - 自动色温 + ButtonSaveHostName + - cold - + Save + 保存 - standard - 标准 + ButtonCancelChangeHostName + - warm - + Cancel + 取消 - Regard computer as idle after - 于此时间后视计算机为空闲 + Host Name + 主机名 - SliderComputerIdleTime - + Warning + 警告 - Lock screen when idle - 计算机空闲时锁定屏幕 + Change host name failed! Please check the Dbus service! + 修改主机名失败!请 检查Dbus服务! + + + CheckpasswdDialog - password is required to wake up in standby mode - 待机时唤醒需要输入密码 + Check password + 校验当前用户密码 - shutdown - 关机 + Check the current password before you enroll the feature + 录入特征之前需要校验当前密码 + + + ChooseItem - hibernate - 休眠 + Form + + + + CreateGroupPage - suspend - 待机 + CreateGroupPage + - display off - 关闭显示器 + Create Group + - do nothing - 不执行操作 + Add Group Members + - ERROR - 错误 + Confirm + - %1hour - %1小时 + Please enter your group name + - %1minute - %1分钟 - - - - GeneralSettingsSubItem + group name cannot be a pure number + + - General Settings - 通用设置 + group name already exists + - - - GeneralSubItem - Keyboard General Option - 键盘通用选项 + Error + 错误 - GroupInfoPage + CreateUserPage - Form - + Account type + 帐户类型 - TextLabel - + standard + 普通用户 - Group - + administrator + 管理员 - Member List - + Please enter user name first + 请输入用户名 - Add User - + Please enter your user name + 请输入用户名 - Delete - + user name cannot be a pure number + 用户名不能全为数字 - Add Member - + user name already exists + 用户名已存在 - Save - 保存 + Please enter your password + 请输出密码 - Cancel - 取消 + Please enter the password again + 请再次输入密码 - Please input keys for search... - + The password you enter must be the same as the former one + 两次密码不相同,请核对后,再次输入 Error - 错误 + 错误 - - - GroupSubItem - Group - + Password encryption failed + 密码加密失败 - Creat group - + Form + - Change group name + UserAvatarWidget - Add group member + User name + 用户名 + + + EditUserName - - - HardWorker - Create User failed - 创建用户失败 + User type + 用户类型 - update password failed - 更新密码失败 + ComboUserType + - icon file - 头像 + Password + 用户密码 - userName type - 用户名 + EditPasswd + - locked - 启用状态 + Confirm password + 确认密码 - Failed to update user properties,%1 - 更新用户属性失败,%1 + EditPasswdConfirm + - Failed to delete user,%1 - 删除用户失败,%1 + ButtonAdvanceSetting + - password - 密码 + Advance setting + 高级设置 - home directory - 用户目录 + ButtonConfirm + - shell - shell + Confirm + 创建 - icon - 头像 + ButtonCancel + - Failed to set user attributes - 设置用户属性失败 + Cancel + 取消 - account type - 帐户类型 + Please enter account name first + 请先输入帐户名 - Failed to update user properties(%1) - 更新用户属性失败(%1) + Please enter your account name + 请输入帐户名 - Failed to delete user - 删除用户失败 + Account cannot be a pure number + 帐户名不能全为数字 - Failed to connect to the account management service - + Account already exists + 帐户名已存在 - Create Group failed - + Please enter your userName name + 请输入用户名 + + + CursorThemePage - Failed to delete group,%1 - + Cursor Themes Settings + 光标主题设置 + + + CursorThemes - add user to group failed - + Cursor Themes Settings + 光标主题设置 - change group name failed - + Faild + 失败 - change group name failed, the new group name is occupied - + Set cursor themes failed! + 设置光标主题失败! - HardwareInformation + DateTimeSettings - Form - + DateTimeSettings + 日期时间设置 - CPU: - CPU: + Select Time + 选择时间 - LabelCpuInfo - + Select Date + 选择日期 - TextLabel + ButtonSave - Memory: - 内存: + save + 保存 - LabelMemoryInfo + ButtonReset - Hard disk: - 硬盘: + reset + 重置 + + + DaySpinBox - Graphics card: - 显卡: + %1 + %1日 + + + DefaultApp - Network card: - 网卡: + DefaultApp + 默认程序 - Copyright © - 版权所有 © + Web Browser + web浏览器 - KylinSec. All rights reserved. - KylinSec.保留所有权利. + Email + 电子邮件 - Unknow - 未知 + Text + 文档查看器 - %1 GB (%2 GB available) - %1 GB (%2 GB 可用) + Music + 音乐播放器 - - - HardwareInformationWidget - CPU: - CPU: + Video + 视频播放器 - Memory: - 内存: + Image + 图片查看器 + + + DefaultappPlugin - Hard disk: - 硬盘: + Email + 电子邮件 - Graphics card: - 显卡: + Text + 文档查看器 - Network card: - 网卡: + Music + 音乐播放器 - Unknow - 未知 - - - - HardwareSubItem - - Hardware Information - 硬件信息 + Video + 视频播放器 - - - IconThemePage - Form - + Image + 图片查看器 - Icon Themes Setting - 图标主题设置 + DefaultApp + 默认程序 - IconThemes + DevicePanel - Icon Themes Setting - 图标主题设置 + Form + - Faild - 失败 + Rotate left 90 degrees + 左旋转90度 - Set icon themes failed! - 设置图标主题失败! + ButtonLeft + - - - IdentificationRenameDialog - Rename Feature - 重命名特征值 + Rotate right 90 degrees + 右旋转90度 - Please enter the renamed feature name - 请输入特征名 + ButtonRight + - Confirm - 确认 + Turn left and right + 左右翻转 - Cancel - 取消 + ButtonHorizontal + - - - ImageSelector - Add Image Failed - 添加壁纸失败 + upside down + 上下翻转 - The image already exists! - 该壁纸已存在! + ButtonVertical + - Delete image - 删除壁纸 + Identification display + 标识显示器 - Are you sure you want to delete this picture? - 您确定要删除此壁纸? + ButtonIdentifying + - InputDialog + DisplayFormatSettings - Confirm - 确认 + DisplayFormatSettings + 日期时间格式设置 - Cancel - 取消 + Long date display format + 长日期显示格式 - - - Ipv4Widget - Ipv4Widget + ComboLongDateDisplayFormat - IPV4 Method - IPV4方法 + Short date display format + 短日期显示格式 - ComboBoxIpv4Method + ComboShortDateDisplayFormat - IP Address - IP地址 + Time format + 时间格式 - EditIpv4Address + ComboTimeFormat - Net Mask - 子网掩码 + Show time witch seconds + 时间显示秒 - EditIpv4Netmask - + 24-hours + 二十四小时制 - Gateway - 网关 + 12-hours + 十二小时制 + + + DisplayPage - EditIpv4Gateway + DisplayPage - Preferred DNS - 首选DNS - - - EditIpv4PreferredDNS + ButtonCopyDisplay - Alternate DNS - 备选DNS + Copy display + 复制显示 - EditIpv4AlternateDNS + ButtonExtendedDisplay - Auto - 自动 + Extended display + 扩展显示 - Manual - 手动 + Resolution ratio + 分辨率 - Required - 必填 + ComboResolutionRatio + - Ipv4 address can not be empty - Ipv4地址不能为空 + Refresh rate + 刷新率 - Ipv4 Address invalid - 无效的Ipv4地址 + ComboRefreshRate + - NetMask can not be empty - 子网掩码不能为空 + Zoom rate + 缩放率 - Netmask invalid - 无效的子网掩码 + ComboZoomRate + - Ipv4 Gateway invalid - 无效的Ipv4网关 + Automatic + 自动 - Ipv4 Preferred DNS invalid - 无效的Ipv4首选DNS + 100% (recommended) + 100% (推荐) - Ipv4 Alternate DNS invalid - 无效的Ipv4备选DNS + 200% + - DNS 1 - + Open + 开启 - DNS 2 - + Set as main display + 设为主显示器 - - - Ipv6Widget - Ipv6Widget + SwitchExtraPrimary - IPV6 Method - IPV6方法 + ComboExtraResolutionRatio + - ComboBoxIpv6Method + ComboExtraRefreshRate - IP Address - IP地址 + ComboExtraZoomRate + - EditIpv6Address + ButtonExtraApply - Prefix - 前缀 + Apply + 应用 - SpinBoxIpv6Prefix + ButtonExtraCancel - Gateway - 网关 + Close + 关闭 - EditIpv6Gateway - + (recommended) + (推荐) - Preferred DNS - 首选DNS + Is the display normal? + 显示是否正常? - EditIpv6PreferredDNS - + Save current configuration(K) + 保存当前配置(K) - Alternate DNS - 备选DNS + Restore previous configuration(R) + 恢复之前的配置(R) - EditIpv6AlternateDNS - + The display will resume the previous configuration in %1 seconds + 显示将会在 %1 秒后恢复之前的配置 + + + DisplaySubitem - Auto - 自动 + Display + 显示 + + + DriverPage - Manual - 手动 + device type + 设备类型 - Ignored - 忽略 + driver list + 驱动列表 - Required - 必填 + Fingerprint + 指纹 - Ipv6 address can not be empty - Ipv6地址不能为空 + FingerVein + 指静脉 - Ipv6 address invalid - 无效的Ipv6地址 + Fingervein + 指静脉 - Ipv6 Gateway invalid - 无效的Ipv6网关 + iris + 虹膜 - Ipv6 Preferred DNS invalid - 无效的Ipv6首选DNS + ukey + UKey - Ipv6 Alternate DNS invalid - 无效的Ipv6备选DNS + face + 人脸 - IrisPage + FaceEnrollDialog - Default Iris device - 默认虹膜设备 + save + 保存 - Iris feature list - 虹膜特征列表 + cancel + 取消 - iris - 虹膜 + initializing face collection environment... + 正在初始化人脸采集环境,请稍后 + + + failed to initialize face collection environment! + 初始化人脸采集环境失败! + + + Failed to start collection + 开始采集失败 + + + + FaceInputDialog + + save + 保存 + + + cancel + 取消 + + + initializing face collection environment... + 正在初始化人脸采集环境,请稍后 + + + failed to initialize face collection environment! + 初始化人脸采集环境失败! + + + Failed to start collection + 开始采集失败 + + + + FacePage + + Default face device + 默认人脸设备 + + + face feature list + 人脸特征列表 + + + face + 人脸 Cancel @@ -2554,2854 +2645,2898 @@ - KcpInterface - - Warning - 警告 - + FingerPage - load qss file failed - 加载qss文件失败 + Cancel + 取消 - - - KeybindingSubItem - Keybinding - 快捷键 + fingerprint + 指纹 - - - KeycodeTranslator - None - 暂无 + fingervein + 指静脉 - disabled - 禁用 + default %1 device + 默认%1设备 - - - KiranAccountManager - disable - 禁用 + %1 list + %1列表 - enable - 启用 + Start enroll failed,%1 + 开始录入失败,%1 - Create new user - 创建新用户 + Error + 错误 - User Manager - 帐户管理工具 + The biometric features were successfully recorded. The feature name is:%1 + 特征已成功录入,特征名为:%1 - Create new account - 创建新用户 + Tips + 提示 - - - KiranAvatarEditor - Avatar Editor - 头像编辑器 + Failed to record biometrics(%1), Please try again + 录入特征失败(%1),请重试 - Confirm - 确认 + %1list + %1列表 - Cancel - 取消 + Default %1 device + 默认%1设备 - KiranCPanelMouse + FingerprintEnrollDialog - Mouse and TouchPad - 鼠标和触摸板 + save + 保存 - - - KiranCPanelMouseWidget - Select Mouse Hand - 选择鼠标手持模式 + cancel + 取消 - Mouse Motion Acceleration - 鼠标移动加速 + Finger Enroll + 指纹录入 - Natural Scroll - 是否为自然滚动 + This fingerprint is bound to the user(%1) + 该指纹已绑定用户(%1) - Middle Emulation Enabled - 同时按下左右键模拟中键 + Info + 提示 - Touchpad Enabled - 禁用触摸板 + Error + 错误 + + + FingerprintInputDialog - Select TouchPad Hand - 选择触摸板使用模式 + save + 保存 - TouchPad Motion Acceleration - 触摸板移动加速 + cancel + 取消 - Select Click Method - 设置点击触摸板方式 + Finger Enroll + 指纹录入 - Select Scroll Method - 滚动窗口方式 + Error + 错误 + + + FingerprintInputWorker - Enabled while Typing - 打字时触摸板禁用 + initializing fingerprint collection environment... + 正在初始化指纹采集环境,请稍等 + + + Fonts - Tap to Click - 轻击(不按下)触摸板功能是否生效 + Form + - Reset - 重置 + Application Font Settings + 应用程序字体设置 - Exit - 关闭 + ComboAppFontName + - Cancel - 取消 + ComboAppFontSize + - Save - 保存 + Titlebar Font Settings + 窗口标题字体设置 - Mouse Settings - 鼠标设置 + ComboTitleFontName + - TouchPad Settings - 触摸板设置 + ComboTitleFontSize + - Standard - 标准 + Monospace Font Settings + 等宽字体设置 - Right Hand Mode - 右手模式 + ComboMonospaceFontName + - Left Hand Mode - 左手模式 + ComboMonospaceFontSize + - Press and Tap - 按键和轻触 + Word size + 字号 - Tap - 轻触 + System font + 系统字体 - Two Finger Scroll - 两指滑动 + Monospaced font + 等宽字体 + + + GeneralBioPage - Edge Scroll - 边缘滑动 + default device + 默认设备 - Slow - 低速 - + feature list + 特征列表 + - Fast - 快速 + 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中的信息将不会被删除 - - - KiranCollapse - ListExpansionSpace - + Are you sure you want to delete the feature called %1 + 您确定要删除特征名为%1的特征吗 - - - KiranCpanelAppearance - Wallpaper Setting - 壁纸设置 + tips + 提示 - Theme Setting - 主题设置 + Error + 错误 - Font Setting - 字体设置 + Failed to enroll feature because the password verification failed! + 由于密码校验失败,录入特征失败! - - - KiranDatePickerWidget - Form - + Rename Feature + 重命名特征值 - - - KiranGroupManager - Create new group - + Please enter the renamed feature name + 请输入特征名 - KiranModuleWidget + GeneralPage - Warning - 警告 + Form + - The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? - %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? + Capslock Tip + 大写锁定提示 - Form - + Numlock Tip + 数字键盘锁定提示 - - - KiranSystemWidget - kiran-system-imformation - 系统信息 + Repeat Key + 重复键 - 保存 - 保存 + (Repeat a key while holding it down) + (按住某一键时重复该键) - - - KiranTimeDateWidget - KiranTimeDateWidget + SwitchRepeatKey - Automatic synchronizetion - 自动同步 - - - Change Time Zone - 更改时区 + Delay + 延时 - Set Time Manually - 手动设置时间 + SliderRepeatDelay + - Time date format setting - 日期时间格式设置 + Short + - %1(%2) - %1时间(%2) + Long + - - - KiranTimePickerWidget - Form - + Interval + 速度 - - - KiranTimeZone - Form + SliderRepeatInterval - Search in all time zones... - 在所有时区中搜索... + Slow + - - - KiranTimeZoneItem - Form - + Fast + - No search results, please search again... - 无搜索结果,请重新搜索... + Enter repeat characters to test + 输入重复字符测试 - - - KiranTimeZoneList - Form + EditTestRepeatKey - - - KiranTips - Form - + Enter characters to test the settings + 输入重复字符测试 - KylinsecLogo + GeneralSettingsPage - Copyright © - 版权所有 © + GeneralSettingsPage + 通用设置页面 - KylinSec. All rights reserved. - KylinSec.保留所有权利. + When the power button is pressed + 按下电源按钮时 - - - LayoutItem - Form + ComboPowerButtonAction - - - LayoutList - LayoutList - + When the suspend button is pressed + 按下挂起按钮时 - - - LayoutPage - Form + ComboSuspendAction - Select Kayboard Layout - 选择布局 + When closing the lid + 合上盖子操作 - Edit - 编辑 + ComboCloseLidAction + - Add Layout - 添加布局 + Computer Mode + 计算机模式 - ButtonAddLayout - + Display brightness setting + 显示亮度设置 - Addition - 添加 + 0% + - ButtonReturn - + SliderDisplayBrightness + - Return - 返回 + Color temperature + 色温 - Failed - 失败 + Automatic color temperature + 自动色温 - You have added this keyboard layout! - 您已经添加过该布局 + cold + - The %1 keyboard layout does not exist! - 该 %1 键盘布局不存在! + standard + 标准 - The keyboard layout is currently in use and cannot be deleted! - 该布局目前正在使用,无法删除! + warm + - Delete Layout - 删除布局 + Regard computer as idle after + 于此时间后视计算机为空闲 - You do not appear to have added %1 keyboard layout! - 您似乎没有添加 %1 键盘布局! + SliderComputerIdleTime + - Finish - 完成 + Lock screen when idle + 计算机空闲时锁定屏幕 - - - LayoutSubItem - Keyboard Layout - 键盘布局 + password is required to wake up in standby mode + 待机时唤醒需要输入密码 - - - LicenseAgreement - Form - + shutdown + 关机 - BrowserLicense - + hibernate + 休眠 - <!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> - + suspend + 待机 - ButtonExportLicense - + display off + 关闭显示器 - Export - 导出 + do nothing + 不执行操作 - ButtonCloseLicense - + ERROR + 错误 - Close - 关闭 - + %1hour + %1小时 + - Save - 保存 + %1minute + %1分钟 + + + GeneralSettingsSubItem - PDF(*.pdf) + General Settings + 通用设置 + + + + GeneralSubItem + + Keyboard General Option + 键盘通用选项 + + + + GroupInfoPage + + Form - Export License - 导出协议 + TextLabel + - Export License failed! - 导出协议失败! + Group + - User End License Agreement - 最终用户许可协议 + Member List + - None - 暂无 + Add User + - Version License - 版本协议 + Delete + - Export EULA - 导出最终用户许可协议 + Add Member + - Export EULA failed! - 导出最终用户许可协议失败! + Save + 保存 - Privacy Policy - 隐私协议 + Cancel + 取消 - - - LicenseInfoWidget - Machine Code: - 机器码: + Please input keys for search... + - Activation Code: - 激活码: + Error + 错误 + + + GroupSubItem - Activation Information - 激活信息 + Group + - Can't get machine code - 无法获取到机器码 + Creat group + - Can't get activation code - 无法获取到激活码 + Change group name + + + + Add group member + - LicenseInformation + HardWorker - Installation time: - 安装时间: + Create User failed + 创建用户失败 - Activation status: - 激活状态: + update password failed + 更新密码失败 - Expiry date: - 质保期: + icon file + 头像 - Contact Us: - 联系我们: + userName type + 用户名 - Unknow - 未知 + locked + 启用状态 - Can't get activation information - 无法获取激活信息 + Failed to update user properties,%1 + 更新用户属性失败,%1 - Activate - 激活 + Failed to delete user,%1 + 删除用户失败,%1 - The current time is illegal - 当前时间不合法 + password + 密码 - Less than the installation time - 小于安装时间 + home directory + 用户目录 - Not activated. Trail expiration: - 未激活.试用到期: + shell + shell - get service status failed - 获取服务状态信息失败 + icon + 头像 - Not yet - 暂无 + Failed to set user attributes + 设置用户属性失败 - Activated - 已激活 + account type + 帐户类型 - Forever - 永久授权 + Failed to update user properties(%1) + 更新用户属性失败(%1) - Copyright © - 版权所有 © + Failed to delete user + 删除用户失败 - KylinSec. All rights reserved. - KylinSec.保留所有权利. + Failed to connect to the account management service + - - - ListExpansionSpace - ListExpansionSpace + Create Group failed - - - Media Key - Audio Play - 音频播放 + Failed to delete group,%1 + - Search - 搜索 + add user to group failed + - WWW - 万维网 + change group name failed + - Audio Lower Volume - 减小音量 + change group name failed, the new group name is occupied + + + + HardwareInformation - Audio Raise Volume - 增大音量 + Form + - Mic Mute - 输入静音 + CPU: + CPU: - Audio Stop - 音频停止 + LabelCpuInfo + - Explorer - 浏览 + TextLabel + - Calculator - 计算器 + Memory: + 内存: - Audio Mute - 音频暂停 + LabelMemoryInfo + - Audio Pause - 音频暂停 + Hard disk: + 硬盘: - Audio Prev - 音频上一个 + Graphics card: + 显卡: - Audio Media - 音频媒体 + Network card: + 网卡: - Audio Next - 音频下一个 + Copyright © + 版权所有 © - Mail - 邮件 + KylinSec. All rights reserved. + KylinSec.保留所有权利. - Tools - 工具 + Unknow + 未知 - Eject - 弹出 + %1 GB (%2 GB available) + %1 GB (%2 GB 可用) - MonthSpinBox + HardwareInformationWidget - MMMM - MMMM + CPU: + CPU: - - - MousePage - Form - + Memory: + 内存: - Select Mouse Hand - 选择鼠标手持模式 + Hard disk: + 硬盘: - ComboSelectMouseHand - + Graphics card: + 显卡: - Mouse Motion Acceleration - 鼠标移动加速 + Network card: + 网卡: - SliderMouseMotionAcceleration + Unknow + 未知 + + + + HardwareSubItem + + Hardware Information + 硬件信息 + + + + IconThemePage + + Form - Slow - + Icon Themes Setting + 图标主题设置 + + + IconThemes - Fast - + Icon Themes Setting + 图标主题设置 - Natural Scroll - 是否为自然滚动 + Faild + 失败 - SwitchMouseNatturalScroll - + Set icon themes failed! + 设置图标主题失败! + + + IdentificationRenameDialog - Middle Emulation Enabled - 同时按下左右键模拟中键 + Rename Feature + 重命名特征值 - SwitchMiddleEmulation - + Please enter the renamed feature name + 请输入特征名 - Test mouse wheel direction - 鼠标滚轮方向测试 + Confirm + 确认 - 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行测试文字 + Cancel + 取消 + + + ImageSelector - Right Hand Mode - 右手模式 + Add Image Failed + 添加壁纸失败 - Left Hand Mode - 左手模式 + The image already exists! + 该壁纸已存在! + + + Delete image + 删除壁纸 + + + Are you sure you want to delete this picture? + 您确定要删除此壁纸? - MouseSettings + InputDialog - Select Mouse Hand - 选择鼠标手持模式 + Confirm + 确认 - Mouse Motion Acceleration - 鼠标移动加速 + Cancel + 取消 + + + IrisPage - Natural Scroll - 是否为自然滚动 + Default Iris device + 默认虹膜设备 - Middle Emulation Enabled - 同时按下左右键模拟中键 + Iris feature list + 虹膜特征列表 - Right Hand Mode - 右手模式 + iris + 虹膜 - Left Hand Mode - 左手模式 + Cancel + 取消 - Slow - + Start enroll failed,%1 + 开始录入失败,%1 - Standard - 标准 + Error + 错误 - Fast - + The biometric features were successfully recorded. The feature name is:%1 + 特征已成功录入,特征名为:%1 + + + Tips + 提示 + + + Failed to record biometrics(%1), Please try again + 录入特征失败(%1),请重试 - MouseSubItem + KcpInterface - Mouse Settings - 鼠标设置 + Warning + 警告 + + + load qss file failed + 加载qss文件失败 - NetworkSubItem + KeybindingSubItem - Wired Network %1 - 有线网络 %1 + Keybinding + 快捷键 + + + KeycodeTranslator - Wired Network - 有线网络 + None + 暂无 - Wireless Network %1 - 无线网络 %1 + disabled + 禁用 + + + + KiranAccountManager + + disable + 禁用 - Wireless Network - 无线网络 + enable + 启用 - VPN - VPN + Create new user + 创建新用户 - Network Details - 网络详情 + User Manager + 帐户管理工具 + + + Create new account + 创建新用户 - NetworkTray + KiranAvatarEditor - Network settings - 网络设置 + Avatar Editor + 头像编辑器 + + + Confirm + 确认 - Network unavailable - 网络不可用 + Cancel + 取消 + + + + KiranCPanelMouse + + Mouse and TouchPad + 鼠标和触摸板 + + + KiranCPanelMouseWidget - Wired network card: %1 available - 有线网卡: %1 可用 + Select Mouse Hand + 选择鼠标手持模式 - Wireless network card: %1 available - 无线网卡: %1 可用 + Mouse Motion Acceleration + 鼠标移动加速 - Wired network card: %1 unavailable - 有线网卡: %1 不可用 + Natural Scroll + 是否为自然滚动 - Wireless network card: %1 unavailable - 无线网卡: %1 不可用 + Middle Emulation Enabled + 同时按下左右键模拟中键 - - - PanelWindow - Control Panel - 控制面板 + Touchpad Enabled + 禁用触摸板 - - - PasswordExpirationPolicyPage - PasswordExpirationPolicyPage - + Select TouchPad Hand + 选择触摸板使用模式 - User expires - 用户过期时间 + TouchPad Motion Acceleration + 触摸板移动加速 - SpinBoxUserExpires - + Select Click Method + 设置点击触摸板方式 - yyyy-MM-dd - + Select Scroll Method + 滚动窗口方式 - Last password change - 最近一次密码修改时间 + Enabled while Typing + 打字时触摸板禁用 - LabelLastPasswdChange - + Tap to Click + 轻击(不按下)触摸板功能是否生效 - 1990-01-01 - + Reset + 重置 - Maximum vaild days of password - 密码最大有限天数 + Exit + 关闭 - SpinBoxMaximumValidDays - + Cancel + 取消 - Prompt time before password expiration - 密码过期之前提醒的天数 + Save + 保存 - SpinBoxPromptBeforeExpiration - + Mouse Settings + 鼠标设置 - how many days after password expires will become inactive - 密码过期多少天认定为失效 + TouchPad Settings + 触摸板设置 - SpinBoxPasswdInactiveTime - + Standard + 标准 - ButtonSave - + Right Hand Mode + 右手模式 - save - 保存 + Left Hand Mode + 左手模式 - ButtonReturn - + Press and Tap + 按键和轻触 - return - 返回 + Tap + 轻触 - day - + Two Finger Scroll + 两指滑动 - - - PluginConnectionList - Other WiFi networks - 其它WIFI网络 + Edge Scroll + 边缘滑动 - Tips - 提示 + Slow + 低速 - Please input a network name - 请输入网络名称 + Fast + 快速 - Popup + KiranCollapse - cancel - 取消 + ListExpansionSpace + - PowerPlugin + KiranCpanelAppearance - General Settings - 通用设置 + Wallpaper Setting + 壁纸设置 - Power Settings - 电源设置 + Theme Setting + 主题设置 - Battery Settings - 电池设置 + Font Setting + 字体设置 - PowerProfilesWrapper - - power-saver - 省电模式 - + KiranDatePickerWidget - balanced - 平衡模式 + Form + + + + KiranGroupManager - performance - 性能模式 + Create new group + - PowerSettingsPage + KiranModuleWidget - PowerSettingsPage - 电源设置页面 + Warning + 警告 - After idle for more than the following time, the computer will execute - 空闲超过以下时间后,计算机将执行 + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? - ComboIdleTime + Form + + + KiranSystemWidget - ComboIdleAction - + kiran-system-imformation + 系统信息 - The monitor will turn off when it is idle - 显示器空闲以下时间关闭 + 保存 + 保存 + + + KiranTimeDateWidget - ComboMonitorTrunOffIdleTime + KiranTimeDateWidget - Suspend - 待机 + Automatic synchronizetion + 自动同步 - Shutdown - 关机 + Change Time Zone + 更改时区 - Hibernate - 休眠 + Set Time Manually + 手动设置时间 - Do nothing - 不执行操作 + Time date format setting + 日期时间格式设置 - - - PowerSubItem - Power Settings - 电源设置 + %1(%2) + %1时间(%2) - PrefsPage + KiranTimePickerWidget - Authentication type Enabled status - 认证类型启用状态 + Form + + + + KiranTimeZone - fingerprint - 指纹 + Form + - fingervein - 指静脉 + Search in all time zones... + 在所有时区中搜索... + + + KiranTimeZoneItem - ... + Form - Return - 返回 - - - login - 登录 + No search results, please search again... + 无搜索结果,请重新搜索... + + + KiranTimeZoneList - unlock - 解锁 + Form + + + + KiranTips - empowerment - 授权 + Form + + + + KylinsecLogo - Apply the %1 authentication to the following applications - 启用%1认证在以下的认证应用中 + Copyright © + 版权所有 © - ukey - UKey + KylinSec. All rights reserved. + KylinSec.保留所有权利. + + + LayoutItem - iris - 虹膜 + Form + + + + LayoutList - face - 人脸 + LayoutList + - QObject + LayoutPage - Did not reply within the specified timeout - 连接超时 + Form + - The called service is not known - 无法连接到Dbus服务 + Select Kayboard Layout + 选择布局 - warning - 警告 + Edit + 编辑 - Open qss file failed - 加载qss文件失败 + Add Layout + 添加布局 - %1Day - %1天 + ButtonAddLayout + - %1Hour - %1小时 + Addition + 添加 - %1Minute - %1分钟 + ButtonReturn + - never - 从不 + Return + 返回 - SLow - 低速 + Failed + 失败 - Standard - 标准 + You have added this keyboard layout! + 您已经添加过该布局 - Fast - 快速 + The %1 keyboard layout does not exist! + 该 %1 键盘布局不存在! - Faild - 失败 + The keyboard layout is currently in use and cannot be deleted! + 该布局目前正在使用,无法删除! - Connect Mouse or TouchPad Dbus Failed! - 连接鼠标或触摸板Dbus服务失败! + Delete Layout + 删除布局 - Load qss file failed! - 加载qss文件失败! + You do not appear to have added %1 keyboard layout! + 您似乎没有添加 %1 键盘布局! - No search results, please search again... - 无搜索结果,请重新搜索... + Finish + 完成 + + + LayoutSubItem - Tips - 提示 + Keyboard Layout + 键盘布局 + + + LicenseAgreement - OK(K) - 确定(K) + Form + - Failed to apply display settings!%1 - 应用显示设置失败!%1 + BrowserLicense + - Fallback display setting failed! %1 - 回撤显示设置失败! %1 + <!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> + - Failed - 失败 + ButtonExportLicense + - Set font failed! - 设置字体失败! + Export + 导出 - Get icon themes failed! - 获取图标主题失败! + ButtonCloseLicense + - Get cursor themes failed! - 获取光标主题失败! + Close + 关闭 - Warning - 警告 + Save + 保存 - There is no theme to set! - 目前没有主题可以设置! + PDF(*.pdf) + - Set font failed! - + Export License + 导出协议 - - - SearchEdit - Enter keywords to search - 输入关键词进行搜索 + Export License failed! + 导出协议失败! - Info - 提示 + User End License Agreement + 最终用户许可协议 - Failed to find related items, please re-enter! - 未能搜索到相关项,请重新输入! + None + 暂无 - - - SelectAvatarPage - Confirm - 确认 + Version License + 版本协议 - Return - 返回 + Export EULA + 导出最终用户许可协议 - select picture - 选择图片 + Export EULA failed! + 导出最终用户许可协议失败! - 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) + Privacy Policy + 隐私协议 - SettingBriefWidget + LicenseInfoWidget - Form - + Machine Code: + 机器码: - TextLabel - + Activation Code: + 激活码: - - - Shortcut - Form - + Activation Information + 激活信息 - EditSearch - + Can't get machine code + 无法获取到机器码 - Custom - 自定义 + Can't get activation code + 无法获取到激活码 + + + LicenseInformation - Edit - 编辑 + Installation time: + 安装时间: - ButtonAddShortcut - + Activation status: + 激活状态: - Add - 添加 + Expiry date: + 质保期: - ButtonReset - + Contact Us: + 联系我们: - Reset - 重置 + Unknow + 未知 - Custom Shortcut Name - 自定义快捷键名称 + Can't get activation information + 无法获取激活信息 - EditCustomShortcutName - + Activate + 激活 - Custom Shortcut application - 自定义快捷键应用程序 + The current time is illegal + 当前时间不合法 - EditShortcutApp - + Less than the installation time + 小于安装时间 - Custom Shortcut Key - 自定义快捷键 + Not activated. Trail expiration: + 未激活.试用到期: - ButtonAdd - + get service status failed + 获取服务状态信息失败 - ButtonCancel - + Not yet + 暂无 - Cancel - 取消 + Activated + 已激活 + + + Forever + 永久授权 - Shortcut Name - 快捷键名称 + Copyright © + 版权所有 © - EditShortcutName - + KylinSec. All rights reserved. + KylinSec.保留所有权利. + + + ListExpansionSpace - Shortcut application - 快捷键应用程序 + ListExpansionSpace + + + + Media Key - Shortcut key - 快捷键 + Audio Play + 音频播放 - ButtonSave - + Search + 搜索 - Save - 保存 + WWW + 万维网 - ButtonReturn - + Audio Lower Volume + 减小音量 - return - 返回 + Audio Raise Volume + 增大音量 - Please enter a search keyword... - 请输入搜索关键字... + Mic Mute + 输入静音 - Required - 必填 + Audio Stop + 音频停止 - Please press the new shortcut key - 请输入新快捷键 + Explorer + 浏览 - Finished - 完成 + Calculator + 计算器 - failed to load shortcut key data! - 加载快捷键数据失败! + Audio Mute + 音频暂停 - List shortcut failed,error:%1 - 列出快捷键失败,错误:%1 + Audio Pause + 音频暂停 - Error - 错误 + Audio Prev + 音频上一个 - Get shortcut failed,error: - 获取快捷键失败,错误: + Audio Media + 音频媒体 - Open File - 打开文件 + Audio Next + 音频下一个 - System - 系统 + Mail + 邮件 - Sound - 声音 + Tools + 工具 - Failed - 失败 + Eject + 弹出 + + + MonthSpinBox - Delete shortcut failed,error: - 删除快捷键失败,错误: + MMMM + MMMM + + + MousePage - Warning - 警告 + Form + - Please complete the shortcut information! - 请完善快捷键信息! + Select Mouse Hand + 选择鼠标手持模式 - Set shortcut - 设置快捷键 + ComboSelectMouseHand + - Are you sure you want to disable this shortcut? - 是否确定要禁用此快捷键? + Mouse Motion Acceleration + 鼠标移动加速 - Modify system shortcut failed,error: - 修改系统快捷键失败,错误: + SliderMouseMotionAcceleration + - Modify custom shortcut failed,error: - 修改自定义快捷键失败,错误: + Slow + - Add custom shortcut failed,error: - 添加自定义快捷键失败,错误: + Fast + - Reset shortcut failed,error: - 重置快捷键失败,错误: + Natural Scroll + 是否为自然滚动 - 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再试一次。 + SwitchMouseNatturalScroll + - Shortcut keys %1 are already used in %2,Please try again! - 快捷键%1已用于%2,请再试一次! + Middle Emulation Enabled + 同时按下左右键模拟中键 - - - ShortcutItem - Form - + SwitchMiddleEmulation + - TextLabel - + Test mouse wheel direction + 鼠标滚轮方向测试 - - - ShowQRCode - Scan QR code to get machine code - 扫描二维码获取机器码 + 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行测试文字 - QRcode of Machine and Activation Code - 激活信息二维码 + Right Hand Mode + 右手模式 - Scan QR code to get activation code - 扫描二维码获取激活码 + Left Hand Mode + 左手模式 - StatusNotification - - Connection Failed - 连接失败 - + MouseSettings - the network not found - 未找到网络 + Select Mouse Hand + 选择鼠标手持模式 - The hidden network "%1" to be connected has been detected and exists in the network list - 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 + Mouse Motion Acceleration + 鼠标移动加速 - Failed to connect to the network "%1" - 无法连接到网络 "%1" + Natural Scroll + 是否为自然滚动 - Connection activated - 网络已连接 + Middle Emulation Enabled + 同时按下左右键模拟中键 - You are now connected to the network "%1" - 您已连接到网络 "%1" + Right Hand Mode + 右手模式 - Connection deactivated - 连接断开 + Left Hand Mode + 左手模式 - You have now disconnected the network "%1" - 您已断开网络连接 "%1" + Slow + - Connection deleted - 连接已删除 + Standard + 标准 - The connection has been deleted "%1" - 已删除连接 "%1" + Fast + - SystemInfoSubItem + MouseSubItem - System Information - 系统信息 + Mouse Settings + 鼠标设置 - SystemInformation - - Form - - + PanelWindow - Host Name: - 主机名: + Control Panel + 控制面板 + + + PasswordExpirationPolicyPage - LabelHostName - + PasswordExpirationPolicyPage + - TextLabel - + User expires + 用户过期时间 - ButtonChangeHostName + SpinBoxUserExpires - Change - 更改 + yyyy-MM-dd + - System Version: - 系统版本: + Last password change + 最近一次密码修改时间 - LabelSystemVersion + LabelLastPasswdChange - Kernel Version: - 内核版本: - - - LabelKernelVersion - + 1990-01-01 + - System Architecture: - 系统架构: + Maximum vaild days of password + 密码最大有限天数 - LabelSystemArch + SpinBoxMaximumValidDays - Activation status: - 激活状态: - - - Show - 查看 - - - EULA: - 最终用户许可协议: + Prompt time before password expiration + 密码过期之前提醒的天数 - ButtonShowEULA + SpinBoxPromptBeforeExpiration - Version License: - 版本协议: + how many days after password expires will become inactive + 密码过期多少天认定为失效 - ButtonShowVersionLicense + SpinBoxPasswdInactiveTime - Unknow - 未知 - - - UnActivated - 未激活 + ButtonSave + - Activation code has expired - 激活码已过期 + save + 保存 - Permanently activated - 永久激活 + ButtonReturn + - Activated - 已激活 + return + 返回 - Error - 错误 + day + + + + Popup - Failed to open the license activator - 启动激活许可证弹窗失败 + cancel + 取消 + + + PowerPlugin - Copyright © - 版权所有 © + General Settings + 通用设置 - KylinSec. All rights reserved. - KylinSec.保留所有权利. + Power Settings + 电源设置 - Privacy policy: - 隐私协议: + Battery Settings + 电池设置 - SystemInformationWidget - - Host Name: - 主机名: - + PowerProfilesWrapper - System Version: - 系统版本: + power-saver + 省电模式 - Kernel Version: - 内核版本: + balanced + 平衡模式 - System Architecture: - 系统架构: + performance + 性能模式 + + + PowerSettingsPage - Installation time: - 安装时间: + PowerSettingsPage + 电源设置页面 - Activation status: - 激活状态: + After idle for more than the following time, the computer will execute + 空闲超过以下时间后,计算机将执行 - Expiry date: - 质保期: + ComboIdleTime + - EULA: - 最终用户许可协议: + ComboIdleAction + - Version License: - 版本协议: + The monitor will turn off when it is idle + 显示器空闲以下时间关闭 - Contact Us: - 联系我们: + ComboMonitorTrunOffIdleTime + - Change - 更改 + Suspend + 待机 - Show - 查看 + Shutdown + 关机 - Unknow - 未知 + Hibernate + 休眠 - The current time is illegal - 当前时间不合法 + Do nothing + 不执行操作 + + + PowerSubItem - Less than the installation time - 小于安装时间 + Power Settings + 电源设置 + + + PrefsPage - Not activated. Trail expiration: - 未激活.试用到期: + Authentication type Enabled status + 认证类型启用状态 - Can't get activation information - 无法获取激活信息 + fingerprint + 指纹 - Activate - 激活 + fingervein + 指静脉 - get service status failed - 获取服务状态信息失败 + ... + - Not yet - 暂无 + Return + 返回 - Activated - 已激活 + login + 登录 - Forever - 永久授权 + unlock + 解锁 - Copyright © - 版权所有 © + empowerment + 授权 - KylinSec. All rights reserved. - KylinSec.保留所有权利. + Apply the %1 authentication to the following applications + 启用%1认证在以下的认证应用中 - - - TextInputDialog - Tips - 提示 + ukey + UKey - Yes - 确认 + iris + 虹膜 - Cancel - 取消 + face + 人脸 - ThemePage + QObject - Form - + Did not reply within the specified timeout + 连接超时 - Dark and Light Theme - 深浅色主题设置 + The called service is not known + 无法连接到Dbus服务 - Themes Settings - 主题设置 + warning + 警告 - Open Window Effects - 打开或关闭窗口特效 + Open qss file failed + 加载qss文件失败 - Unknown - 未知 + %1Day + %1天 - Light Theme - 浅色 + %1Hour + %1小时 - Auto - 自动 + %1Minute + %1分钟 - Dark Theme - 深色 + never + 从不 - Choose icon Theme - 选择图标主题 + SLow + 低速 - Choose cursor Themes - 选择光标主题 + Standard + 标准 - - - ThemeWidget - Dark Theme - 深色 + Fast + 快速 - Light Theme - 浅色 + Faild + 失败 - Auto - 自动 + Connect Mouse or TouchPad Dbus Failed! + 连接鼠标或触摸板Dbus服务失败! - - - Themes - Dark and Light Theme - 深浅色主题设置 + Load qss file failed! + 加载qss文件失败! - Themes Settings - 主题设置 + No search results, please search again... + 无搜索结果,请重新搜索... - Open Window Effects - 打开或关闭窗口特效 + Tips + 提示 - Choose icon themes - 选择图标主题 + OK(K) + 确定(K) - Unknown - 未知 + Failed to apply display settings!%1 + 应用显示设置失败!%1 - Choose cursor themes - 选择光标主题 + Fallback display setting failed! %1 + 回撤显示设置失败! %1 - - - ThreadObject Failed 失败 - List shortcut failed,error: - 列出快捷键失败,错误: + Set font failed! + 设置字体失败! - - - TimeDateSubItem - Time Date Settings - 日期时间设置 + Get icon themes failed! + 获取图标主题失败! - Chnage time Zone - 更改时区 + Get cursor themes failed! + 获取光标主题失败! - Set time Manually - 手动设置时间 + Warning + 警告 - Time date format setting - 日期时间格式设置 + There is no theme to set! + 目前没有主题可以设置! + + + Set font failed! + - TimezoneSettings + SearchEdit - TimezoneSettings - + Enter keywords to search + 输入关键词进行搜索 - Select Time Zone - 选择时区 + Info + 提示 - ButtonSave - + Failed to find related items, please re-enter! + 未能搜索到相关项,请重新输入! + + + + SelectAvatarPage + + Confirm + 确认 - save - 保存 + Return + 返回 - ButtonReturn - + select picture + 选择图片 - reset - 重置 + 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) - TopBar - - ListExpansionSpace - - + SettingBriefWidget - TITLE + Form - FLAG + TextLabel - TouchPadPage + Shortcut Form + + + + EditSearch - TouchPad Enabled - 开启触摸板 + Custom + 自定义 - SwitchTouchPadEnable + Edit + 编辑 + + + ButtonAddShortcut - Select TouchPad Hand - 选择触摸板使用模式 + Add + 添加 - ComboTouchPadHand + ButtonReset - TouchPad Motion Acceleration - 触摸板移动加速 + Reset + 重置 - SliderTouchPadMotionAcceleration + Custom Shortcut Name + 自定义快捷键名称 + + + EditCustomShortcutName - Slow - + Custom Shortcut application + 自定义快捷键应用程序 - Fast - + EditShortcutApp + - Select Click Method - 设置点击触摸板方式 + Custom Shortcut Key + 自定义快捷键 - ComboClickMethod + ButtonAdd - Select Scroll Method - 滚动窗口方式 + ButtonCancel + - ComboScrollMethod - + Cancel + 取消 - Natural Scroll - 是否为自然滚动 + Shortcut Name + 快捷键名称 - ComboNaturalScroll + EditShortcutName - Enabled while Typing - 打字时触摸板禁用 + Shortcut application + 快捷键应用程序 + + + Shortcut key + 快捷键 - SwitchTypingEnable + ButtonSave - Tap to Click - 轻击(不按下)触摸板功能是否生效 + Save + 保存 - SwtichTapToClick + ButtonReturn - Right Hand Mode - 右手模式 + return + 返回 - Left Hand Mode - 左手模式 + Please enter a search keyword... + 请输入搜索关键字... - Press and Tap - 按键和轻触 + Required + 必填 - Tap - 轻触 + Please press the new shortcut key + 请输入新快捷键 - Two Finger Scroll - 两指滑动 + Finished + 完成 - Edge Scroll - 边缘滑动 + failed to load shortcut key data! + 加载快捷键数据失败! - - - TouchPadSettings - Touchpad Enabled - 禁用触摸板 + List shortcut failed,error:%1 + 列出快捷键失败,错误:%1 - Disable TouchPad - 禁用触摸板 + Error + 错误 - TouchPad Enabled - 开启触摸板 + Get shortcut failed,error: + 获取快捷键失败,错误: - Select TouchPad Hand - 选择触摸板使用模式 + Open File + 打开文件 - TouchPad Motion Acceleration - 触摸板移动加速 + System + 系统 - Select Click Method - 设置点击触摸板方式 + Sound + 声音 - Select Scroll Method - 滚动窗口方式 + Failed + 失败 - Natural Scroll - 是否为自然滚动 + Delete shortcut failed,error: + 删除快捷键失败,错误: - Enabled while Typing - 打字时触摸板禁用 + Warning + 警告 - Tap to Click - 轻击(不按下)触摸板功能是否生效 + Please complete the shortcut information! + 请完善快捷键信息! - Slow - + Set shortcut + 设置快捷键 - Standard - 标准 + Are you sure you want to disable this shortcut? + 是否确定要禁用此快捷键? - Fast - + Modify system shortcut failed,error: + 修改系统快捷键失败,错误: - Right Hand Mode - 右手模式 + Modify custom shortcut failed,error: + 修改自定义快捷键失败,错误: - Left Hand Mode - 左手模式 + Add custom shortcut failed,error: + 添加自定义快捷键失败,错误: - Press and Tap - 按键和轻触 + Reset shortcut failed,error: + 重置快捷键失败,错误: - Tap - 轻触 + 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再试一次。 - Two Finger Scroll - 两指滑动 + Shortcut keys %1 are already used in %2,Please try again! + 快捷键%1已用于%2,请再试一次! + + + ShortcutItem - Edge Scroll - 边缘滑动 + Form + + + + TextLabel + - TouchPadSubItem + ShowQRCode - TouchPad Settings - 触摸板设置 + Scan QR code to get machine code + 扫描二维码获取机器码 + + + QRcode of Machine and Activation Code + 激活信息二维码 + + + Scan QR code to get activation code + 扫描二维码获取激活码 - TrayConnectionList + SystemInfoSubItem - Other WiFi networks - 其它WIFI网络 + System Information + 系统信息 - TrayItemWidget + SystemInformation - TrayItemWidget + Form - Icon - + Host Name: + 主机名: - Name - 名称 + LabelHostName + - Status - 状态 + TextLabel + - Ignore - 忽略 + ButtonChangeHostName + - Disconnect - 断开 + Change + 更改 - Cancel - 取消 + System Version: + 系统版本: - Connect - 连接 + LabelSystemVersion + - Connected - 已连接 + Kernel Version: + 内核版本: - Unconnected - 未连接 + LabelKernelVersion + - Please input password - 请输入密码 + System Architecture: + 系统架构: - Please input a network name - 请输入网络名称 + LabelSystemArch + - - - TrayPage - TrayPage - + Activation status: + 激活状态: - TextLabel - + Show + 查看 - Select wired network card - 请选择有线网卡 + EULA: + 最终用户许可协议: - Select wireless network card - 请选择无线网卡 + ButtonShowEULA + - - - UKeyPage - Ukey - UKey + Version License: + 版本协议: - Default Ukey device - 默认UKey设备 + ButtonShowVersionLicense + - List of devices bound to the Ukey - 绑定UKey设备列表 + Unknow + 未知 - error - 错误 + UnActivated + 未激活 - No UKey device detected, pelease insert the UKey device and perform operations - 未检测到UKey设备,请插入UKey设备再次执行操作 + Activation code has expired + 激活码已过期 - UKey Enroll - UKey录入 + Permanently activated + 永久激活 - Please enter the ukey pin code - 请输入UKey PIN码 + Activated + 已激活 - - - UKeyPinCodeDialog - UKey Enroll - UKey录入 + Error + 错误 - Please enter the ukey pin code - 请输入UKey PIN码 + Failed to open the license activator + 启动激活许可证弹窗失败 - Confirm - 确认 + Copyright © + 版权所有 © - Cancel - 取消 + KylinSec. All rights reserved. + KylinSec.保留所有权利. + + + Privacy policy: + 隐私协议: - UserInfoPage + SystemInformationWidget - Form - + Host Name: + 主机名: - Account - + System Version: + 系统版本: - Change password - 修改密码 + Kernel Version: + 内核版本: - User id - 用户ID + System Architecture: + 系统架构: - User type - 用户类型 + Installation time: + 安装时间: - User status - 启用用户 + Activation status: + 激活状态: - auth manager - 认证管理 + Expiry date: + 质保期: - Password expiration policy - 密码过期策略 + EULA: + 最终用户许可协议: - Confirm - 保存 + Version License: + 版本协议: - Delete - 删除用户 + Contact Us: + 联系我们: - Current password - 当前密码 + Change + 更改 - EditCurrentPasswd - + Show + 查看 - New password - 新密码 + Unknow + 未知 - EditNewPasswd - + The current time is illegal + 当前时间不合法 - Enter the new password again - 再次输入新密码 + Less than the installation time + 小于安装时间 - EditNewPasswdAgain - + Not activated. Trail expiration: + 未激活.试用到期: - EditPasswdSave - + Can't get activation information + 无法获取激活信息 - Save - 保存 + Activate + 激活 - EditPasswdCancel - + get service status failed + 获取服务状态信息失败 - Cancel - 取消 + Not yet + 暂无 - Account type - 帐户类型 + Activated + 已激活 - Account status - 启用帐户 + Forever + 永久授权 - standard - 普通用户 + Copyright © + 版权所有 © - administrator - 管理员 + KylinSec. All rights reserved. + KylinSec.保留所有权利. + + + ThemePage - Please enter the new user password - 请输入新密码 + Form + - Please enter the password again - 请再次输入密码 + Dark and Light Theme + 深浅色主题设置 - The password you enter must be the same as the former one - 两次密码不相同,请核对后,再次输入 + Themes Settings + 主题设置 - Please enter the current user password - 请输入当前密码 + Open Window Effects + 打开或关闭窗口特效 - The current password is incorrect - 当前密码错误,请再次输入 + Unknown + 未知 - The new password cannot be the same as the current password - 新密码不能和旧密码相同,请重新输入 + Light Theme + 浅色 - Error - 错误 + Auto + 自动 - Password encryption failed - 密码加密失败 + Dark Theme + 深色 - user information updated successfully - 用户信息更新成功 + Choose icon Theme + 选择图标主题 - Password updated successfully - 密码更新成功 + Choose cursor Themes + 选择光标主题 + + + ThemeWidget - 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 Theme + 深色 - Warning - 警告 + Light Theme + 浅色 - Account information updated successfully - 帐户信息更新成功 + Auto + 自动 - UserlicenseAgreement - - Export - 导出 - + Themes - Close - 关闭 + Dark and Light Theme + 深浅色主题设置 - Save - 保存 + Themes Settings + 主题设置 - Export EULA - 导出最终用户许可协议 + Open Window Effects + 打开或关闭窗口特效 - Export EULA failed! - 导出最终用户许可协议失败! + Choose icon themes + 选择图标主题 - User End License Agreement - 最终用户许可协议 + Unknown + 未知 - None - 暂无 + Choose cursor themes + 选择光标主题 - VpnIPsec - - VpnIPsec - - + ThreadObject - Enable IPsec - 启用IPsec + Failed + 失败 - Group Name - 组名 + List shortcut failed,error: + 列出快捷键失败,错误: + + + TimeDateSubItem - EditGroupName - + Time Date Settings + 日期时间设置 - Group ID - 组ID + Chnage time Zone + 更改时区 - EditGroupId - + Set time Manually + 手动设置时间 - Pre-Shared Key - 预共享密钥 + Time date format setting + 日期时间格式设置 + + + TimezoneSettings - EditPreSharedKey + TimezoneSettings - Show Password - 显示密码 - - - Internet Key Exchange Protocol - 密钥交换协议 + Select Time Zone + 选择时区 - EditIpsecIKE + ButtonSave - Encapsulating Security Payload - 安全封装协议 - - - EditIpsecESP - + save + 保存 - - - VpnIpvx - VpnIpvx + ButtonReturn - IPV4 Method - IPV4方法 + reset + 重置 + + + TopBar - ComboBoxVPNIpv4Method + ListExpansionSpace - Only applied in corresponding resources - 仅用于相对应的网络上的资源 + TITLE + - Preferred DNS - 首选DNS + FLAG + + + + TouchPadPage - EditVPNIpv4PreferredDNS + Form - Alternate DNS - 备选DNS + TouchPad Enabled + 开启触摸板 - EditIpv4AlternateDNS + SwitchTouchPadEnable - Auto - 自动 + Select TouchPad Hand + 选择触摸板使用模式 - - - VpnL2tpSetting - VpnL2tpSetting + ComboTouchPadHand - VPN name - VPN名称 + TouchPad Motion Acceleration + 触摸板移动加速 - - - VpnManager - VpnManager + SliderTouchPadMotionAcceleration - VPN type - VPN类型 + Slow + - Save - 保存 + Fast + - Return - 返回 + Select Click Method + 设置点击触摸板方式 - VPN - VPN + ComboClickMethod + - L2TP - + Select Scroll Method + 滚动窗口方式 - Tips - 提示 + ComboScrollMethod + - Password required to connect to %1. - 连接网络 "%1" 需要密码 + Natural Scroll + 是否为自然滚动 - - - VpnPpp - VpnPpp + ComboNaturalScroll - Use MPPE - 使用MPPE + Enabled while Typing + 打字时触摸板禁用 - Security - 安全 + SwitchTypingEnable + - ComboBoxMppeSecurity - + Tap to Click + 轻击(不按下)触摸板功能是否生效 - Stateful MPPE - 使用带状态的MPPE + SwtichTapToClick + - All available (default) - 都可用(默认) + Right Hand Mode + 右手模式 - 40-bit (less secure) - 40位(较安全) + Left Hand Mode + 左手模式 - 128-bit (most secure) - 128位(最安全) + Press and Tap + 按键和轻触 - Refuse EAP Authentication - 拒绝EAP认证 + Tap + 轻触 - Refuse PAP Authentication - 拒绝PAP认证 + Two Finger Scroll + 两指滑动 - Refuse CHAP Authentication - 拒绝CHAP认证 + Edge Scroll + 边缘滑动 + + + TouchPadSettings - Refuse MSCHAP Authentication - 拒绝MSCHAP认证 + Touchpad Enabled + 禁用触摸板 - Refuse MSCHAPv2 Authentication - 拒绝MSCHAPv2认证 + Disable TouchPad + 禁用触摸板 - No BSD Data Compression - 无BSD数据压缩 + TouchPad Enabled + 开启触摸板 - No Deflate Data Compression - 无Deflate数据压缩 + Select TouchPad Hand + 选择触摸板使用模式 - No TCP Header Compression - 无TCP头压缩 + TouchPad Motion Acceleration + 触摸板移动加速 - No Protocol Field Compression - 无协议字段压缩 + Select Click Method + 设置点击触摸板方式 - No Address/Control Compression - 无地址/控制压缩 + Select Scroll Method + 滚动窗口方式 - Send PPP Echo Packets - 发送PPP回响包 + Natural Scroll + 是否为自然滚动 - - - VpnPptpSetting - VpnPptpSetting - + Enabled while Typing + 打字时触摸板禁用 - VPN name - VPN名称 + Tap to Click + 轻击(不按下)触摸板功能是否生效 - - - VpnWidget - VpnWidget - + Slow + - Gateway - 网关 + Standard + 标准 - EditVPNGateway - + Fast + - User Name - 用户名 + Right Hand Mode + 右手模式 - EditVPNUserName - + Left Hand Mode + 左手模式 - Password Options - 密码选项 + Press and Tap + 按键和轻触 - ComboBoxVPNPasswordOptions - + Tap + 轻触 - Password - 密码 + Two Finger Scroll + 两指滑动 - EditVPNPassword - + Edge Scroll + 边缘滑动 + + + TouchPadSubItem - ButtonPasswordVisual - + TouchPad Settings + 触摸板设置 + + + UKeyPage - Show Password - 显示密码 + Ukey + UKey - NT Domain - NT域 + Default Ukey device + 默认UKey设备 - EditNTDomain - + List of devices bound to the Ukey + 绑定UKey设备列表 - Required - 必填 + error + 错误 - Saved - 已保存的 + No UKey device detected, pelease insert the UKey device and perform operations + 未检测到UKey设备,请插入UKey设备再次执行操作 - Ask - 总是询问 + UKey Enroll + UKey录入 - Not required - 不要求 + Please enter the ukey pin code + 请输入UKey PIN码 + + + UKeyPinCodeDialog - Gateway can not be empty - 网关不能为空 + UKey Enroll + UKey录入 - Gateway invalid - 无效的网关 + Please enter the ukey pin code + 请输入UKey PIN码 - user name can not be empty - 用户名不能为空 + Confirm + 确认 - password can not be empty - 密码不能为空 + Cancel + 取消 - Wallpaper + UserInfoPage Form - Set wallpaper - 壁纸设置 - - - FrameLockScreenPreview - + Account + - FrameDesktopPreivew - + Change password + 修改密码 - Desktop Wallpaper Preview - 桌面壁纸预览 + User id + 用户ID - Lock Screen WallPaper Preview - 锁屏壁纸预览 + User type + 用户类型 - Select wallpaper - 选择壁纸 + User status + 启用用户 - Select Wallpaper - 选择壁纸 + auth manager + 认证管理 - Set Desktop Wallpaper - 选择桌面壁纸 + Password expiration policy + 密码过期策略 - Set Lock Screen Wallpaper - 选择锁屏壁纸 + Confirm + 保存 - set wallpaper - 壁纸设置 + Delete + 删除用户 - Set wallpaper failed! - 壁纸设置失败! + Current password + 当前密码 - select picture - 选择图片 + EditCurrentPasswd + - 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) + New password + 新密码 - Add Image Failed - 添加壁纸失败 + EditNewPasswd + - The image already exists! - 该壁纸已存在! + Enter the new password again + 再次输入新密码 - - - WiredManager - WiredManager + EditNewPasswdAgain - ButtonSave + EditPasswdSave @@ -5409,186 +5544,178 @@ This is line 50 of the test text 保存 - ButtonReturn + EditPasswdCancel - Return - 返回 + Cancel + 取消 - Wired Network Adapter - 有线网络配置 + Account type + 帐户类型 - The carrier is pulled out - 网线被拔出 + Account status + 启用帐户 - The current device is not available - 当前设备不可用 + standard + 普通用户 - - - WiredSettingPage - WiredSettingPage - + administrator + 管理员 - Network name - 网络名称 + Please enter the new user password + 请输入新密码 - - - WirelessManager - WirelessManager - + Please enter the password again + 请再次输入密码 - Save - 保存 + The password you enter must be the same as the former one + 两次密码不相同,请核对后,再次输入 - Return - 返回 + Please enter the current user password + 请输入当前密码 - Wireless Network Adapter - 无线网卡 + The current password is incorrect + 当前密码错误,请再次输入 - The current device is not available - 当前设备不可用 + The new password cannot be the same as the current password + 新密码不能和旧密码相同,请重新输入 - Tips - 提示 + Error + 错误 - Password required to connect to %1. - 连接网络 "%1" 需要密码 + Password encryption failed + 密码加密失败 - - - WirelessSecurityWidget - WirelessSecurityWidget - + user information updated successfully + 用户信息更新成功 - Security - 安全 + Password updated successfully + 密码更新成功 - ComboBoxWirelessSecurityOption - + 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用户吗? - Password Options - 密码选项 + Warning + 警告 - ComboBoxWirelessPasswordOption - + Account information updated successfully + 帐户信息更新成功 + + + UserlicenseAgreement - Password - 密码 + Export + 导出 - EditWirelessPassword - + Close + 关闭 - ButtonWirelessPasswordVisual - + Save + 保存 - PushButton - + Export EULA + 导出最终用户许可协议 - None - + Export EULA failed! + 导出最终用户许可协议失败! - WPA/WPA2 Personal - WPA/WPA2个人版 + User End License Agreement + 最终用户许可协议 - Save password for all users - 仅为该用户存储密码 + None + 暂无 + + + Wallpaper - Save password for this user - 存储所有用户密码 + Form + - Ask me always - 总是询问 + Set wallpaper + 壁纸设置 - Required - 必填 + FrameLockScreenPreview + - - - WirelessSettingPage - WirelessSettingPage + FrameDesktopPreivew - Wireless name - 无线网络名称 + Desktop Wallpaper Preview + 桌面壁纸预览 - - - WirelessTrayWidget - the network "%1" not found - 未找到网络 "%1" + Lock Screen WallPaper Preview + 锁屏壁纸预览 - - - WirelessWidget - WirelessWidget - + Select wallpaper + 选择壁纸 - SSID - + Select Wallpaper + 选择壁纸 - EditSsid - + Set Desktop Wallpaper + 选择桌面壁纸 - MAC Address Of Device - 设备MAC地址 + Set Lock Screen Wallpaper + 选择锁屏壁纸 - ComboBoxWirelessMacAddress - + set wallpaper + 壁纸设置 - Custom MTU - 自定义MTU + Set wallpaper failed! + 壁纸设置失败! - SpinBoxWirelessCustomMTU - + select picture + 选择图片 - Required - 必填 + 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) - No device specified - 不指定设备 + Add Image Failed + 添加壁纸失败 + + + The image already exists! + 该壁纸已存在! -- Gitee From 867477665198198ceb4a0a223427fab6b1e78347 Mon Sep 17 00:00:00 2001 From: luoqing Date: Tue, 12 Dec 2023 14:36:18 +0800 Subject: [PATCH 09/17] refactor(audio):Modify the audio code according to the review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根据https://gitee.com/openeuler/kiran-control-panel/pulls/191 评审意见整理和修改代码 --- .../audio/src/dbus/audio-device-interface.cpp | 3 +- plugins/audio/src/dbus/audio-interface.cpp | 26 ++-- plugins/audio/src/plugin/audio-plugin.cpp | 30 +--- plugins/audio/src/plugin/audio-plugin.h | 2 - plugins/audio/src/plugin/input-page.cpp | 99 ++++++------- plugins/audio/src/plugin/output-page.cpp | 134 ++++++++---------- plugins/audio/src/plugin/volume-scale.cpp | 3 +- .../src/system-tray/audio-system-tray.cpp | 53 ++----- .../audio/src/system-tray/audio-system-tray.h | 1 - plugins/audio/src/system-tray/main.cpp | 10 +- .../src/system-tray/mixed-setting-page.cpp | 14 +- .../src/system-tray/volume-setting-page.cpp | 24 ++-- 12 files changed, 149 insertions(+), 250 deletions(-) diff --git a/plugins/audio/src/dbus/audio-device-interface.cpp b/plugins/audio/src/dbus/audio-device-interface.cpp index 4f14c5a0..cada0bed 100644 --- a/plugins/audio/src/dbus/audio-device-interface.cpp +++ b/plugins/audio/src/dbus/audio-device-interface.cpp @@ -14,6 +14,7 @@ #include "audio-device-interface.h" #include +#include "logging-category.h" /* * Implementation of interface class AudioDeviceInterface @@ -32,7 +33,7 @@ AudioDeviceInterface::~AudioDeviceInterface() QList AudioDeviceInterface::getPortsInfo() { QDBusPendingReply getPorts = GetPorts(); - KLOG_DEBUG() << "getPorts:" << getPorts; + KLOG_DEBUG(qLcAudio) << "device:" << name() << "ports:" << getPorts; //解析默认sink的端口信息 QJsonParseError jsonParseError; diff --git a/plugins/audio/src/dbus/audio-interface.cpp b/plugins/audio/src/dbus/audio-interface.cpp index 598b3bf7..85bdc509 100644 --- a/plugins/audio/src/dbus/audio-interface.cpp +++ b/plugins/audio/src/dbus/audio-interface.cpp @@ -15,6 +15,7 @@ #include "audio-interface.h" #include "kiran-session-daemon/audio-i.h" #include +#include "logging-category.h" /* * Implementation of interface class AudioInterface */ @@ -47,30 +48,29 @@ AudioInterface::~AudioInterface() QList AudioInterface::getCards() { QDBusPendingReply cards = GetCards(); - KLOG_DEBUG() << "get Cards:" << cards; + KLOG_DEBUG(qLcAudio) << "get all audio cards:" << cards; //解析默认sink的端口信息 QJsonParseError jsonParseError; QJsonDocument doc = QJsonDocument::fromJson(cards.value().toUtf8(), &jsonParseError); - if((doc.isNull()) || (jsonParseError.error != QJsonParseError::NoError)) + if( (doc.isNull()) || + (jsonParseError.error != QJsonParseError::NoError) || + (!doc.isArray())) { return QList(); } QList cardInfoList; - if (doc.isArray() && jsonParseError.error == QJsonParseError::NoError) + QJsonArray array = doc.array(); + for (int i = 0; i < array.count(); ++i) { - QJsonArray array = doc.array(); - for (int i = 0; i < array.count(); ++i) - { - QJsonObject object = array.at(i).toObject(); - AudioCardInfo cardInfo; - cardInfo.index = object.value("index").toInt(); - cardInfo.name = object.value("name").toString(); - cardInfoList << cardInfo; - } - } + QJsonObject object = array.at(i).toObject(); + AudioCardInfo cardInfo; + cardInfo.index = object.value("index").toInt(); + cardInfo.name = object.value("name").toString(); + cardInfoList << cardInfo; + } return cardInfoList; } diff --git a/plugins/audio/src/plugin/audio-plugin.cpp b/plugins/audio/src/plugin/audio-plugin.cpp index c4ac0826..f52f6bb4 100644 --- a/plugins/audio/src/plugin/audio-plugin.cpp +++ b/plugins/audio/src/plugin/audio-plugin.cpp @@ -16,6 +16,7 @@ #include "config.h" #include "volume-input-subitem.h" #include "volume-output-subitem.h" +#include "logging-category.h" #include #include @@ -33,29 +34,6 @@ AudioPlugin::~AudioPlugin() int AudioPlugin::init(KiranControlPanel::PanelInterface* interface) { - if (m_translator != nullptr) - { - QCoreApplication::removeTranslator(m_translator); - delete m_translator; - m_translator = nullptr; - } - - m_translator = new QTranslator(qApp); - if (!m_translator->load(QLocale(), - "kiran-control-panel", - ".", - TRANSLATE_PREFIX, - ".qm")) - { - KLOG_ERROR() << "can't load translator"; - delete m_translator; - m_translator = nullptr; - } - else - { - qApp->installTranslator(m_translator); - } - auto inputSubitem = new VolumeIntputSubItem; auto outputSubitem = new VolumeOutputSubItem; m_subitems.append({KiranControlPanel::SubItemPtr(inputSubitem), KiranControlPanel::SubItemPtr(outputSubitem)}); @@ -65,12 +43,6 @@ int AudioPlugin::init(KiranControlPanel::PanelInterface* interface) void AudioPlugin::uninit() { - if (m_translator != nullptr) - { - QCoreApplication::removeTranslator(m_translator); - delete m_translator; - m_translator = nullptr; - } } QVector AudioPlugin::getSubItems() diff --git a/plugins/audio/src/plugin/audio-plugin.h b/plugins/audio/src/plugin/audio-plugin.h index d82b225a..37224d6f 100644 --- a/plugins/audio/src/plugin/audio-plugin.h +++ b/plugins/audio/src/plugin/audio-plugin.h @@ -19,7 +19,6 @@ #include "plugin-interface-v2.h" #include "plugin-subitem-interface.h" -class QTranslator; class AudioPlugin : public QObject, public KiranControlPanel::PluginInterfaceV2 @@ -44,7 +43,6 @@ public: QVector getSubItems() override; private: - QTranslator* m_translator = nullptr; QVector m_subitems; }; diff --git a/plugins/audio/src/plugin/input-page.cpp b/plugins/audio/src/plugin/input-page.cpp index eaeef628..c8a01df6 100644 --- a/plugins/audio/src/plugin/input-page.cpp +++ b/plugins/audio/src/plugin/input-page.cpp @@ -15,6 +15,8 @@ #include "dbus/audio-device-interface.h" #include "dbus/audio-interface.h" #include "ui_input-page.h" +#include "logging-category.h" +#include #include #include @@ -191,7 +193,7 @@ void InputPage::init() void InputPage::initSettings() { QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSource(); - KLOG_DEBUG() << "default Source Path" << dbusReply; + KLOG_DEBUG(qLcAudio) << "default Source Path" << dbusReply; if (!dbusReply.isValid()) { @@ -216,7 +218,7 @@ void InputPage::initSettings() void InputPage::initCardOptions() { - ui->inputCards->blockSignals(true); + QSignalBlocker blocker(ui->inputCards); QList cardsInfo = m_audioInterface->getCards(); for (auto card : cardsInfo) { @@ -224,19 +226,18 @@ void InputPage::initCardOptions() } int index = ui->inputCards->findData(m_defaultSource->card_index()); ui->inputCards->setCurrentIndex(index); - ui->inputCards->blockSignals(false); } void InputPage::initActivedPort() { if (!m_defaultSource->isAvailablePorts()) { - KLOG_INFO() << "No available ports for current default source"; + KLOG_INFO(qLcAudio) << "No available ports for current default source"; disableSettings(); return; } - ui->inputDevices->blockSignals(true); + QSignalBlocker blocker(ui->inputDevices); ui->inputDevices->setEnabled(true); m_isValidPort = true; @@ -246,12 +247,10 @@ void InputPage::initActivedPort() if (portInfo.available != PORT_AVAILABLE_NO) { ui->inputDevices->addItem(portInfo.description, portInfo.name); - } } int currentIndex = ui->inputDevices->findData(m_defaultSource->active_port()); ui->inputDevices->setCurrentIndex(currentIndex); - ui->inputDevices->blockSignals(false); // 端口可用后才初始化音量设置和音量反馈 initVolume(); @@ -265,21 +264,20 @@ void InputPage::initVolume() ui->volumeSetting->setEnabled(true); } - ui->volumeSetting->blockSignals(true); + QSignalBlocker blocker(ui->volumeSetting); double currentVolumeDouble = m_defaultSource->volume() * 100; int currentVolume = round(currentVolumeDouble); ui->volumeSetting->setValue(currentVolume); ui->inputVolume->setText(QString::number(currentVolume) + "%"); - ui->volumeSetting->blockSignals(false); - KLOG_DEBUG() << "current input volume:" << currentVolume; + KLOG_DEBUG(qLcAudio) << "current input volume:" << currentVolume; } void InputPage::initConnet() { - connect(ui->inputCards, static_cast(&QComboBox::currentIndexChanged), this, &InputPage::changeDefaultInputCard); - connect(ui->inputDevices, static_cast(&QComboBox::currentIndexChanged), this, &InputPage::setActivePort); + connect(ui->inputCards, QOverload::of(&QComboBox::currentIndexChanged), this, &InputPage::changeDefaultInputCard); + connect(ui->inputDevices, QOverload::of(&QComboBox::currentIndexChanged), this, &InputPage::setActivePort); connect(ui->volumeSetting, &QSlider::valueChanged, this, &InputPage::setVolume); connect(m_audioInterface, &AudioInterface::SourceAdded, this, &InputPage::addSource); @@ -289,8 +287,8 @@ void InputPage::initConnet() void InputPage::disableSettings() { - ui->inputDevices->blockSignals(true); - ui->volumeSetting->blockSignals(true); + QSignalBlocker inputDevicesBlocker(ui->inputDevices); + QSignalBlocker volumeSettingBlocker(ui->volumeSetting); m_isValidPort = false; ui->inputDevices->insertItem(0, tr("No input device detected")); @@ -302,9 +300,6 @@ void InputPage::disableSettings() ui->inputDevices->setEnabled(false); ui->volumeSetting->setEnabled(false); - ui->inputDevices->blockSignals(false); - ui->volumeSetting->blockSignals(false); - ui->volumeScale->setPercent(0); clearFeedBack(); @@ -312,10 +307,9 @@ void InputPage::disableSettings() void InputPage::onActivePortChanged(const QString &value) { - KLOG_INFO() << "input device (active port) changed :" << value; - ui->inputDevices->blockSignals(true); + KLOG_INFO(qLcAudio) << "input device (active port) changed :" << value; + QSignalBlocker blocker(ui->inputDevices); ui->inputDevices->clear(); - ui->inputDevices->blockSignals(false); clearFeedBack(); initActivedPort(); @@ -323,12 +317,11 @@ void InputPage::onActivePortChanged(const QString &value) void InputPage::onVolumeChanged(double value) { - ui->volumeSetting->blockSignals(true); + QSignalBlocker blocker(ui->volumeSetting); int currentVolume = round(value * 100); ui->inputVolume->setText(QString::number(currentVolume) + "%"); ui->volumeSetting->setValue(currentVolume); - ui->volumeSetting->blockSignals(false); - KLOG_DEBUG() << "input volume changed:" << currentVolume; + KLOG_DEBUG(qLcAudio) << "input volume changed:" << currentVolume; } /** @@ -342,7 +335,7 @@ void InputPage::onVolumeChanged(double value) void InputPage::changeDefaultInputCard(int index) { int cardIndex = ui->inputCards->itemData(index, Qt::UserRole).toInt(); - KLOG_INFO() << "change default input card, current input card Index:" << cardIndex; + KLOG_INFO(qLcAudio) << "change default input card, current input card Index:" << cardIndex; QDBusPendingReply getSources = m_audioInterface->GetSources(); QStringList sourcesList = getSources.value(); @@ -350,20 +343,18 @@ void InputPage::changeDefaultInputCard(int index) for (auto source : sourcesList) { AudioDeviceInterface audioSource(AUDIO_DBUS_NAME, source, QDBusConnection::sessionBus(), this); - if (cardIndex == audioSource.card_index()) + if ((cardIndex == audioSource.card_index()) && + (audioSource.isAvailablePorts())) { - if (audioSource.isAvailablePorts()) - { - sourceIndex = audioSource.index(); - break; - } + sourceIndex = audioSource.index(); + break; } } if (sourceIndex == -1) { - KLOG_INFO() << "The source with an available port corresponding to the card index was not found"; - KLOG_INFO() << "set default source failed"; + KLOG_INFO(qLcAudio) << "The source with an available port corresponding to the card index was not found"; + KLOG_INFO(qLcAudio) << "set default source failed"; disableSettings(); return; } @@ -374,7 +365,7 @@ void InputPage::changeDefaultInputCard(int index) if (sourceIndex == defaultSource.index()) { - KLOG_INFO() << "current default source:" << sourceIndex; + KLOG_INFO(qLcAudio) << "current default source:" << sourceIndex; reload(); return; } @@ -391,62 +382,55 @@ void InputPage::setDefaultSource(int sourceIndex) * 接收到DefaultSourceChange信号后,确认SetDefaultSource生效后(即切换Source成功),界面再打开和更新设置 */ m_audioInterface->SetDefaultSource(sourceIndex); - KLOG_INFO() << QString("set default sourcee:%1").arg(sourceIndex); + KLOG_INFO(qLcAudio) << QString("set default sourcee:%1").arg(sourceIndex); disableSettings(); } void InputPage::setVolume(int value) { - double volumeValue = static_cast(value) / static_cast(100); + double volumeValue = value / 100.0; if (m_defaultSource != nullptr) { m_defaultSource->SetVolume(volumeValue); - KLOG_DEBUG() << "set input Volume:" << volumeValue; + KLOG_DEBUG(qLcAudio) << "set input Volume:" << volumeValue; } else { - KLOG_INFO() << "set input volume failed, default source is null"; + KLOG_INFO(qLcAudio) << "set input volume failed, default source is null"; } } void InputPage::onDefaultSourceChanged(int index) { - KLOG_DEBUG() << "Default Source Changed:" << index; + KLOG_DEBUG(qLcAudio) << "Default Source Changed:" << index; // delete and restart init defaultSource reload(); } void InputPage::setActivePort(int index) { - QString namePort = ui->inputDevices->itemData(index, Qt::UserRole).toString(); - if (!namePort.isNull()) + QString portName = ui->inputDevices->itemData(index, Qt::UserRole).toString(); + if ((m_defaultSource != nullptr) && !portName.isNull()) { - if (m_defaultSource != nullptr) - { - m_defaultSource->SetActivePort(namePort); - KLOG_INFO() << " set source Active Port:" << namePort; - } - else - { - KLOG_DEBUG() << "set source active port failed, default Source is null"; - } + m_defaultSource->SetActivePort(portName); + KLOG_INFO(qLcAudio) << " set default source Active Port:" << portName; } else { - KLOG_DEBUG() << "namePort is null"; - } + KLOG_INFO(qLcAudio) << QString("set default source active port: %1 failed").arg(portName); + } } // 暂时没有处理Source增加减少的需求 void InputPage::addSource(int index) { - KLOG_INFO() << "Source Added:" << index; + KLOG_INFO(qLcAudio) << "Source Added:" << index; reload(); } void InputPage::deleteSource(int index) { - KLOG_INFO() << "Source Delete:" << index; + KLOG_INFO(qLcAudio) << "Source Delete:" << index; reload(); } @@ -500,7 +484,7 @@ void InputPage::refreshFeedBack() void InputPage::reload() { - KLOG_INFO() << "reload input settings"; + KLOG_INFO(qLcAudio) << "reload input settings"; clear(); initSettings(); } @@ -515,13 +499,10 @@ void InputPage::clear() m_defaultSource = nullptr; } - ui->inputDevices->blockSignals(true); + QSignalBlocker inputDevicesBlocker(ui->inputDevices); + QSignalBlocker inputCardsBlocker(ui->inputCards); ui->inputDevices->clear(); - ui->inputDevices->blockSignals(false); - - ui->inputCards->blockSignals(true); ui->inputCards->clear(); - ui->inputCards->blockSignals(false); clearFeedBack(); } diff --git a/plugins/audio/src/plugin/output-page.cpp b/plugins/audio/src/plugin/output-page.cpp index 438a4167..eddc9960 100644 --- a/plugins/audio/src/plugin/output-page.cpp +++ b/plugins/audio/src/plugin/output-page.cpp @@ -16,6 +16,7 @@ #include "dbus/audio-device-interface.h" #include "dbus/audio-interface.h" #include "kiran-session-daemon/audio-i.h" +#include "logging-category.h" #include "ui_output-page.h" #include @@ -37,7 +38,7 @@ OutputPage::OutputPage(QWidget *parent) : QWidget(parent), m_dbusServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, [this](const QString &service) { - KLOG_INFO() << "serviceUnregistered:" << service; + KLOG_INFO(qLcAudio) << "dbus service unregistered:" << service; disableSettings(); }); } @@ -65,11 +66,11 @@ void OutputPage::init() void OutputPage::initSettins() { QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSink(); - KLOG_INFO() << "default Sink:" << dbusReply; + KLOG_INFO(qLcAudio) << "default Sink:" << dbusReply; if (!dbusReply.isValid()) { - KLOG_INFO() << "default Sink Path error:" << dbusReply.error(); + KLOG_INFO(qLcAudio) << "default Sink Path error:" << dbusReply.error(); disableSettings(); return; } @@ -93,7 +94,7 @@ void OutputPage::initSettins() void OutputPage::initCardOptions() { - ui->outputCards->blockSignals(true); + QSignalBlocker blocker(ui->outputCards); QList cardsInfo = m_audioInterface->getCards(); for (auto card : cardsInfo) { @@ -101,35 +102,32 @@ void OutputPage::initCardOptions() } int index = ui->outputCards->findData(m_defaultSink->card_index()); ui->outputCards->setCurrentIndex(index); - ui->outputCards->blockSignals(false); } void OutputPage::initActivedPort() { - if(!m_defaultSink->isAvailablePorts()) + if (!m_defaultSink->isAvailablePorts()) { // 无激活端口则禁用音量设置和平衡 - KLOG_DEBUG() << "No available ports for current default sink"; + KLOG_DEBUG(qLcAudio) << "No available ports for current default sink"; disableSettings(); return; } - ui->outputDevices->blockSignals(true); + QSignalBlocker blocker(ui->outputDevices); ui->outputDevices->setEnabled(true); QList portsInfo = m_defaultSink->getPortsInfo(); - for (auto portInfo: portsInfo) + for (auto portInfo : portsInfo) { if (portInfo.available != PORT_AVAILABLE_NO) { ui->outputDevices->addItem(portInfo.description, portInfo.name); - } } int currentIndex = ui->outputDevices->findData(m_defaultSink->active_port()); ui->outputDevices->setCurrentIndex(currentIndex); - ui->outputDevices->blockSignals(false); /// 存在激活端口才初始化音量和平衡设置 initVolumeAndBalance(); @@ -143,8 +141,8 @@ void OutputPage::initVolumeAndBalance() ui->volumeBalance->setEnabled(true); } - ui->volumeSetting->blockSignals(true); - ui->volumeBalance->blockSignals(true); + QSignalBlocker volumeSettingBlocker(ui->volumeSetting); + QSignalBlocker volumeBalanceBlocker(ui->volumeBalance); double currentVolumeDouble = m_defaultSink->volume() * 100; int currentVolume = round(currentVolumeDouble); @@ -154,11 +152,8 @@ void OutputPage::initVolumeAndBalance() double currentBalanceDouble = m_defaultSink->balance() * 100; ui->volumeBalance->setValue(round(currentBalanceDouble)); - ui->volumeSetting->blockSignals(false); - ui->volumeBalance->blockSignals(false); - - KLOG_DEBUG() << "current output volume:" << currentVolume; - KLOG_DEBUG() << "current output balance:" << round(currentBalanceDouble); + KLOG_DEBUG(qLcAudio) << "current output volume:" << currentVolume; + KLOG_DEBUG(qLcAudio) << "current output balance:" << round(currentBalanceDouble); } void OutputPage::initConnect() @@ -167,8 +162,8 @@ void OutputPage::initConnect() connect(m_audioInterface, &AudioInterface::SinkDelete, this, &OutputPage::deleteSink); connect(m_audioInterface, &AudioInterface::DefaultSinkChange, this, &OutputPage::defaultSinkChanged, Qt::QueuedConnection); - connect(ui->outputCards, static_cast(&QComboBox::currentIndexChanged), this, &OutputPage::changeDefaultOutputCard); - connect(ui->outputDevices, static_cast(&QComboBox::currentIndexChanged), this, &OutputPage::setActivePort); + connect(ui->outputCards, QOverload::of(&QComboBox::currentIndexChanged), this, &OutputPage::changeDefaultOutputCard); + connect(ui->outputDevices, QOverload::of(&QComboBox::currentIndexChanged), this, &OutputPage::setActivePort); connect(ui->volumeSetting, &QSlider::valueChanged, this, &OutputPage::setVolume); connect(ui->volumeBalance, &QSlider::valueChanged, this, &OutputPage::setBalance); @@ -176,67 +171,63 @@ void OutputPage::initConnect() void OutputPage::onActivePortChanged(const QString &value) { - KLOG_INFO() << "output device (active Port) changed :" << value; - ui->outputDevices->blockSignals(true); + KLOG_INFO(qLcAudio) << "output device (active Port) changed :" << value; + QSignalBlocker blocker(ui->outputDevices); ui->outputDevices->clear(); - ui->outputDevices->blockSignals(false); initActivedPort(); } void OutputPage::changeVolumeSlider(double value) { - ui->volumeSetting->blockSignals(true); // 为了避免拖动的同时设置位置会出现问题 + QSignalBlocker blocker(ui->volumeSetting); // 为了避免拖动的同时设置位置会出现问题 int currentVolume = round(value * 100); ui->outputVolume->setText(QString::number(currentVolume) + "%"); ui->volumeSetting->setValue(currentVolume); - ui->volumeSetting->blockSignals(false); } void OutputPage::changeBalanceSlider(double value) { - ui->volumeBalance->blockSignals(true); + QSignalBlocker blocker(ui->volumeBalance); int currentBalance = round(value * 100); ui->volumeBalance->setValue(currentBalance); - ui->volumeBalance->blockSignals(false); } void OutputPage::setActivePort(int index) { - QString namePort = ui->outputDevices->itemData(index, Qt::UserRole).toString(); - KLOG_DEBUG() << "Set Active Port:" << namePort; - if (m_defaultSink != nullptr) - m_defaultSink->SetActivePort(namePort); - else - KLOG_DEBUG() << "m_defaultSink is null"; + QString portName = ui->outputDevices->itemData(index, Qt::UserRole).toString(); + if (!m_defaultSink || portName.isNull()) + { + KLOG_INFO(qLcAudio) << QString("set default sink active port: %1 failed").arg(portName); + return; + } + + m_defaultSink->SetActivePort(portName); + KLOG_INFO(qLcAudio) << " set default sink Active Port:" << portName; } void OutputPage::setVolume(int value) { - double volumeValue = static_cast(ui->volumeSetting->sliderPosition()) / static_cast(100); - if (m_defaultSink != nullptr) - { - m_defaultSink->SetVolume(volumeValue); - KLOG_DEBUG() << "Set Volume:" << volumeValue; - } - else + double volumeValue = ui->volumeSetting->sliderPosition() / 100.0; + if (!m_defaultSink) { - KLOG_INFO() << "set volume failed, default Sink is null"; + KLOG_INFO(qLcAudio) << "set volume failed, default Sink is null"; + return; } + m_defaultSink->SetVolume(volumeValue); + KLOG_DEBUG(qLcAudio) << "set volume:" << volumeValue; } void OutputPage::setBalance(int value) { - double balanceValue = static_cast(value) / static_cast(100); - if (m_defaultSink != nullptr) - { - m_defaultSink->SetBalance(balanceValue); - KLOG_DEBUG() << "set balance" << balanceValue; - } - else + double balanceValue = value / 100.0; + if (!m_defaultSink) { - KLOG_INFO() << "set balance failed, default Sink is null"; + KLOG_INFO(qLcAudio) << "set balance failed, default Sink is null"; + return; } + m_defaultSink->SetBalance(balanceValue); + KLOG_DEBUG(qLcAudio) << "set balance" << balanceValue; } /** @@ -246,7 +237,7 @@ void OutputPage::setBalance(int value) void OutputPage::changeDefaultOutputCard(int index) { int cardIndex = ui->outputCards->itemData(index, Qt::UserRole).toInt(); - KLOG_INFO() << "change default output card, current output card Index:" << cardIndex; + KLOG_INFO(qLcAudio) << "change default output card, current output card Index:" << cardIndex; QDBusPendingReply getSinks = m_audioInterface->GetSinks(); QStringList sinksList = getSinks.value(); @@ -254,20 +245,17 @@ void OutputPage::changeDefaultOutputCard(int index) for (auto sink : sinksList) { AudioDeviceInterface audioSink(AUDIO_DBUS_NAME, sink, QDBusConnection::sessionBus(), this); - if (cardIndex == audioSink.card_index()) + if (cardIndex == audioSink.card_index() && audioSink.isAvailablePorts()) { - if (audioSink.isAvailablePorts()) - { - sinkIndex = audioSink.index(); - break; - } + sinkIndex = audioSink.index(); + break; } } if (sinkIndex == -1) { - KLOG_INFO() << "The sink with an available port corresponding to the card index was not found"; - KLOG_INFO() << "set default sink failed"; + KLOG_INFO(qLcAudio) << "The sink with an available port corresponding to the card index was not found"; + KLOG_INFO(qLcAudio) << "set default sink failed"; disableSettings(); return; } @@ -277,7 +265,7 @@ void OutputPage::changeDefaultOutputCard(int index) AudioDeviceInterface defaultSink(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); if (sinkIndex == defaultSink.index()) { - KLOG_DEBUG() << "current default sink:" << sinkIndex; + KLOG_DEBUG(qLcAudio) << "current default sink:" << sinkIndex; reload(); return; } @@ -287,10 +275,10 @@ void OutputPage::changeDefaultOutputCard(int index) void OutputPage::disableSettings() { - KLOG_INFO() << "disbale settings"; - ui->outputDevices->blockSignals(true); - ui->volumeSetting->blockSignals(true); - ui->volumeBalance->blockSignals(true); + KLOG_INFO(qLcAudio) << "disbale settings"; + QSignalBlocker outputDevicesBlocker(ui->outputDevices); + QSignalBlocker volumeSettingBlocker(ui->volumeSetting); + QSignalBlocker volumeBalanceBlocker(ui->volumeBalance); ui->outputDevices->insertItem(0, tr("No output device detected")); ui->outputDevices->setCurrentIndex(0); @@ -302,10 +290,6 @@ void OutputPage::disableSettings() ui->outputDevices->setEnabled(false); ui->volumeSetting->setEnabled(false); ui->volumeBalance->setEnabled(false); - - ui->outputDevices->blockSignals(false); - ui->volumeSetting->blockSignals(false); - ui->volumeBalance->blockSignals(false); } void OutputPage::setDefaultSink(int sinkIndex) @@ -318,13 +302,13 @@ void OutputPage::setDefaultSink(int sinkIndex) */ m_audioInterface->SetDefaultSink(sinkIndex); - KLOG_INFO() << QString("set default sink:%1").arg(sinkIndex); + KLOG_INFO(qLcAudio) << QString("set default sink:%1").arg(sinkIndex); disableSettings(); } void OutputPage::reload() { - KLOG_INFO() << "reload output device and settings"; + KLOG_INFO(qLcAudio) << "reload output device and settings"; // delete and restart init defaultSink clear(); initSettins(); @@ -337,13 +321,11 @@ void OutputPage::clear() m_defaultSink->deleteLater(); m_defaultSink = nullptr; } - ui->outputDevices->blockSignals(true); + QSignalBlocker outputDevicesBlocker(ui->outputDevices); ui->outputDevices->clear(); - ui->outputDevices->blockSignals(false); - ui->outputCards->blockSignals(true); + QSignalBlocker outputCardsBlocker(ui->outputCards); ui->outputCards->clear(); - ui->outputCards->blockSignals(false); } /** @@ -355,20 +337,20 @@ void OutputPage::clear() // 默认sink变了,重新比对card_index,重新加载sink和界面 void OutputPage::defaultSinkChanged(int index) { - KLOG_INFO() << "default sink changed"; + KLOG_INFO(qLcAudio) << "default sink changed"; reload(); } void OutputPage::addSink(int index) { - KLOG_DEBUG() << "Sink Added:" << index; + KLOG_DEBUG(qLcAudio) << "sink added:" << index; reload(); } // 当pulseAudio被kill时,会发出SinkDelete和SourceDelete信号 void OutputPage::deleteSink(uint index) { - KLOG_DEBUG() << "Sink Delete:" << index; + KLOG_DEBUG(qLcAudio) << "sink delete:" << index; reload(); } diff --git a/plugins/audio/src/plugin/volume-scale.cpp b/plugins/audio/src/plugin/volume-scale.cpp index 7646f802..a355b9f0 100644 --- a/plugins/audio/src/plugin/volume-scale.cpp +++ b/plugins/audio/src/plugin/volume-scale.cpp @@ -13,6 +13,7 @@ */ #include "volume-scale.h" +#include "logging-category.h" #include #include @@ -64,5 +65,5 @@ void VolumeScale::setPercent(qreal percent) { m_percent = percent; update(); - KLOG_DEBUG() << "m_percent:" << m_percent; + KLOG_DEBUG(qLcAudio) << "feed back percent:" << m_percent; } diff --git a/plugins/audio/src/system-tray/audio-system-tray.cpp b/plugins/audio/src/system-tray/audio-system-tray.cpp index e888e419..eb554b25 100644 --- a/plugins/audio/src/system-tray/audio-system-tray.cpp +++ b/plugins/audio/src/system-tray/audio-system-tray.cpp @@ -19,6 +19,7 @@ #include "kiran-rounded-tray-popup/kiran-rounded-tray-popup.h" #include "system-tray/mixed-setting-page.h" #include "system-tray/volume-setting-page.h" +#include "logging-category.h" #include #include @@ -80,12 +81,9 @@ void AudioSystemTray::initMixedSettingPage() void AudioSystemTray::initTrayIcon() { - getTrayIconStyle(); - 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)); } @@ -119,18 +117,15 @@ void AudioSystemTray::initConnect() { connect(m_systemTray, &QSystemTrayIcon::activated, this, &AudioSystemTray::handleAudioTrayClicked); - connect(m_volumeSettingPage,&VolumeSettingPage::volumeChanged,[=](double value) + connect(m_volumeSettingPage,&VolumeSettingPage::volumeChanged,[this](double value) { int currentVolume = round(value * 100); //表示数值的时候向上取整 - KLOG_DEBUG() << "m_sink volumeChanged :" << currentVolume; + KLOG_DEBUG(qLcAudio) << "sink volume changed :" << currentVolume; setTrayIcon(currentVolume); }); - connect(m_statusNotifierManager, &StatusNotifierManagerInterface::StyleChanged, [=](const QString &style) + connect(Kiran::StylePalette::instance(), &Kiran::StylePalette::themeChanged, [this](Kiran::PaletteType paletteType) { - KLOG_DEBUG() << "StyleChanged"; - //重新获取style - getTrayIconStyle(); //获取当前音量值重新设置TrayIcon QDBusPendingReply defaultSinkPath = m_audioInterface->GetDefaultSink(); AudioDeviceInterface defaultSink (AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus()); @@ -220,7 +215,6 @@ QPixmap AudioSystemTray::trayIconColorSwitch(const QString &iconPath, const int void AudioSystemTray::getTrayGeometry() { QDBusPendingReply getGeometry = m_statusNotifierManager->GetGeometry("~02-volume"); - KLOG_DEBUG() << "getGeometry.value():" << getGeometry.value(); double height, width, x, y; QJsonParseError jsonParseError; @@ -244,11 +238,11 @@ void AudioSystemTray::getTrayGeometry() m_widthTray = static_cast(width); m_xTray = static_cast(x); m_yTray = static_cast(y); - KLOG_DEBUG() << "getTrayGeometry "; - KLOG_DEBUG() << "heightTray" << m_heightTray; - KLOG_DEBUG() << "widthTray" << m_widthTray; - KLOG_DEBUG() << "xTray" << m_xTray; - KLOG_DEBUG() << "yTray" << m_yTray; + KLOG_DEBUG(qLcAudio) << "tray geometry" + << "height:" << m_heightTray + << "width:" << m_widthTray + << "x:" << m_xTray + << "y:" << m_yTray; } // XXX:频繁调用函数,需要优化 @@ -290,32 +284,3 @@ void AudioSystemTray::handleVolumeSettingClicked() process.startDetached("kiran-control-panel", arguments); } -//暂时不使用,改成从平台主题中获取颜色 -void AudioSystemTray::getTrayIconStyle() -{ - QDBusPendingReply getStyle = m_statusNotifierManager->GetStyle(); - KLOG_DEBUG() << "getStyle.value()" << getStyle.value(); - double red, green, blue, alpha; - QJsonParseError jsonParseError; - QJsonDocument doc = QJsonDocument::fromJson(getStyle.value().toLatin1(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isObject() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isObject()) - { - QJsonObject object = doc.object(); - QStringList list = object.keys(); - KLOG_DEBUG() << "fg_color" << object.value("fg_color"); - QJsonObject rgba = object.value("fg_color").toObject(); - red = rgba.value("red").toDouble(); - green = rgba.value("green").toDouble(); - blue = rgba.value("blue").toDouble(); - alpha = rgba.value("alpha").toDouble(); - } - } - } - //暂时用rgb,rgba设置无效,需要完善 - m_colorTheme = QString("rgb(%1,%2,%3)").arg(red * 255).arg(green * 255).arg(blue * 255); - KLOG_DEBUG() << "getTrayIconStyle:" << m_colorTheme; -} diff --git a/plugins/audio/src/system-tray/audio-system-tray.h b/plugins/audio/src/system-tray/audio-system-tray.h index fd5f150d..077f1991 100644 --- a/plugins/audio/src/system-tray/audio-system-tray.h +++ b/plugins/audio/src/system-tray/audio-system-tray.h @@ -47,7 +47,6 @@ public slots: void handleAudioTrayClicked(QSystemTrayIcon::ActivationReason reason); void handleMixedSettingClicked(); void handleVolumeSettingClicked(); - void getTrayIconStyle(); void setTrayIcon(int value); void handleAdjustedMixedSettingPageSize(); diff --git a/plugins/audio/src/system-tray/main.cpp b/plugins/audio/src/system-tray/main.cpp index 731a6d28..fec8300f 100644 --- a/plugins/audio/src/system-tray/main.cpp +++ b/plugins/audio/src/system-tray/main.cpp @@ -26,6 +26,8 @@ #include #include #include "dbus-tray-monitor.h" +#include "logging-category.h" + #define DBUS_SERVICE_KDE_STATUS_NOTIFIER_WATCHER "org.kde.StatusNotifierWatcher" @@ -34,13 +36,13 @@ int main(int argc, char *argv[]) KiranApplication a(argc, argv); QApplication::setQuitOnLastWindowClosed(false); klog_qt5_init("", "kylinsec-session", "kiran-cpanel-audio", "kiran-cpanel-audio"); - KLOG_INFO() << "autostart!"; + KLOG_INFO(qLcAudio) << "audio tray autostart!"; QTranslator translator; if (translator.load(QLocale(), "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) { a.installTranslator(&translator); - KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); + KLOG_DEBUG(qLcAudio) << "installTranslator load:" << a.installTranslator(&translator); } else { @@ -50,7 +52,7 @@ int main(int argc, char *argv[]) AudioSystemTray *audioSystemTray = nullptr; if (KiranControlPanel::isDBusTrayAvailable()) { - KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; + KLOG_DEBUG(qLcAudio) << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; audioSystemTray = new AudioSystemTray; } else @@ -62,7 +64,7 @@ int main(int argc, char *argv[]) { if(audioSystemTray == nullptr) { - KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; + KLOG_DEBUG(qLcAudio) << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; audioSystemTray = new AudioSystemTray; } }); diff --git a/plugins/audio/src/system-tray/mixed-setting-page.cpp b/plugins/audio/src/system-tray/mixed-setting-page.cpp index 627e82b2..e01eb5d0 100644 --- a/plugins/audio/src/system-tray/mixed-setting-page.cpp +++ b/plugins/audio/src/system-tray/mixed-setting-page.cpp @@ -21,6 +21,7 @@ #include #include #include +#include "logging-category.h" #include #include @@ -84,16 +85,17 @@ void MixedSettingPage::initSink() void MixedSettingPage::initSinkInput() { QDBusPendingReply getSinkInputs = m_audioInterface->GetSinkInputs(); - KLOG_DEBUG() << "getSinkInputs:" << getSinkInputs.value(); + KLOG_DEBUG(qLcAudio) << "all sink inputs:" << getSinkInputs.value(); QStringList sinkInputsList = getSinkInputs.value(); for (int i = 0; i < sinkInputsList.count(); ++i) { QString objectPath = sinkInputsList.at(i); - KLOG_DEBUG() << "objectPath :" << objectPath << "count:" << objectPath.count(); VolumeSettingPage *sinkInputSettings = new VolumeSettingPage(AUDIO_STREAM, objectPath); int index = objectPath.mid(49).toInt(); //获取SinkInput的index - KLOG_DEBUG() << "index" << index; + KLOG_DEBUG(qLcAudio) << "objectPath :" << objectPath + << "count:" << objectPath.count() + << "index:" << index; m_sinkInputsMap[index] = sinkInputSettings; m_vboxLayout->addWidget(sinkInputSettings); // m_vboxScrollAreaLayout->addWidget(sinkInputSettings); @@ -102,9 +104,8 @@ void MixedSettingPage::initSinkInput() void MixedSettingPage::handleSinkInputAdded(int index) { - KLOG_DEBUG() << "SinkInputAdded index: " << index; QString objectPath = QString("/com/kylinsec/Kiran/SessionDaemon/Audio/SinkInput%1").arg(index); - KLOG_DEBUG() << "SinkInputAdded objectPath:" << objectPath; + KLOG_DEBUG(qLcAudio) << "sink input added index: " << index << "objectPath:" << objectPath; VolumeSettingPage *sinkInputAdded = new VolumeSettingPage(AUDIO_STREAM, objectPath); m_sinkInputsMap[index] = sinkInputAdded; m_vboxLayout->addWidget(sinkInputAdded); @@ -114,7 +115,7 @@ void MixedSettingPage::handleSinkInputAdded(int index) void MixedSettingPage::handleSinkInputDelete(int index) { - KLOG_DEBUG() << "SinkInputDelete index: " << index; + KLOG_DEBUG(qLcAudio) << "Sink Input Delete index: " << index; delete m_sinkInputsMap[index]; m_sinkInputsMap[index] = nullptr; int removeNum = m_sinkInputsMap.remove(index); @@ -125,7 +126,6 @@ void MixedSettingPage::handleSinkInputDelete(int index) int MixedSettingPage::getHeight() { - // KLOG_DEBUG() << "m_vboxLayout->sizeHint():" << m_vboxLayout->sizeHint(); int height = 66 * (m_sinkInputsMap.count() + 1); if (height > 198) diff --git a/plugins/audio/src/system-tray/volume-setting-page.cpp b/plugins/audio/src/system-tray/volume-setting-page.cpp index 01096636..03116c74 100644 --- a/plugins/audio/src/system-tray/volume-setting-page.cpp +++ b/plugins/audio/src/system-tray/volume-setting-page.cpp @@ -16,6 +16,7 @@ #include "dbus/audio-interface.h" #include "dbus/audio-stream-interface.h" #include "ui_volume-setting-page.h" +#include "logging-category.h" #include #include @@ -43,7 +44,7 @@ VolumeSettingPage::VolumeSettingPage(enum AudioNode audio, const QString objectP connect(m_sink, &AudioDeviceInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged); connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) { - double volumeValue = static_cast(value) / static_cast(100); + double volumeValue = value / 100.0; m_sink->SetVolume(volumeValue); }); connect(m_audioInterface, &AudioInterface::SinkAdded, this, &VolumeSettingPage::handleSinkAdded); @@ -73,13 +74,12 @@ void VolumeSettingPage::initDbusServiceWatcher() m_dbusServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, [this](const QString &service) { - KLOG_DEBUG() << "serviceUnregistered:" << service; + KLOG_DEBUG(qLcAudio) << "dbus service unregistered:" << service; disableSettings(); }); } void VolumeSettingPage::initAudioDevice() { - KLOG_DEBUG() << "AUDIO_DEVICE"; QDBusPendingReply getPorts = m_sink->GetPorts(); // 解析默认sink的端口信息 QJsonParseError jsonParseError; @@ -98,13 +98,12 @@ void VolumeSettingPage::initAudioDevice() void VolumeSettingPage::initAudioStream() { - KLOG_DEBUG() << "AUDIO_STREAM"; initSettings(m_sinkInput); ui->volumeName->setText(m_sinkInput->GetProperty("application.name")); connect(m_sinkInput, &AudioStreamInterface::volumeChanged, this, &VolumeSettingPage::handleVolumeChanged); - connect(ui->volumeSetting, &QSlider::valueChanged, [=](int value) + connect(ui->volumeSetting, &QSlider::valueChanged, [this](int value) { - double volumeValue = static_cast(value) / static_cast(100); + double volumeValue = value / 100.0; m_sinkInput->SetVolume(volumeValue); }); } @@ -116,7 +115,7 @@ void VolumeSettingPage::initSettings(Audio *audio) ui->volumeSetting->setPageStep(1); ui->volumeSetting->setEnabled(true); - KLOG_DEBUG() << "current volume:" << audio->volume(); + KLOG_DEBUG(qLcAudio) << "current volume:" << audio->volume(); double currentVolumeDouble = audio->volume() * 100; int currentVolume = round(currentVolumeDouble); setVolumeIcon(currentVolume); @@ -126,12 +125,11 @@ void VolumeSettingPage::initSettings(Audio *audio) void VolumeSettingPage::handleVolumeChanged(double value) { - ui->volumeSetting->blockSignals(true); // 为了避免拖动的同时设置位置会出现问题 + QSignalBlocker blocker(ui->volumeSetting); // 为了避免拖动的同时设置位置会出现问题 int currentVolume = round(value * 100); // 表示数值的时候向上取整 ui->volume->setText(QString::number(currentVolume) + "%"); setVolumeIcon(currentVolume); ui->volumeSetting->setValue(currentVolume); - ui->volumeSetting->blockSignals(false); emit volumeChanged(value); } @@ -145,7 +143,7 @@ void VolumeSettingPage::handleMuteButtonClicked() void VolumeSettingPage::handleDefaultSinkChanged(int index) { - KLOG_DEBUG() << "Default Sink Changed"; + KLOG_DEBUG(qLcAudio) << "Default Sink Changed"; // delete and restart init defaultSink if (m_sink != nullptr) { @@ -161,7 +159,7 @@ void VolumeSettingPage::handleDefaultSinkChanged(int index) void VolumeSettingPage::handleSinkAdded(int index) { - KLOG_DEBUG() << "SinkAdded"; + KLOG_DEBUG(qLcAudio) << "sink added index:" << index; // 当已经存在defaultSink时,暂时不处理其他sink的添加 if (m_sink != nullptr) { @@ -202,14 +200,14 @@ void VolumeSettingPage::clickMuteButton(Audio *audio) audio->SetMute(true); } audio->SetVolume(0); - KLOG_DEBUG() << "current sink is mute :" << audio->mute(); + KLOG_DEBUG(qLcAudio) << "current sink is mute :" << audio->mute(); } else { if (m_volumeBeforeMute != 0) { //重新设置音量时,会自动解除静音状态 - audio->SetVolume(static_cast(m_volumeBeforeMute) / static_cast(100)); + audio->SetVolume(m_volumeBeforeMute / 100.0); m_volumeBeforeMute = 0; } } -- Gitee From 3c21a42361ab694dc0952319d32d82a2c91824d1 Mon Sep 17 00:00:00 2001 From: luoqing Date: Tue, 12 Dec 2023 14:43:01 +0800 Subject: [PATCH 10/17] refactor(network):Modify the network plugin code according to the review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根据https://gitee.com/openeuler/kiran-control-panel/pulls/191 评审意见,修改网络插件代码 --- plugins/network/CMakeLists.txt | 2 - plugins/network/data/network.conf | 4 - plugins/network/src/connection-list.cpp | 11 +- plugins/network/src/general.h | 15 ++ .../src/plugin/connection-itemwidget.cpp | 67 +++--- .../src/plugin/connection-show-page.cpp | 3 +- .../src/plugin/cpanel-network-widget.cpp | 13 +- .../connection-details-widget.cpp | 16 +- .../src/plugin/details-page/details-page.cpp | 37 ++-- .../device-available-connection-widget.cpp | 21 +- plugins/network/src/plugin/device-list.cpp | 55 +++-- .../network/src/plugin/manager/manager.cpp | 12 +- .../src/plugin/manager/vpn-manager.cpp | 59 ++--- .../src/plugin/manager/wired-manager.cpp | 3 +- plugins/network/src/plugin/network-plugin.cpp | 29 --- plugins/network/src/plugin/network-plugin.h | 2 - .../network/src/plugin/network-subitem.cpp | 17 +- plugins/network/src/plugin/network-subitem.h | 14 ++ .../src/plugin/plugin-connection-list.cpp | 16 +- .../setting-widget/connection-name-widget.cpp | 3 +- .../disconnect-and-delete-button.cpp | 9 +- .../plugin/setting-widget/ethernet-widget.cpp | 5 +- .../src/plugin/setting-widget/ipv4-widget.cpp | 33 +-- .../src/plugin/setting-widget/ipv6-widget.cpp | 21 +- .../plugin/setting-widget/vpn/vpn-ipsec.cpp | 7 +- .../plugin/setting-widget/vpn/vpn-ipvx.cpp | 3 +- .../src/plugin/setting-widget/vpn/vpn-ppp.cpp | 11 +- .../plugin/setting-widget/vpn/vpn-widget.cpp | 19 +- .../plugin/setting-widget/wireless-widget.cpp | 3 +- .../src/plugin/settings/setting-page.cpp | 13 +- .../plugin/settings/wired-setting-page.cpp | 3 +- .../plugin/settings/wireless-setting-page.cpp | 5 +- plugins/network/src/signal-forward.cpp | 11 +- plugins/network/src/status-notification.cpp | 3 +- plugins/network/src/tray/main.cpp | 9 +- plugins/network/src/tray/network-tray.cpp | 206 +++++++++--------- plugins/network/src/tray/network-tray.h | 34 ++- .../network/src/tray/tray-connection-list.cpp | 16 +- plugins/network/src/tray/tray-page.cpp | 11 +- plugins/network/src/tray/tray-widget.cpp | 17 +- .../network/src/tray/wired-tray-widget.cpp | 27 +-- .../network/src/tray/wireless-tray-widget.cpp | 63 +++--- plugins/network/src/utils.h | 1 - settings.ini.in | 7 +- 44 files changed, 506 insertions(+), 430 deletions(-) delete mode 100644 plugins/network/data/network.conf diff --git a/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt index d2fc4704..8708fcb8 100644 --- a/plugins/network/CMakeLists.txt +++ b/plugins/network/CMakeLists.txt @@ -95,8 +95,6 @@ set(NETWORK_SERVER_CONF /etc/NetworkManager/conf.d) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/00-server.conf.in ${CMAKE_CURRENT_BINARY_DIR}/00-server.conf @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/00-server.conf DESTINATION ${NETWORK_SERVER_CONF}/) -set(NETWORK_PLUGIN_CONF /etc/kiran-control-panel/plugins) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/network.conf DESTINATION ${NETWORK_PLUGIN_CONF}/) #安装插件和二进制文件 install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) diff --git a/plugins/network/data/network.conf b/plugins/network/data/network.conf deleted file mode 100644 index dd5a52be..00000000 --- a/plugins/network/data/network.conf +++ /dev/null @@ -1,4 +0,0 @@ -[CheckInternetConnectivity] -Enable=true -Address=www.kylinsec.com.cn -Port=80 \ No newline at end of file diff --git a/plugins/network/src/connection-list.cpp b/plugins/network/src/connection-list.cpp index 19314368..adfdd4bd 100644 --- a/plugins/network/src/connection-list.cpp +++ b/plugins/network/src/connection-list.cpp @@ -19,6 +19,7 @@ #include "general.h" #include #include "utils.h" +#include "logging-category.h" using namespace NetworkManager; @@ -104,10 +105,10 @@ void ConnectionList::showConnectionList(NetworkManager::ConnectionSettings::Conn QString devicePath = device->uni(); for (Connection::Ptr conn : connectionList) { - KLOG_DEBUG() << "connection name:" << conn->name(); + KLOG_DEBUG(qLcNetwork) << "connection name:" << conn->name(); if (conn->settings()->connectionType() == ConnectionSettings::Wired) { - KLOG_DEBUG() << "deviceName:" << device->interfaceName(); + KLOG_DEBUG(qLcNetwork) << "deviceName:" << device->interfaceName(); addConnection(conn, devicePath); } } @@ -129,7 +130,7 @@ void ConnectionList::showWirelessNetworkList() Device::Ptr device = findNetworkInterface(m_devicePath); if (device->type() == Device::Wifi) { - KLOG_DEBUG() << "dev->interfaceName():" << device->interfaceName(); + KLOG_DEBUG(qLcNetwork) << "dev->interfaceName():" << device->interfaceName(); QSharedPointer wirelessDevice = qobject_cast(device); WirelessNetwork::List wirelessNetworkList = wirelessDevice->networks(); QString devicePath = wirelessDevice->uni(); @@ -264,7 +265,7 @@ void ConnectionList::handleActiveStateDeactivated(const QString &activeConnectio // 没有找到item则直接返回 if (activeItemWidget == nullptr) { - KLOG_DEBUG() << "Activated item was no found"; + KLOG_DEBUG(qLcNetwork) << "Activated item was no found"; return; } clearItemWidgetActiveConnectionInfo(activeItemWidget); @@ -307,7 +308,7 @@ void ConnectionList::sort() if (m_itemWidgetList.count() == 0) { - KLOG_DEBUG() << "Sorting failed, connection list cannot be empty."; + KLOG_DEBUG(qLcNetwork) << "Sorting failed, connection list cannot be empty."; return; } diff --git a/plugins/network/src/general.h b/plugins/network/src/general.h index 9423b9c4..8aa4f67c 100644 --- a/plugins/network/src/general.h +++ b/plugins/network/src/general.h @@ -22,6 +22,21 @@ #define MAX_WAIT_COUNTS 10 #define PLUGIN_ITEM_WIDGET_HEIGHT 36 +enum NetworkState +{ + WIRED_CONNECTED, + WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET, + WIRELESS_CONNECTED, + WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET, + DISCONNECTED +}; + +struct NetworkStateInfo +{ + QString iconPath; + QString description; +}; + struct WirelessConnectionInfo { int signalStrength = 0; diff --git a/plugins/network/src/plugin/connection-itemwidget.cpp b/plugins/network/src/plugin/connection-itemwidget.cpp index 1adf30d4..5c3b245a 100644 --- a/plugins/network/src/plugin/connection-itemwidget.cpp +++ b/plugins/network/src/plugin/connection-itemwidget.cpp @@ -32,6 +32,7 @@ #include "status-notification.h" #include "text-input-dialog.h" #include "utils.h" +#include "logging-category.h" using namespace NetworkManager; // 使用默认析构函数,父对象被释放时,会释放子对象 @@ -98,7 +99,7 @@ void ConnectionItemWidget::initPluginItemWidget() m_horizonLayout->addWidget(m_connectionName); m_horizonLayout->addStretch(); - m_horizonEditAndMoreOptions = new QHBoxLayout(); + m_horizonEditAndMoreOptions = new QHBoxLayout(); m_horizonEditAndMoreOptions->addWidget(m_editButton); m_horizonEditAndMoreOptions->addWidget(m_moreOptions); m_horizonEditAndMoreOptions->setMargin(0); @@ -137,7 +138,7 @@ void ConnectionItemWidget::setName(const QString& name) // { // nameStr = fontMetricsF.elidedText(nameStr,Qt::ElideRight,m_connectionName->width()); // } - // KLOG_DEBUG() << "elidedText:" << nameStr; + // KLOG_DEBUG(qLcNetwork) << "elidedText:" << nameStr; m_connectionName->setText(nameStr); m_editButton->setAccessibleName(QString("ButtonEditConnectionName::%1").arg(nameStr)); } @@ -277,15 +278,15 @@ void ConnectionItemWidget::activateConnection(const QString& connectionPath, con return; } - KLOG_DEBUG() << "Will activate the device:" << m_connectionInfo.devicePath; + KLOG_DEBUG(qLcNetwork) << "Will activate the device:" << m_connectionInfo.devicePath; QString connectionUni = connectionPath.isEmpty() ? m_connectionInfo.connectionPath : connectionPath; QString devicePath = m_connectionInfo.devicePath; - if(!devicePath.isEmpty()) + if (!devicePath.isEmpty()) { Device::Ptr device = NetworkManager::findNetworkInterface(devicePath); auto devicestate = device->state(); - KLOG_DEBUG() << "current device state:" << devicestate; + KLOG_DEBUG(qLcNetwork) << "current device state:" << devicestate; if (devicestate == Device::Unavailable) { StatusNotification::connectitonFailedNotifyByReason(tr("The current device:%1 is not available").arg(device->interfaceName())); @@ -300,7 +301,7 @@ void ConnectionItemWidget::activateConnection(const QString& connectionPath, con if (reply.isError()) { // 此处处理进入激活流程失败的原因,并不涉及流程中某个具体阶段失败的原因 - KLOG_ERROR() << "activate connection failed:" << reply.error(); + KLOG_ERROR(qLcNetwork) << "activate connection failed:" << reply.error(); QString errorMessage = reply.error().message(); if (errorMessage.contains("device has no carrier")) { @@ -313,7 +314,7 @@ void ConnectionItemWidget::activateConnection(const QString& connectionPath, con } else { - KLOG_DEBUG() << "activateConnection reply:" << reply.reply(); + KLOG_DEBUG(qLcNetwork) << "activateConnection reply:" << reply.reply(); } } @@ -326,7 +327,7 @@ void ConnectionItemWidget::activateHiddenNetwork(const QString& ssid) // 若要连接的隐藏网络已经被显式探测到了,则返回 if (wirelessDevice->findNetwork(ssid) != nullptr) { - KLOG_DEBUG() << "Hidden networks have been explicitly detected,return"; + KLOG_DEBUG(qLcNetwork) << "Hidden networks have been explicitly detected,return"; StatusNotification::connectitonHiddenNetworkFailedNotify(ssid); return; } @@ -362,7 +363,7 @@ void ConnectionItemWidget::updateConnection() if (!mac.isEmpty() && (mac != hardwareAddress)) { - KLOG_INFO() << "绑定的设备地址发生改变"; + KLOG_INFO(qLcNetwork) << "the binding device MAC has changed"; SignalForward::instance()->connectionMacChanged(connectionPath, hardwareAddress); return; } @@ -382,11 +383,11 @@ void ConnectionItemWidget::disconnectConnection() reply.waitForFinished(); if (reply.isError()) { - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); } else { - KLOG_INFO() << "DeactivateConnection reply:" << reply.reply(); + KLOG_INFO(qLcNetwork) << "DeactivateConnection reply:" << reply.reply(); } } @@ -406,11 +407,11 @@ void ConnectionItemWidget::removeConnection() StatusNotification::connectionDeleteNotify(connectionName); if (reply.isError()) { - KLOG_INFO() << "Delete the connection failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Delete the connection failed:" << reply.error(); } else { - KLOG_INFO() << "remove the connection :" << this->connectionPath(); + KLOG_INFO(qLcNetwork) << "remove the connection :" << this->connectionPath(); } } @@ -425,13 +426,12 @@ void ConnectionItemWidget::setSecurityPskAndActivateWirelessConnection(const QSt addAndActivateWirelessConnection(m_connnectionSettings); } - // NOTE:ignore无线网络会删除配置,功能目前与remove重合 void ConnectionItemWidget::ignoreWirelessNetwork() { QString devicePath = m_connectionInfo.devicePath; Connection::Ptr connection = NetworkUtils::getAvailableConnectionBySsid(devicePath, ssid()); - if(connection.isNull()) + if (connection.isNull()) { return; } @@ -440,11 +440,11 @@ void ConnectionItemWidget::ignoreWirelessNetwork() reply.waitForFinished(); if (reply.isError()) { - KLOG_INFO() << "remove the connection failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "remove the connection failed:" << reply.error(); } else { - KLOG_INFO() << "ignore the wireless network:" << ssid(); + KLOG_INFO(qLcNetwork) << "ignore the wireless network:" << ssid(); } } @@ -462,7 +462,7 @@ void ConnectionItemWidget::requireInputPassword() void ConnectionItemWidget::requireHiddenNetworkName() { - KLOG_DEBUG() << "connect hidden network"; + KLOG_DEBUG(qLcNetwork) << "connect hidden network"; TextInputDialog ssidInputDialog; ssidInputDialog.setTitle(tr("Tips")); QString tips = QString(tr("Please input a network name")); @@ -476,7 +476,7 @@ void ConnectionItemWidget::addAndActivateWirelessConnection(NetworkManager::Conn const QString ssid = m_connectionInfo.wirelessInfo.ssid; const QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; const QString devicePath = m_connectionInfo.devicePath; - KLOG_DEBUG() << "accessPointPath" << accessPointPath; + KLOG_DEBUG(qLcNetwork) << "accessPointPath" << accessPointPath; QDBusPendingReply reply = NetworkManager::addAndActivateConnection(connectionSettings->toMap(), devicePath, accessPointPath); @@ -484,7 +484,7 @@ void ConnectionItemWidget::addAndActivateWirelessConnection(NetworkManager::Conn reply.waitForFinished(); if (reply.isError()) { - KLOG_DEBUG() << "Connection failed: " << reply.error(); + KLOG_DEBUG(qLcNetwork) << "Connection failed: " << reply.error(); StatusNotification::connectitonFailedNotifyByName(ssid); } } @@ -492,7 +492,7 @@ void ConnectionItemWidget::addAndActivateWirelessConnection(NetworkManager::Conn void ConnectionItemWidget::activateWirelessNetwork() { QString ssid = m_connectionInfo.wirelessInfo.ssid; - KLOG_DEBUG() << "Activate Selected Wireless Network:" << ssid; + KLOG_DEBUG(qLcNetwork) << "Activate Selected Wireless Network:" << ssid; QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; // 连接隐藏网络 @@ -509,22 +509,19 @@ void ConnectionItemWidget::activateWirelessNetwork() if (!connection.isNull()) { activateConnection(connection->path(), accessPointPath); + return; } - else + + m_connnectionSettings = NetworkUtils::createWirelessConnectionSettings(ssid, devicePath, accessPointPath); + WirelessSecuritySetting::Ptr wirelessSecurity = + m_connnectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); + WirelessSecuritySetting::KeyMgmt keyMgmt = wirelessSecurity->keyMgmt(); + if (keyMgmt != WirelessSecuritySetting::KeyMgmt::WpaNone) { - m_connnectionSettings = NetworkUtils::createWirelessConnectionSettings(ssid, devicePath, accessPointPath); - WirelessSecuritySetting::Ptr wirelessSecurity = - m_connnectionSettings->setting(NetworkManager::Setting::WirelessSecurity).dynamicCast(); - WirelessSecuritySetting::KeyMgmt keyMgmt = wirelessSecurity->keyMgmt(); - if (keyMgmt != WirelessSecuritySetting::KeyMgmt::WpaNone) - { - requireInputPassword(); - } - else - { - addAndActivateWirelessConnection(m_connnectionSettings); - } + requireInputPassword(); + return; } + addAndActivateWirelessConnection(m_connnectionSettings); } void ConnectionItemWidget::handleThemeChanged(Kiran::PaletteType paletteType) @@ -544,7 +541,7 @@ void ConnectionItemWidget::mousePressEvent(QMouseEvent* event) { activateWirelessNetwork(); } - else if(type() == ConnectionSettings::Wired) + else if (type() == ConnectionSettings::Wired) { activateConnection(); } diff --git a/plugins/network/src/plugin/connection-show-page.cpp b/plugins/network/src/plugin/connection-show-page.cpp index a0d81507..fee53a01 100644 --- a/plugins/network/src/plugin/connection-show-page.cpp +++ b/plugins/network/src/plugin/connection-show-page.cpp @@ -22,6 +22,7 @@ #include #include "animation-loading-label.h" #include "ui_connection-show-page.h" +#include "logging-category.h" using namespace NetworkManager; #define PLUGIN_ITEM_WIDGET_HEIGHT 36 @@ -148,7 +149,7 @@ void ConnectionShowPage::handleToggledSwitchButton(bool toggled) #define PLUGIN_ITEM_WIDGET_HEIGHT 36 void ConnectionShowPage::handleWirelessEnabledChanged(bool enabled) { - KLOG_DEBUG() << "Wireless Enabled Changed:" << enabled; + KLOG_DEBUG(qLcNetwork) << "Wireless Enabled Changed:" << enabled; //处理通过命令行等其他方式禁用无线网络的情况 m_switchButton->blockSignals(true); m_switchButton->setChecked(enabled); diff --git a/plugins/network/src/plugin/cpanel-network-widget.cpp b/plugins/network/src/plugin/cpanel-network-widget.cpp index bc60f333..9e7012b7 100644 --- a/plugins/network/src/plugin/cpanel-network-widget.cpp +++ b/plugins/network/src/plugin/cpanel-network-widget.cpp @@ -22,6 +22,7 @@ #include "vpn-manager.h" #include "wired-manager.h" #include "wireless-manager.h" +#include "logging-category.h" using namespace NetworkManager; #define MAX_WAIT_COUNTS 10 @@ -175,13 +176,13 @@ void CPanelNetworkWidget::initWirelessManager() void CPanelNetworkWidget::changeDeviceState(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) { - KLOG_DEBUG() << "new state:" << newstate; - KLOG_DEBUG() << "old state:" << oldstate; - KLOG_DEBUG() << "reason:" << reason; + KLOG_DEBUG(qLcNetwork) << "new state:" << newstate; + KLOG_DEBUG(qLcNetwork) << "old state:" << oldstate; + KLOG_DEBUG(qLcNetwork) << "reason:" << reason; auto device = qobject_cast(sender()); if (device == nullptr) { - KLOG_DEBUG() << "device is null"; + KLOG_DEBUG(qLcNetwork) << "device is null"; return; } @@ -319,7 +320,7 @@ void CPanelNetworkWidget::changeSideBarItem(QListWidgetItem *item) replyRequestScan.waitForFinished(); if (replyRequestScan.isError()) { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); + KLOG_DEBUG(qLcNetwork) << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); } } } @@ -327,7 +328,7 @@ void CPanelNetworkWidget::changeSideBarItem(QListWidgetItem *item) void CPanelNetworkWidget::removeDevice(const QString &devicePath) { - KLOG_DEBUG() << "DeviceRemoved: " << devicePath; + KLOG_DEBUG(qLcNetwork) << "DeviceRemoved: " << devicePath; auto newWiredDeviceList = NetworkUtils::getManagedDeviceList(Device::Ethernet); auto newWirelessDeviceList = NetworkUtils::getManagedDeviceList(Device::Wifi); 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 f05df2c3..08e04f74 100644 --- a/plugins/network/src/plugin/details-page/connection-details-widget.cpp +++ b/plugins/network/src/plugin/details-page/connection-details-widget.cpp @@ -22,6 +22,8 @@ #include #include "ui_connection-details-widget.h" #include "utils.h" +#include "logging-category.h" + using namespace NetworkManager; using namespace NetworkUtils; @@ -144,7 +146,7 @@ void ConnectionDetailsWidget::setWirelessSpecificDetails() void ConnectionDetailsWidget::setIpDetails() { - KLOG_INFO() << m_device << "ip details"; + KLOG_INFO(qLcNetwork) << m_device << "ip details"; IpConfig ipV4Config = m_activeConnection->ipV4Config(); IpAddress ipv4Address = ipV4Config.addresses().value(0); @@ -211,10 +213,10 @@ void ConnectionDetailsWidget::setIpDetails() ui->ipv6->setText(ipv6); ui->prefix->setText(QString::number(prefix)); - KLOG_INFO() << "active connection state:" << m_activeConnection->state(); - KLOG_INFO() << "ipv4:" << address; - KLOG_INFO() << "netmask:" << netmask; - KLOG_INFO() << "gateway:" << gateway; - KLOG_INFO() << "dhcp options:" << dhcpOptions; - KLOG_INFO() << "ipv6:" << ipv6; + KLOG_INFO(qLcNetwork) << "active connection state:" << m_activeConnection->state(); + KLOG_INFO(qLcNetwork) << "ipv4:" << address; + KLOG_INFO(qLcNetwork) << "netmask:" << netmask; + KLOG_INFO(qLcNetwork) << "gateway:" << gateway; + KLOG_INFO(qLcNetwork) << "dhcp options:" << dhcpOptions; + KLOG_INFO(qLcNetwork) << "ipv6:" << ipv6; } diff --git a/plugins/network/src/plugin/details-page/details-page.cpp b/plugins/network/src/plugin/details-page/details-page.cpp index 167b67de..5f4dd32a 100644 --- a/plugins/network/src/plugin/details-page/details-page.cpp +++ b/plugins/network/src/plugin/details-page/details-page.cpp @@ -14,7 +14,7 @@ #include "details-page.h" #include - +#include "logging-category.h" #include "connection-details-widget.h" #include "ui_details-page.h" #include "utils.h" @@ -37,23 +37,28 @@ DetailsPage::~DetailsPage() delete ui; } +// TODO:消除嵌套 void DetailsPage::initUI() { ui->selectConnectionwidget->setVisible(false); Device::List deviceList = networkInterfaces(); for (Device::Ptr device : deviceList) { - if ((device->type() == Device::Wifi) || - (device->type() == Device::Ethernet)) + if ((device->type() != Device::Wifi) && + (device->type() != Device::Ethernet)) + { + continue; + } + + ActiveConnection::Ptr activeConnection = device->activeConnection(); + if (activeConnection.isNull()) + { + continue; + } + + if (activeConnection->state() == ActiveConnection::Activated) { - ActiveConnection::Ptr activeConnection = device->activeConnection(); - if (activeConnection != nullptr) - { - if (activeConnection->state() == ActiveConnection::Activated) - { - m_deviceList << device; - } - } + m_deviceList << device; } } @@ -128,25 +133,25 @@ void DetailsPage::deviceStateChanged(NetworkManager::Device::State newstate, Net void DetailsPage::changeIpV4Config() { auto device = qobject_cast(sender()); - KLOG_DEBUG() << device << "ipV4 Config Changed"; + KLOG_DEBUG(qLcNetwork) << device << "ipV4 Config Changed"; updateDetails(); } void DetailsPage::changeIpV6Config() { auto device = qobject_cast(sender()); - KLOG_DEBUG() << device << "ipV6 Config Changed"; + KLOG_DEBUG(qLcNetwork) << device << "ipV6 Config Changed"; updateDetails(); } void DetailsPage::changeDhcp4Config() { auto device = qobject_cast(sender()); - KLOG_DEBUG() << device << "dhcp4 config changed"; + KLOG_DEBUG(qLcNetwork) << device << "dhcp4 config changed"; updateDetails(); } void DetailsPage::changeDhcp6Config() { auto device = qobject_cast(sender()); - KLOG_DEBUG() << device << "dhcp6 config changed"; + KLOG_DEBUG(qLcNetwork) << device << "dhcp6 config changed"; updateDetails(); } @@ -170,7 +175,7 @@ void DetailsPage::clear() void DetailsPage::reload() { - KLOG_DEBUG() << "refresh details page"; + KLOG_DEBUG(qLcNetwork) << "refresh details page"; m_reloadTimer.stop(); clear(); initUI(); diff --git a/plugins/network/src/plugin/device-available-connection-widget.cpp b/plugins/network/src/plugin/device-available-connection-widget.cpp index 8ae8362f..b05a1202 100644 --- a/plugins/network/src/plugin/device-available-connection-widget.cpp +++ b/plugins/network/src/plugin/device-available-connection-widget.cpp @@ -26,6 +26,7 @@ #include "general.h" #include "signal-forward.h" #include "utils.h" +#include "logging-category.h" using namespace NetworkManager; using namespace NetworkUtils; @@ -39,7 +40,7 @@ DeviceAvailableConnectionWidget::DeviceAvailableConnectionWidget(NetworkManager: m_device = device; m_devicePath = m_device->uni(); m_deviceType = m_device->type(); - KLOG_DEBUG() << m_device; + KLOG_DEBUG(qLcNetwork) << m_device; initUI(); initConnect(); @@ -93,7 +94,7 @@ void DeviceAvailableConnectionWidget::onAddWirelessNetwork(NetworkManager::Wirel connectionInfo.wirelessInfo.ssid = network->ssid(); connectionInfo.wirelessInfo.accessPointPath = accessPoint->uni(); connectionInfo.wirelessInfo.signalStrength = accessPoint->signalStrength(); - KLOG_DEBUG() << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; + KLOG_DEBUG(qLcNetwork) << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; if (accessPoint->capabilities() == AccessPoint::Capability::None) connectionInfo.wirelessInfo.securitySetting = false; @@ -114,7 +115,7 @@ void DeviceAvailableConnectionWidget::onAddWirelessNetwork(NetworkManager::Wirel void DeviceAvailableConnectionWidget::addActiveConnection(const QString &activePath) { ActiveConnection::Ptr activatedConnection = findActiveConnection(activePath); - KLOG_DEBUG() << "add activatedConnection id:" << activatedConnection->id(); + KLOG_DEBUG(qLcNetwork) << "add activatedConnection id:" << activatedConnection->id(); QStringList deviceList = activatedConnection->devices(); if (!deviceList.contains(m_devicePath)) { @@ -123,24 +124,24 @@ void DeviceAvailableConnectionWidget::addActiveConnection(const QString &activeP ConnectionItemWidget *activeItem; QString uuid = activatedConnection->uuid(); - KLOG_DEBUG() << "add activatedConnection uuid:" << uuid; + KLOG_DEBUG(qLcNetwork) << "add activatedConnection uuid:" << uuid; activeItem = findConnectionItemByUuid(uuid); if (activeItem == nullptr) { ConnectionSettings::Ptr settings = activatedConnection->connection()->settings(); WirelessSetting::Ptr wirelessSetting = settings->setting(Setting::Wireless).dynamicCast(); QString ssid = wirelessSetting->ssid(); - KLOG_DEBUG() << "add activatedConnection ssid:" << ssid; + KLOG_DEBUG(qLcNetwork) << "add activatedConnection ssid:" << ssid; activeItem = findConnectionItemBySsid(ssid); } if (activeItem == nullptr) { - KLOG_DEBUG() << "no found connection by uuid and ssid"; + KLOG_DEBUG(qLcNetwork) << "no found connection by uuid and ssid"; return; } - KLOG_DEBUG() << "Active Connection State:" << activatedConnection->state(); + KLOG_DEBUG(qLcNetwork) << "Active Connection State:" << activatedConnection->state(); activeItem->setActiveConnectionPath(activePath); activeItem->setActiveStatus(activatedConnection->state()); @@ -166,7 +167,7 @@ void DeviceAvailableConnectionWidget::removeActiveConnection(const QString &acti void DeviceAvailableConnectionWidget::addConnection(const QString &path) { Connection::Ptr connection = findConnection(path); - KLOG_DEBUG() << "add connection::" << connection->name(); + KLOG_DEBUG(qLcNetwork) << "add connection::" << connection->name(); if (deviceType() == Device::Ethernet) { @@ -230,7 +231,7 @@ void DeviceAvailableConnectionWidget::disappearNetwork(const QString &ssid) void DeviceAvailableConnectionWidget::appearNetwork(const QString &ssid) { - KLOG_DEBUG() << "appear network:" << ssid; + KLOG_DEBUG(qLcNetwork) << "appear network:" << ssid; WirelessNetwork::Ptr network = m_wirelessDevice->findNetwork(ssid); onAddWirelessNetwork(network); } @@ -443,7 +444,7 @@ void DeviceAvailableConnectionWidget::updateConnectionItemStatus(ConnectionItemW item->setActiveConnectionPath(activeConnection->path()); item->setActiveStatus(activeConnection->state()); m_activateLabel->setText(activeConnection->id()); - KLOG_DEBUG() << "current activeConnection state:" << activeConnection->state(); + KLOG_DEBUG(qLcNetwork) << "current activeConnection state:" << activeConnection->state(); connect(activeConnection.data(), &ActiveConnection::stateChanged, item, &ConnectionItemWidget::activeConnectionStateChanged, Qt::UniqueConnection); } } diff --git a/plugins/network/src/plugin/device-list.cpp b/plugins/network/src/plugin/device-list.cpp index 0d315584..a78840a5 100644 --- a/plugins/network/src/plugin/device-list.cpp +++ b/plugins/network/src/plugin/device-list.cpp @@ -1,3 +1,17 @@ +/** + * Copyright (c) 2022 KylinSec Co., Ltd. + * kiran-cpanel-network 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 + */ + #include "device-list.h" #include #include @@ -5,6 +19,7 @@ #include "device-available-connection-widget.h" #include "signal-forward.h" #include "utils.h" +#include "logging-category.h" using namespace NetworkManager; using namespace NetworkUtils; @@ -40,22 +55,22 @@ void DeviceList::init(NetworkManager::Device::Type type) m_verticalSpacer = new QSpacerItem(40, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); m_widgetContentsLayout->addItem(m_verticalSpacer); - if (m_deviceType == Device::Wifi) + if (m_deviceType != Device::Wifi) + { + return; + } + + for (auto device : managedDeviceList) { - for (auto device : managedDeviceList) + WirelessDevice::Ptr wirelessDevice = qobject_cast(device); + QDBusPendingReply<> replyRequestScan = wirelessDevice->requestScan(); + replyRequestScan.waitForFinished(); + if (replyRequestScan.isError()) { - WirelessDevice::Ptr wirelessDevice = qobject_cast(device); - QDBusPendingReply<> replyRequestScan = wirelessDevice->requestScan(); - replyRequestScan.waitForFinished(); - if (replyRequestScan.isError()) - { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); - } - else - { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan reply:" << replyRequestScan.reply(); - } + KLOG_DEBUG(qLcNetwork) << "wireless Device:" << wirelessDevice << " requestScan error:" << replyRequestScan.error(); + continue; } + KLOG_DEBUG(qLcNetwork) << "wireless Device:" << wirelessDevice << " requestScan reply:" << replyRequestScan.reply(); } } @@ -77,7 +92,7 @@ void DeviceList::addDevice(const QString &devicePath) Device::Ptr device = findNetworkInterface(devicePath); if(m_deviceType == device->type()) { - KLOG_INFO() << "add new device:" << device; + KLOG_INFO(qLcNetwork) << "add new device:" << device; auto widget = new DeviceAvailableConnectionWidget(device, m_scrollAreaWidgetContents); addWidget(widget); m_managedDevicePaths << devicePath; @@ -94,13 +109,15 @@ void DeviceList::removeDevice(const QString &devicePath) for (auto item : m_itemWidgetList) { auto deviceItem = qobject_cast(item); - if (deviceItem->devicePath() == devicePath) + if (deviceItem->devicePath() != devicePath) { - removeWidget(deviceItem); - m_managedDevicePaths.removeOne(devicePath); - KLOG_INFO() << "removed device:" << devicePath; - return; + continue; } + + removeWidget(deviceItem); + m_managedDevicePaths.removeOne(devicePath); + KLOG_INFO(qLcNetwork) << "removed device:" << devicePath; + return; } } diff --git a/plugins/network/src/plugin/manager/manager.cpp b/plugins/network/src/plugin/manager/manager.cpp index cffe69ce..cb0f48c4 100644 --- a/plugins/network/src/plugin/manager/manager.cpp +++ b/plugins/network/src/plugin/manager/manager.cpp @@ -18,6 +18,7 @@ #include #include #include "signal-forward.h" +#include "logging-category.h" using namespace NetworkManager; @@ -31,7 +32,6 @@ Manager::~Manager() void Manager::refreshConnectionLists() { - KLOG_DEBUG() << "Manager::refreshConnectionLists()"; } void Manager::handleActiveConnectionStateChanged(ActiveConnection::State state) @@ -41,21 +41,21 @@ void Manager::handleActiveConnectionStateChanged(ActiveConnection::State state) switch (state) { case ActiveConnection::State::Unknown: - KLOG_DEBUG() << "ActiveConnection::State::Unknown"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Unknown"; break; case ActiveConnection::State::Activating: - KLOG_DEBUG() << "ActiveConnection::State::Activating"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Activating"; handleStateActivating(path); break; case ActiveConnection::State::Activated: - KLOG_DEBUG() << "ActiveConnection::State::Activated"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Activated"; handleStateActivated(path); break; case ActiveConnection::State::Deactivating: - KLOG_DEBUG() << "ActiveConnection::State::Deactivating"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Deactivating"; break; case ActiveConnection::State::Deactivated: - KLOG_DEBUG() << "ActiveConnection::State::Deactivated"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Deactivated"; handleStateDeactivated(path); break; default: diff --git a/plugins/network/src/plugin/manager/vpn-manager.cpp b/plugins/network/src/plugin/manager/vpn-manager.cpp index 23d2cfda..c21e73d4 100644 --- a/plugins/network/src/plugin/manager/vpn-manager.cpp +++ b/plugins/network/src/plugin/manager/vpn-manager.cpp @@ -26,6 +26,7 @@ #include "status-notification.h" #include "text-input-dialog.h" #include "ui_vpn-manager.h" +#include "logging-category.h" using namespace NetworkManager; Q_DECLARE_METATYPE(VpnType) @@ -186,16 +187,16 @@ void VpnManager::handleActivateSelectedConnection(const QString &connectionPath, if (passwordFlags == Setting::SecretFlagType::None || passwordFlags == Setting::SecretFlagType::AgentOwned) { activateVPNConnection(connectionPath, connectionParameter); - KLOG_DEBUG() << "passwordFlags None"; + KLOG_DEBUG(qLcNetwork) << "passwordFlags None"; } else if (passwordFlags == Setting::SecretFlagType::NotRequired) { activateVPNConnection(connectionPath, connectionParameter); - KLOG_DEBUG() << "passwordFlags NotRequired"; + KLOG_DEBUG(qLcNetwork) << "passwordFlags NotRequired"; } else if (passwordFlags == Setting::SecretFlagType::NotSaved) { - KLOG_DEBUG() << "passwordFlags NotSaved"; + KLOG_DEBUG(qLcNetwork) << "passwordFlags NotSaved"; TextInputDialog inputDialog; inputDialog.setTitle(tr("Tips")); QString tips = QString(tr("Password required to connect to %1.")).arg(settings->id()); @@ -221,12 +222,12 @@ void VpnManager::activateVPNConnection(const QString &connectionPath, const QStr reply.waitForFinished(); if (reply.isError()) { - KLOG_ERROR() << "activate connection failed" << reply.error(); + KLOG_ERROR(qLcNetwork) << "activate connection failed" << reply.error(); StatusNotification::connectitonFailedNotify(connectionPath); } else { - KLOG_DEBUG() << "reply.reply():" << reply.reply(); + KLOG_DEBUG(qLcNetwork) << "reply.reply():" << reply.reply(); QString activatedPath = reply.value().path(); } } @@ -247,7 +248,7 @@ void VpnManager::handleActiveConnectionAdded(const QString &activePath) ActiveConnection::Ptr activatedConnection = findActiveConnection(activePath); if (activatedConnection == nullptr) { - KLOG_DEBUG() << "activatedConnection == nullptr"; + KLOG_DEBUG(qLcNetwork) << "activatedConnection == nullptr"; return; } @@ -257,7 +258,7 @@ void VpnManager::handleActiveConnectionAdded(const QString &activePath) return; } QString uuid = vpnConnection->uuid(); - KLOG_DEBUG() << "vpn uuid:" << uuid; + KLOG_DEBUG(qLcNetwork) << "vpn uuid:" << uuid; QWidget *activeItemWidget = ui->connectionShowPage->findItemWidgetByUuid(uuid); if (activeItemWidget != nullptr) { @@ -277,40 +278,40 @@ void VpnManager::handleVpnConnectionStateChanged(VpnConnection::State state, Vpn auto activeVpnConnection = qobject_cast(sender()); QString activePath = activeVpnConnection->path(); - KLOG_DEBUG() << " activeConnection->id():" << activeVpnConnection->id(); + KLOG_DEBUG(qLcNetwork) << " activeConnection->id():" << activeVpnConnection->id(); QString id = ""; if (activeVpnConnection != nullptr) id = activeVpnConnection->id(); switch (state) { case VpnConnection::State::Unknown: - KLOG_DEBUG() << "VpnConnection::State::Unknown"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Unknown"; break; case VpnConnection::State::Prepare: - KLOG_DEBUG() << "VpnConnection::State::Prepare"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Prepare"; break; case VpnConnection::State::NeedAuth: - KLOG_DEBUG() << "VpnConnection::State::NeedAuth"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::NeedAuth"; break; case VpnConnection::State::Connecting: handleStateActivating(activePath); - KLOG_DEBUG() << "VpnConnection::State::Connecting"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Connecting"; break; case VpnConnection::State::GettingIpConfig: - KLOG_DEBUG() << "VpnConnection::State::GettingIpConfig"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::GettingIpConfig"; break; case VpnConnection::State::Activated: - KLOG_DEBUG() << "VpnConnection::State::Activated"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Activated"; handleStateActivated(activePath); break; case VpnConnection::State::Failed: - KLOG_DEBUG() << "VpnConnection::State::Failed"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Failed"; if (!id.isEmpty()) StatusNotification::ActiveConnectionDeactivatedNotify(id); handleVpnStateFailed(activePath); break; case VpnConnection::State::Disconnected: - KLOG_DEBUG() << "VpnConnection::State::Disconnected"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::State::Disconnected"; if (!id.isEmpty()) StatusNotification::ActiveConnectionDeactivatedNotify(id); handleVpnStateDisconnected(activePath); @@ -322,40 +323,40 @@ void VpnManager::handleVpnConnectionStateChanged(VpnConnection::State state, Vpn switch (reason) { case VpnConnection::StateChangeReason::UnknownReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::UnknownReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::UnknownReason"; break; case VpnConnection::StateChangeReason::NoneReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::NoneReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::NoneReason"; break; case VpnConnection::StateChangeReason::UserDisconnectedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::UserDisconnectedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::UserDisconnectedReason"; break; case VpnConnection::StateChangeReason::DeviceDisconnectedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::DeviceDisconnectedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::DeviceDisconnectedReason"; break; case VpnConnection::StateChangeReason::ServiceStoppedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::ServiceStoppedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::ServiceStoppedReason"; break; case VpnConnection::StateChangeReason::IpConfigInvalidReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::IpConfigInvalidReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::IpConfigInvalidReason"; break; case VpnConnection::StateChangeReason::ConnectTimeoutReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::ConnectTimeoutReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::ConnectTimeoutReason"; break; case VpnConnection::StateChangeReason::ServiceStartTimeoutReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::ServiceStartTimeoutReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::ServiceStartTimeoutReason"; break; case VpnConnection::StateChangeReason::ServiceStartFailedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::ServiceStartFailedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::ServiceStartFailedReason"; break; case VpnConnection::StateChangeReason::NoSecretsReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::NoSecretsReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::NoSecretsReason"; break; case VpnConnection::StateChangeReason::LoginFailedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::LoginFailedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::LoginFailedReason"; break; case VpnConnection::StateChangeReason::ConnectionRemovedReason: - KLOG_DEBUG() << "VpnConnection::StateChangeReason::ConnectionRemovedReason"; + KLOG_DEBUG(qLcNetwork) << "VpnConnection::StateChangeReason::ConnectionRemovedReason"; break; default: break; @@ -432,7 +433,7 @@ void VpnManager::clearVpnSetting() // TODO:更新列表逻辑需要修改 void VpnManager::handleConnectionUpdated(const QString &path) { - KLOG_DEBUG() << "Connection::updated:" << path; + KLOG_DEBUG(qLcNetwork) << "Connection::updated:" << path; Connection::Ptr updateConnection = findConnection(path); if (updateConnection->settings()->connectionType() == ConnectionSettings::Vpn) { diff --git a/plugins/network/src/plugin/manager/wired-manager.cpp b/plugins/network/src/plugin/manager/wired-manager.cpp index 64f84ef9..70a02b05 100644 --- a/plugins/network/src/plugin/manager/wired-manager.cpp +++ b/plugins/network/src/plugin/manager/wired-manager.cpp @@ -25,6 +25,7 @@ #include "ui_wired-manager.h" #include "device-list.h" #include +#include "logging-category.h" using namespace NetworkManager; @@ -90,7 +91,7 @@ void WiredManager::saveConnectionSettings() } else { - KLOG_DEBUG() << "Invalid input exists"; + KLOG_DEBUG(qLcNetwork) << "Invalid input exists"; } } diff --git a/plugins/network/src/plugin/network-plugin.cpp b/plugins/network/src/plugin/network-plugin.cpp index 402d0d54..27377d7d 100644 --- a/plugins/network/src/plugin/network-plugin.cpp +++ b/plugins/network/src/plugin/network-plugin.cpp @@ -29,29 +29,6 @@ NetworkPlugin::~NetworkPlugin() int NetworkPlugin::init(KiranControlPanel::PanelInterface* interface) { - if (m_translator != nullptr) - { - QCoreApplication::removeTranslator(m_translator); - delete m_translator; - m_translator = nullptr; - } - - m_translator = new QTranslator(qApp); - if (!m_translator->load(QLocale(), - "kiran-control-panel", - ".", - TRANSLATE_PREFIX, - ".qm")) - { - KLOG_ERROR() << "can't load translator"; - delete m_translator; - m_translator = nullptr; - } - else - { - qApp->installTranslator(m_translator); - } - auto networkSubItem = new NetworkSubItem(interface,this); m_subitem.reset(networkSubItem); @@ -60,12 +37,6 @@ int NetworkPlugin::init(KiranControlPanel::PanelInterface* interface) void NetworkPlugin::uninit() { - if (m_translator != nullptr) - { - QCoreApplication::removeTranslator(m_translator); - delete m_translator; - m_translator = nullptr; - } } QVector NetworkPlugin::getSubItems() diff --git a/plugins/network/src/plugin/network-plugin.h b/plugins/network/src/plugin/network-plugin.h index dfaf1ac0..3dd023f5 100644 --- a/plugins/network/src/plugin/network-plugin.h +++ b/plugins/network/src/plugin/network-plugin.h @@ -19,7 +19,6 @@ #include "plugin-interface-v2.h" #include "plugin-subitem-interface.h" -class QTranslator; class NetworkPlugin : public QObject, public KiranControlPanel::PluginInterfaceV2 @@ -44,7 +43,6 @@ public: QVector getSubItems() override; private: - QTranslator* m_translator = nullptr; KiranControlPanel::SubItemPtr m_subitem; }; diff --git a/plugins/network/src/plugin/network-subitem.cpp b/plugins/network/src/plugin/network-subitem.cpp index 10633568..03456d84 100644 --- a/plugins/network/src/plugin/network-subitem.cpp +++ b/plugins/network/src/plugin/network-subitem.cpp @@ -1,8 +1,23 @@ +/** + * Copyright (c) 2022 KylinSec Co., Ltd. + * kiran-cpanel-network 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 + */ + #include "network-subitem.h" #include "cpanel-network-widget.h" #include #include #include "utils.h" +#include "logging-category.h" NetworkSubItem::NetworkSubItem(KiranControlPanel::PanelInterface* interface, QObject *parent) : m_interface(interface), @@ -68,7 +83,7 @@ QVector > NetworkSubItem::getSearchKeys() foreach(auto subItem,m_subItemsList) { - KLOG_DEBUG() << "subItem:" << subItem; + KLOG_DEBUG(qLcNetwork) << "subItem:" << subItem; searchKeys.append({subItem,subItem}); } diff --git a/plugins/network/src/plugin/network-subitem.h b/plugins/network/src/plugin/network-subitem.h index 4608ba34..e689e4eb 100644 --- a/plugins/network/src/plugin/network-subitem.h +++ b/plugins/network/src/plugin/network-subitem.h @@ -1,3 +1,17 @@ +/** + * Copyright (c) 2022 KylinSec Co., Ltd. + * kiran-cpanel-network 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 + */ + #ifndef NETWORKSUBITEM_H #define NETWORKSUBITEM_H diff --git a/plugins/network/src/plugin/plugin-connection-list.cpp b/plugins/network/src/plugin/plugin-connection-list.cpp index 3090fb7d..99467ab2 100644 --- a/plugins/network/src/plugin/plugin-connection-list.cpp +++ b/plugins/network/src/plugin/plugin-connection-list.cpp @@ -19,6 +19,7 @@ #include "connection-itemwidget.h" #include "general.h" #include "text-input-dialog.h" +#include "logging-category.h" using namespace NetworkManager; #define PLUGIN_ITEM_WIDGET_HEIGHT 36 @@ -47,7 +48,6 @@ void PluginConnectionList::addConnection(NetworkManager::Connection::Ptr ptr, co { if (ptr == nullptr) { - KLOG_ERROR() << "ptr == null"; return; } @@ -108,14 +108,14 @@ void PluginConnectionList::addConnection(NetworkManager::Connection::Ptr ptr, co void PluginConnectionList::addWirelessNetwork(NetworkManager::WirelessNetwork::Ptr network, const QString& devicePath) { - KLOG_DEBUG() << "network ssid to be added:" << network->ssid(); + KLOG_DEBUG(qLcNetwork) << "network ssid to be added:" << network->ssid(); AccessPoint::Ptr accessPoint = network->referenceAccessPoint(); NetworkConnectionInfo connectionInfo; connectionInfo.isWireless = true; connectionInfo.wirelessInfo.ssid = network->ssid(); connectionInfo.wirelessInfo.accessPointPath = accessPoint->uni(); connectionInfo.wirelessInfo.signalStrength = accessPoint->signalStrength(); - KLOG_DEBUG() << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; + KLOG_DEBUG(qLcNetwork) << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; connectionInfo.devicePath = devicePath; if (accessPoint->capabilities() == AccessPoint::Capability::None) connectionInfo.wirelessInfo.securitySetting = false; @@ -212,13 +212,13 @@ void PluginConnectionList::handleEditButtonClicked() QString activeConnectionPath = connectionInfo.activeConnectionPath; bool isWireless = connectionInfo.isWireless; - KLOG_DEBUG() << "edit connection path:" << activeConnectionPath; + KLOG_DEBUG(qLcNetwork) << "edit connection path:" << activeConnectionPath; if (isWireless) { if (!activeConnectionPath.isEmpty()) emit editConnection(uuid, activeConnectionPath); else - KLOG_DEBUG() << "can not edit an unconnected wireless network "; + KLOG_DEBUG(qLcNetwork) << "can not edit an unconnected wireless network "; } else emit editConnection(uuid, activeConnectionPath); @@ -229,7 +229,7 @@ void PluginConnectionList::setItemWidgetStatus(const QString& activePath, Networ auto itemWidget = findItemWidgetByActivePath(activePath); if (itemWidget == nullptr) { - KLOG_DEBUG() << "active ItemWidget was no found"; + KLOG_DEBUG(qLcNetwork) << "active ItemWidget was no found"; return; } @@ -284,7 +284,7 @@ void PluginConnectionList::handleConnectionItemClicked() { if (connectionInfo.wirelessInfo.signalStrength == -1) { - KLOG_DEBUG() << "connect hidden network"; + KLOG_DEBUG(qLcNetwork) << "connect hidden network"; TextInputDialog ssidInputDialog; ssidInputDialog.setTitle(tr("Tips")); QString tips = QString(tr("Please input a network name")); @@ -299,5 +299,5 @@ void PluginConnectionList::handleConnectionItemClicked() emit activateSelectedConnection(connectionPath); } else - KLOG_DEBUG() << "this connection is activated"; + KLOG_DEBUG(qLcNetwork) << "this connection is activated"; } diff --git a/plugins/network/src/plugin/setting-widget/connection-name-widget.cpp b/plugins/network/src/plugin/setting-widget/connection-name-widget.cpp index 27e298d9..13b925d5 100644 --- a/plugins/network/src/plugin/setting-widget/connection-name-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/connection-name-widget.cpp @@ -21,6 +21,7 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_connection-name-widget.h" +#include "logging-category.h" using namespace NetworkManager; ConnectionNameWidget::ConnectionNameWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ConnectionNameWidget) @@ -187,7 +188,7 @@ bool ConnectionNameWidget::isInputValid() QString error = QString(tr("Connection name can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->connectionName); - KLOG_DEBUG() << "Connection name cannot be empty"; + KLOG_DEBUG(qLcNetwork) << "Connection name cannot be empty"; return false; } return true; diff --git a/plugins/network/src/plugin/setting-widget/disconnect-and-delete-button.cpp b/plugins/network/src/plugin/setting-widget/disconnect-and-delete-button.cpp index 88e58b6f..ac4c10e2 100644 --- a/plugins/network/src/plugin/setting-widget/disconnect-and-delete-button.cpp +++ b/plugins/network/src/plugin/setting-widget/disconnect-and-delete-button.cpp @@ -20,6 +20,7 @@ #include #include "status-notification.h" #include "ui_disconnect-and-delete-button.h" +#include "logging-category.h" using namespace NetworkManager; DisconnectAndDeleteButton::DisconnectAndDeleteButton(QWidget *parent) : QWidget(parent), ui(new Ui::DisconnectAndDeleteButton) @@ -81,10 +82,10 @@ void DisconnectAndDeleteButton::initConnection() reply.waitForFinished(); if (reply.isError()) { - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); } else - KLOG_DEBUG() << "deactivateConnection reply:" << reply.reply(); + KLOG_DEBUG(qLcNetwork) << "deactivateConnection reply:" << reply.reply(); emit disconnectButtonClicked(); }); connect(ui->deleteButton, &QPushButton::clicked, this, &DisconnectAndDeleteButton::handleDeleteConnection); connect(ui->ignoreButton, &QPushButton::clicked, this, &DisconnectAndDeleteButton::handleIgnoreWireless); @@ -109,7 +110,7 @@ void DisconnectAndDeleteButton::handleDeleteConnection() StatusNotification::connectionDeleteNotify(connectionName); if (reply.isError()) { - KLOG_INFO() << "Delete the connection failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Delete the connection failed:" << reply.error(); } emit deleteButtonClicked(); } @@ -126,7 +127,7 @@ void DisconnectAndDeleteButton::handleIgnoreWireless() QDBusPendingReply<> reply = NetworkManager::deactivateConnection(m_activeConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_DEBUG() << "Disconnect failed:" << reply.error(); + KLOG_DEBUG(qLcNetwork) << "Disconnect failed:" << reply.error(); /* * Note:deactivate后,通过信号发出deactivate的状态通知,通知需要从connection中获取id信息 diff --git a/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp b/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp index f9ff73ef..b0230d43 100644 --- a/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ethernet-widget.cpp @@ -20,6 +20,7 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_ethernet-widget.h" +#include "logging-category.h" using namespace NetworkManager; EthernetWidget::EthernetWidget(QWidget *parent) : QWidget(parent), ui(new Ui::EthernetWidget) @@ -90,7 +91,7 @@ void EthernetWidget::saveSettings() QString macAddress = ui->deviceMac->currentData().toString(); QString cloneMac = ui->cloneDeviceMac->text(); - KLOG_DEBUG() << "save ethernet setting: macAddress:" << macAddress << "cloneMac:" << cloneMac; + KLOG_DEBUG(qLcNetwork) << "save ethernet setting: macAddress:" << macAddress << "cloneMac:" << cloneMac; m_wiredSetting->setMacAddress(QByteArray::fromHex(macAddress.toUtf8())); @@ -167,7 +168,7 @@ bool EthernetWidget::isInputValid() QString error = QString(tr("Clone Mac invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->cloneDeviceMac); - KLOG_DEBUG() << "Clone Mac invalid"; + KLOG_DEBUG(qLcNetwork) << "Clone Mac invalid"; return false; } return true; diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp index ed58c808..da46dabb 100644 --- a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp @@ -18,6 +18,7 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_ipv4-widget.h" +#include "logging-category.h" using namespace NetworkManager; Ipv4Widget::Ipv4Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Ipv4Widget) @@ -106,7 +107,7 @@ void Ipv4Widget::saveSettings() } else { - KLOG_DEBUG() << "Net prefix length error"; + KLOG_DEBUG(qLcNetwork) << "Net prefix length error"; } } else @@ -115,10 +116,10 @@ void Ipv4Widget::saveSettings() } ipv4Address.setGateway(QHostAddress(ui->ipv4Gateway->text())); - KLOG_DEBUG() << "ipv4 ip:" << ipv4Address.ip(); - KLOG_DEBUG() << "ipv4 netmask:" << ipv4Address.netmask(); - KLOG_DEBUG() << "ipv4 prefix Length:" << ipv4Address.prefixLength(); - KLOG_DEBUG() << "ipv4 gateway:" << ipv4Address.gateway(); + KLOG_DEBUG(qLcNetwork) << "ipv4 ip:" << ipv4Address.ip(); + KLOG_DEBUG(qLcNetwork) << "ipv4 netmask:" << ipv4Address.netmask(); + KLOG_DEBUG(qLcNetwork) << "ipv4 prefix Length:" << ipv4Address.prefixLength(); + KLOG_DEBUG(qLcNetwork) << "ipv4 gateway:" << ipv4Address.gateway(); QList ipv4AddresseList; ipv4AddresseList << ipv4Address; @@ -136,7 +137,7 @@ void Ipv4Widget::saveSettings() ipv4DNS << QHostAddress(dns); } } - KLOG_DEBUG() << "ipv4 DNS:" << ipv4DNS; + KLOG_DEBUG(qLcNetwork) << "ipv4 DNS:" << ipv4DNS; m_ipv4Setting->setDns(ipv4DNS); } @@ -148,7 +149,7 @@ void Ipv4Widget::showSettings() return; } - KLOG_DEBUG() << "current ipv4 Setting method:" << m_ipv4Setting->method(); + KLOG_DEBUG(qLcNetwork) << "current ipv4 Setting method:" << m_ipv4Setting->method(); if (m_ipv4Setting->method() == Ipv4Setting::ConfigMethod::Automatic) { resetSettings(); @@ -163,9 +164,9 @@ void Ipv4Widget::showSettings() QString netmask = ipv4Address.netmask().toString(); QString gateway = ipv4Address.gateway().toString(); - KLOG_DEBUG() << "address:" << address; - KLOG_DEBUG() << "netmask:" << netmask; - KLOG_DEBUG() << "gateway:" << gateway; + KLOG_DEBUG(qLcNetwork) << "address:" << address; + KLOG_DEBUG(qLcNetwork) << "netmask:" << netmask; + KLOG_DEBUG(qLcNetwork) << "gateway:" << gateway; ui->ipv4Address->setText(address); ui->ipv4Netmask->setText(netmask); @@ -189,7 +190,7 @@ void Ipv4Widget::showSettings() dnsList << address.toString(); } dnsString = dnsList.join(";"); - KLOG_DEBUG() << "ipv4 DNS:" << dnsString; + KLOG_DEBUG(qLcNetwork) << "ipv4 DNS:" << dnsString; } ui->ipv4DNS->setText(dnsString); } @@ -243,7 +244,7 @@ bool Ipv4Widget::isInputValid() QString error = QString(tr("Ipv4 DNS invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv4DNS); - KLOG_DEBUG() << "Ipv4 DNS invalid"; + KLOG_DEBUG(qLcNetwork) << "Ipv4 DNS invalid"; return false; } } @@ -262,7 +263,7 @@ bool Ipv4Widget::isIpv4ManualConfigValid() QString error = QString(tr("Ipv4 address can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv4Address); - KLOG_DEBUG() << "Ipv4 address can not be empty"; + KLOG_DEBUG(qLcNetwork) << "Ipv4 address can not be empty"; return false; } else @@ -272,7 +273,7 @@ bool Ipv4Widget::isIpv4ManualConfigValid() QString error = QString(tr("Ipv4 Address invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv4Address); - KLOG_DEBUG() << "Ipv4 Address invalid"; + KLOG_DEBUG(qLcNetwork) << "Ipv4 Address invalid"; return false; } } @@ -282,7 +283,7 @@ bool Ipv4Widget::isIpv4ManualConfigValid() QString error = QString(tr("NetMask can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv4Netmask); - KLOG_DEBUG() << "NetMask cannot be empty"; + KLOG_DEBUG(qLcNetwork) << "NetMask cannot be empty"; return false; } else @@ -292,7 +293,7 @@ bool Ipv4Widget::isIpv4ManualConfigValid() QString error = QString(tr("Netmask invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv4Netmask); - KLOG_DEBUG() << "Netmask invalid"; + KLOG_DEBUG(qLcNetwork) << "Netmask invalid"; return false; } } diff --git a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp index 47dd317b..feefdcfa 100644 --- a/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/ipv6-widget.cpp @@ -17,6 +17,7 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_ipv6-widget.h" +#include "logging-category.h" using namespace NetworkManager; Ipv6Widget::Ipv6Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Ipv6Widget) @@ -65,15 +66,15 @@ void Ipv6Widget::handleIpv6MethodChanged(NetworkManager::Ipv6Setting::ConfigMeth { case Ipv6Setting::ConfigMethod::Automatic: ui->ipv6Manual->setVisible(false); - KLOG_DEBUG() << "Automatic"; + KLOG_DEBUG(qLcNetwork) << "Automatic"; break; case Ipv6Setting::ConfigMethod::Manual: ui->ipv6Manual->setVisible(true); - KLOG_DEBUG() << "Manual"; + KLOG_DEBUG(qLcNetwork) << "Manual"; break; case Ipv6Setting::ConfigMethod::Ignored: ui->ipv6Manual->setVisible(false); - KLOG_DEBUG() << "Ignored"; + KLOG_DEBUG(qLcNetwork) << "Ignored"; break; default: break; @@ -84,7 +85,7 @@ void Ipv6Widget::saveSettings() { if (m_ipv6Setting.isNull()) { - KLOG_DEBUG() << "ipv6 setting null"; + KLOG_DEBUG(qLcNetwork) << "ipv6 setting null"; return; } @@ -129,7 +130,7 @@ void Ipv6Widget::saveSettings() ipv6DNS << QHostAddress(dns); } } - KLOG_DEBUG() << "ipv6 set DNS:" << ipv6DNS; + KLOG_DEBUG(qLcNetwork) << "ipv6 set DNS:" << ipv6DNS; m_ipv6Setting->setDns(ipv6DNS); } @@ -178,7 +179,7 @@ void Ipv6Widget::showSettings() dnsList << address.toString(); } dnsString = dnsList.join(";"); - KLOG_DEBUG() << "current ipv6 DNS:" << dnsString; + KLOG_DEBUG(qLcNetwork) << "current ipv6 DNS:" << dnsString; } ui->ipv6DNS->setText(dnsString); } @@ -235,7 +236,7 @@ bool Ipv6Widget::isInputValid() QString error = QString(tr("Ipv6 DNS invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv6DNS); - KLOG_DEBUG() << "Ipv6 DNS invalid"; + KLOG_DEBUG(qLcNetwork) << "Ipv6 DNS invalid"; return false; } } @@ -252,7 +253,7 @@ bool Ipv6Widget::isIpv6ManualConfigValid() m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv6Address); - KLOG_DEBUG() << "Ipv6 Address cannot be empty"; + KLOG_DEBUG(qLcNetwork) << "Ipv6 Address cannot be empty"; return false; } else @@ -262,7 +263,7 @@ bool Ipv6Widget::isIpv6ManualConfigValid() QString error = QString(tr("Ipv6 address invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv6Address); - KLOG_DEBUG() << "Ipv6Address invalid"; + KLOG_DEBUG(qLcNetwork) << "Ipv6Address invalid"; return false; } } @@ -275,7 +276,7 @@ bool Ipv6Widget::isIpv6ManualConfigValid() QString error = QString(tr("Ipv6 Gateway invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->ipv6Gateway); - KLOG_DEBUG() << "Ipv6 Netmask invalid"; + KLOG_DEBUG(qLcNetwork) << "Ipv6 Netmask invalid"; return false; } } diff --git a/plugins/network/src/plugin/setting-widget/vpn/vpn-ipsec.cpp b/plugins/network/src/plugin/setting-widget/vpn/vpn-ipsec.cpp index eea5c4a4..27e0d45b 100644 --- a/plugins/network/src/plugin/setting-widget/vpn/vpn-ipsec.cpp +++ b/plugins/network/src/plugin/setting-widget/vpn/vpn-ipsec.cpp @@ -16,6 +16,7 @@ #include #include #include "ui_vpn-ipsec.h" +#include "logging-category.h" using namespace NetworkManager; VpnIPsec::VpnIPsec(QWidget *parent) : QWidget(parent), ui(new Ui::VpnIPsec) @@ -82,7 +83,7 @@ void VpnIPsec::saveSettings() m_dataMap.remove("ipsec-esp"); } - KLOG_DEBUG() << "m_dataMap:" << m_dataMap; + KLOG_DEBUG(qLcNetwork) << "m_dataMap:" << m_dataMap; m_vpnSetting->setData(m_dataMap); m_vpnSetting->setInitialized(true); } @@ -112,10 +113,10 @@ void VpnIPsec::showSettings() QVariant secretsValue = variantMap.value("secrets"); auto dbusArg = secretsValue.value(); - KLOG_DEBUG() << dbusArg.currentType() << dbusArg.currentSignature(); + KLOG_DEBUG(qLcNetwork) << dbusArg.currentType() << dbusArg.currentSignature(); NMStringMap dbusMap = qdbus_cast(dbusArg); - KLOG_DEBUG() << "dbusMap " << dbusMap; + KLOG_DEBUG(qLcNetwork) << "dbusMap " << dbusMap; ui->preSharedKey->setText(dbusMap.value("ipsec-psk")); } else diff --git a/plugins/network/src/plugin/setting-widget/vpn/vpn-ipvx.cpp b/plugins/network/src/plugin/setting-widget/vpn/vpn-ipvx.cpp index 4a415017..c5842714 100644 --- a/plugins/network/src/plugin/setting-widget/vpn/vpn-ipvx.cpp +++ b/plugins/network/src/plugin/setting-widget/vpn/vpn-ipvx.cpp @@ -15,6 +15,7 @@ #include #include #include "ui_vpn-ipvx.h" +#include "logging-category.h" using namespace NetworkManager; Q_DECLARE_METATYPE(NetworkManager::Ipv4Setting::ConfigMethod) @@ -111,7 +112,7 @@ void VpnIpvx::showSeittngs() void VpnIpvx::resetSettings() { - KLOG_DEBUG() << "VpnIpvx::resetSettings"; + KLOG_DEBUG(qLcNetwork) << "VpnIpvx::resetSettings"; int ipv4MethodIndex = ui->ipv4Method->findData(Ipv4Setting::ConfigMethod::Automatic); ui->ipv4Method->setCurrentIndex(ipv4MethodIndex); m_neverDefault->setChecked(false); diff --git a/plugins/network/src/plugin/setting-widget/vpn/vpn-ppp.cpp b/plugins/network/src/plugin/setting-widget/vpn/vpn-ppp.cpp index 73472fca..aeeb41a4 100644 --- a/plugins/network/src/plugin/setting-widget/vpn/vpn-ppp.cpp +++ b/plugins/network/src/plugin/setting-widget/vpn/vpn-ppp.cpp @@ -16,6 +16,7 @@ #include #include #include "ui_vpn-ppp.h" +#include "logging-category.h" using namespace NetworkManager; VpnPpp::VpnPpp(QWidget *parent) : QWidget(parent), ui(new Ui::VpnPpp) @@ -76,7 +77,7 @@ void VpnPpp::initOptionsButton(const QStringList &supportOptions) } else { - KLOG_DEBUG() << "Unsupport option:" << option; + KLOG_DEBUG(qLcNetwork) << "Unsupport option:" << option; } } } @@ -115,7 +116,7 @@ void VpnPpp::saveSettings() { m_dataMap = m_vpnSetting->data(); QString mppeMethod = ui->mppeSecurity->currentData().toString(); - KLOG_DEBUG() << "mppeMethod:" << mppeMethod; + KLOG_DEBUG(qLcNetwork) << "mppeMethod:" << mppeMethod; if (m_useMPPE->isChecked()) { m_dataMap.insert(mppeMethod, "yes"); @@ -135,7 +136,7 @@ void VpnPpp::saveSettings() for (KiranSwitchButton *button : m_optionsButtonMap) { QString option = m_optionsButtonMap.key(button); - KLOG_DEBUG() << "save option:" << option << "-----" << button->isChecked(); + KLOG_DEBUG(qLcNetwork) << "save option:" << option << "-----" << button->isChecked(); if (button->isChecked()) { if (option == "lcp-echo-interval") @@ -175,8 +176,8 @@ void VpnPpp::showSettings() { QString option = i.key(); QString optionValue = i.value(); - KLOG_DEBUG() << "i.key():" << i.key(); - KLOG_DEBUG() << "i.value():" << i.value(); + KLOG_DEBUG(qLcNetwork) << "i.key():" << i.key(); + KLOG_DEBUG(qLcNetwork) << "i.value():" << i.value(); QList requireMppeList; requireMppeList << "require-mppe" diff --git a/plugins/network/src/plugin/setting-widget/vpn/vpn-widget.cpp b/plugins/network/src/plugin/setting-widget/vpn/vpn-widget.cpp index 01e9b830..14aa8bc7 100644 --- a/plugins/network/src/plugin/setting-widget/vpn/vpn-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/vpn/vpn-widget.cpp @@ -17,6 +17,7 @@ #include #include #include "kiran-tips/kiran-tips.h" +#include "logging-category.h" #include "ui_vpn-widget.h" using namespace NetworkManager; @@ -134,7 +135,7 @@ void VpnWidget::showSettings() ui->gateway->setText(dataMap.value("gateway")); ui->userName->setText(dataMap.value("user")); - KLOG_DEBUG() << "password-flags:" << dataMap.value("password-flags"); + KLOG_DEBUG(qLcNetwork) << "password-flags:" << dataMap.value("password-flags"); int index = ui->passwordOptions->findData(dataMap.value("password-flags")); if (index == -1) { @@ -151,8 +152,8 @@ void VpnWidget::showSettings() // 通过m_vpnSetting->secrets()获取到的map为空 // NMStringMap secretMap = m_vpnSetting->secrets(); - // KLOG_DEBUG() << "vpn secretMap:" << secretMap; - // KLOG_DEBUG() << "password:" << secretMap.value("password"); + // KLOG_DEBUG(qLcNetwork) << "vpn secretMap:" << secretMap; + // KLOG_DEBUG(qLcNetwork) << "password:" << secretMap.value("password"); // ui->password->setText(secretMap.value("password")); ui->ntDomain->setText(dataMap.value("domain")); @@ -169,10 +170,10 @@ void VpnWidget::showSettings() QVariant secretsValue = variantMap.value("secrets"); auto dbusArg = secretsValue.value(); - KLOG_DEBUG() << dbusArg.currentType() << dbusArg.currentSignature(); + KLOG_DEBUG(qLcNetwork) << dbusArg.currentType() << dbusArg.currentSignature(); NMStringMap dbusMap = qdbus_cast(dbusArg); - KLOG_DEBUG() << "dbusMap " << dbusMap; + KLOG_DEBUG(qLcNetwork) << "dbusMap " << dbusMap; ui->password->setText(dbusMap.value("password")); } else @@ -203,7 +204,7 @@ bool VpnWidget::isInputValid() QString error = QString(tr("Gateway can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->gateway); - KLOG_DEBUG() << "Gateway cannot be empty"; + KLOG_DEBUG(qLcNetwork) << "Gateway cannot be empty"; return false; } else @@ -213,7 +214,7 @@ bool VpnWidget::isInputValid() QString error = QString(tr("Gateway invalid")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->gateway); - KLOG_DEBUG() << "Gateway invalid"; + KLOG_DEBUG(qLcNetwork) << "Gateway invalid"; return false; } } @@ -223,7 +224,7 @@ bool VpnWidget::isInputValid() QString error = QString(tr("user name can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->userName); - KLOG_DEBUG() << "user name can not be empty"; + KLOG_DEBUG(qLcNetwork) << "user name can not be empty"; return false; } @@ -233,7 +234,7 @@ bool VpnWidget::isInputValid() QString error = QString(tr("password can not be empty")); m_errorTip->setText(error); m_errorTip->showTipAroundWidget(ui->password); - KLOG_DEBUG() << "password can not be empty"; + KLOG_DEBUG(qLcNetwork) << "password can not be empty"; return false; } diff --git a/plugins/network/src/plugin/setting-widget/wireless-widget.cpp b/plugins/network/src/plugin/setting-widget/wireless-widget.cpp index ab796c55..8374ea40 100644 --- a/plugins/network/src/plugin/setting-widget/wireless-widget.cpp +++ b/plugins/network/src/plugin/setting-widget/wireless-widget.cpp @@ -18,6 +18,7 @@ #include #include "kiran-switch-button.h" #include "ui_wireless-widget.h" +#include "logging-category.h" using namespace NetworkManager; WirelessWidget::WirelessWidget(QWidget *parent) : QWidget(parent), ui(new Ui::WirelessWidget) @@ -63,7 +64,7 @@ void WirelessWidget::saveSettings() if (m_wirelessSetting != nullptr) { QString macAddress = ui->deviceMac->currentData().toString(); - KLOG_DEBUG() << "macAddress:" << macAddress; + KLOG_DEBUG(qLcNetwork) << "macAddress:" << macAddress; m_wirelessSetting->setMacAddress(QByteArray::fromHex(macAddress.toUtf8())); m_wirelessSetting->setMtu(ui->customMTU->value()); } diff --git a/plugins/network/src/plugin/settings/setting-page.cpp b/plugins/network/src/plugin/settings/setting-page.cpp index 3aa92019..39339cd9 100644 --- a/plugins/network/src/plugin/settings/setting-page.cpp +++ b/plugins/network/src/plugin/settings/setting-page.cpp @@ -17,6 +17,7 @@ #include #include #include +#include "logging-category.h" using namespace NetworkManager; SettingPage::SettingPage(QWidget* parent) : QWidget(parent) @@ -34,7 +35,7 @@ void SettingPage::initConnectionSettings(ConnectionSettings::ConnectionType conn if (m_connectionUuid.isEmpty()) { - KLOG_DEBUG() << "connection uuid is empty, creating new ConnectionSettings"; + KLOG_DEBUG(qLcNetwork) << "connection uuid is empty, creating new ConnectionSettings"; createConnectionSettings(); m_isNewConnection = true; } @@ -43,7 +44,7 @@ void SettingPage::initConnectionSettings(ConnectionSettings::ConnectionType conn m_connection = findConnectionByUuid(m_connectionUuid); if (!m_connection) { - KLOG_DEBUG() << "can't find connection by uuid"; + KLOG_DEBUG(qLcNetwork) << "can't find connection by uuid"; } m_connectionSettings = m_connection->settings(); m_isNewConnection = false; @@ -55,7 +56,7 @@ void SettingPage::createConnectionSettings() m_connectionSettings = QSharedPointer(new NetworkManager::ConnectionSettings(m_connectionType)); m_connectionUuid = m_connectionSettings->createNewUuid(); m_connectionSettings->setUuid(m_connectionUuid); - KLOG_DEBUG() << "create uuid:" << m_connectionSettings->uuid(); + KLOG_DEBUG(qLcNetwork) << "create uuid:" << m_connectionSettings->uuid(); } void SettingPage::clearPtr() @@ -86,11 +87,11 @@ void SettingPage::handleSaveButtonClicked(ConnectionSettings::ConnectionType con replyAdd.waitForFinished(); if (replyAdd.isError()) { - KLOG_DEBUG() << "add connection failed," << replyAdd.error(); + KLOG_DEBUG(qLcNetwork) << "add connection failed," << replyAdd.error(); } else { - KLOG_DEBUG() << "add new connection reply:" << replyAdd.reply(); + KLOG_DEBUG(qLcNetwork) << "add new connection reply:" << replyAdd.reply(); } } else @@ -121,7 +122,7 @@ void SettingPage::handleSaveButtonClicked(ConnectionSettings::ConnectionType con replyUpdate.waitForFinished(); if (replyUpdate.isError()) { - KLOG_DEBUG() << "error occurred while updating the connection" << replyUpdate.error(); + KLOG_DEBUG(qLcNetwork) << "error occurred while updating the connection" << replyUpdate.error(); } } } diff --git a/plugins/network/src/plugin/settings/wired-setting-page.cpp b/plugins/network/src/plugin/settings/wired-setting-page.cpp index 0015df7a..51ab26b7 100644 --- a/plugins/network/src/plugin/settings/wired-setting-page.cpp +++ b/plugins/network/src/plugin/settings/wired-setting-page.cpp @@ -22,6 +22,7 @@ #include "kiran-tips/kiran-tips.h" #include "ui_wired-setting-page.h" #include +#include "logging-category.h" using namespace NetworkManager; @@ -126,7 +127,7 @@ void WiredSettingPage::createSettingPage(const QString &devicePath) { macAddress = wiredDevice->hardwareAddress(); } - KLOG_DEBUG() << "binding MAC Address:" << macAddress; + KLOG_DEBUG(qLcNetwork) << "binding MAC Address:" << macAddress; ui->ethernetWidget->setDefaultMacAddress(macAddress); } diff --git a/plugins/network/src/plugin/settings/wireless-setting-page.cpp b/plugins/network/src/plugin/settings/wireless-setting-page.cpp index cc3be877..c4334507 100644 --- a/plugins/network/src/plugin/settings/wireless-setting-page.cpp +++ b/plugins/network/src/plugin/settings/wireless-setting-page.cpp @@ -15,19 +15,20 @@ #include "wireless-setting-page.h" #include #include "ui_wireless-setting-page.h" +#include "logging-category.h" using namespace NetworkManager; WirelessSettingPage::WirelessSettingPage(QWidget *parent) : SettingPage(parent), ui(new Ui::WirelessSettingPage) { ui->setupUi(this); initConnection(); - KLOG_DEBUG() << "WirelessSettingPage::WirelessSettingPage"; + KLOG_DEBUG(qLcNetwork) << "WirelessSettingPage::WirelessSettingPage"; } WirelessSettingPage::~WirelessSettingPage() { delete ui; - KLOG_DEBUG() << "WirelessSettingPage::~WirelessSettingPage()"; + KLOG_DEBUG(qLcNetwork) << "WirelessSettingPage::~WirelessSettingPage()"; } void WirelessSettingPage::initConnection() diff --git a/plugins/network/src/signal-forward.cpp b/plugins/network/src/signal-forward.cpp index 9b19bc6c..82f4de9a 100644 --- a/plugins/network/src/signal-forward.cpp +++ b/plugins/network/src/signal-forward.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "logging-category.h" using namespace NetworkManager; SignalForward *SignalForward::instance() @@ -73,13 +74,13 @@ void SignalForward::initConnect() } else { - KLOG_INFO() << "this device interface is invalid!"; + KLOG_INFO(qLcNetwork) << "this device interface is invalid!"; m_Timer.start(); } m_waitCounts++; if(m_waitCounts > MAX_WAIT_COUNTS) { - KLOG_INFO() << "This device is currently invalid by NetworkManager"; + KLOG_INFO(qLcNetwork) << "This device is currently invalid by NetworkManager"; m_Timer.stop(); } }); } @@ -167,7 +168,7 @@ void SignalForward::addDevice(const QString &uni) m_tmpDevicePath = uni; if(device->managed()) { - KLOG_INFO() << "add device:" << uni; + KLOG_INFO(qLcNetwork) << "add device:" << uni; switch (device->type()) { case Device::Type::Ethernet: @@ -183,8 +184,8 @@ void SignalForward::addDevice(const QString &uni) } else { - KLOG_INFO() << "this device interface is invalid!"; + KLOG_INFO(qLcNetwork) << "this device interface is invalid!"; m_Timer.start(); - KLOG_INFO() << "wait device managed counts:" << m_waitCounts; + KLOG_INFO(qLcNetwork) << "wait device managed counts:" << m_waitCounts; } } \ No newline at end of file diff --git a/plugins/network/src/status-notification.cpp b/plugins/network/src/status-notification.cpp index 657b6056..41bd5de1 100644 --- a/plugins/network/src/status-notification.cpp +++ b/plugins/network/src/status-notification.cpp @@ -18,6 +18,7 @@ #include #include #include "connection-list.h" +#include "logging-category.h" using namespace NetworkManager; void StatusNotification::connectitonFailedNotify() @@ -65,7 +66,7 @@ void StatusNotification::connectitonFailedNotifyByReason(const QString& reason) void StatusNotification::ActiveConnectionActivatedNotify(const QString &connectionName) { - KLOG_DEBUG() << "ActiveConnectionStateNotify"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnectionStateNotify"; QString summary, body; summary = tr("Connection activated"); body = tr("You are now connected to the network \"%1\"").arg(connectionName); diff --git a/plugins/network/src/tray/main.cpp b/plugins/network/src/tray/main.cpp index 130eef30..9ccde9cc 100644 --- a/plugins/network/src/tray/main.cpp +++ b/plugins/network/src/tray/main.cpp @@ -22,19 +22,20 @@ #include "config.h" #include "dbus-tray-monitor.h" #include "network-tray.h" +#include "logging-category.h" int main(int argc, char* argv[]) { KiranApplication a(argc, argv); klog_qt5_init("", "kylinsec-session", "kiran-cpanel-network", "kiran-cpanel-network"); - KLOG_INFO() << "autostart!"; + KLOG_INFO(qLcNetwork) << "autostart!"; QTranslator translator; if (translator.load(QLocale(), "kiran-control-panel", ".", TRANSLATE_PREFIX, ".qm")) { a.installTranslator(&translator); - KLOG_DEBUG() << "installTranslator load:" << a.installTranslator(&translator); + KLOG_DEBUG(qLcNetwork) << "installTranslator load:" << a.installTranslator(&translator); } else { @@ -44,7 +45,7 @@ int main(int argc, char* argv[]) NetworkTray* tray = nullptr; if (KiranControlPanel::isDBusTrayAvailable()) { - KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; + KLOG_DEBUG(qLcNetwork) << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; tray = new NetworkTray; } else @@ -56,7 +57,7 @@ int main(int argc, char* argv[]) { if(tray == nullptr) { - KLOG_DEBUG() << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; + KLOG_DEBUG(qLcNetwork) << KDE_STATUS_NOTIFIER_HOST << "is registered,create network tray icon"; tray = new NetworkTray; } }); diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp index 8cbd7220..00b6685a 100644 --- a/plugins/network/src/tray/network-tray.cpp +++ b/plugins/network/src/tray/network-tray.cpp @@ -21,19 +21,23 @@ #include #include #include +#include "config.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; #define STATUS_NOTIFIER_MANAGER "org.kde.StatusNotifierManager" #define STATUS_NOTIFIER_MANAGER_OBJECT_NAME "/StatusNotifierManager" #define MAX_WAIT_COUNTS 10 #define MAX_HEIGHT 868 -#define KIRAN_CPANEL_NETWORK_CONFIG "/etc/kiran-control-panel/plugins/network.conf" NetworkTray::NetworkTray(QWidget *parent) : KiranRoundedTrayPopup(parent), m_wiredTrayPage(nullptr), @@ -88,22 +92,22 @@ void NetworkTray::initConnect() Device::Ptr device = findNetworkInterface(m_addDevicePath); if(device.isNull()) { - KLOG_DEBUG() << "this device interface is not found"; + KLOG_DEBUG(qLcNetwork) << "this device interface is not found"; return; } - KLOG_DEBUG() << "device->uni():" << device->uni(); - KLOG_DEBUG() << "device->interfaceName():" << device->interfaceName(); - KLOG_DEBUG() << "device->state():" << device->state(); - KLOG_DEBUG() << "device->isValid():" << device->isValid(); + KLOG_DEBUG(qLcNetwork) << "device->uni():" << device->uni(); + KLOG_DEBUG(qLcNetwork) << "device->interfaceName():" << device->interfaceName(); + KLOG_DEBUG(qLcNetwork) << "device->state():" << device->state(); + KLOG_DEBUG(qLcNetwork) << "device->isValid():" << device->isValid(); if(device->isValid()) { handleDeviceAdded(m_addDevicePath); } else { - KLOG_INFO() << "this device interface is invalid!"; + KLOG_INFO(qLcNetwork) << "this device interface is invalid!"; m_Timer.start(); - KLOG_INFO() << "wait counts:" << m_waitCounts; + KLOG_INFO(qLcNetwork) << "wait counts:" << m_waitCounts; } }); m_Timer.setInterval(500); @@ -114,7 +118,7 @@ void NetworkTray::initConnect() Device::Ptr device = findNetworkInterface(m_addDevicePath); if(device.isNull()) { - KLOG_DEBUG() << "this device interface is not found"; + KLOG_DEBUG(qLcNetwork) << "this device interface is not found"; return ; } if(device->isValid()) @@ -124,13 +128,13 @@ void NetworkTray::initConnect() } else { - KLOG_INFO() << "this device interface is not ready"; + KLOG_INFO(qLcNetwork) << "this device interface is not ready"; m_Timer.start(); } m_waitCounts++; if(m_waitCounts > MAX_WAIT_COUNTS) { - KLOG_INFO() << "This device is not currently managed by NetworkManager"; + KLOG_INFO(qLcNetwork) << "This device is not currently managed by NetworkManager"; m_Timer.stop(); } }); @@ -161,7 +165,7 @@ void NetworkTray::initTrayIcon() { m_systemTray = new QSystemTrayIcon(); updateTrayIcon(); - KLOG_DEBUG() << " NetworkManager::status():" << NetworkManager::status(); + KLOG_DEBUG(qLcNetwork) << " NetworkManager::status():" << NetworkManager::status(); m_systemTray->show(); } @@ -182,7 +186,7 @@ void NetworkTray::initMenu() // 初始化条件:设备存在且被管理 void NetworkTray::initTrayPage() { - KLOG_DEBUG() << "init Tray Page"; + KLOG_DEBUG(qLcNetwork) << "init Tray Page"; m_wiredDeviceList = NetworkUtils::getAvailableDeviceList(Device::Ethernet); m_wirelessDeviceList = NetworkUtils::getAvailableDeviceList(Device::Wifi); @@ -260,11 +264,11 @@ void NetworkTray::handleTrayClicked(QSystemTrayIcon::ActivationReason reason) replyRequestScan.waitForFinished(); if (replyRequestScan.isError()) { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); + KLOG_DEBUG(qLcNetwork) << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); } else { - KLOG_DEBUG() << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan reply:" << replyRequestScan.reply(); + KLOG_DEBUG(qLcNetwork) << "wireless Device name:" << wirelessDevice->interfaceName() << " requestScan reply:" << replyRequestScan.reply(); } } } @@ -332,25 +336,19 @@ void NetworkTray::getTrayGeometry() { // 名称待修改 QDBusPendingReply getGeometry = m_statusNotifierManager->GetGeometry("~04-network"); - KLOG_DEBUG() << "getGeometry.value():" << getGeometry.value(); + KLOG_DEBUG(qLcNetwork) << "getGeometry.value():" << getGeometry.value(); double height, width, x, y; QJsonParseError jsonParseError; QJsonDocument doc = QJsonDocument::fromJson(getGeometry.value().toLatin1(), &jsonParseError); - if (!doc.isNull() && jsonParseError.error == QJsonParseError::NoError) + if (!doc.isNull() && doc.isObject() && jsonParseError.error == QJsonParseError::NoError) { - if (doc.isObject() && jsonParseError.error == QJsonParseError::NoError) - { - if (doc.isObject()) - { - QJsonObject object = doc.object(); - QStringList list = object.keys(); - height = object.value("height").toDouble(); - width = object.value("width").toDouble(); - x = object.value("x").toDouble(); - y = object.value("y").toDouble(); - } - } + QJsonObject object = doc.object(); + QStringList list = object.keys(); + height = object.value("height").toDouble(); + width = object.value("width").toDouble(); + x = object.value("x").toDouble(); + y = object.value("y").toDouble(); } m_heightTray = static_cast(height); m_widthTray = static_cast(width); @@ -361,55 +359,51 @@ void NetworkTray::getTrayGeometry() void NetworkTray::updateTrayIcon() { auto status = NetworkManager::status(); - QString iconPath; - QString toolTip; - if (status == NetworkManager::Status::Connected) - { - // 判断主连接类型,托盘网络图标以主连接类型为准 - // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 - ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); - if (primaryActiveConnection.isNull()) - { - KLOG_INFO() << "update tray icon failed, primary active connection is null"; - return; - } + if (status != NetworkManager::Status::Connected) + { + setTrayIcon(DISCONNECTED); + return; + } - //NetworkManager::connectivity() 不准确,使用checkConnectivity - QDBusPendingReply reply = NetworkManager::checkConnectivity(); - reply.waitForFinished(); - uint result = reply.value(); + // 判断主连接类型,托盘网络图标以主连接类型为准 + // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + if (primaryActiveConnection.isNull()) + { + KLOG_INFO(qLcNetwork) << "update tray icon failed, primary active connection is null"; + return; + } - if (result == NetworkManager::Connectivity::Full) - { - checkInternetConnectivity(); - return; - } - if (primaryActiveConnection->type() == ConnectionSettings::Wireless) - { - iconPath = ":/kcp-network-images/wireless-error.svg"; - } - else - { - iconPath = ":/kcp-network-images/wired-error.svg"; - } - toolTip = tr("The network is connected, but you cannot access the Internet"); - + // NetworkManager::connectivity() 不准确,使用checkConnectivity + QDBusPendingReply reply = NetworkManager::checkConnectivity(); + reply.waitForFinished(); + uint result = reply.value(); + + if (result == NetworkManager::Connectivity::Full) + { + checkInternetConnectivity(); + return; } - else if ((status == NetworkManager::Status::Disconnecting) || (status == NetworkManager::Status::Connecting)) + + NetworkState state; + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) { - // TODO:加载动画 - iconPath = ":/kcp-network-images/wired-disconnected.svg"; - toolTip = tr("Network not connected"); + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; } else { - iconPath = ":/kcp-network-images/wired-disconnected.svg"; - toolTip = tr("Network not connected"); + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; } - setTrayIcon(iconPath,toolTip); + setTrayIcon(state); +} + +void NetworkTray::setTrayIcon(NetworkState state) +{ + auto stateInfo = m_StateInfoMap.value(state); + setTrayIcon(stateInfo.iconPath, stateInfo.description); } -void NetworkTray::setTrayIcon(const QString &iconPath,const QString &toolTip) +void NetworkTray::setTrayIcon(const QString &iconPath, const QString &toolTip) { QIcon icon; icon.addPixmap(NetworkUtils::trayIconColorSwitch(iconPath)); @@ -422,7 +416,7 @@ void NetworkTray::setTrayIcon(const QString &iconPath,const QString &toolTip) // XXX:可以优化 void NetworkTray::handleDeviceAdded(const QString &devicePath) { - KLOG_DEBUG() << "Device Added:" << devicePath; + KLOG_DEBUG(qLcNetwork) << "Device Added:" << devicePath; Device::Ptr device = findNetworkInterface(devicePath); auto state = device->state(); auto type = device->type(); @@ -450,7 +444,7 @@ void NetworkTray::handleDeviceAdded(const QString &devicePath) // XXX:当device被移除时,由于设备对象可能已经被删除,所以并不能通过findNetworkInterface(path)找到该设备接口,进而知道被删除的设备类型 void NetworkTray::handleDeviceRemoved(const QString &devicePath) { - KLOG_DEBUG() << "Device Removed :" << devicePath; + KLOG_DEBUG(qLcNetwork) << "Device Removed :" << devicePath; if (m_wiredTrayPage != nullptr) { if (m_wiredTrayPage->devicePathList().contains(devicePath)) @@ -473,10 +467,10 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat { Device *device = qobject_cast(sender()); auto deviceType = device->type(); - KLOG_DEBUG() << "Device interfaceName:" << device->interfaceName(); - KLOG_DEBUG() << "Device newstate:" << newstate; - KLOG_DEBUG() << "Device oldstate:" << oldstate; - KLOG_DEBUG() << "Device reason:" << reason; + KLOG_DEBUG(qLcNetwork) << "Device interfaceName:" << device->interfaceName(); + KLOG_DEBUG(qLcNetwork) << "Device newstate:" << newstate; + KLOG_DEBUG(qLcNetwork) << "Device oldstate:" << oldstate; + KLOG_DEBUG(qLcNetwork) << "Device reason:" << reason; // 设备变为可用 if ((oldstate == Device::Unavailable || oldstate == Device::Unmanaged || oldstate == Device::UnknownState) && @@ -500,7 +494,7 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat m_verticalLayout->removeWidget(m_unavailableWidget); m_unavailableWidget->deleteLater(); m_unavailableWidget = nullptr; - KLOG_DEBUG() << "remove unavailable widget"; + KLOG_DEBUG(qLcNetwork) << "remove unavailable widget"; } } } @@ -516,7 +510,7 @@ void NetworkTray::handleDeviceStateChanged(NetworkManager::Device::State newstat reason != Device::SleepingReason) { // 设备变为不可用时,如果无线和有线均不可用则显示网络不可用的提示 - KLOG_DEBUG() << "device is unavailable"; + KLOG_DEBUG(qLcNetwork) << "device is unavailable"; if ((NetworkUtils::getAvailableDeviceList(Device::Ethernet).count() == 0) && (NetworkUtils::getAvailableDeviceList(Device::Wifi).count() == 0)) { @@ -549,7 +543,7 @@ void NetworkTray::handleDeviceManagedChanged() */ void NetworkTray::handleWirelessEnabledChanged(bool enable) { - KLOG_DEBUG() << " Wireless Enabled Changed:" << enable; + KLOG_DEBUG(qLcNetwork) << " Wireless Enabled Changed:" << enable; if (m_wirelessTrayPage != nullptr) { @@ -565,9 +559,9 @@ void NetworkTray::handleWirelessEnabledChanged(bool enable) const Device::List deviceList = networkInterfaces(); for (Device::Ptr dev : deviceList) { - KLOG_DEBUG() << "dev->interfaceName():" << dev->interfaceName(); - KLOG_DEBUG() << "dev->state():" << dev->state(); - KLOG_DEBUG() << "dev->isValid():" << dev->isValid(); + KLOG_DEBUG(qLcNetwork) << "dev->interfaceName():" << dev->interfaceName(); + KLOG_DEBUG(qLcNetwork) << "dev->state():" << dev->state(); + KLOG_DEBUG(qLcNetwork) << "dev->isValid():" << dev->isValid(); if ((dev->state() == Device::Unmanaged) || (dev->state() == Device::UnknownState)) continue; @@ -594,13 +588,13 @@ void NetworkTray::handleWirelessEnabledChanged(bool enable) void NetworkTray::handleNetworkManagerStatusChanged(NetworkManager::Status status) { - KLOG_DEBUG() << "network status changed: " << status; + KLOG_DEBUG(qLcNetwork) << "network status changed: " << status; updateTrayIcon(); } void NetworkTray::handlePrimaryConnectionChanged(const QString &uni) { - KLOG_DEBUG() << "primary connection changed: " << uni; + KLOG_DEBUG(qLcNetwork) << "primary connection changed: " << uni; updateTrayIcon(); } @@ -626,12 +620,12 @@ void NetworkTray::UnavailableTrayPage() } initUnavailableWidget(); m_verticalLayout->addWidget(m_unavailableWidget); - KLOG_DEBUG() << "add unavailable widget"; + KLOG_DEBUG(qLcNetwork) << "add unavailable widget"; } void NetworkTray::reloadWiredTrayPage() { - KLOG_DEBUG() << "reloadWiredTrayPage"; + KLOG_DEBUG(qLcNetwork) << "reloadWiredTrayPage"; if (m_wiredTrayPage != nullptr) { m_verticalLayout->removeWidget(m_wiredTrayPage); @@ -653,7 +647,7 @@ void NetworkTray::reloadWiredTrayPage() void NetworkTray::reloadWirelessTrayPage() { - KLOG_DEBUG() << "reloadWirelessTrayPage"; + KLOG_DEBUG(qLcNetwork) << "reloadWirelessTrayPage"; if (m_wirelessTrayPage != nullptr) { m_verticalLayout->removeWidget(m_wirelessTrayPage); @@ -693,13 +687,13 @@ void NetworkTray::handleAdjustedTraySize(QSize sizeHint) adjustSize(); else { - // KLOG_DEBUG() << "resize before this->size():" << this->size(); + // KLOG_DEBUG(qLcNetwork) << "resize before this->size():" << this->size(); QSize newSize(this->sizeHint().width(),sizeHint.height() + OFFSET_MARGIN); - // KLOG_DEBUG() << "newSize:" << newSize; + // KLOG_DEBUG(qLcNetwork) << "newSize:" << newSize; this->resize(newSize); - KLOG_DEBUG() << "handleAdjustedTraySize"; + KLOG_DEBUG(qLcNetwork) << "handleAdjustedTraySize"; // this->setFixedSize(newSize); - // KLOG_DEBUG() << "resize after this->size():" << this->size(); + // KLOG_DEBUG(qLcNetwork) << "resize after this->size():" << this->size(); } setTrayPagePos(); }); } @@ -718,52 +712,50 @@ void NetworkTray::initTcpSocket() void NetworkTray::checkInternetConnectivity() { - KLOG_DEBUG() << "check Internet Connectivity"; - QSettings confSettings(KIRAN_CPANEL_NETWORK_CONFIG, QSettings::NativeFormat); - QVariant enable = confSettings.value(QString("CheckInternetConnectivity/Enable")); - if(!enable.toBool()) + QSettings confSettings(SETTINGS_PATH, QSettings::NativeFormat); + QVariant enable = confSettings.value(QString("Network/CheckInternetConnectivity")); + KLOG_DEBUG(qLcNetwork) << "check Internet Connectivity : " << enable; + if (!enable.toBool()) { internetConnected(); return; } - QVariant address = confSettings.value(QString("CheckInternetConnectivity/Address")); - QVariant port = confSettings.value(QString("CheckInternetConnectivity/Port")); + QVariant address = confSettings.value(QString("Network/Address")); + QVariant port = confSettings.value(QString("Network/Port")); m_tcpClient->connectToHost(address.toString(), port.toInt()); } void NetworkTray::internetConnected() { - KLOG_DEBUG() << "Connectivity check pass"; - QString iconPath; + KLOG_DEBUG(qLcNetwork) << "Connectivity check pass"; ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + NetworkState state; if (primaryActiveConnection->type() == ConnectionSettings::Wireless) { - iconPath = ":/kcp-network-images/wireless-4.svg"; + state = WIRELESS_CONNECTED; } else { - iconPath = ":/kcp-network-images/wired-connection.svg"; + state = WIRED_CONNECTED; } - QString toolTip = tr("Network connected"); - setTrayIcon(iconPath,toolTip); + setTrayIcon(state); m_tcpClient->abort(); } void NetworkTray::internetError(QAbstractSocket::SocketError socketError) { - KLOG_INFO() << "Connectivity check fail: " << socketError; - QString iconPath; + KLOG_INFO(qLcNetwork) << "Connectivity check fail: " << socketError; + NetworkState state; if (primaryConnectionType() == ConnectionSettings::Wireless) { - iconPath = ":/kcp-network-images/wireless-error.svg"; + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; } else { - iconPath = ":/kcp-network-images/wired-error.svg"; + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; } - QString toolTip = tr("The network is connected, but you cannot access the Internet"); - setTrayIcon(iconPath,toolTip); + setTrayIcon(state); m_tcpClient->abort(); } diff --git a/plugins/network/src/tray/network-tray.h b/plugins/network/src/tray/network-tray.h index ff028e0c..273a3a3d 100644 --- a/plugins/network/src/tray/network-tray.h +++ b/plugins/network/src/tray/network-tray.h @@ -19,15 +19,17 @@ #include #include #include -#include #include +#include "general.h" #include "kiran-rounded-tray-popup/kiran-rounded-tray-popup.h" -#include class WiredTrayWidget; class WirelessTrayWidget; class StatusNotifierManagerInterface; class TrayPage; +class QTcpSocket; +class QVBoxLayout; + class NetworkTray : public KiranRoundedTrayPopup { Q_OBJECT @@ -73,7 +75,8 @@ public slots: private: void updateTrayIcon(); - void setTrayIcon(const QString &iconPath,const QString &toolTip); + void setTrayIcon(NetworkState state); + void setTrayIcon(const QString &iconPath, const QString &toolTip); void initTcpSocket(); void checkInternetConnectivity(); @@ -103,8 +106,31 @@ private: QString m_addDevicePath; int m_waitCounts; QSize m_wirelessTraySizeHint; - QTcpSocket *m_tcpClient; + + // clang-format off + QMap m_StateInfoMap = { + { + WIRED_CONNECTED, + {":/kcp-network-images/wired-connection.svg",tr("Network connected")} + }, + { + WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET, + {":/kcp-network-images/wired-error.svg",tr("The network is connected, but you cannot access the Internet")} + }, + { + WIRELESS_CONNECTED, + {":/kcp-network-images/wireless-4.svg",tr("Network connected")} + }, + { + WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET, + {":/kcp-network-images/wireless-error.svg",tr("The network is connected, but you cannot access the Internet")} + }, + { + DISCONNECTED, + {":/kcp-network-images/wired-disconnected.svg",tr("Network not connected")} + }}; + // clang-format on }; #endif // KIRAN_CPANEL_NETWORK_MANAGER_TRAY_H diff --git a/plugins/network/src/tray/tray-connection-list.cpp b/plugins/network/src/tray/tray-connection-list.cpp index bc7391b0..b5c51987 100644 --- a/plugins/network/src/tray/tray-connection-list.cpp +++ b/plugins/network/src/tray/tray-connection-list.cpp @@ -18,6 +18,7 @@ #include "general.h" #include "status-notification.h" #include "tray-itemwidget.h" +#include "logging-category.h" #define LIST_MAX_HEIGHT 358 #define TRAY_ITEM_NORAML_SIZE QSize(240, 50) @@ -47,7 +48,6 @@ void TrayConnectionList::addConnection(NetworkManager::Connection::Ptr ptr, cons { if (ptr == nullptr) { - KLOG_ERROR() << "ptr == null"; return; } @@ -109,14 +109,14 @@ void TrayConnectionList::addWirelessNetwork(NetworkManager::WirelessNetwork::Ptr const QString& devicePath) { - // KLOG_DEBUG() << "network ssid:" << network->ssid(); + // KLOG_DEBUG(qLcNetwork) << "network ssid:" << network->ssid(); AccessPoint::Ptr accessPoint = network->referenceAccessPoint(); NetworkConnectionInfo connectionInfo; connectionInfo.isWireless = true; connectionInfo.wirelessInfo.ssid = network->ssid(); connectionInfo.wirelessInfo.accessPointPath = accessPoint->uni(); connectionInfo.wirelessInfo.signalStrength = accessPoint->signalStrength(); - // KLOG_DEBUG() << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; + // KLOG_DEBUG(qLcNetwork) << "accessPoint signalStrength:" << connectionInfo.wirelessInfo.signalStrength; connectionInfo.devicePath = devicePath; if (accessPoint->capabilities() == AccessPoint::Capability::None) connectionInfo.wirelessInfo.securitySetting = false; @@ -209,11 +209,11 @@ void TrayConnectionList::addHiddenNetworkItemWidget() void TrayConnectionList::setItemWidgetStatus(const QString& activePath, NetworkManager::ActiveConnection::State state) { - KLOG_DEBUG() << "activePath:" << activePath; + KLOG_DEBUG(qLcNetwork) << "activePath:" << activePath; auto itemWidget = findItemWidgetByActivePath(activePath); if (itemWidget == nullptr) { - KLOG_DEBUG() << "active ItemWidget was no found"; + KLOG_DEBUG(qLcNetwork) << "active ItemWidget was no found"; return; } @@ -270,7 +270,7 @@ void TrayConnectionList::adjustTraySize() totalheight = LIST_MAX_HEIGHT; setFixedHeight(totalheight); - // KLOG_DEBUG() << "totalheight:" << totalheight; + // KLOG_DEBUG(qLcNetwork) << "totalheight:" << totalheight; emit sizeChanged(QSize(this->sizeHint().width(), totalheight)); } @@ -323,7 +323,7 @@ void TrayConnectionList::handleConnectionItemClicked() } } else - KLOG_DEBUG() << "this connection is activated"; + KLOG_DEBUG(qLcNetwork) << "this connection is activated"; } void TrayConnectionList::setItemWidgetSimpleStatus(QWidget* itemWidget) @@ -373,7 +373,7 @@ void TrayConnectionList::handleCancelButtonClicked() if (activeConnection->state() == ActiveConnection::Activating) { emit cancelConnection(path); - KLOG_DEBUG() << "emit cancel Connection"; + KLOG_DEBUG(qLcNetwork) << "emit cancel Connection"; } } } diff --git a/plugins/network/src/tray/tray-page.cpp b/plugins/network/src/tray/tray-page.cpp index 2e50f22d..e1d8743f 100644 --- a/plugins/network/src/tray/tray-page.cpp +++ b/plugins/network/src/tray/tray-page.cpp @@ -17,6 +17,7 @@ #include "ui_tray-page.h" #include "wired-tray-widget.h" #include "wireless-tray-widget.h" +#include "logging-category.h" using namespace NetworkManager; TrayPage::TrayPage(Device::List deviceList, QWidget *parent) : QWidget(parent), ui(new Ui::TrayPage) @@ -159,10 +160,10 @@ void TrayPage::handleDeviceComboBoxChanged(int index) int height = trayWidget->getHeight(); ui->stackedWidget->setFixedHeight(height); - KLOG_DEBUG() << "tray widget height:" << height; - // KLOG_DEBUG() << "ui->stackedWidget->size():" << ui->stackedWidget->size(); - // KLOG_DEBUG() << " ui->selectDevicewidget->size():" << ui->selectDevicewidget->size(); - // KLOG_DEBUG() << "this->size():" << this->size(); + KLOG_DEBUG(qLcNetwork) << "tray widget height:" << height; + // KLOG_DEBUG(qLcNetwork) << "ui->stackedWidget->size():" << ui->stackedWidget->size(); + // KLOG_DEBUG(qLcNetwork) << " ui->selectDevicewidget->size():" << ui->selectDevicewidget->size(); + // KLOG_DEBUG(qLcNetwork) << "this->size():" << this->size(); emit sizeChanged(QSize(this->sizeHint().width(), ui->selectDevicewidget->sizeHint().height() + height)); } @@ -175,7 +176,7 @@ QStringList TrayPage::devicePathList() if (device != nullptr) devicePathList << device->uni(); } - KLOG_DEBUG() << "devicePathList:" << devicePathList; + KLOG_DEBUG(qLcNetwork) << "devicePathList:" << devicePathList; return devicePathList; } diff --git a/plugins/network/src/tray/tray-widget.cpp b/plugins/network/src/tray/tray-widget.cpp index ea2d07c3..616df2df 100644 --- a/plugins/network/src/tray/tray-widget.cpp +++ b/plugins/network/src/tray/tray-widget.cpp @@ -21,6 +21,7 @@ #include "connection-list.h" #include "connection-show-page.h" #include "tray-widget.h" +#include "logging-category.h" // clang-format on using namespace NetworkManager; #define TRAY_ITEM_NORAML_HIEGHT 50 @@ -90,24 +91,24 @@ void TrayWidget::handleActiveConnectionStateChanged(ActiveConnection::State stat switch (state) { case ActiveConnection::State::Unknown: - KLOG_DEBUG() << "ActiveConnection::State::Unknown"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Unknown"; break; case ActiveConnection::State::Activating: - KLOG_DEBUG() << "ActiveConnection::State::Activating"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Activating"; handleStateActivating(m_activatedPath); break; case ActiveConnection::State::Activated: - KLOG_DEBUG() << "ActiveConnection::State::Activated"; - KLOG_DEBUG() << "id:" << id; - KLOG_DEBUG() << "deviceList:" << deviceList; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Activated"; + KLOG_DEBUG(qLcNetwork) << "id:" << id; + KLOG_DEBUG(qLcNetwork) << "deviceList:" << deviceList; m_StateActivatedTimer.start(); break; case ActiveConnection::State::Deactivating: - KLOG_DEBUG() << "ActiveConnection::State::Deactivating"; + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Deactivating"; break; case ActiveConnection::State::Deactivated: - KLOG_DEBUG() << "ActiveConnection::State::Deactivated id:" << id; - KLOG_DEBUG() << "device path:" << m_devicePtr->uni(); + KLOG_DEBUG(qLcNetwork) << "ActiveConnection::State::Deactivated id:" << id; + KLOG_DEBUG(qLcNetwork) << "device path:" << m_devicePtr->uni(); if (deviceList.contains(m_devicePtr->uni())) { if (!id.isEmpty()) diff --git a/plugins/network/src/tray/wired-tray-widget.cpp b/plugins/network/src/tray/wired-tray-widget.cpp index 9372dad3..af5dbdfa 100644 --- a/plugins/network/src/tray/wired-tray-widget.cpp +++ b/plugins/network/src/tray/wired-tray-widget.cpp @@ -20,6 +20,7 @@ #include "signal-forward.h" #include "status-notification.h" #include "utils.h" +#include "logging-category.h" using namespace NetworkManager; WiredTrayWidget::WiredTrayWidget(const QString &devicePath, QWidget *parent) : TrayWidget(parent), @@ -51,7 +52,7 @@ void WiredTrayWidget::init() void WiredTrayWidget::initUI() { // m_wiredDevice->state(); 设备状态在最开始初始化托盘页面时已经判断过了 - KLOG_DEBUG() << "wiredDevice carrier :" << m_wiredDevice->carrier(); + KLOG_DEBUG(qLcNetwork) << "wiredDevice carrier :" << m_wiredDevice->carrier(); m_connectionList = new TrayConnectionList(this); addWidget(m_connectionList); showWiredConnectionLists(); @@ -89,7 +90,7 @@ void WiredTrayWidget::showWiredConnectionLists() */ void WiredTrayWidget::handleCarrierChanged(bool plugged) { - KLOG_DEBUG() << "Carrier Changed plugged: " << plugged; + KLOG_DEBUG(qLcNetwork) << "Carrier Changed plugged: " << plugged; } void WiredTrayWidget::handleStateChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) @@ -109,7 +110,7 @@ void WiredTrayWidget::handleStateChanged(NetworkManager::Device::State newstate, void WiredTrayWidget::handleActivateSelectedConnection(const QString &connectionPath, const QString &connectionParameter) { - KLOG_DEBUG() << "Activate Selected Connection:" << connectionPath; + KLOG_DEBUG(qLcNetwork) << "Activate Selected Connection:" << connectionPath; // m_devicePath 可以为空,即不指定设备 QDBusPendingReply reply = NetworkManager::activateConnection(connectionPath, m_devicePath, connectionParameter); @@ -118,12 +119,12 @@ void WiredTrayWidget::handleActivateSelectedConnection(const QString &connection if (reply.isError()) { // 此处处理进入激活流程失败的原因,并不涉及流程中某个具体阶段失败的原因 - KLOG_ERROR() << "activate connection failed:" << reply.error(); + KLOG_ERROR(qLcNetwork) << "activate connection failed:" << reply.error(); StatusNotification::connectitonFailedNotify(connectionPath); } else { - KLOG_DEBUG() << "reply:" << reply.reply(); + KLOG_DEBUG(qLcNetwork) << "reply:" << reply.reply(); QString activatedPath = reply.value().path(); } } @@ -157,18 +158,18 @@ void WiredTrayWidget::handleStateDeactivated(const QString &activePath) void WiredTrayWidget::handleStateActivated(const QString &activePath) { - KLOG_DEBUG() << "Wired handleStateActivated"; + KLOG_DEBUG(qLcNetwork) << "Wired handleStateActivated"; m_connectionList->setItemWidgetStatus(activePath, ActiveConnection::Activated); m_connectionList->sort(); } void WiredTrayWidget::handleActiveConnectionAdded(const QString &path) { - KLOG_DEBUG() << "handleActiveConnectionAdded path:" << path; + KLOG_DEBUG(qLcNetwork) << "handleActiveConnectionAdded path:" << path; ActiveConnection::Ptr activatedConnection = findActiveConnection(path); if (activatedConnection.isNull()) { - KLOG_DEBUG() << "activatedConnection is null"; + KLOG_DEBUG(qLcNetwork) << "activatedConnection is null"; return; } @@ -180,7 +181,7 @@ void WiredTrayWidget::handleActiveConnectionAdded(const QString &path) if (activeItemWidget != nullptr) { m_connectionList->updateItemWidgetActivePath(activeItemWidget, path); - KLOG_DEBUG() << "activatedConnection->state():" << activatedConnection->state(); + KLOG_DEBUG(qLcNetwork) << "activatedConnection->state():" << activatedConnection->state(); switch (activatedConnection->state()) { case ActiveConnection::State::Activating: @@ -213,9 +214,9 @@ void WiredTrayWidget::handleDisconnect(const QString &activatedConnectionPath) QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activatedConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); else - KLOG_INFO() << "deactivate Connection:" << reply.reply(); + KLOG_INFO(qLcNetwork) << "deactivate Connection:" << reply.reply(); } void WiredTrayWidget::handleCancelConnection(const QString &activatedConnectionPath) @@ -223,9 +224,9 @@ void WiredTrayWidget::handleCancelConnection(const QString &activatedConnectionP QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activatedConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); else - KLOG_INFO() << "deactivate Connection:" << reply.reply(); + KLOG_INFO(qLcNetwork) << "deactivate Connection:" << reply.reply(); } void WiredTrayWidget::handleConnectionUpdated(const QString &path) diff --git a/plugins/network/src/tray/wireless-tray-widget.cpp b/plugins/network/src/tray/wireless-tray-widget.cpp index 76803761..c4e0743b 100644 --- a/plugins/network/src/tray/wireless-tray-widget.cpp +++ b/plugins/network/src/tray/wireless-tray-widget.cpp @@ -20,6 +20,7 @@ #include "general.h" #include "signal-forward.h" #include "status-notification.h" +#include "logging-category.h" using namespace NetworkManager; WirelessTrayWidget::WirelessTrayWidget(const QString &devicePath, QWidget *parent) : TrayWidget(parent), @@ -80,7 +81,7 @@ void WirelessTrayWidget::handleActivateSelectedWirelessNetwork(const NetworkConn m_connectionInfo = connectionInfo; QString ssid = connectionInfo.wirelessInfo.ssid; QString accessPointPath = connectionInfo.wirelessInfo.accessPointPath; - KLOG_DEBUG() << "handleRequestConnectWirelessNetwork ssid:" << ssid; + KLOG_DEBUG(qLcNetwork) << "handleRequestConnectWirelessNetwork ssid:" << ssid; getWirelessAvailableConnections(m_devicePath); if (m_wirelssConnectionMap.contains(ssid)) @@ -109,7 +110,7 @@ void WirelessTrayWidget::handleActivateHiddenNetwork(const QString &ssid) //若要连接的隐藏网络已经被显式探测到了,则返回 if (m_wirelessDevice->findNetwork(ssid) != nullptr) { - KLOG_DEBUG() << "Hidden networks have been explicitly detected,return"; + KLOG_DEBUG(qLcNetwork) << "Hidden networks have been explicitly detected,return"; StatusNotification::connectitonHiddenNetworkFailedNotify(ssid); // 将排在最后的隐藏网络item复原 int row = m_connectionList->count() - 1; @@ -143,7 +144,7 @@ void WirelessTrayWidget::getWirelessAvailableConnections(const QString &devicePa { WirelessSetting::Ptr wirelessSetting = conn->settings()->setting(Setting::SettingType::Wireless).dynamicCast(); QString ssid = QString(wirelessSetting->ssid()); - KLOG_DEBUG() << "wirelessSetting->ssid():" << ssid; + KLOG_DEBUG(qLcNetwork) << "wirelessSetting->ssid():" << ssid; m_wirelssConnectionMap.insert(ssid, conn); } } @@ -155,18 +156,18 @@ void WirelessTrayWidget::activateWirelessConnection(const QString &connectionPat { if (!connectionPath.isEmpty()) { - KLOG_DEBUG() << " wireless device path" << devicePath; + KLOG_DEBUG(qLcNetwork) << " wireless device path" << devicePath; QDBusPendingReply reply = NetworkManager::activateConnection(connectionPath, devicePath, accessPointPath); reply.waitForFinished(); if (reply.isError()) { - KLOG_ERROR() << "activate connection failed:" << reply.error(); + KLOG_ERROR(qLcNetwork) << "activate connection failed:" << reply.error(); StatusNotification::connectitonFailedNotify(connectionPath); } else - KLOG_DEBUG() << "reply QDBusObjectPath:" << reply.reply(); + KLOG_DEBUG(qLcNetwork) << "reply QDBusObjectPath:" << reply.reply(); } } @@ -233,8 +234,8 @@ void WirelessTrayWidget::addAndActivateWirelessConnection(ConnectionSettings::Pt { const QString ssid = m_connectionInfo.wirelessInfo.ssid; const QString accessPointPath = m_connectionInfo.wirelessInfo.accessPointPath; - KLOG_DEBUG() << "accessPointPath" << accessPointPath; - KLOG_DEBUG() << "wireless device path:" << m_devicePath; + KLOG_DEBUG(qLcNetwork) << "accessPointPath" << accessPointPath; + KLOG_DEBUG(qLcNetwork) << "wireless device path:" << m_devicePath; QDBusPendingReply reply = NetworkManager::addAndActivateConnection(connectionSettings->toMap(), m_devicePath, accessPointPath); @@ -242,7 +243,7 @@ void WirelessTrayWidget::addAndActivateWirelessConnection(ConnectionSettings::Pt if (reply.isError()) { StatusNotification::connectitonFailedNotifyByName(ssid); - KLOG_DEBUG() << "Connection failed: " << reply.error(); + KLOG_DEBUG(qLcNetwork) << "Connection failed: " << reply.error(); } } @@ -258,7 +259,7 @@ void WirelessTrayWidget::handleDisconnect(const QString &activatedConnectionPath QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activatedConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); } // Note:目前已知连接一个不存在的无线网络时,activatedConnection为空 @@ -269,13 +270,13 @@ void WirelessTrayWidget::handleDisconnect(const QString &activatedConnectionPath void WirelessTrayWidget::handleActiveConnectionAdded(const QString &path) { //多个网卡,还需要判断设备 - KLOG_DEBUG() << "handleActiveConnectionAdded :" << path; + KLOG_DEBUG(qLcNetwork) << "handleActiveConnectionAdded :" << path; ActiveConnection::Ptr activatedConnection = findActiveConnection(path); if (activatedConnection.isNull()) { // Note:目前已知连接一个不存在的无线网络时,activatedConnection为空 StatusNotification::connectitonFailedNotify(); - KLOG_DEBUG() << "new add activatedConnection is nullptr"; + KLOG_DEBUG(qLcNetwork) << "new add activatedConnection is nullptr"; return; } @@ -317,7 +318,7 @@ void WirelessTrayWidget::handleActiveConnectionAdded(const QString &path) void WirelessTrayWidget::handleActiveConnectionRemoved(const QString &path) { - KLOG_DEBUG() << "ConnectionRemoved"; + KLOG_DEBUG(qLcNetwork) << "ConnectionRemoved"; m_connectionList->handleActiveStateDeactivated(path); } @@ -327,21 +328,21 @@ void WirelessTrayWidget::handleStateActivating(const QString &activePath) QDBusPendingReply<> replyRequestScan = m_wirelessDevice->requestScan(); replyRequestScan.waitForFinished(); - KLOG_DEBUG() << "State Activating requestScan"; + KLOG_DEBUG(qLcNetwork) << "State Activating requestScan"; if (replyRequestScan.isError()) { - KLOG_DEBUG() << "State Activating requestScan error:" << replyRequestScan.error(); + KLOG_DEBUG(qLcNetwork) << "State Activating requestScan error:" << replyRequestScan.error(); } else { - KLOG_DEBUG() << "State Activating requestScan reply:" << replyRequestScan.reply(); + KLOG_DEBUG(qLcNetwork) << "State Activating requestScan reply:" << replyRequestScan.reply(); } } void WirelessTrayWidget::handleStateActivated(const QString &activePath) { - KLOG_DEBUG() << "Wireless State: Activated"; - KLOG_DEBUG() << "handleStateActivated activePath:" << activePath; + KLOG_DEBUG(qLcNetwork) << "Wireless State: Activated"; + KLOG_DEBUG(qLcNetwork) << "handleStateActivated activePath:" << activePath; m_connectionList->setItemWidgetStatus(activePath, ActiveConnection::State::Activated); auto itemWidget = m_connectionList->findItemWidgetByActivePath(activePath); @@ -354,11 +355,11 @@ void WirelessTrayWidget::handleStateActivated(const QString &activePath) replyRequestScan.waitForFinished(); if (replyRequestScan.isError()) { - KLOG_DEBUG() << "StateActivated requestScan error:" << replyRequestScan.error(); + KLOG_DEBUG(qLcNetwork) << "StateActivated requestScan error:" << replyRequestScan.error(); } else { - KLOG_DEBUG() << "StateActivated requestScan reply:" << replyRequestScan.reply(); + KLOG_DEBUG(qLcNetwork) << "StateActivated requestScan reply:" << replyRequestScan.reply(); } } @@ -372,20 +373,20 @@ void WirelessTrayWidget::handleNotifierConnectionRemoved(const QString &path) void WirelessTrayWidget::handleStateDeactivated(const QString &activatedPath) { - KLOG_DEBUG() << "StateDeactivated :" << activatedPath; + KLOG_DEBUG(qLcNetwork) << "StateDeactivated :" << activatedPath; m_connectionList->handleActiveStateDeactivated(activatedPath); } void WirelessTrayWidget::handleNetworkDisappeared(const QString &ssid) { - KLOG_DEBUG() << "NetworkDisappeared ssid:" << ssid; + KLOG_DEBUG(qLcNetwork) << "NetworkDisappeared ssid:" << ssid; m_connectionList->removeWirelessNetworkFromList(ssid); m_connectionList->adjustTraySize(); } void WirelessTrayWidget::handleNetworkAppeared(const QString &ssid) { - KLOG_DEBUG() << "NetworkAppeared ssid:" << ssid; + KLOG_DEBUG(qLcNetwork) << "NetworkAppeared ssid:" << ssid; WirelessNetwork::Ptr network = m_wirelessDevice->findNetwork(ssid); QString devicePath = m_wirelessDevice->uni(); m_connectionList->addWirelessNetwork(network, devicePath); @@ -409,9 +410,9 @@ void WirelessTrayWidget::handleCancelConnection(const QString &activatedConnecti QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activatedConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); else - KLOG_INFO() << "deactivate Connection:" << reply.reply(); + KLOG_INFO(qLcNetwork) << "deactivate Connection:" << reply.reply(); } /**忽略该网络:断开连接并移除该网络配置*/ @@ -425,13 +426,13 @@ void WirelessTrayWidget::handleIgnoreConnection(const QString &activatedConnecti Connection::Ptr connection = activeConnection->connection(); QSharedPointer wirelessSetting = connection->settings()->setting(Setting::Wireless).dynamicCast(); QString ssid = QString(wirelessSetting->ssid()); - KLOG_DEBUG() << "Ignore ssid:" << ssid; + KLOG_DEBUG(qLcNetwork) << "Ignore ssid:" << ssid; m_wirelssConnectionMap.remove(ssid); QDBusPendingReply<> reply = NetworkManager::deactivateConnection(activatedConnectionPath); reply.waitForFinished(); if (reply.isError()) - KLOG_INFO() << "Disconnect failed:" << reply.error(); + KLOG_INFO(qLcNetwork) << "Disconnect failed:" << reply.error(); /* * Note:deactivate后,通过信号发出deactivate的状态通知,通知需要从connection中获取id信息 @@ -445,7 +446,7 @@ void WirelessTrayWidget::handleIgnoreConnection(const QString &activatedConnecti QDBusPendingReply<> replyRemove = connection->remove(); replyRemove.waitForFinished(); if (replyRemove.isError()) - KLOG_INFO() << "Remove connection failed:" << replyRemove.error(); }); + KLOG_INFO(qLcNetwork) << "Remove connection failed:" << replyRemove.error(); }); } void WirelessTrayWidget::setSecurityPskAndActivateWirelessConnection(const QString &password) @@ -461,7 +462,7 @@ void WirelessTrayWidget::setSecurityPskAndActivateWirelessConnection(const QStri void WirelessTrayWidget::handleDeviceStateChanged(Device::State newstate, Device::State oldstate, Device::StateChangeReason reason) { - KLOG_DEBUG() << "Device::StateChangeReason reason" << reason; + KLOG_DEBUG(qLcNetwork) << "Device::StateChangeReason reason" << reason; //验证失败,删除配置,以便重新配置,避免出现重复的配置文件 if ((oldstate == Device::NeedAuth) && (newstate == Device::Failed)) { @@ -477,7 +478,7 @@ void WirelessTrayWidget::handleDeviceStateChanged(Device::State newstate, Device QDBusPendingReply<> replyRemove = conn->remove(); replyRemove.waitForFinished(); if (replyRemove.isError()) - KLOG_INFO() << "Remove connection failed:" << replyRemove.error(); + KLOG_INFO(qLcNetwork) << "Remove connection failed:" << replyRemove.error(); } } } @@ -486,7 +487,7 @@ void WirelessTrayWidget::handleDeviceStateChanged(Device::State newstate, Device if (reason == NetworkManager::Device::SsidNotFound) { - KLOG_DEBUG() << "NetworkManager::Device::SsidNotFound"; + KLOG_DEBUG(qLcNetwork) << "NetworkManager::Device::SsidNotFound"; QString body, bodyStr; body = tr("the network \"%1\" not found"); bodyStr = body.arg(m_connectionInfo.wirelessInfo.ssid); diff --git a/plugins/network/src/utils.h b/plugins/network/src/utils.h index f52ecc41..265e6276 100644 --- a/plugins/network/src/utils.h +++ b/plugins/network/src/utils.h @@ -17,7 +17,6 @@ #include #include -#include namespace NetworkUtils { diff --git a/settings.ini.in b/settings.ini.in index 5ccc080f..92fc09e1 100644 --- a/settings.ini.in +++ b/settings.ini.in @@ -1,2 +1,7 @@ [Account] -ShowRoot=false \ No newline at end of file +ShowRoot=false + +[Network] +CheckInternetConnectivity=true +Address=www.kylinsec.com.cn +Port=80 \ No newline at end of file -- Gitee From fb12e60409bc72a6aadb083a94d0a048c995224b Mon Sep 17 00:00:00 2001 From: luoqing Date: Tue, 12 Dec 2023 17:01:50 +0800 Subject: [PATCH 11/17] fix(build): fix some build problems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 解决一些RPM构建问题 --- data/CMakeLists.txt | 4 ++-- libexec/avatar-editor/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 9fd982e2..9f66d681 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -22,10 +22,10 @@ install(FILES ${CATEGORY_ICONS} DESTINATION ${CATEGORY_ICON_DIR}) # 主面板desktop configure_file(${CMAKE_SOURCE_DIR}/data/${PROJECT_NAME}.desktop.in ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.desktop) -install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.desktop DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}/applications/) +install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/applications/) # 控制中心pkgconfig文件 configure_file(${CMAKE_SOURCE_DIR}/data/${PROJECT_NAME}.pc.in ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY) -install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/pkgconfig) +install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install(DIRECTORY ./avatars DESTINATION ${KCP_ACCOUNT_DATADIR} ) \ No newline at end of file diff --git a/libexec/avatar-editor/CMakeLists.txt b/libexec/avatar-editor/CMakeLists.txt index a6147b3f..cc5f0131 100644 --- a/libexec/avatar-editor/CMakeLists.txt +++ b/libexec/avatar-editor/CMakeLists.txt @@ -20,5 +20,5 @@ target_link_libraries(kiran-avatar-editor ${KLOG_LIBRARIES} ${KIRAN_STYLE_LIBRARIES}) -install(TARGETS kiran-avatar-editor DESTINATION ${KCP_ACCOUNT_AVATAR_EDITOR}) +install(TARGETS kiran-avatar-editor DESTINATION ${CMAKE_INSTALL_FULL_LIBEXECDIR}) install(FILES ${AVATAR_EDITOR_QM_FILES} DESTINATION ${TRANSLATION_DIR} ) -- Gitee From 47b6042b60c7688c8e8758abfad96957b90b9b7f Mon Sep 17 00:00:00 2001 From: liuxinhao Date: Tue, 12 Dec 2023 20:26:29 +0800 Subject: [PATCH 12/17] 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 de3ae6ba..1e50a0d1 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@ -- Gitee From d8a75df2c5cc3c8d7b56fa6222bb9b40a4889885 Mon Sep 17 00:00:00 2001 From: yuanxing Date: Wed, 13 Dec 2023 14:04:46 +0800 Subject: [PATCH 13/17] 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 | 7124 ++++++++++------- 4 files changed, 4097 insertions(+), 3060 deletions(-) diff --git a/plugins/appearance/pages/theme/icon/icon-theme-page.cpp b/plugins/appearance/pages/theme/icon/icon-theme-page.cpp index 7aaa1429..845d5bf7 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 853ef132..dbc52e14 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 a20c4a5e..7c303b76 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 5d355f60..1ba6ea74 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -2,5725 +2,6765 @@ - 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 - + + Volume Setting + 声音设置 - ButtonDisconnect - + + Mixed Setting + 混合设置 + + + AuthManagerPage - Disconnect - 断开 + Fingerprint Authentication + 指纹认证 - ButtonDelete - + Face Authentication + 人脸认证 - Delete - 删除 + Password Authentication + 密码认证 - ButtonIgnore - + save + 保存 - Ignore - 忽略 + return + 返回 - Are you sure you want to delete the connection %1 - 您是否确定要删除连接 "%1" + add fingerprint + 录入指纹数据 - Warning - 警告 + add face + 录入人脸数据 - - - DnsWidget - DnsWidget - + error + 错误 - Preferred DNS - 首选DNS + please ensure that at least one authentication option exists + 请确保至少一个认证选项打开 - Alternate DNS - 备选DNS + fingerprint_ + 指纹_ + + + face_ + 人脸_ - DslManager + AuthPlugin - DslManager - + + Fingerprint + 指纹 - DSL - + + FingerVein + 指静脉 - - - DslSettingPage - DslSettingPage - + + Driver Manager + 驱动管理 - Save - 保存 + + Prefs + 配置 - Return - 返回 + + UKey + UKey + + + + Iris + 虹膜 + + + + Face + 人脸 - EthernetWidget + AutoStartPage - EthernetWidget - + Boot Setup + 开机启动设置 - MAC Address Of Ethernet Device - 设备MAC地址 + Desktop files(*.desktop) + 桌面类型(*.desktop) - ComboBoxDeviceMac - + select autostart desktop + 选择自启动应用 - Ethernet Clone MAC Address - 克隆MAC地址 + Select + 选择 - EditDeviceMac - + Cancel + 取消 - Custom MTU - 自定义MTU + Error + 错误 - SpinBoxCustomMTU - + Desktop has existed + 该程序已存在 - No device specified - 不指定设备 + Desktop cant permit to join + 该程序不允许添加 - Clone Mac invalid - 无效的克隆MAC地址 + Desktop dont support + 不支持该程序 - 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 + 不支持该程序 + + + BatterySettingsPage - - DNS - + + BatterySettingsPage + 电池设置 - EditIpv4PreferredDNS - + + After idle for more than the following time, the computer will execute + 空闲超过以下时间后,计算机将执行 - Auto - 自动 + + ComboIdleTime + - Manual - 手动 + + ComboIdleAction + - Required - 必填 + + When the battery is lit up, it will be executed + 电池电量将用尽时 - - Please separate multiple DNS entries by semicolon - 请用分号分隔多个DNS + + ComboLowBatteryAction + - - Ipv4 DNS invalid - 无效的Ipv4 DNS + + The monitor will turn off when it is idle + 显示器空闲以下时间关闭 - Ipv4 address can not be empty - Ipv4地址不能为空 + + ComboMonitorTurnOffIdleTime + - Ipv4 Address invalid - 无效的Ipv4地址 + + Reduce screen brightness when idle + 空闲时减少亮度 - NetMask can not be empty - 子网掩码不能为空 + + Reduce screen brightness when no power + 低点亮时减少亮度 - Netmask invalid - 无效的子网掩码 + + The energy saving mode is enabled when the power is low + 低电量时自动开启节能模式 - Ipv4 Gateway invalid - 无效的Ipv4网关 + + + Suspend + 待机 - Preferred DNS - 首选DNS + + + Shutdown + 关机 - Alternate DNS - 备选DNS + + + Hibernate + 休眠 - EditIpv4AlternateDNS - + + + Do nothing + 不执行操作 + + + BatterySubItem - Ipv4 Preferred DNS invalid - 无效的Ipv4首选DNS + Battery Settings + 电池设置 + + + BiometricItem - Ipv4 Alternate DNS invalid - 无效的Ipv4备选DNS + add + 添加 + + + CPanelAudioWidget - DNS 1 - + + CPanelAudioWidget + - DNS 2 - + + Output + 输出 + + + + Input + 输入 - Ipv6Widget + CPanelNetworkWidget - Ipv6Widget + + CPanelNetworkWidget - IPV6 Method - IPV6方法 + + + VPN + VPN - ComboBoxIpv6Method - + + + Network Details + 网络详情 - IP Address - IP地址 + + + + + + Wired Network + 有线网络 - EditIpv6Address - + + + + + + + Wireless Network + 无线网络 - Prefix - 前缀 + + Connected + 已连接 - SpinBoxIpv6Prefix - + + Unavailable + 已禁用 - Gateway - 网关 + + Disconnected + 已断开 - EditIpv6Gateway + Wired Network %1 + 有线网络 %1 + + + Wireless Network %1 + 无线网络 %1 + + + + ChangeHostNameWidget + + + Form - - DNS - + + Host Name: + 主机名: - EditIpv6PreferredDNS + + EditHostName - Auto - 自动 + + ButtonSaveHostName + - Manual - 手动 + + Save + 保存 - Ignored - 忽略 + + ButtonCancelChangeHostName + - Required - 必填 + + Cancel + 取消 - - Please separate multiple DNS entries by semicolon - 请用分号分隔多个DNS + Host Name + 主机名 - - Ipv6 DNS invalid - 无效的Ipv6 DNS + + Warning + 警告 - Ipv6 address can not be empty - Ipv6地址不能为空 + + Change host name failed! Please check the Dbus service! + 修改主机名失败!请 检查Dbus服务! + + + CheckpasswdDialog - Ipv6 address invalid - 无效的Ipv6地址 + + Check password + 校验当前用户密码 - Ipv6 Gateway invalid - 无效的Ipv6网关 + + Check the current password before you enroll the feature + 录入特征之前需要校验当前密码 + + + ChooseItem - Preferred DNS - 首选DNS + + Form + + + + + ConnectionDetailsWidget + + + ConnectionDetailsWidget + - Alternate DNS - 备选DNS + + Security type + 安全类型 - EditIpv6AlternateDNS + + + + + + + + + + + + + + TextLabel - Ipv6 Preferred DNS invalid - 无效的Ipv6首选DNS + + Frequency band + 频段 - Ipv6 Alternate DNS invalid - 无效的Ipv6备选DNS + + Channel + 网络通道 - - - NetworkSubItem - Wired Network %1 - 有线网络 %1 + + Interface + 接口 - Wired Network - 有线网络 + + MAC + - Wireless Network %1 - 无线网络 %1 + + IPv4 + - Wireless Network - 无线网络 + + + Gateway + 网关 - VPN - VPN + + DNS + - Network Details - 网络详情 + + Subnet mask + 子网掩码 - - - NetworkTray - Network settings - 网络设置 + + IPv6 + - Network unavailable - 网络不可用 + + Prefix + 前缀 - - - The network is connected, but you cannot access the Internet - 网络已连接,但不能访问互联网 + + Rate + 速率 - - - Network not connected - 网络已断开 + Preferred DNS + 首选DNS + + + + ConnectionItemWidget + + + disconnect + 断开 - Wired network card: %1 available - 有线网卡: %1 可用 + + ignore + 忽略 - Wireless network card: %1 available - 无线网卡: %1 可用 + + remove + 移除 - Wired network card: %1 unavailable - 有线网卡: %1 不可用 + + The current device:%1 is not available + 当前设备:%1 不可用 - Wireless network card: %1 unavailable - 无线网卡: %1 不可用 + + The carrier is pulled out + 网线被拔出 - - Network connected - 网络已连接 + + Are you sure you want to delete the connection %1 + 您是否确定要删除连接 "%1" - - - PluginConnectionList - Other WiFi networks - 其它WIFI网络 + + Warning + 警告 + + Tips 提示 + + Password required to connect to %1. + 连接网络 "%1" 需要密码 + + + Please input a network name 请输入网络名称 - StatusNotification - - Connection Failed - 连接失败 - + ConnectionNameWidget - the network not found - 未找到网络 + + ConnectionNameWidget + - The hidden network "%1" to be connected has been detected and exists in the network list - 要连接的隐藏网络“%1”已经被探测到,并存在于网络列表中 + + TextLabel + - Failed to connect to the network "%1" - 无法连接到网络 "%1" + + EditConnectionName + - Connection activated - 网络已连接 + + Auto Connection + 自动连接 - You are now connected to the network "%1" - 您已连接到网络 "%1" + + Required + 必填 - Connection deactivated - 连接断开 + + Wired Connection %1 + 有线网络%1 - You have now disconnected the network "%1" - 您已断开网络连接 "%1" + + VPN L2TP %1 + - Connection deleted - 连接已删除 + + VPN PPTP %1 + - The connection has been deleted "%1" - 已删除连接 "%1" + + Connection name can not be empty + 网络名称不能为空 - TextInputDialog + ConnectionShowPage - Tips - 提示 + + ConnectionShowPage + - Yes - 确认 + + TextLabel + - Cancel - 取消 + + ButtonCreateConnection + - TrayConnectionList + CreateGroupPage - Other WiFi networks - 其它WIFI网络 + + CreateGroupPage + - - - TrayItemWidget - TrayItemWidget + + Create Group - Icon + + Add Group Members - Name - 名称 + + Confirm + - Status - 状态 + + Please enter your group name + - Ignore - 忽略 + + group name cannot be a pure number + - Disconnect - 断开 + + group name already exists + - Cancel - 取消 + + + Error + 错误 + + + CreateUserPage - Connect - 连接 + Account type + 帐户类型 - Connected - 已连接 + + standard + 普通用户 - Unconnected - 未连接 + + administrator + 管理员 - Please input password - 请输入密码 + + Please enter user name first + 请输入用户名 - Please input a network name - 请输入网络名称 + + Please enter your user name + 请输入用户名 - - - TrayPage - TrayPage - + + user name cannot be a pure number + 用户名不能全为数字 - TextLabel - + + user name already exists + 用户名已存在 - Select wired network card - 请选择有线网卡 + + Please enter your password + 请输出密码 - Select wireless network card - 请选择无线网卡 + + Please enter the password again + 请再次输入密码 - - - VpnIPsec - VpnIPsec - + + The password you enter must be the same as the former one + 两次密码不相同,请核对后,再次输入 - Enable IPsec - 启用IPsec + + + Error + 错误 - Group Name - 组名 + + Password encryption failed + 密码加密失败 - EditGroupName + + Form + + + + + UserAvatarWidget - Group ID - 组ID + + User name + 用户名 - EditGroupId + + EditUserName - Pre-Shared Key - 预共享密钥 + + User type + 用户类型 - EditPreSharedKey + + ComboUserType - Show Password - 显示密码 + + Password + 用户密码 - Internet Key Exchange Protocol - 密钥交换协议 + + EditPasswd + - EditIpsecIKE - + + Confirm password + 确认密码 - Encapsulating Security Payload - 安全封装协议 + + EditPasswdConfirm + - EditIpsecESP + + ButtonAdvanceSetting - - - VpnIpvx - VpnIpvx + + Advance setting + 高级设置 + + + + ButtonConfirm - IPV4 Method - IPV4方法 + + Confirm + 创建 - ComboBoxVPNIpv4Method + + ButtonCancel - Only applied in corresponding resources - 仅用于相对应的网络上的资源 + + Cancel + 取消 - Preferred DNS - 首选DNS + Please enter account name first + 请先输入帐户名 - EditVPNIpv4PreferredDNS - + Please enter your account name + 请输入帐户名 - Alternate DNS - 备选DNS + Account cannot be a pure number + 帐户名不能全为数字 - EditIpv4AlternateDNS - + Account already exists + 帐户名已存在 - Auto - 自动 + Please enter your userName name + 请输入用户名 - VpnL2tpSetting + CursorThemePage - VpnL2tpSetting - + + Cursor Themes Settings + 光标主题设置 + + + CursorThemes - VPN name - VPN名称 + Cursor Themes Settings + 光标主题设置 + + + Faild + 失败 + + + Set cursor themes failed! + 设置光标主题失败! - VpnManager + DateTimeSettings - VpnManager - + + DateTimeSettings + 日期时间设置 - VPN type - VPN类型 + + Select Time + 选择时间 - Save - 保存 + + Select Date + 选择日期 - Return - 返回 + + ButtonSave + - VPN - VPN + + save + 保存 - L2TP + + ButtonReset - Tips - 提示 + + reset + 重置 + + + DaySpinBox - Password required to connect to %1. - 连接网络 "%1" 需要密码 + + %1 + %1日 - VpnPpp + DefaultApp - VpnPpp - + + DefaultApp + 默认程序 - Use MPPE - 使用MPPE + + Web Browser + web浏览器 - Security - 安全 + + Email + 电子邮件 - ComboBoxMppeSecurity - + + Text + 文档查看器 - Stateful MPPE - 使用带状态的MPPE + + Music + 音乐播放器 - All available (default) - 都可用(默认) + + Video + 视频播放器 - 40-bit (less secure) - 40位(较安全) + + Image + 图片查看器 + + + DefaultappPlugin - 128-bit (most secure) - 128位(最安全) + Email + 电子邮件 - Refuse EAP Authentication - 拒绝EAP认证 + Text + 文档查看器 - Refuse PAP Authentication - 拒绝PAP认证 + Music + 音乐播放器 - Refuse CHAP Authentication - 拒绝CHAP认证 + Video + 视频播放器 - Refuse MSCHAP Authentication - 拒绝MSCHAP认证 + Image + 图片查看器 - Refuse MSCHAPv2 Authentication - 拒绝MSCHAPv2认证 + DefaultApp + 默认程序 + + + DetailsPage - No BSD Data Compression - 无BSD数据压缩 + + DetailsPage + - No Deflate Data Compression - 无Deflate数据压缩 + + Network Details + 网络详情 - No TCP Header Compression - 无TCP头压缩 + + Please select a connection + 请选择连接 - No Protocol Field Compression - 无协议字段压缩 + + ComboBoxDetailsSelectConnection + + + + DeviceAvailableConnectionWidget - No Address/Control Compression - 无地址/控制压缩 + + Network card: %1 + 网卡:%1 - Send PPP Echo Packets - 发送PPP回响包 + + Other WiFi networks + 其它WIFI网络 - VpnPptpSetting + DeviceList - VpnPptpSetting - + + Wired Network Adapter + 有线网络配置 - VPN name - VPN名称 + + Wireless Network Adapter + 无线网络配置 - VpnWidget + DevicePanel - VpnWidget + + Form - Gateway - 网关 + + Rotate left 90 degrees + 左旋转90度 - EditVPNGateway + + ButtonLeft - User Name - 用户名 + + Rotate right 90 degrees + 右旋转90度 - EditVPNUserName + + ButtonRight - Password Options - 密码选项 + + Turn left and right + 左右翻转 - ComboBoxVPNPasswordOptions + + ButtonHorizontal - Password - 密码 - - - EditVPNPassword - + + upside down + 上下翻转 - ButtonPasswordVisual + + ButtonVertical - Show Password - 显示密码 + + Identification display + 标识显示器 - NT Domain - NT域 + + ButtonIdentifying + + + + DisconnectAndDeleteButton - EditNTDomain + + DisconnectAndDeleteButton - Required - 必填 + + ButtonDisconnect + - Saved - 已保存的 + + Disconnect + 断开 - Ask - 总是询问 + + ButtonDelete + - Not required - 不要求 + + Delete + 删除 - Gateway can not be empty - 网关不能为空 + + ButtonIgnore + - Gateway invalid - 无效的网关 + + Ignore + 忽略 - user name can not be empty - 用户名不能为空 + + Are you sure you want to delete the connection %1 + 您是否确定要删除连接 "%1" - password can not be empty - 密码不能为空 + + Warning + 警告 - WiredManager + DisplayFormatSettings - WiredManager - + + DisplayFormatSettings + 日期时间格式设置 - ButtonSave + + Long date display format + 长日期显示格式 + + + + ComboLongDateDisplayFormat - Save - 保存 + + Short date display format + 短日期显示格式 - ButtonReturn + + ComboShortDateDisplayFormat - Return - 返回 + + Time format + 时间格式 - Wired Network Adapter - 有线网络配置 + + ComboTimeFormat + - The carrier is pulled out - 网线被拔出 + + Show time witch seconds + 时间显示秒 - The current device is not available - 当前设备不可用 + + 24-hours + 二十四小时制 + + + + 12-hours + 十二小时制 - WiredSettingPage + DisplayPage - WiredSettingPage + + DisplayPage - Network name - 网络名称 - - - - WirelessManager - - WirelessManager + + ButtonCopyDisplay - Save - 保存 + + Copy display + 复制显示 - Return - 返回 + + ButtonExtendedDisplay + - Wireless Network Adapter - 无线网卡 + + Extended display + 扩展显示 - The current device is not available - 当前设备不可用 + + + Resolution ratio + 分辨率 - Tips - 提示 + + ComboResolutionRatio + - Password required to connect to %1. - 连接网络 "%1" 需要密码 + + + Refresh rate + 刷新率 - - - WirelessSecurityWidget - WirelessSecurityWidget + + ComboRefreshRate - Security - 安全 + + + Zoom rate + 缩放率 - ComboBoxWirelessSecurityOption + + ComboZoomRate - Password Options - 密码选项 + + + Automatic + 自动 - ComboBoxWirelessPasswordOption + + + 100% (recommended) + 100% (推荐) + + + + + 200% - Password - 密码 + + Open + 开启 - EditWirelessPassword + + Set as main display + 设为主显示器 + + + + SwitchExtraPrimary - ButtonWirelessPasswordVisual + + ComboExtraResolutionRatio - PushButton + + ComboExtraRefreshRate - None - + + ComboExtraZoomRate + - WPA/WPA2 Personal - WPA/WPA2个人版 + + ButtonExtraApply + - Save password for all users - 仅为该用户存储密码 + + Apply + 应用 - Save password for this user - 存储所有用户密码 + + ButtonExtraCancel + - Ask me always - 总是询问 + + Close + 关闭 - Required - 必填 + + + (recommended) + (推荐) - - - WirelessSettingPage - WirelessSettingPage - + + Is the display normal? + 显示是否正常? - Wireless name - 无线网络名称 + + Save current configuration(K) + 保存当前配置(K) + + + + Restore previous configuration(R) + 恢复之前的配置(R) + + + + The display will resume the previous configuration in %1 seconds + 显示将会在 %1 秒后恢复之前的配置 - WirelessTrayWidget + DisplaySubitem - the network "%1" not found - 未找到网络 "%1" + + Display + 显示 - WirelessWidget + DnsWidget - WirelessWidget + + DnsWidget - SSID - + + Preferred DNS + 首选DNS - EditSsid - + + Alternate DNS + 备选DNS + + + DriverPage - MAC Address Of Device - 设备MAC地址 + + device type + 设备类型 - ComboBoxWirelessMacAddress - + + driver list + 驱动列表 - Custom MTU - 自定义MTU + + Fingerprint + 指纹 - SpinBoxWirelessCustomMTU - + FingerVein + 指静脉 - Required - 必填 + + Fingervein + 指静脉 - No device specified - 不指定设备 + + iris + 虹膜 + + + + ukey + UKey + + + + face + 人脸 - AudioSystemTray + DslManager - Volume Setting - 声音设置 + + DslManager + - Mixed Setting - 混合设置 + + DSL + - CPanelAudioWidget + DslSettingPage - CPanelAudioWidget - + + DslSettingPage + - Output - 输出 + + Save + 保存 - Input - 输入 + + Return + 返回 - InputPage + EthernetWidget - InputPage - + + EthernetWidget + - - Input cards - 输入声卡 + + MAC Address Of Ethernet Device + 设备MAC地址 - Input devices - 输入设备 + + ComboBoxDeviceMac + - ComboBoxInputDevices - + + Ethernet Clone MAC Address + 克隆MAC地址 - Input volume - 输入音量 + + EditDeviceMac + - SliderVolumeSetting - + + Custom MTU + 自定义MTU - Feedback volume - 反馈音量 + + SpinBoxCustomMTU + - No input device detected - 未检测到输入设备 + + No device specified + 不指定设备 - - - OutputPage - OutputPage - + + Clone Mac invalid + 无效的克隆MAC地址 + + + FaceEnrollDialog - - Output cards - 输出声卡 + save + 保存 - Output devices - 输出设备 + cancel + 取消 - ComboBoxOutputDevices - + initializing face collection environment... + 正在初始化人脸采集环境,请稍后 - Output volume - 输出音量 + failed to initialize face collection environment! + 初始化人脸采集环境失败! - SlilderVolumeSetting - + Failed to start collection + 开始采集失败 + + + FaceInputDialog - Left/right balance - 左/右平衡 + save + 保存 - SliderVolumeBalance - + cancel + 取消 - Left - + initializing face collection environment... + 正在初始化人脸采集环境,请稍后 - Right - + failed to initialize face collection environment! + 初始化人脸采集环境失败! - No output device detected - 未检测到输出设备 + Failed to start collection + 开始采集失败 - VolumeIntputSubItem + FacePage - VolumeInput - 输入 + + Default face device + 默认人脸设备 - - - VolumeOutputSubItem - VolumeOutput - 输出 + + face feature list + 人脸特征列表 - - - VolumeSettingPage - VolumeSettingPage - + + face + 人脸 - Volume - 音量 + + Cancel + 取消 - - - AccountItemWidget - Create new user - 创建新用户 + + Start enroll failed,%1 + 开始录入失败,%1 - disable - 禁用 + + + Error + 错误 - enable - 启用 + + The biometric features were successfully recorded. The feature name is:%1 + 特征已成功录入,特征名为:%1 - - - AccountSubItem - account - 帐户 + + Tips + 提示 - New User - 创建新用户 + + Failed to record biometrics(%1), Please try again + 录入特征失败(%1),请重试 - AccountWidget + FingerPage - disable - 禁用 + + Cancel + 取消 - enable - 启用 + + fingerprint + 指纹 - Create new user - 创建新用户 + + fingervein + 指静脉 - - - ActGuideWidget - Please choose activation mode: - 请选择激活方式: + default %1 device + 默认%1设备 - Next - 下一步 + + %1 list + %1列表 - Current machine code: - 当前系统机器码: + + Start enroll failed,%1 + 开始录入失败,%1 - Please input activation code: - 请输入激活码: + + + Error + 错误 - Back - 上一步 + + The biometric features were successfully recorded. The feature name is:%1 + 特征已成功录入,特征名为:%1 - Please insert the UsbKey device first! - 请先插入UsbKey设备! + + Tips + 提示 - Activate online - 在线激活 + + Failed to record biometrics(%1), Please try again + 录入特征失败(%1),请重试 - Activate with the input activation code - 输入激活码激活 + %1list + %1列表 - Activate with insert UsbKey - 插入UsbKey设备激活 + + Default %1 device + 默认%1设备 + + + FingerprintEnrollDialog - Activate - 激活 + save + 保存 - Please enter the activate server address: - 请输入激活服务器地址: + cancel + 取消 - Activating...... - 正在激活...... + Finger Enroll + 指纹录入 - System activate successful! - 系统激活成功! + This fingerprint is bound to the user(%1) + 该指纹已绑定用户(%1) - server activation and remaining points: - 服务器版激活点数和剩余点数: + Info + 提示 - development activation and remaining points: - 开发版激活点数和剩余点数: + Error + 错误 + + + FingerprintInputDialog - industrial activation and remaining points: - 工控版激活点数和剩余点数: + save + 保存 - desktop activation and remaining points: - 桌面版激活点数和剩余点数: + cancel + 取消 - activation points: - 激活点数: + Finger Enroll + 指纹录入 - remaining points: - 剩余点数: + Error + 错误 + + + FingerprintInputWorker - Close - 关闭 + initializing fingerprint collection environment... + 正在初始化指纹采集环境,请稍等 + + + Fonts - System activate failed! - 系统激活失败! + + Form + - unknow - 未知 + Application Font Settings + 应用程序字体设置 - Activation Mode - 选择激活方式 + Titlebar Font Settings + 窗口标题字体设置 - Start Activation - 开始激活 + Monospace Font Settings + 等宽字体设置 - Activation Complete - 激活完成 + + Word size + 字号 - Activation Guide - 激活向导 + + System font + 系统字体 - Server IP address or Domain name - 服务器IP地址或域名 + + Monospaced font + 等宽字体 - AdvanceSettings + GeneralBioPage - Advance Settings - 高级设置 + + default device + 默认设备 - Automatically generated by system - 由系统自动生成 + + feature list + 特征列表 - Please enter the correct path - 请输入正确的路径 + + 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中的信息将不会被删除 - Please enter specify user Id - 请输入用户ID + + Are you sure you want to delete the feature called %1 + 您确定要删除特征名为%1的特征吗 - Please enter an integer above 1000 - 请输入一个大于或等于1000的整数 + + tips + 提示 - Please enter the correct home directory - 请输入正确的用户目录 + + Error + 错误 + + + + Failed to enroll feature because the password verification failed! + 由于密码校验失败,录入特征失败! + + + + Rename Feature + 重命名特征值 + + + + Please enter the renamed feature name + 请输入特征名 + + + GeneralPage + Form - Login shell - 登录Shell + + Capslock Tip + 大写锁定提示 - EditLoginShell - + + Numlock Tip + 数字键盘锁定提示 - Specify user id (needs to be greater than 1000) - 指定用户ID(需大于或等于1000) + + Repeat Key + 重复键 - EditSpecifyUserID - + + (Repeat a key while holding it down) + (按住某一键时重复该键) - Specify user home - 指定用户目录 + + SwitchRepeatKey + - EditSpecifyUserHome - + + Delay + 延时 - ButtonConfirm + + SliderRepeatDelay - confirm - 确认 + + Short + - ButtonCancel - + + Long + - cancel - 取消 + + Interval + 速度 - Specify user id - 指定用户ID + + SliderRepeatInterval + - - - AppearancePlugin - Theme - 主题 + + Slow + - Wallpaper - 壁纸 + + Fast + - Font - 字体 + + + Enter repeat characters to test + 输入重复字符测试 - - - ApplicationPlugin - DefaultApp - 默认程序 + + EditTestRepeatKey + - AutoStart - 开机启动 + Enter characters to test the settings + 输入重复字符测试 - AuthManagerPage + GeneralSettingsPage - Fingerprint Authentication - 指纹认证 + + GeneralSettingsPage + 通用设置页面 - Face Authentication - 人脸认证 + + When the power button is pressed + 按下电源按钮时 - Password Authentication - 密码认证 + + ComboPowerButtonAction + - save - 保存 + + When the suspend button is pressed + 按下挂起按钮时 - return - 返回 + + ComboSuspendAction + - add fingerprint - 录入指纹数据 - + + When closing the lid + 合上盖子操作 + - add face - 录入人脸数据 + + ComboCloseLidAction + - error - 错误 + + Computer Mode + 计算机模式 - please ensure that at least one authentication option exists - 请确保至少一个认证选项打开 + + Display brightness setting + 显示亮度设置 - fingerprint_ - 指纹_ + + 0% + - face_ - 人脸_ + + SliderDisplayBrightness + - - - AuthPlugin - Fingerprint - 指纹 + + Color temperature + 色温 - FingerVein - 指静脉 + + Automatic color temperature + 自动色温 - Driver Manager - 驱动管理 + + cold + - Prefs - 配置 + + standard + 标准 - UKey - UKey + + warm + - Iris - 虹膜 + + Regard computer as idle after + 于此时间后视计算机为空闲 - Face - 人脸 + + SliderComputerIdleTime + - - - AutoStartPage - Boot Setup - 开机启动设置 + + Lock screen when idle + 计算机空闲时锁定屏幕 - Desktop files(*.desktop) - 桌面类型(*.desktop) + + password is required to wake up in standby mode + 待机时唤醒需要输入密码 - select autostart desktop - 选择自启动应用 + + + shutdown + 关机 - Select - 选择 + + + + hibernate + 休眠 - Cancel - 取消 + + + + suspend + 待机 - Error - 错误 + + + display off + 关闭显示器 - Desktop has existed - 该程序已存在 + + + + do nothing + 不执行操作 - Desktop cant permit to join - 该程序不允许添加 + + ERROR + 错误 - Desktop dont support - 不支持该程序 + + %1hour + %1小时 + + + + %1minute + %1分钟 - AutostartPage + GeneralSettingsSubItem - Boot Setup - 开机启动设置 + General Settings + 通用设置 + + + GeneralSubItem - Desktop files(*.desktop) - 桌面类型(*.desktop) + + Keyboard General Option + 键盘通用选项 + + + GroupInfoPage - select autostart desktop - 选择自启动应用 + + Form + - Select - 选择 + + TextLabel + - Cancel - 取消 + + Group + - Error - 错误 + + Member List + - Desktop has existed - 该程序已存在 + + Add User + - Desktop cant permit to join - 该程序不允许添加 + + Delete + - Desktop dont support - 不支持该程序 + + Add Member + - - - BatterySettingsPage - BatterySettingsPage - 电池设置 + + Save + 保存 - After idle for more than the following time, the computer will execute - 空闲超过以下时间后,计算机将执行 + + Cancel + 取消 - ComboIdleTime - + + Please input keys for search... + - ComboIdleAction - + + + + + Error + 错误 + + + GroupSubItem - When the battery is lit up, it will be executed - 电池电量将用尽时 + + Group + - ComboLowBatteryAction - + + Creat group + - The monitor will turn off when it is idle - 显示器空闲以下时间关闭 + + Change group name + - ComboMonitorTurnOffIdleTime - + + Add group member + + + + HardWorker - Reduce screen brightness when idle - 空闲时减少亮度 + + Create User failed + 创建用户失败 - Reduce screen brightness when no power - 低点亮时减少亮度 + + update password failed + 更新密码失败 - The energy saving mode is enabled when the power is low - 低电量时自动开启节能模式 + + icon file + 头像 - Suspend - 待机 + + userName type + 用户名 - Shutdown - 关机 + + locked + 启用状态 - Hibernate - 休眠 + + Failed to update user properties,%1 + 更新用户属性失败,%1 - Do nothing - 不执行操作 + + Failed to delete user,%1 + 删除用户失败,%1 - - - BatterySubItem - Battery Settings - 电池设置 + password + 密码 - - - BiometricItem - add - 添加 + home directory + 用户目录 - - - ChangeHostNameWidget - Form - + shell + shell - Host Name: - 主机名: + icon + 头像 - EditHostName - + Failed to set user attributes + 设置用户属性失败 - ButtonSaveHostName - + account type + 帐户类型 - Save - 保存 + Failed to update user properties(%1) + 更新用户属性失败(%1) - ButtonCancelChangeHostName - + Failed to delete user + 删除用户失败 - Cancel - 取消 + + Failed to connect to the account management service + - Host Name - 主机名 + + Create Group failed + - Warning - 警告 + + Failed to delete group,%1 + - Change host name failed! Please check the Dbus service! - 修改主机名失败!请 检查Dbus服务! + + + add user to group failed + - - - CheckpasswdDialog - Check password - 校验当前用户密码 + + change group name failed + - Check the current password before you enroll the feature - 录入特征之前需要校验当前密码 + + change group name failed, the new group name is occupied + - ChooseItem + HardwareInformation + Form - - - - - CreateGroupPage - - CreateGroupPage - Create Group - + + CPU: + CPU: - Add Group Members + + LabelCpuInfo - Confirm + + + TextLabel - Please enter your group name - + + Memory: + 内存: - group name cannot be a pure number + + LabelMemoryInfo - group name already exists - + + Hard disk: + 硬盘: - Error - 错误 + + Graphics card: + 显卡: - - - CreateUserPage - Account type - 帐户类型 + + Network card: + 网卡: - standard - 普通用户 + Copyright © + 版权所有 © - administrator - 管理员 + KylinSec. All rights reserved. + KylinSec.保留所有权利. - Please enter user name first - 请输入用户名 + + + + Unknow + 未知 - Please enter your user name - 请输入用户名 + + %1 GB (%2 GB available) + %1 GB (%2 GB 可用) + + + HardwareInformationWidget - user name cannot be a pure number - 用户名不能全为数字 + CPU: + CPU: - user name already exists - 用户名已存在 + Memory: + 内存: - Please enter your password - 请输出密码 + Hard disk: + 硬盘: - Please enter the password again - 请再次输入密码 + Graphics card: + 显卡: - The password you enter must be the same as the former one - 两次密码不相同,请核对后,再次输入 + Network card: + 网卡: - Error - 错误 + Unknow + 未知 + + + HardwareSubItem - Password encryption failed - 密码加密失败 + + Hardware Information + 硬件信息 + + + IconThemePage + Form - - - - UserAvatarWidget - User name - 用户名 + + Icon Themes Setting + 图标主题设置 + + + IconThemes - EditUserName - + Icon Themes Setting + 图标主题设置 - User type - 用户类型 + Faild + 失败 - ComboUserType - + Set icon themes failed! + 设置图标主题失败! + + + IdentificationRenameDialog - Password - 用户密码 + Rename Feature + 重命名特征值 - EditPasswd - + Please enter the renamed feature name + 请输入特征名 - Confirm password - 确认密码 + Confirm + 确认 - EditPasswdConfirm - + Cancel + 取消 + + + ImageSelector - ButtonAdvanceSetting - + + Add Image Failed + 添加壁纸失败 - Advance setting - 高级设置 + + The image already exists! + 该壁纸已存在! - ButtonConfirm - + + Delete image + 删除壁纸 - Confirm - 创建 + + Are you sure you want to delete this picture? + 您确定要删除此壁纸? + + + InputDialog - ButtonCancel - + + Confirm + 确认 + Cancel 取消 + + + InputPage - Please enter account name first - 请先输入帐户名 + + InputPage + - Please enter your account name - 请输入帐户名 + + Input cards + 输入声卡 - Account cannot be a pure number - 帐户名不能全为数字 + + Input devices + 输入设备 - Account already exists - 帐户名已存在 + + ComboBoxInputDevices + - Please enter your userName name - 请输入用户名 + + Input volume + 输入音量 - - - CursorThemePage - Cursor Themes Settings - 光标主题设置 + + SliderVolumeSetting + + + + + Feedback volume + 反馈音量 + + + + No input device detected + 未检测到输入设备 - CursorThemes + Ipv4Widget - Cursor Themes Settings - 光标主题设置 + + Ipv4Widget + - Faild - 失败 + + IPV4 Method + IPV4方法 - Set cursor themes failed! - 设置光标主题失败! + + ComboBoxIpv4Method + - - - DateTimeSettings - DateTimeSettings - 日期时间设置 + + IP Address + IP地址 - Select Time - 选择时间 + + EditIpv4Address + - Select Date - 选择日期 + + Net Mask + 子网掩码 - ButtonSave + + EditIpv4Netmask - save - 保存 + + Gateway + 网关 - ButtonReset + + EditIpv4Gateway - reset - 重置 + + DNS + - - - DaySpinBox - %1 - %1日 + + EditIpv4PreferredDNS + - - - DefaultApp - DefaultApp - 默认程序 + + Auto + 自动 - Web Browser - web浏览器 + + Manual + 手动 - Email - 电子邮件 + + + Required + 必填 - Text - 文档查看器 + + Please separate multiple DNS entries by semicolon + 请用分号分隔多个DNS - Music - 音乐播放器 + + Ipv4 DNS invalid + 无效的Ipv4 DNS - Video - 视频播放器 + + Ipv4 address can not be empty + Ipv4地址不能为空 - Image - 图片查看器 + + Ipv4 Address invalid + 无效的Ipv4地址 - - - DefaultappPlugin - Email - 电子邮件 + + NetMask can not be empty + 子网掩码不能为空 - Text - 文档查看器 + + Netmask invalid + 无效的子网掩码 - Music - 音乐播放器 + + Ipv4 Gateway invalid + 无效的Ipv4网关 - Video - 视频播放器 + Preferred DNS + 首选DNS - Image - 图片查看器 + Alternate DNS + 备选DNS - DefaultApp - 默认程序 + Ipv4 Preferred DNS invalid + 无效的Ipv4首选DNS + + + Ipv4 Alternate DNS invalid + 无效的Ipv4备选DNS - DevicePanel + Ipv6Widget - Form + + Ipv6Widget - Rotate left 90 degrees - 左旋转90度 + + IPV6 Method + IPV6方法 - ButtonLeft + + ComboBoxIpv6Method - Rotate right 90 degrees - 右旋转90度 + + IP Address + IP地址 - ButtonRight + + EditIpv6Address - Turn left and right - 左右翻转 + + Prefix + 前缀 - ButtonHorizontal + + SpinBoxIpv6Prefix - upside down - 上下翻转 + + Gateway + 网关 - ButtonVertical + + EditIpv6Gateway - Identification display - 标识显示器 + + DNS + - ButtonIdentifying + + EditIpv6PreferredDNS - - - DisplayFormatSettings - DisplayFormatSettings - 日期时间格式设置 + + Auto + 自动 - Long date display format - 长日期显示格式 + + Manual + 手动 - ComboLongDateDisplayFormat - + + Ignored + 忽略 - Short date display format - 短日期显示格式 + + Required + 必填 - ComboShortDateDisplayFormat - + + Please separate multiple DNS entries by semicolon + 请用分号分隔多个DNS - Time format - 时间格式 + + Ipv6 DNS invalid + 无效的Ipv6 DNS - ComboTimeFormat - + + Ipv6 address can not be empty + Ipv6地址不能为空 - Show time witch seconds - 时间显示秒 + + Ipv6 address invalid + 无效的Ipv6地址 - 24-hours - 二十四小时制 + + Ipv6 Gateway invalid + 无效的Ipv6网关 - 12-hours - 十二小时制 + Preferred DNS + 首选DNS - - - DisplayPage - DisplayPage - + Alternate DNS + 备选DNS - ButtonCopyDisplay - + Ipv6 Preferred DNS invalid + 无效的Ipv6首选DNS - Copy display - 复制显示 + Ipv6 Alternate DNS invalid + 无效的Ipv6备选DNS + + + IrisPage - ButtonExtendedDisplay - + + Default Iris device + 默认虹膜设备 - Extended display - 扩展显示 + + Iris feature list + 虹膜特征列表 - Resolution ratio - 分辨率 + + iris + 虹膜 - ComboResolutionRatio - + + Cancel + 取消 - Refresh rate - 刷新率 + + Start enroll failed,%1 + 开始录入失败,%1 - ComboRefreshRate - + + + Error + 错误 - Zoom rate - 缩放率 + + The biometric features were successfully recorded. The feature name is:%1 + 特征已成功录入,特征名为:%1 - ComboZoomRate - + + Tips + 提示 - Automatic - 自动 + + Failed to record biometrics(%1), Please try again + 录入特征失败(%1),请重试 + + + KcpInterface - 100% (recommended) - 100% (推荐) + Warning + 警告 - 200% - + load qss file failed + 加载qss文件失败 + + + KeybindingSubItem - Open - 开启 + + Keybinding + 快捷键 + + + KeycodeTranslator - Set as main display - 设为主显示器 + + None + 暂无 - SwitchExtraPrimary - + + disabled + 禁用 + + + KiranAccountManager - ComboExtraResolutionRatio - + disable + 禁用 - ComboExtraRefreshRate - + enable + 启用 - ComboExtraZoomRate - + Create new user + 创建新用户 - ButtonExtraApply - + User Manager + 帐户管理工具 - Apply - 应用 + Create new account + 创建新用户 + + + KiranAvatarEditor - ButtonExtraCancel - - - - Close - 关闭 - - - (recommended) - (推荐) - - - Is the display normal? - 显示是否正常? - - - Save current configuration(K) - 保存当前配置(K) + + Avatar Editor + 头像编辑器 - Restore previous configuration(R) - 恢复之前的配置(R) + + Confirm + 确认 - The display will resume the previous configuration in %1 seconds - 显示将会在 %1 秒后恢复之前的配置 + + Cancel + 取消 - DisplaySubitem + KiranCPanelMouse - Display - 显示 + Mouse and TouchPad + 鼠标和触摸板 - DriverPage - - device type - 设备类型 - + KiranCPanelMouseWidget - driver list - 驱动列表 + Select Mouse Hand + 选择鼠标手持模式 - Fingerprint - 指纹 + Mouse Motion Acceleration + 鼠标移动加速 - FingerVein - 指静脉 + Natural Scroll + 是否为自然滚动 - Fingervein - 指静脉 + Middle Emulation Enabled + 同时按下左右键模拟中键 - iris - 虹膜 + Touchpad Enabled + 禁用触摸板 - ukey - UKey + Select TouchPad Hand + 选择触摸板使用模式 - face - 人脸 + TouchPad Motion Acceleration + 触摸板移动加速 - - - FaceEnrollDialog - save - 保存 + Select Click Method + 设置点击触摸板方式 - cancel - 取消 + Select Scroll Method + 滚动窗口方式 - initializing face collection environment... - 正在初始化人脸采集环境,请稍后 + Enabled while Typing + 打字时触摸板禁用 - failed to initialize face collection environment! - 初始化人脸采集环境失败! + Tap to Click + 轻击(不按下)触摸板功能是否生效 - Failed to start collection - 开始采集失败 + Reset + 重置 - - - FaceInputDialog - save - 保存 + Exit + 关闭 - cancel + Cancel 取消 - initializing face collection environment... - 正在初始化人脸采集环境,请稍后 + Save + 保存 - failed to initialize face collection environment! - 初始化人脸采集环境失败! + Mouse Settings + 鼠标设置 - Failed to start collection - 开始采集失败 + TouchPad Settings + 触摸板设置 - - - FacePage - Default face device - 默认人脸设备 + Standard + 标准 - face feature list - 人脸特征列表 + Right Hand Mode + 右手模式 - face - 人脸 + Left Hand Mode + 左手模式 - Cancel - 取消 + Press and Tap + 按键和轻触 - Start enroll failed,%1 - 开始录入失败,%1 + Tap + 轻触 - Error - 错误 + Two Finger Scroll + 两指滑动 - The biometric features were successfully recorded. The feature name is:%1 - 特征已成功录入,特征名为:%1 + Edge Scroll + 边缘滑动 - Tips - 提示 + Slow + 低速 - Failed to record biometrics(%1), Please try again - 录入特征失败(%1),请重试 + Fast + 快速 - FingerPage - - Cancel - 取消 - + KiranCollapse - fingerprint - 指纹 + + ListExpansionSpace + + + + KiranCpanelAppearance - fingervein - 指静脉 + Wallpaper Setting + 壁纸设置 - default %1 device - 默认%1设备 + Theme Setting + 主题设置 - %1 list - %1列表 + Font Setting + 字体设置 + + + KiranDatePickerWidget - Start enroll failed,%1 - 开始录入失败,%1 + + Form + + + + KiranGroupManager - Error - 错误 + + Create new group + + + + KiranModuleWidget - The biometric features were successfully recorded. The feature name is:%1 - 特征已成功录入,特征名为:%1 + Warning + 警告 - Tips - 提示 + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? - Failed to record biometrics(%1), Please try again - 录入特征失败(%1),请重试 + + Form + + + + KiranSystemWidget - %1list - %1列表 + kiran-system-imformation + 系统信息 - Default %1 device - 默认%1设备 + 保存 + 保存 - FingerprintEnrollDialog + KiranTimeDateWidget - save - 保存 + + KiranTimeDateWidget + - cancel - 取消 + + Automatic synchronizetion + 自动同步 - Finger Enroll - 指纹录入 + + Change Time Zone + 更改时区 - This fingerprint is bound to the user(%1) - 该指纹已绑定用户(%1) + + Set Time Manually + 手动设置时间 - Info - 提示 + + Time date format setting + 日期时间格式设置 - Error - 错误 + + %1(%2) + %1时间(%2) - FingerprintInputDialog + KiranTimePickerWidget - save - 保存 + + Form + + + + KiranTimeZone - cancel - 取消 + + Form + - Finger Enroll - 指纹录入 + + Search in all time zones... + 在所有时区中搜索... + + + KiranTimeZoneItem - Error - 错误 + + Form + + + + + No search results, please search again... + 无搜索结果,请重新搜索... - FingerprintInputWorker + KiranTimeZoneList - initializing fingerprint collection environment... - 正在初始化指纹采集环境,请稍等 + + Form + - Fonts + KiranTips + + Form - + + + + KylinsecLogo - Application Font Settings - 应用程序字体设置 + + Copyright © + 版权所有 © - ComboAppFontName - + + KylinSec. All rights reserved. + KylinSec.保留所有权利. + + + LayoutItem - ComboAppFontSize + + Form + + + LayoutList - Titlebar Font Settings - 窗口标题字体设置 - - - ComboTitleFontName + + LayoutList + + + LayoutPage - ComboTitleFontSize + + Form - Monospace Font Settings - 等宽字体设置 + + Select Kayboard Layout + 选择布局 - ComboMonospaceFontName - + + + Edit + 编辑 - ComboMonospaceFontSize - + + + Add Layout + 添加布局 - Word size - 字号 + + ButtonAddLayout + - System font - 系统字体 + + Addition + 添加 - Monospaced font - 等宽字体 + + ButtonReturn + - - - GeneralBioPage - default device - 默认设备 + + Return + 返回 - feature list - 特征列表 + + + + + Failed + 失败 - 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中的信息将不会被删除 + + You have added this keyboard layout! + 您已经添加过该布局 - Are you sure you want to delete the feature called %1 - 您确定要删除特征名为%1的特征吗 + + The %1 keyboard layout does not exist! + 该 %1 键盘布局不存在! - tips - 提示 + + The keyboard layout is currently in use and cannot be deleted! + 该布局目前正在使用,无法删除! - Error - 错误 + + Delete Layout + 删除布局 - Failed to enroll feature because the password verification failed! - 由于密码校验失败,录入特征失败! + + You do not appear to have added %1 keyboard layout! + 您似乎没有添加 %1 键盘布局! - Rename Feature - 重命名特征值 + + Finish + 完成 + + + LayoutSubItem - Please enter the renamed feature name - 请输入特征名 + + Keyboard Layout + 键盘布局 - GeneralPage + LicenseAgreement + Form - + - Capslock Tip - 大写锁定提示 + + BrowserLicense + - Numlock Tip - 数字键盘锁定提示 + + <!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> + - Repeat Key - 重复键 + + ButtonExportLicense + - (Repeat a key while holding it down) - (按住某一键时重复该键) + + Export + 导出 - SwitchRepeatKey + + ButtonCloseLicense - Delay - 延时 + + Close + 关闭 - SliderRepeatDelay - + + Save + 保存 - Short - + + PDF(*.pdf) + - Long - + + Export License + 导出协议 - Interval - 速度 + + Export License failed! + 导出协议失败! - SliderRepeatInterval - + + User End License Agreement + 最终用户许可协议 - Slow - + + + + + + + None + 暂无 - Fast - + + Version License + 版本协议 - Enter repeat characters to test - 输入重复字符测试 + Export EULA + 导出最终用户许可协议 - EditTestRepeatKey - + Export EULA failed! + 导出最终用户许可协议失败! - Enter characters to test the settings - 输入重复字符测试 + + + Privacy Policy + 隐私协议 - GeneralSettingsPage + LicenseInfoWidget - GeneralSettingsPage - 通用设置页面 + Machine Code: + 机器码: - When the power button is pressed - 按下电源按钮时 + Activation Code: + 激活码: - ComboPowerButtonAction - + Activation Information + 激活信息 - When the suspend button is pressed - 按下挂起按钮时 + Can't get machine code + 无法获取到机器码 - ComboSuspendAction - + Can't get activation code + 无法获取到激活码 + + + LicenseInformation - When closing the lid - 合上盖子操作 + Installation time: + 安装时间: - ComboCloseLidAction - + Activation status: + 激活状态: - Computer Mode - 计算机模式 + Expiry date: + 质保期: - Display brightness setting - 显示亮度设置 + Contact Us: + 联系我们: - 0% - + Unknow + 未知 - SliderDisplayBrightness - + Can't get activation information + 无法获取激活信息 - Color temperature - 色温 + Activate + 激活 - Automatic color temperature - 自动色温 + The current time is illegal + 当前时间不合法 - cold - + Less than the installation time + 小于安装时间 - standard - 标准 + Not activated. Trail expiration: + 未激活.试用到期: - warm - + get service status failed + 获取服务状态信息失败 - Regard computer as idle after - 于此时间后视计算机为空闲 + Not yet + 暂无 - SliderComputerIdleTime - - - - Lock screen when idle - 计算机空闲时锁定屏幕 - - - password is required to wake up in standby mode - 待机时唤醒需要输入密码 - - - shutdown - 关机 - - - hibernate - 休眠 - - - suspend - 待机 - - - display off - 关闭显示器 - - - do nothing - 不执行操作 - - - ERROR - 错误 - - - %1hour - %1小时 - - - %1minute - %1分钟 - - - - GeneralSettingsSubItem - - General Settings - 通用设置 - - - - GeneralSubItem - - Keyboard General Option - 键盘通用选项 - - - - GroupInfoPage - - Form - - - - TextLabel - - - - Group - - - - Member List - - - - Add User - - - - Delete - - - - Add Member - - - - Save - 保存 + Activated + 已激活 - Cancel - 取消 + Forever + 永久授权 - Please input keys for search... - + Copyright © + 版权所有 © - Error - 错误 + KylinSec. All rights reserved. + KylinSec.保留所有权利. - GroupSubItem - - Group - - - - Creat group - - - - Change group name - - + ListExpansionSpace - Add group member + + ListExpansionSpace - HardWorker - - Create User failed - 创建用户失败 - - - update password failed - 更新密码失败 - - - icon file - 头像 - + Media Key - userName type - 用户名 + + Audio Play + 音频播放 - locked - 启用状态 + + Search + 搜索 - Failed to update user properties,%1 - 更新用户属性失败,%1 + + WWW + 万维网 - Failed to delete user,%1 - 删除用户失败,%1 + + Audio Lower Volume + 减小音量 - password - 密码 + + Audio Raise Volume + 增大音量 - home directory - 用户目录 + + Mic Mute + 输入静音 - shell - shell + + Audio Stop + 音频停止 - icon - 头像 + + Explorer + 浏览 - Failed to set user attributes - 设置用户属性失败 + + Calculator + 计算器 - account type - 帐户类型 + + Audio Mute + 音频暂停 - Failed to update user properties(%1) - 更新用户属性失败(%1) + + Audio Pause + 音频暂停 - Failed to delete user - 删除用户失败 + + Audio Prev + 音频上一个 - Failed to connect to the account management service - + + Audio Media + 音频媒体 - Create Group failed - + + Audio Next + 音频下一个 - Failed to delete group,%1 - + + Mail + 邮件 - add user to group failed - + + Tools + 工具 - change group name failed - + + Eject + 弹出 + + + MonthSpinBox - change group name failed, the new group name is occupied - + + MMMM + MMMM - HardwareInformation + MousePage + Form - CPU: - CPU: - - - LabelCpuInfo - + + Select Mouse Hand + 选择鼠标手持模式 - TextLabel + + ComboSelectMouseHand - Memory: - 内存: + + Mouse Motion Acceleration + 鼠标移动加速 - LabelMemoryInfo + + SliderMouseMotionAcceleration - Hard disk: - 硬盘: + + Slow + - Graphics card: - 显卡: + + Fast + - Network card: - 网卡: + + Natural Scroll + 是否为自然滚动 - Copyright © - 版权所有 © + + SwitchMouseNatturalScroll + - KylinSec. All rights reserved. - KylinSec.保留所有权利. + + Middle Emulation Enabled + 同时按下左右键模拟中键 - Unknow - 未知 + + SwitchMiddleEmulation + - %1 GB (%2 GB available) - %1 GB (%2 GB 可用) + + Test mouse wheel direction + 鼠标滚轮方向测试 - - - HardwareInformationWidget - CPU: - CPU: - - - Memory: - 内存: - - - Hard disk: - 硬盘: - - - Graphics card: - 显卡: - - - Network card: - 网卡: + + 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行测试文字 - Unknow - 未知 + + Right Hand Mode + 右手模式 - - - HardwareSubItem - Hardware Information - 硬件信息 + + Left Hand Mode + 左手模式 - IconThemePage + MouseSettings - Form - + Select Mouse Hand + 选择鼠标手持模式 - Icon Themes Setting - 图标主题设置 + Mouse Motion Acceleration + 鼠标移动加速 - - - IconThemes - Icon Themes Setting - 图标主题设置 + Natural Scroll + 是否为自然滚动 - Faild - 失败 + Middle Emulation Enabled + 同时按下左右键模拟中键 - Set icon themes failed! - 设置图标主题失败! + Right Hand Mode + 右手模式 - - - IdentificationRenameDialog - Rename Feature - 重命名特征值 + Left Hand Mode + 左手模式 - Please enter the renamed feature name - 请输入特征名 + Slow + - Confirm - 确认 + Standard + 标准 - Cancel - 取消 + Fast + - ImageSelector - - Add Image Failed - 添加壁纸失败 - - - The image already exists! - 该壁纸已存在! - - - Delete image - 删除壁纸 - + MouseSubItem - Are you sure you want to delete this picture? - 您确定要删除此壁纸? + + Mouse Settings + 鼠标设置 - InputDialog + NetworkSubItem - Confirm - 确认 + + Wired Network %1 + 有线网络 %1 - Cancel - 取消 + + Wired Network + 有线网络 - - - IrisPage - Default Iris device - 默认虹膜设备 + + Wireless Network %1 + 无线网络 %1 - Iris feature list - 虹膜特征列表 + + Wireless Network + 无线网络 - iris - 虹膜 + + VPN + VPN - Cancel - 取消 + + Network Details + 网络详情 + + + NetworkTray - Start enroll failed,%1 - 开始录入失败,%1 + + Network settings + 网络设置 - Error - 错误 + + + Network unavailable + 网络不可用 - The biometric features were successfully recorded. The feature name is:%1 - 特征已成功录入,特征名为:%1 + + + The network is connected, but you cannot access the Internet + 网络已连接,但不能访问互联网 - Tips - 提示 + + Network not connected + 网络已断开 - Failed to record biometrics(%1), Please try again - 录入特征失败(%1),请重试 - - - - KcpInterface - - Warning - 警告 + + Wired network card: %1 available + 有线网卡: %1 可用 - load qss file failed - 加载qss文件失败 + + Wireless network card: %1 available + 无线网卡: %1 可用 - - - KeybindingSubItem - Keybinding - 快捷键 + + Wired network card: %1 unavailable + 有线网卡: %1 不可用 - - - KeycodeTranslator - None - 暂无 + + Wireless network card: %1 unavailable + 无线网卡: %1 不可用 - disabled - 禁用 + + + Network connected + 网络已连接 - KiranAccountManager - - disable - 禁用 - - - enable - 启用 - + OutputPage - Create new user - 创建新用户 + + OutputPage + - User Manager - 帐户管理工具 + + Output cards + 输出声卡 - Create new account - 创建新用户 + + Output devices + 输出设备 - - - KiranAvatarEditor - Avatar Editor - 头像编辑器 + + ComboBoxOutputDevices + - Confirm - 确认 + + Output volume + 输出音量 - Cancel - 取消 + + SlilderVolumeSetting + - - - KiranCPanelMouse - Mouse and TouchPad - 鼠标和触摸板 + + Left/right balance + 左/右平衡 - - - KiranCPanelMouseWidget - Select Mouse Hand - 选择鼠标手持模式 + + 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年 -- Gitee From a7e290f84706326720fa007affcab28a7ff94fab Mon Sep 17 00:00:00 2001 From: liuxinhao Date: Fri, 15 Dec 2023 21:06:06 +0800 Subject: [PATCH 14/17] 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 4fe97652..07a668da 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 f6f62874..1315fda3 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 98c5383f..586c6c8d 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}/) -- Gitee From 8ec8f81ec74b9af6333e8beb4b2a8f0dec08cdc9 Mon Sep 17 00:00:00 2001 From: liuxinhao Date: Fri, 15 Dec 2023 16:13:08 +0800 Subject: [PATCH 15/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 05f71539..981fdbfe 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(); -- Gitee From 07f66555be3f8255f961015aa989f63af48db087 Mon Sep 17 00:00:00 2001 From: niko_yhc Date: Wed, 20 Dec 2023 20:38:55 +0800 Subject: [PATCH 16/17] feature(language-settings):add language-settings into kiran-control-panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 控制中心新增语言设置 Closes#23737 --- data/category/desktop/language.desktop | 30 ++ data/category/images/language.png | Bin 0 -> 3295 bytes .../kiran-setting-item.cpp | 17 +- .../kiran-setting-item.h | 4 + plugins/CMakeLists.txt | 1 + plugins/language/CMakeLists.txt | 70 ++++ plugins/language/config/config.h.in | 6 + ...com.kylinsec.kiran.language.gschema.xml.in | 10 + plugins/language/data/support_language.json | 46 +++ plugins/language/language-plugin.cpp | 82 ++++ plugins/language/language-plugin.h | 51 +++ plugins/language/language-subitem.cpp | 99 +++++ plugins/language/language-subitem.h | 83 ++++ plugins/language/src/langpack-installer.cpp | 116 ++++++ plugins/language/src/langpack-installer.h | 48 +++ plugins/language/src/langpack-thread.cpp | 58 +++ plugins/language/src/langpack-thread.h | 41 ++ plugins/language/src/language-manager.cpp | 361 ++++++++++++++++++ plugins/language/src/language-manager.h | 99 +++++ plugins/language/src/language-page.cpp | 199 ++++++++++ plugins/language/src/language-page.h | 56 +++ .../language/src/language-select-dialog.cpp | 141 +++++++ plugins/language/src/language-select-dialog.h | 51 +++ .../language/src/language-select-dialog.ui | 174 +++++++++ resources/control-panel-resources.qrc | 3 + resources/images/language.svg | 39 ++ translations/kiran-control-panel.zh_CN.ts | 95 +++++ 27 files changed, 1979 insertions(+), 1 deletion(-) create mode 100644 data/category/desktop/language.desktop create mode 100644 data/category/images/language.png create mode 100644 plugins/language/CMakeLists.txt create mode 100644 plugins/language/config/config.h.in create mode 100644 plugins/language/data/com.kylinsec.kiran.language.gschema.xml.in create mode 100644 plugins/language/data/support_language.json create mode 100644 plugins/language/language-plugin.cpp create mode 100644 plugins/language/language-plugin.h create mode 100644 plugins/language/language-subitem.cpp create mode 100644 plugins/language/language-subitem.h create mode 100644 plugins/language/src/langpack-installer.cpp create mode 100644 plugins/language/src/langpack-installer.h create mode 100644 plugins/language/src/langpack-thread.cpp create mode 100644 plugins/language/src/langpack-thread.h create mode 100644 plugins/language/src/language-manager.cpp create mode 100644 plugins/language/src/language-manager.h create mode 100644 plugins/language/src/language-page.cpp create mode 100644 plugins/language/src/language-page.h create mode 100644 plugins/language/src/language-select-dialog.cpp create mode 100644 plugins/language/src/language-select-dialog.h create mode 100644 plugins/language/src/language-select-dialog.ui create mode 100644 resources/images/language.svg diff --git a/data/category/desktop/language.desktop b/data/category/desktop/language.desktop new file mode 100644 index 00000000..75b6e223 --- /dev/null +++ b/data/category/desktop/language.desktop @@ -0,0 +1,30 @@ +[Kiran Control Panel Category] +Category=language + +Name=language +Name[zh_CN]=语言 +Name[bo_CN]=སྐད་སྒྲ། +Name[kk_KG]=үн +Name[kk_KZ]=дыбыс +Name[mn_MN]=дуу чимээ +Name[ug_CN]=ئاۋاز + +Comment=language settings +Comment[zh_CN]=语言设置 +Comment[bo_CN]=སྐད་སྒྲ་སྒྲིག་པ། +Comment[kk_KG]=Үн параметрлери +Comment[kk_KZ]=Дыбыс параметрлері +Comment[mn_MN]=Дуу чимээний тохиргоо +Comment[ug_CN]=ئاۋاز تەسىس قىلىش + +Icon=language.png + +Weight=7 + +Keywords[zh_CN]=语言 +Keywords[bo_CN]=སྐད་སྒྲ། +Keywords[kk_KG]=үн +Keywords[kk_KZ]=дыбыс +Keywords[mn_MN]=дуу чимээ +Keywords[ug_CN]=ئاۋاز +Keywords=language diff --git a/data/category/images/language.png b/data/category/images/language.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0befefed885ef549c7bff1f3ee4693a2f23d91 GIT binary patch literal 3295 zcmV<53?TD~P) zdvH|M9mhZC?%nKeve^X#QcXb(B|vR;1hov#ID^hObrew0(fTT#@linpk+#xO{_w5n zm%9e4;>2E_YW!9qa`@F-9-VR21YE(t^~ z1nhop;W(fcxMU!;DfO?9;A1oNatP6ks;@aSYZav`RXCIshyg^a;gNYFEhAmqkgtrI$_nG-&U>k68 z-l|qu*a2MjyJz9=hV&~ZCZBTim(&Dp>q3eTUf8WQ-nE~UJRqVQEf0Mm2{KTuth0>-5}Qch4^ zivq@YT}t^K)wL*KjMF8IQeBGz#wZ;r%T?E+fKjeX)m12P=u#FbP>CV|icwTSilI~N z0ZLI+L5iVV1r4P9{-n+3>>3IVFl9YJ20r_nuD@wTAJ?kLP)dLdT$e9dLdS<6(y@Mh zR)GXblQK6FTp^3hwPxR!o;WHTZ0=~5ig zBX%-Lr?5UAwyJdEvVjw7vHp<|lg*WVQgRP($KN#RQmG1QY&653aSsQ3etD~i)G8umM^Du=T1`V*8~2R z?+qm*M}le6e(V_ShYzD65F*ps9S8|hbho}#&V|H*DN}}&3UcmwE9IyL6BxTH4FkQT zgke2Bw_!?&M$fH3->osP1bBb2BYdw)F#{xIYmH5H^)7h^5IuV&=S-byJ$wIs+7BP` zwPpbfzwo;x#*MS;AU$P>+$VFV3wa~JTZ*G%%5S}u_+^*%=$80w(V}i7eEHi~NK5F# zB4G4AcUuE6u2W8PMx5&vC*e?N-8Rd3?FXAwe_`= z-X}QwN*wQpKufISV$+TrtExf|hasJ&?aM=sJ&Uxvj7yqnKspV8VM=>aCeaX>WF~7WIz-+H zaD#LPQt2bWH2keqVhLy5lTT8f&BC$cPP}P06K|T`a|P^pQ)=IIZ+*UECGG#*qPPd- zsi1BIWC@l@njygSX5djHg9U3wYz^2>Psn#KP+|qSde^J7od`xoU6`h{OhsUSZ7rdA zJY&9+@e2j>?Fo)AD1>EwbnM=PkkZXVg=<;~0j`~IkEp`?z|5|KQag6IlQsiLlRE)U ztJbgtuLEIWeU^B}0TrfbUR976nUyJlVUr-hM}Rw4h)f>Y>YK}N2-^NVslj|B?=#_U z*V1XZ_8r4?Rgjd@ovnHko_EVFt~uME+B?0V>8)B@{Ry87&ZubMWXIvn&^LIh0Kd_(EJAlKq>g)IHnj+EI2V?S?iZl>+)uY2?zdGE)D z4I`RN`ttS0@zy7w63M$O!i(T6G}{;e5Kbm3ude3!wr$ou`}u*b+xV=mu3LUiS}y@( zXU}G=r{@Sers};x%D1IB1Fba=kUqD8X-Z0lCAsK<2LL#_b*q)w=^>^W7$ABn%bTzC z>-}uKAzv6$1jqmZS|Y*4bLSGTr~n{To}jb2*++ozxGNklC|K?apZe-SwRwXIQ&id3 z#NZ6rU7Yc_A|~JeQ_3qUz%XdqwTq7CW}ga@rs>WT9O1j>t*}UN%Iap`W(g`VI#Wt}@yD8kIgU6L7;*%h zW&8I5x;i>&+_Z^(>;LYb<=W3H#*BgK*JpJr2U~ZACtqg_@Cv`632^LiJyGtq`nFVx zkKTTpn%D{sct*m zTzw9-rBa;C635BkTUKczK`i0_>(k;GK*stIb~W~`TSt2;mARiSp-sU49Xt5suYa@R z*=xXF0t_TkM+aMxd>GNn#|r?R7gU(6$F04_cRcC^>j}6)XAmv9IupwGfB1Q0@F^V{C5JC`*L?rMJZTgG#UkM?$ zN5Wy{Z;cm9h=jukA+}F{vHqYAAmR1WSZs1zXXlWf6`u(ZLQoouA+2L@-2)t6*MxYo zEE2q8$8m4TEk5}t7GyQ_FNtbF$%@MuWWNXCn&Sq(Ol@i-w( z19;4qHPC%~dJXWSNH}~+d1)!B*4BL1@r*^Htjx0e;orau-e>F0T+XdVLq)MYv z5@p3B;|GdFSsA64-ai4{YRlM#$ab9VJM(6`$Jw@bcGBF^QXCWd2_Xc@c${cS3E0Qk z-neQ_-^bYk*b(OgL`zDjNG1vEN?)e=MnTtgDw0V@_yF^>2_JfSH~Gd@YhIRcp9CWm z3UO94NxZZagivnI4b^}U#7j%5NG1t|LP%?`*?l*zTJv&Gau(TCkQepyX5Ik&0Z0It zhCyq4J15)Qi)zV+5Q11FLOd2j3%MIBTY$S}ty=R=uW9=t0HA)}%yB?1aEWuzG)>w% zI%w^C^=Zz-_Zut!d~h50MK20QGZclmLr?r36l0HBFO_ zt}eRLY0~L5hG}A&<~L%oKNo01plKQ*O+(jp!n#f*91aQ{tW#2-0G7{sX>DgNd5c^L za8NgQMkVkta4%4_Q!ShXRs&DZerfH2{v;IrCBQ-5+!-T)JF!j$orL;5PWgrewgYbf zf1Lf&+M}nEi8xgPyr{c>`Y2!;*141ufeV0setVisible(visible); + m_midIcon = icon; + m_midIconChanged = midIconChanged; + updateIcon(); +} + void KiranSettingItem::setSwitcherVisible(bool visible) { m_switcher->setVisible(visible); @@ -114,6 +122,12 @@ void KiranSettingItem::initUI() connect(m_switcher, &KiranSwitchButton::toggled, this, [this](bool checked) { emit switchButtonToggled(m_userData, checked); }); + m_midButton = new QPushButton(this); + m_midButton->setFixedSize(16, 16); + m_midButton->setFlat(true); + m_midButton->setVisible(false); + layout->addWidget(m_midButton); + m_rightButton = new QPushButton(this); m_rightButton->setFixedSize(16, 16); m_rightButton->setFlat(true); @@ -137,7 +151,8 @@ void KiranSettingItem::updateIcon() }; QVector buttonIconMap = { {m_leftButton, m_leftIcon, m_leftIconChanged}, - {m_rightButton, m_rightIcon, m_rightIconChanged}}; + {m_rightButton, m_rightIcon, m_rightIconChanged}, + {m_midButton, m_midIcon, m_midIconChanged}}; for (auto& iter : buttonIconMap) { diff --git a/lib/common-widgets/kiran-setting-container/kiran-setting-item.h b/lib/common-widgets/kiran-setting-container/kiran-setting-item.h index 48da4cae..f2dd9acd 100644 --- a/lib/common-widgets/kiran-setting-container/kiran-setting-item.h +++ b/lib/common-widgets/kiran-setting-container/kiran-setting-item.h @@ -36,6 +36,7 @@ public: void setLeftButtonVisible(bool visible, const QIcon& icon, bool leftIconChanged = true); void setRightButtonVisible(bool visible, const QIcon& icon, bool rightIconChanged = true); + void setMidButtonVisible(bool visible, const QIcon& icon, bool midIconChanged = true); void setSwitcherVisible(bool visible); void setSwitcherChecked(bool checked); @@ -60,15 +61,18 @@ private: QIcon m_leftIcon; QIcon m_rightIcon; + QIcon m_midIcon; QPushButton* m_leftButton; KiranLabel* m_label; KiranSwitchButton* m_switcher; QPushButton* m_rightButton; + QPushButton* m_midButton; bool m_clickable = false; bool m_clicked = false; bool m_leftIconChanged; bool m_rightIconChanged; + bool m_midIconChanged; }; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 9acb921e..832e380b 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory(display) add_subdirectory(keybinding) add_subdirectory(authentication) add_subdirectory(application) +add_subdirectory(language) if(ENABLE_NETWORK) add_subdirectory(network) endif() diff --git a/plugins/language/CMakeLists.txt b/plugins/language/CMakeLists.txt new file mode 100644 index 00000000..79e787ad --- /dev/null +++ b/plugins/language/CMakeLists.txt @@ -0,0 +1,70 @@ +set(TARGET_NAME kiran-cpanel-language) + +find_package(PkgConfig REQUIRED) +find_package(Qt5 COMPONENTS Widgets Svg DBus LinguistTools Network) +pkg_search_module(KIRAN_WIDGETS_QT5 REQUIRED kiranwidgets-qt5) +pkg_search_module(KLOG_QT5 REQUIRED klog-qt5) +pkg_search_module(KIRAN_CC_DAEMON REQUIRED kiran-cc-daemon) +pkg_search_module(KIRAN_CONTROL_PANEL REQUIRED kiran-control-panel) +pkg_search_module(KIRAN_STYLE_HELPER REQUIRED kiran-style-helper) +pkg_search_module(QGSETTINGS REQUIRED gsettings-qt) +pkg_search_module(LIBNOTIFY REQUIRED libnotify) +pkg_search_module(PACKAGEKIT_QT5 REQUIRED packagekitqt5) + +set(LANGUAGE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/lib/common-widgets/kiran-setting-container ${PROJECT_SOURCE_DIR}/src/search-edit) + +file(GLOB_RECURSE LANGUAGE_PLUGIN_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/*.ui) + +add_library(${TARGET_NAME} SHARED + ${LANGUAGE_PLUGIN_SRC}) + +target_include_directories(${TARGET_NAME} PRIVATE + ${CMAKE_CURRENT_BINARY_DIR} + ${KCP_PLUGIN_INCLUDE_DIR} + ${LANGUAGE_INCLUDE_DIRS} + ${KIRAN_WIDGETS_QT5_INCLUDE_DIRS} + ${KLOG_QT5_INCLUDE_DIRS} + ${KIRAN_CC_DAEMON_INCLUDE_DIRS} + ${KIRAN_STYLE_HELPER_INCLUDE_DIRS} + ${QGSETTINGS_INCLUDE_DIRS} + ${LIBNOTIFY_INCLUDE_DIRS} + ${PACKAGEKIT_QT5_INCLUDE_DIRS}) + +target_link_libraries(${TARGET_NAME} + common-widgets + Qt5::Widgets + Qt5::DBus + Qt5::Svg + Qt5::Core + ${KIRAN_WIDGETS_QT5_LIBRARIES} + ${KLOG_QT5_LIBRARIES} + ${KIRAN_STYLE_HELPER_LIBRARIES} + ${QGSETTINGS_LIBRARIES} + ${LIBNOTIFY_LIBRARIES} + ${PACKAGEKIT_QT5_LIBRARIES}) + +install(TARGETS ${TARGET_NAME} + DESTINATION ${PLUGIN_LIBS_DIR}/) + +install(FILES ${LANGUAGE_QM} DESTINATION ${TRANSLATION_DIR}/) + +set(SUPPORT_LANGUAGE_JSON support_language.json) +set(KIRAN_SUPPORT_LANGUAGE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data) +set(KIRAN_SYSTEM_SUPPORT_LANGUAGE_DIR ${PLUGIN_DIR}/data) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/${SUPPORT_LANGUAGE_JSON} + DESTINATION ${PLUGIN_DIR}/data/) + +set(SCHEMA_IN_FILE com.kylinsec.kiran.language.gschema.xml.in) +set(SCHEMA_FILE com.kylinsec.kiran.language.gschema.xml) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/${SCHEMA_IN_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_FILE}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_FILE} + DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/glib-2.0/schemas/) +install( + CODE "execute_process(COMMAND glib-compile-schemas \"${CMAKE_INSTALL_FULL_DATADIR}/glib-2.0/schemas/\")" + ) + + diff --git a/plugins/language/config/config.h.in b/plugins/language/config/config.h.in new file mode 100644 index 00000000..9400f286 --- /dev/null +++ b/plugins/language/config/config.h.in @@ -0,0 +1,6 @@ +#ifndef __LANGUAGE_CONFIG_H__ +#define __LANGUAGE_CONFIG_H__ + +#define KIRAN_SUPPORT_LANGUAGE_DIR "@KIRAN_SUPPORT_LANGUAGE_DIR@/" +#define KIRAN_SYSTEM_SUPPORT_LANGUAGE_DIR "@KIRAN_SYSTEM_SUPPORT_LANGUAGE_DIR@/" +#endif diff --git a/plugins/language/data/com.kylinsec.kiran.language.gschema.xml.in b/plugins/language/data/com.kylinsec.kiran.language.gschema.xml.in new file mode 100644 index 00000000..14904b81 --- /dev/null +++ b/plugins/language/data/com.kylinsec.kiran.language.gschema.xml.in @@ -0,0 +1,10 @@ + + + + + ['en_US.UTF-8','zh_CN.UTF-8'] + Show Language list. + + + + diff --git a/plugins/language/data/support_language.json b/plugins/language/data/support_language.json new file mode 100644 index 00000000..3c77c50e --- /dev/null +++ b/plugins/language/data/support_language.json @@ -0,0 +1,46 @@ +{ + "SupportLanguage":[ + { + "Locale": "zh_CN.UTF-8", + "Description": "简体中文", + "LangCode": "zh_CN", + "LanguageName": "Simplified Chinese" + }, + { + "Locale": "en_US.UTF-8", + "Description": "English", + "LangCode": "en", + "LanguageName": "English" + }, + { + "Locale": "bo_CN", + "Description": "বাংলা", + "LangCode": "bo", + "LanguageName": "Tibetan" + }, + { + "Locale": "ky_KG", + "Description": "Кыргызча", + "LangCode": "ky", + "LanguageName": "Kirgiz" + }, + { + "Locale": "mn_MN", + "Description": "Монгол", + "LangCode": "mn", + "LanguageName": "Mongolian" + }, + { + "Locale": "kk_KZ.UTF-8", + "Description": "Қазақша", + "LangCode": "kk", + "LanguageName": "Kazakh" + }, + { + "Locale": "ug_CN", + "Description": "Uyghurche", + "LangCode": "ug", + "LanguageName": "Uighur" + } + ] +} \ No newline at end of file diff --git a/plugins/language/language-plugin.cpp b/plugins/language/language-plugin.cpp new file mode 100644 index 00000000..6bf6ec6e --- /dev/null +++ b/plugins/language/language-plugin.cpp @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include "language-plugin.h" +#include "language-subitem.h" +#include "language-page.h" + +LanguagePlugin::LanguagePlugin(QObject* parent) : QObject(parent) +{ +} + +LanguagePlugin::~LanguagePlugin() +{ +} + +int LanguagePlugin::init(KiranControlPanel::PanelInterface* interface) +{ + initSubItem(); + return 0; +} + +void LanguagePlugin::uninit() +{ +} + +QVector LanguagePlugin::getSubItems() +{ + return m_subitems; +} + +void LanguagePlugin::initSubItem() +{ + auto languageSubItemCreator = []() -> QWidget* + { + return new LanguagePage(); + }; + + struct SubItemStruct + { + QString id; + QString name; + QString category; + QString desc; + QString icon; + int weight; + CreateWidgetFunc func; + }; + + QList subitemInfos = { + {"Language", + tr("Language"), + "language", + "", + ":/kcp-language/images/language.svg", + 96, + languageSubItemCreator} + }; + + for (const SubItemStruct& subitemInfo : subitemInfos) + { + LanguageSubItem* subitem = new LanguageSubItem(subitemInfo.func); + + subitem->setID(subitemInfo.id); + subitem->setName(subitemInfo.name); + subitem->setCategory(subitemInfo.category); + subitem->setDesc(subitemInfo.desc); + subitem->setIcon(subitemInfo.icon); + subitem->setWeight(subitemInfo.weight); + m_subitems.append(KiranControlPanel::SubItemPtr(subitem)); + } +} \ No newline at end of file diff --git a/plugins/language/language-plugin.h b/plugins/language/language-plugin.h new file mode 100644 index 00000000..ac73cc97 --- /dev/null +++ b/plugins/language/language-plugin.h @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#ifndef __LANGUAGE_PLUGIN_H__ +#define __LANGUAGE_PLUGIN_H__ +#include +#include + +#include "panel-interface.h" +#include "plugin-interface-v2.h" +#include "plugin-subitem-interface.h" + +class LanguagePlugin : public QObject, + public KiranControlPanel::PluginInterfaceV2 +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID KiranControlPanel_PluginInterfaceV2_iid) + Q_INTERFACES(KiranControlPanel::PluginInterfaceV2) + +public: + LanguagePlugin(QObject* parent = nullptr); + virtual ~LanguagePlugin(); + + int init(KiranControlPanel::PanelInterface* interface) override; + void uninit() override; + + QVector getSubItems() override; + +private: + void initSubItem(); + +private: + KiranControlPanel::PanelInterface* m_panelInterface = nullptr; + QVector m_subitems; + + +}; + + +#endif \ No newline at end of file diff --git a/plugins/language/language-subitem.cpp b/plugins/language/language-subitem.cpp new file mode 100644 index 00000000..9ddca3e4 --- /dev/null +++ b/plugins/language/language-subitem.cpp @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + + + +#include "language-subitem.h" +#include + +LanguageSubItem::LanguageSubItem(CreateWidgetFunc func, QObject* parent) + : m_func(func), QObject(parent) +{ +} + +LanguageSubItem::~LanguageSubItem() +{ +} + +// 功能项ID,用于区分功能项,应确保其唯一 +void LanguageSubItem::setID(const QString& subitemID) +{ + m_id = subitemID; +} + +QString LanguageSubItem::getID() +{ + return m_id; +} + +// 功能项名称,用于显示在启动器标题栏之中 +void LanguageSubItem::setName(const QString& name) +{ + m_name = name; +} + +QString LanguageSubItem::getName() +{ + return m_name; +} + +// 获取功能项分类ID,该功能项属于哪个分类 +void LanguageSubItem::setCategory(const QString& category) +{ + m_category = category; +} + +QString LanguageSubItem::getCategory() +{ + return m_category; +} + +// 获取功能项目状态描述,显示在功能项侧边栏右边状态文本描述 +void LanguageSubItem::setDesc(const QString& desc) +{ + m_desc = desc; +} + +QString LanguageSubItem::getDesc() +{ + return m_desc; +} + +// 获取功能项图标显示,用于形成功能项侧边栏的左侧图标 +void LanguageSubItem::setIcon(const QString& icon) +{ + m_icon = icon; +} + +QString LanguageSubItem::getIcon() +{ + return m_icon; +} + +// 获取功能项权重,用于多个功能项排序 +void LanguageSubItem::setWeight(int weight) +{ + m_weight = weight; +} + +int LanguageSubItem::getWeight() +{ + return m_weight; +} + +// 创建显示控件 +QWidget* LanguageSubItem::createWidget() +{ + return m_func(); +} \ No newline at end of file diff --git a/plugins/language/language-subitem.h b/plugins/language/language-subitem.h new file mode 100644 index 00000000..9c325eca --- /dev/null +++ b/plugins/language/language-subitem.h @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + + +#ifndef __LANGUAGE_SUBITEM_H__ +#define __LANGUAGE_SUBITEM_H__ + +#include +#include +#include "panel-interface.h" +#include "plugin-subitem-interface.h" + +typedef QWidget* (*CreateWidgetFunc)(); + +class LanguageSubItem : public QObject, + public KiranControlPanel::PluginSubitemInterface +{ + Q_OBJECT + +public: + LanguageSubItem(CreateWidgetFunc func, QObject* parent = nullptr); + ~LanguageSubItem(); +public: + // 功能项ID,用于区分功能项,应确保其唯一 + void setID(const QString& subitemID); + QString getID() override; + + // 功能项名称,用于显示在启动器标题栏之中 + void setName(const QString& name); + QString getName() override; + + // 获取功能项分类ID,该功能项属于哪个分类 + void setCategory(const QString& category); + QString getCategory() override; + + // 获取功能项目状态描述,显示在功能项侧边栏右边状态文本描述 + void setDesc(const QString& desc); + QString getDesc() override; + + // 获取功能项图标显示,用于形成功能项侧边栏的左侧图标 + void setIcon(const QString& icon); + QString getIcon() override; + + // 获取功能项权重,用于多个功能项排序 + void setWeight(int weight); + int getWeight() override; + + // 创建显示控件 + QWidget* createWidget() override; + + // 获取自定义搜索关键词 + // QVector< 显示文本(已翻译),搜索跳转标识ID > + QVector> getSearchKeys() override { return {}; }; + + // 跳转至自定义搜索项 + bool jumpToSearchEntry(const QString& key) override { return false; }; + + // 该功能项是否存在未保存配置 + bool haveUnSavedOptions() override { return false; }; + +private: + QString m_id; + QString m_name; + QString m_category; + QString m_desc; + QString m_icon; + int m_weight; + CreateWidgetFunc m_func; + +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/langpack-installer.cpp b/plugins/language/src/langpack-installer.cpp new file mode 100644 index 00000000..66f04c36 --- /dev/null +++ b/plugins/language/src/langpack-installer.cpp @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include +#include +#include +#include +#include +#include "langpack-installer.h" + +typedef enum +{ + PACKAGE_UNKNOW, + PACKAGE_INSTALLED, + PACKAGE_AVAILABLE +} PackageState; + +Daemon* LangpackInstaller::m_daemon = nullptr; +LangpackInstaller::LangpackInstaller(QWidget* parent) : QWidget(parent), m_langpackName(QString()), m_langpackState(PACKAGE_UNKNOW) +{ + m_daemon = Daemon::global(); +} + +LangpackInstaller::~LangpackInstaller() +{ + +} + +void LangpackInstaller::searchLangpack(const QString& langCode) +{ + QString searchLangpack = "langpacks-" + langCode; + Transaction *transaction = m_daemon->searchNames(searchLangpack, Transaction::FilterNone); + QEventLoop loop; + connect(transaction, SIGNAL(finished(PackageKit::Transaction::Exit, uint)), &loop, SLOT(quit())); + connect(transaction, &Transaction::errorCode, + [this](uint errorcode, QString details) { + KLOG_WARNING() << "errorcode:" << errorcode << ", details:" << details; + return; + }); + connect(transaction, &Transaction::package, + [this](uint info, const QString &pid, const QString &summary) { + const QByteArray &pkgInfo = pid.toLatin1(); + QString infoStr = QString("%1").arg(info); + KLOG_INFO() << "pkgInfo:" << pkgInfo << ", infoStr:" << infoStr; + m_langpackName = pkgInfo; + m_langpackState = info; + }); + loop.exec(); +} + +bool LangpackInstaller::checkLangpackInstalled(const QString& langCode) +{ + bool installed = false; + searchLangpack(langCode); + if (m_langpackState == PACKAGE_INSTALLED) + { + installed = true; + } + + m_langpackName.clear(); + m_langpackState = PACKAGE_UNKNOW; + + return installed; +} + + +void LangpackInstaller::showProcessDialog(uint percentage) +{ + if (percentage == 100) + { + m_processDialog->setLabelText(tr("Install Complete!")); + } + m_processDialog->setMinimumDuration(0); + m_processDialog->setValue(percentage); +} + +void LangpackInstaller::installLangpack(const QString& langCode) +{ + searchLangpack(langCode); + if (m_langpackState != PACKAGE_AVAILABLE) + { + KLOG_DEBUG() << langCode << " state is " << m_langpackState; + return; + } + + m_processDialog = new QProgressDialog(this); + // dialog出现需等待的时间 + m_processDialog->setMinimumDuration(1000000000); + m_processDialog->setValue(0); + m_processDialog->setWindowTitle(tr("Package Install")); + // 当进度条显示到 100%时 不隐藏 + m_processDialog->setAutoClose(0); + // 当进度条显示到 100%时 不调用reset()函数重置进度条 + m_processDialog->setAutoReset(0); + // 设置进度对话框标签文本,向用户提示该进度条正在做什么 + m_processDialog->setLabelText(tr("Installing...")); + // 重新设置 Cancel按钮 的文本 + m_processDialog->setCancelButtonText(QString()); + m_processDialog->setRange(0, 100); + + Transaction *transaction = m_daemon->installPackage(m_langpackName, Transaction::TransactionFlagNone); + m_langpackThread = new LangpackThread(this, transaction); + connect(m_langpackThread, &LangpackThread::showProcessDialogSignal, this, &LangpackInstaller::showProcessDialog); + m_langpackThread->start(); +} \ No newline at end of file diff --git a/plugins/language/src/langpack-installer.h b/plugins/language/src/langpack-installer.h new file mode 100644 index 00000000..2c872d1a --- /dev/null +++ b/plugins/language/src/langpack-installer.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + + +#ifndef __LANGPACK_INSTALLER_H__ +#define __LANGPACK_INSTALLER_H__ + +#include +#include +#include "langpack-thread.h" + +class QProgressDialog; +using namespace PackageKit; +class LangpackInstaller : public QWidget +{ + Q_OBJECT + +public: + explicit LangpackInstaller(QWidget* parent = nullptr); + ~LangpackInstaller(); + + void searchLangpack(const QString& langCode); + void installLangpack(const QString& langCode); + bool checkLangpackInstalled(const QString& langCode); + +private slots: + void showProcessDialog(uint percentage); + +private: + QProgressDialog* m_processDialog = nullptr; + static Daemon* m_daemon; + QString m_langpackName; + uint m_langpackState; + LangpackThread* m_langpackThread = nullptr; +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/langpack-thread.cpp b/plugins/language/src/langpack-thread.cpp new file mode 100644 index 00000000..e71499a6 --- /dev/null +++ b/plugins/language/src/langpack-thread.cpp @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include "langpack-thread.h" +#include + +typedef enum +{ + PACKAGE_UNKNOW, + PACKAGE_INSTALLED, + PACKAGE_AVAILABLE +} PackageState; + +LangpackThread::LangpackThread(QObject* parent, Transaction* transaction) : QThread(parent), m_transaction(transaction) +{ + +} + +LangpackThread::~LangpackThread() +{ +} + + +void LangpackThread::run() +{ + connect(m_transaction, &Transaction::errorCode, + [this](uint errorcode, QString details) { + KLOG_WARNING() << "errorcode:" << errorcode << ", details:" << details; + return; + }); + connect(m_transaction, &Transaction::package, + [this](uint info, const QString &pid, const QString &summary) { + uint percentage = m_transaction->percentage(); + KLOG_INFO() << "info:" << info << ", pid:" << pid << ", summary:" << summary << ", percentage:" << percentage; + emit showProcessDialogSignal(percentage); + }); + connect(m_transaction, &Transaction::finished, + [this](uint status, uint runtime) { + if (status == PACKAGE_INSTALLED) + { + uint percentage = m_transaction->percentage(); + KLOG_INFO() << "percentage:" << percentage; + emit showProcessDialogSignal(percentage); + this->quit(); + } + }); +} diff --git a/plugins/language/src/langpack-thread.h b/plugins/language/src/langpack-thread.h new file mode 100644 index 00000000..552edf61 --- /dev/null +++ b/plugins/language/src/langpack-thread.h @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + + +#ifndef __LANGPACK_THREAD_H__ +#define __LANGPACK_THREAD_H__ + +#include +#include +#include + +using namespace PackageKit; +class LangpackThread : public QThread +{ + Q_OBJECT + +public: + explicit LangpackThread(QObject* parent = nullptr, Transaction* transaction = nullptr); + ~LangpackThread(); + void run(); + +signals: + void showProcessDialogSignal(uint percentage); + +private: + QString m_langCode; + Transaction* m_transaction = nullptr; +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/language-manager.cpp b/plugins/language/src/language-manager.cpp new file mode 100644 index 00000000..b803c5f5 --- /dev/null +++ b/plugins/language/src/language-manager.cpp @@ -0,0 +1,361 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "language-manager.h" +#include "langpack-installer.h" + +#define KIRAN_LANGUAGE_SCHEMA_ID "com.kylinsec.kiran.language" +#define KEY_LANGUAGE_LIST "language-list" +#define LOCALE_CONF "/etc/locale.conf" +#define SUPPORT_LANGUAGE_FILE "support_language.json" + + +LanguageManager::LanguageManager(QWidget* parent) : QWidget(parent), m_languageDialog(new LanguageSelectDialog(this)), m_langpackInstaller(new LangpackInstaller(this)) +{ + m_languageDialog->setHidden(true); + initLanguageDBus(); + initGSettings(); + languageList(); + currentLanguage(); + showLangugaeList(); + initConnect(); +} + +LanguageManager::~LanguageManager() +{ + if (m_languageSettings != nullptr) + { + delete m_languageSettings; + m_languageSettings = nullptr; + } + + if (m_languageDBus != nullptr) + { + delete m_languageDBus; + m_languageDBus = nullptr; + } +} + +void LanguageManager::initLanguageDBus() +{ + if (!m_languageDBus) + { + unsigned int uid = getuid(); + QString objpath = QString("/org/freedesktop/Accounts/User") + QString::number(uid); + m_languageDBus = new QDBusInterface("org.freedesktop.Accounts", + objpath, + "org.freedesktop.Accounts.User", + QDBusConnection::systemBus()); + } +} + +void LanguageManager::initGSettings() +{ + if (QGSettings::isSchemaInstalled(KIRAN_LANGUAGE_SCHEMA_ID)) + { + m_languageSettings = new QGSettings(KIRAN_LANGUAGE_SCHEMA_ID, QByteArray(), this); + } + + if (m_languageSettings) + { + connect(m_languageSettings, &QGSettings::changed, this, [=](const QString& key) { + + QStringList languageList = m_languageSettings->get(KEY_LANGUAGE_LIST).toStringList(); + if (!languageList.contains(m_currentLanguage)) + { + languageList.append(m_currentLanguage); + } + + QList showLanguageList; + for (const auto& locale : languageList) + { + for (const auto& langInfo : m_languageList) + { + if (langInfo.locale == locale) + { + showLanguageList.append(langInfo); + break; + } + } + } + + m_showLanguageList = showLanguageList; + emit showLanguageChanged(); + }); + } +} + + +void LanguageManager::initConnect() +{ + connect(m_languageDialog, &LanguageSelectDialog::languageAddBtnClicked, this, &LanguageManager::addShowLanguage); +} + +void LanguageManager::currentLanguage() +{ + QString defaultLanguage = "en_US.UTF-8"; + if (!m_languageDBus) + { + m_currentLanguage = defaultLanguage; + return; + } + + m_currentLanguage = m_languageDBus->property("Language").toString(); + if (m_currentLanguage.isEmpty()) + { + m_currentLanguage = defaultLanguage; + } +} + +QList LanguageManager::parseSupportLang(const QString& langs) +{ + QList langInfoList; + QJsonParseError jsonError; + QJsonDocument jsonDocument = QJsonDocument::fromJson(langs.toUtf8().data(), &jsonError); + if (jsonDocument.isNull() || jsonError.error != QJsonParseError::NoError) + { + KLOG_ERROR() << " please check the string " << langs.toUtf8().data(); + return langInfoList; + } + + if (jsonDocument.isObject()) + { + QJsonObject obj = jsonDocument.object(); + if (obj.contains("SupportLanguage")) + { + QJsonValue langValue = obj.value("SupportLanguage"); + if (langValue.isArray()) + { + QJsonArray array = langValue.toArray(); + for (int i = 0; i < array.size(); i++) + { + QJsonValue value = array.at(i); + if (value.type() == QJsonValue::Object) + { + LangInfo info; + QJsonObject langObj = value.toObject(); + if (langObj.contains("Locale")) + { + info.locale = langObj.value("Locale").toString(); + } + if (langObj.contains("Description")) + { + info.desc = langObj.value("Description").toString(); + } + if (langObj.contains("LangCode")) + { + info.langCode = langObj.value("LangCode").toString(); + } + if (langObj.contains("LanguageName")) + { + info.languageName = langObj.value("LanguageName").toString(); + } + langInfoList.append(info); + } + } + } + } + } + return langInfoList; +} + + +void LanguageManager::languageList() +{ + QList langInfoList; + QString supportLanguageFile = QString("%1%2").arg(KIRAN_SUPPORT_LANGUAGE_DIR).arg(SUPPORT_LANGUAGE_FILE); + QString systemLanguageFile = QString("%1%2").arg(KIRAN_SYSTEM_SUPPORT_LANGUAGE_DIR).arg(supportLanguageFile); + + if (!QFileInfo::exists(supportLanguageFile) && !QFileInfo::exists(systemLanguageFile)) + { + KLOG_WARNING() << SUPPORT_LANGUAGE_FILE << "isn't exists!"; + return; + } + + QString languageFile = QFileInfo::exists(supportLanguageFile) ? supportLanguageFile : systemLanguageFile; + QFile file(languageFile); + if (!file.open(QIODevice::ReadOnly)) + { + KLOG_DEBUG() << SUPPORT_LANGUAGE_FILE << " can't open."; + return; + } + + QTextStream out(&file); + langInfoList = parseSupportLang(out.readAll()); + m_languageList = langInfoList; +} + +void LanguageManager::showLangugaeList() +{ + QList showLanguageList; + if (m_languageSettings) + { + QStringList languageList = m_languageSettings->get(KEY_LANGUAGE_LIST).toStringList(); + if (!languageList.contains(m_currentLanguage)) + { + languageList.append(m_currentLanguage); + QSignalBlocker blocker(m_languageSettings); + m_languageSettings->set(KEY_LANGUAGE_LIST, languageList); + } + + for (const auto& locale : languageList) + { + bool flag = false; + for (const auto& langInfo : m_languageList) + { + if (langInfo.locale == locale) + { + flag = true; + showLanguageList.append(langInfo); + break; + } + } + + // 若gsettings中的locale在在support_language.json中不存在,则报错 + if (!flag) + { + KiranMessageBox::message(nullptr, + tr("Error"), + tr("%1 inexistence in system").arg(locale), + KiranMessageBox::Ok); + } + } + + m_showLanguageList = showLanguageList; + } +} + + +bool LanguageManager::isSupportedLanguage(const QString& locale) +{ + for (const auto& info : m_languageList) + { + if(info.locale == locale) + return true; + } + return false; +} + +void LanguageManager::addShowLanguage(QString locale) +{ + if (m_languageSettings) + { + bool flag = false; + for (const auto& info : m_showLanguageList) + { + if (info.locale == locale) + { + flag = true; + break; + } + } + + if (!flag) + { + for (const auto& info : m_languageList) + { + if (info.locale == locale) + { + m_showLanguageList.append(info); + break; + } + } + + QStringList languageList = m_languageSettings->get(KEY_LANGUAGE_LIST).toStringList(); + languageList.append(locale); + m_languageSettings->set(KEY_LANGUAGE_LIST, languageList); + } + } +} + +void LanguageManager::deleteShowLanguage(const QString& locale) +{ + if (m_languageSettings) + { + bool flag = false; + LangInfo deleteLangInfo; + for (const auto& info : m_showLanguageList) + { + if (info.locale == locale) + { + flag = true; + deleteLangInfo = info; + break; + } + } + + if (flag) + { + m_showLanguageList.removeAll(deleteLangInfo); + + QStringList languageList = m_languageSettings->get(KEY_LANGUAGE_LIST).toStringList(); + languageList.removeAll(locale); + QSignalBlocker blocker(m_languageSettings); + m_languageSettings->set(KEY_LANGUAGE_LIST, languageList); + } + } +} + +void LanguageManager::setCurrentLanguage(const QString& locale) +{ + // 在support_language.json中是否存在 + if (!isSupportedLanguage(locale)) + { + KiranMessageBox::message(nullptr, + tr("set locale failed"), + tr("%1 inexistence in system").arg(locale), + KiranMessageBox::Ok); + return; + } + + // 在gsettings文件中是否存在,不存在则添加 + addShowLanguage(locale); + + // 调用LangpackInstaller接口检查langCode是否存在,不存在则下载 + QString langCode; + for (const auto& info : m_showLanguageList) + { + if (info.locale == locale) + { + langCode = info.langCode; + } + } + + m_langpackInstaller = new LangpackInstaller; + if (!m_langpackInstaller->checkLangpackInstalled(langCode)) + { + m_langpackInstaller->installLangpack(langCode); + } + + // 不论下载langCode是否成功,都将locale设置为系统语言 + if (!m_languageDBus) + { + return; + } + + m_languageDBus->call("SetLanguage", locale); + m_currentLanguage = locale; +} \ No newline at end of file diff --git a/plugins/language/src/language-manager.h b/plugins/language/src/language-manager.h new file mode 100644 index 00000000..639bbe2d --- /dev/null +++ b/plugins/language/src/language-manager.h @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#ifndef __LANGUAGE_MANAGER_H__ +#define __LANGUAGE_MANAGER_H__ + +#include +#include +#include "language-select-dialog.h" + +struct LangInfo{ + QString locale; + QString desc; + QString langCode; + QString languageName; + LangInfo() :locale(), desc(), langCode(),languageName(){} + bool operator==(const LangInfo& other) const + { + if (locale == other.locale && desc == other.desc && langCode == other.langCode && languageName == other.languageName) + return true; + else + return false; + } +}; + +class QGSettings; +class LangpackInstaller; +class LanguageManager : public QWidget +{ + Q_OBJECT + +public: + explicit LanguageManager(QWidget* parent = nullptr); + ~LanguageManager(); + + +public: + inline QString getCurrentLanguage() + { + return m_currentLanguage; + } + + inline QList getShowLangugaeList() + { + return m_showLanguageList; + } + + inline QList getLanguageList() + { + return m_languageList; + } + inline LanguageSelectDialog* languageDailog() + { + return m_languageDialog; + } + void setCurrentLanguage(const QString& locale); + void deleteShowLanguage(const QString& locale); + bool isSupportedLanguage(const QString& locale); + void initConnect(); + void initLanguageDBus(); + QList parseSupportLang(const QString& langs); + +private: + void initGSettings(); + // 展示到主界面的语言列表 + void showLangugaeList(); + // 支持的所有语言列表 + void languageList(); + // 当前系统语言 + void currentLanguage(); + +signals: + void showLanguageChanged(); + +private slots: + void addShowLanguage(QString locale); + +private: + QString m_currentLanguage; + QList m_showLanguageList; + QList m_languageList; + QGSettings* m_languageSettings = nullptr; + LangpackInstaller* m_langpackInstaller = nullptr; + LanguageSelectDialog* m_languageDialog = nullptr; + QDBusInterface* m_languageDBus = nullptr; +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/language-page.cpp b/plugins/language/src/language-page.cpp new file mode 100644 index 00000000..b8d5602f --- /dev/null +++ b/plugins/language/src/language-page.cpp @@ -0,0 +1,199 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include +#include +#include +#include +#include +#include "kiran-setting-container.h" +#include "kiran-setting-item.h" +#include "language-page.h" +#include "language-manager.h" + +LanguagePage::LanguagePage(QWidget* parent) : QWidget(parent), + m_languageManager(new LanguageManager(this)) +{ + initUI(); + initLanguageSelectDialogUI(); + initConnect(); +} + +LanguagePage::~LanguagePage() +{ +} + +void LanguagePage::initConnect() +{ + connect(m_languageManager, &LanguageManager::showLanguageChanged, this, &LanguagePage::handleLanguageChanged); +} + +// 加载每一项languageItem +void LanguagePage::loadLangaugeItem() +{ + QString currentLanguage = m_languageManager->getCurrentLanguage(); + QList showLanguageList = m_languageManager->getShowLangugaeList(); + + for (const auto& showLanguage : showLanguageList) + { + auto languageItem = createLanguageItem(showLanguage); + + if (currentLanguage == showLanguage.locale) + { + languageItem->setMidButtonVisible(true, QIcon(":/kiran-control-panel/images/indicator-selected.png")); + m_languageItem = languageItem; + } + m_languageContainer->addItem(languageItem); + connect(languageItem, &KiranSettingItem::clicked, this, &LanguagePage::toggleLanguageItem); + + auto deleteLanguageItemSlot = std::bind(&LanguagePage::deleteLanguageItem, this, languageItem); + connect(languageItem, &KiranSettingItem::rightButtonClicked, this, deleteLanguageItemSlot); + } + initAddBtn(); +} + +void LanguagePage::initUI() +{ + auto mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setContentsMargins(24, 14, 14, 14); + mainLayout->setSpacing(0); + + auto label = new QLabel(tr("Language Select(Reboot to take effect)"), this); + mainLayout->addWidget(label); + + auto languageWidget = new QWidget(this); + mainLayout->addWidget(languageWidget); + + auto languageLayout = new QBoxLayout(QBoxLayout::TopToBottom, languageWidget); + languageLayout->setSpacing(8); + languageLayout->setContentsMargins(0, 0, 10, 0); + + languageLayout->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Fixed)); + + m_languageContainer = new SettingsContainer(this); + languageLayout->addWidget(m_languageContainer); + + languageLayout->addStretch(); + + loadLangaugeItem(); +} + +void LanguagePage::initAddBtn() +{ + m_languageButton = new QPushButton(this); + Kiran::StylePropertyHelper::setButtonType(m_languageButton, Kiran::BUTTON_Default); + m_languageButton->setIcon(QIcon(":/kcp-application/images/addition.svg")); + m_languageContainer->addItem(m_languageButton); + connect(m_languageButton, &QPushButton::clicked, this, [=]() { + m_languageManager->languageDailog()->show(); + }); +} + +void LanguagePage::deleteLanguageItem(KiranSettingItem* languageItem) +{ + QString locale = languageItem->getUserData().toString(); + QString currentLocale = m_languageManager->getCurrentLanguage(); + if (languageItem == nullptr || locale == currentLocale) + { + KLOG_DEBUG() << "can't delete currentLanguageitem:" << locale; + return; + } + + m_languageContainer->removeItem(languageItem); + m_languageManager->deleteShowLanguage(languageItem->getUserData().toString()); +} + +void LanguagePage::toggleLanguageItem() +{ + KiranSettingItem* languageItem = qobject_cast(sender()); + QString currentLocale = languageItem->getUserData().toString(); + // 取消切换前的语言选中状态 + m_languageItem->setMidButtonVisible(false, QIcon(":/kiran-control-panel/images/indicator-selected.png")); + QString beforeLocale = m_languageItem->getUserData().toString(); + // 添加切换后的语言选中状态 + m_languageItem = languageItem; + languageItem->setMidButtonVisible(true, QIcon(":/kiran-control-panel/images/indicator-selected.png")); + m_languageManager->setCurrentLanguage(currentLocale); +} + +QString LanguagePage::showLanguageName(QString languageCode) +{ + QString languageName; + if (languageCode == "zh_CN.UTF-8") + { + languageName = QString("简体中文") + QString("-%1").arg(tr("Simplified Chinese")); + } + else if (languageCode == "en_US.UTF-8") + { + languageName = QString("English") + QString("-%1").arg(tr("English")); + } + else if (languageCode == "bo_CN") + { + languageName = QString("বাংলা") + QString("-%1").arg(tr("Tibetan")); + } + else if (languageCode == "ky_KG") + { + languageName = QString("Кыргызча") + QString("-%1").arg(tr("Kirgiz")); + } + else if (languageCode == "mn_MN") + { + languageName = QString("Монгол") + QString("-%1").arg(tr("Mongolian")); + } + else if (languageCode == "kk_KZ.UTF-8") + { + languageName = QString("Қазақша") + QString("-%1").arg(tr("Kazakh")); + } + else if (languageCode == "ug_CN") + { + languageName = QString("Uyghurche") + QString("-%1").arg(tr("Uighur")); + } + else + { + languageName = QString("languageCode") + QString("-%1").arg("languageCode"); + } + return languageName; +} + +KiranSettingItem* LanguagePage::createLanguageItem(const LangInfo& langInfo) +{ + auto languageItem = new KiranSettingItem(this); + languageItem->setClickable(true); + languageItem->setLeftButtonVisible(false, QIcon()); + languageItem->setRightButtonVisible(true, QIcon(":/kiran-control-panel/images/trash.svg")); + languageItem->setSwitcherVisible(false); + languageItem->setMidButtonVisible(false, QIcon(":/kiran-control-panel/images/indicator-selected.png")); + languageItem->setUserData(langInfo.locale); + + QString textLable = showLanguageName(langInfo.locale); + languageItem->setText(textLable); + + return languageItem; +} + +void LanguagePage::handleLanguageChanged() +{ + // 重新加载 + m_languageContainer->clear(); + loadLangaugeItem(); +} + + +void LanguagePage::initLanguageSelectDialogUI() +{ + QList languageList = m_languageManager->getLanguageList(); + for (const auto& langInfo : languageList) + { + m_languageManager->languageDailog()->addLanguageItem(showLanguageName(langInfo.locale), langInfo.locale); + } +} \ No newline at end of file diff --git a/plugins/language/src/language-page.h b/plugins/language/src/language-page.h new file mode 100644 index 00000000..89ad883a --- /dev/null +++ b/plugins/language/src/language-page.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + + +#ifndef __LANGUAGE_PAGE_H__ +#define __LANGUAGE_PAGE_H__ + +#include + +class LanguageManager; +class QPushButton; +class SettingsContainer; +class KiranSettingItem; +class LangInfo; +class LanguagePage : public QWidget +{ + Q_OBJECT + +public: + explicit LanguagePage(QWidget* parent = nullptr); + ~LanguagePage(); + +private: + void initUI(); + void initAddBtn(); + void initConnect(); + void loadLangaugeItem(); + void initLanguageSelectDialogUI(); + QString showLanguageName(QString languageCode); + KiranSettingItem* createLanguageItem(const LangInfo& langInfo); + +private slots: + void toggleLanguageItem(); + void deleteLanguageItem(KiranSettingItem* languageItem); + void handleLanguageChanged(); + +private: + LanguageManager* m_languageManager = nullptr; + + SettingsContainer* m_languageContainer = nullptr; + QPushButton* m_languageButton = nullptr; + KiranSettingItem* m_languageItem = nullptr; +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/language-select-dialog.cpp b/plugins/language/src/language-select-dialog.cpp new file mode 100644 index 00000000..c5e53827 --- /dev/null +++ b/plugins/language/src/language-select-dialog.cpp @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "language-select-dialog.h" +#include "ui_language-select-dialog.h" +#include "search-delegate.h" + +LanguageSelectDialog::LanguageSelectDialog(QWidget* parent) : QDialog(parent), + ui(new Ui::LanguageSelectDialog), m_kiranSearchBox(new KiranSearchBox(this)) +{ + ui->setupUi(this); + this->setWindowTitle(tr("Add Language")); + m_kiranSearchBox->setPlaceholderText(tr("Search")); + ui->frame->layout()->addWidget(m_kiranSearchBox); + ui->tableView->setStyleSheet("QTableView{border: 1px solid palette(midlight);}"); + model = new QStandardItemModel(this); + ui->tableView->setModel(model); + ui->tableView->setAlternatingRowColors(true); + ui->tableView->setMouseTracking(true); + ui->tableView->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); + ui->tableView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows); + connect(ui->tableView, &QTableView::entered, + this, [=](const QModelIndex &index){ + QString mStr = index.data().toString(); + QFontMetrics fontMetrics(this->font()); + int fontSize = fontMetrics.width(mStr); + if (fontSize - 16 > 416) { + QToolTip::showText(QCursor::pos(), mStr); + } + }); + // 隐藏垂直表头 + ui->tableView->verticalHeader()->setVisible(false); + // 隐藏水平表头 + ui->tableView->horizontalHeader()->setVisible(false); + // 隐藏水平滑动条 + ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + // 不显示表格线 + ui->tableView->setShowGrid(false); + // 水平表格自动拉伸 + ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + // 行高默认为36 + ui->tableView->verticalHeader()->setDefaultSectionSize(36); + this->setWindowModality(Qt::ApplicationModal); + // 不可编辑 + ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + model->setColumnCount(1); + // 加载Completer到KiranSearchBox中,便于搜索 + initCompleter(); + + // 选中语言添加 + connect(ui->yesBtn, &QPushButton::clicked, this, [=]() { + QModelIndexList indexList = ui->tableView->selectionModel()->selectedRows(); + QString locale; + if (!indexList.empty()) + { + QModelIndex modelIndex = indexList.first(); + locale = model->data(modelIndex, Qt::UserRole + 1).toString(); + } + emit languageAddBtnClicked(locale); + this->hide(); + }); + // 取消 + connect(ui->noBtn, &QPushButton::clicked, this, [=]() { + this->hide(); + }); +} + +LanguageSelectDialog::~LanguageSelectDialog() +{ +} + +void LanguageSelectDialog::initCompleter() +{ + m_searchDelegate = new SearchDelegate(this); + m_completer = new QCompleter(this); + m_completer->setModel(model); + m_completer->setMaxVisibleItems(6); + m_completer->popup()->setAttribute(Qt::WA_InputMethodEnabled); + m_completer->popup()->setItemDelegate(m_searchDelegate); + m_completer->setFilterMode(Qt::MatchContains); + m_completer->setCaseSensitivity(Qt::CaseInsensitive); + m_completer->setCompletionMode(QCompleter::PopupCompletion); + m_completer->setWrapAround(false); + if (m_kiranSearchBox) { + m_kiranSearchBox->setCompleter(m_completer); + } + + connect(m_kiranSearchBox, &QLineEdit::returnPressed, this, [=]() { + if (!m_kiranSearchBox->text().isEmpty()) { + QList itemList = model->findItems(m_kiranSearchBox->text()); + if (!itemList.isEmpty()) { + QModelIndex m_modeIndex = model->indexFromItem(itemList.first()); + ui->tableView->scrollTo(m_modeIndex); + int index = m_modeIndex.row(); + ui->tableView->selectRow(index); + } + } + }); + + connect(m_kiranSearchBox, &QLineEdit::textChanged, this, [=](QString text){ + for (int i = 0; i < model->rowCount(); i++) { + if (text.contains(model->data(model->index(i,0)).toString())) { + m_kiranSearchBox->blockSignals(true); + m_kiranSearchBox->setText(model->item(i)->text()); + m_kiranSearchBox->blockSignals(false); + } + } + }); + + connect(m_completer, QOverload::of(&QCompleter::activated), + [=](const QString &text) { + Q_UNUSED(text); + emit m_kiranSearchBox->returnPressed(); + }); +} + +void LanguageSelectDialog::addLanguageItem(const QString &languageName, const QString &locale) +{ + auto item = new QStandardItem(languageName); + item->setData(locale); + model->appendRow(item); +} \ No newline at end of file diff --git a/plugins/language/src/language-select-dialog.h b/plugins/language/src/language-select-dialog.h new file mode 100644 index 00000000..4aeb885b --- /dev/null +++ b/plugins/language/src/language-select-dialog.h @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2022 ~ 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: yinhongchang + */ +#ifndef __LANGUAGE_SELECT_DIALOG_H__ +#define __LANGUAGE_SELECT_DIALOG_H__ + +#include +#include + +namespace Ui +{ + class LanguageSelectDialog; +} + +class QStandardItemModel; +class KiranSearchBox; +class QCompleter; +class SearchDelegate; +class LanguageSelectDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LanguageSelectDialog(QWidget* parent = nullptr); + ~LanguageSelectDialog(); + void initCompleter(); + void addLanguageItem(const QString &languageName, const QString &locale); + +signals: + void languageAddBtnClicked(QString locale); + +private: + Ui::LanguageSelectDialog* ui = nullptr; + KiranSearchBox* m_kiranSearchBox = nullptr; + + QStandardItemModel* model = nullptr; + QCompleter* m_completer = nullptr; + SearchDelegate* m_searchDelegate = nullptr; +}; + +#endif \ No newline at end of file diff --git a/plugins/language/src/language-select-dialog.ui b/plugins/language/src/language-select-dialog.ui new file mode 100644 index 00000000..e4ff5da0 --- /dev/null +++ b/plugins/language/src/language-select-dialog.ui @@ -0,0 +1,174 @@ + + + LanguageSelectDialog + + + + 0 + 0 + 480 + 520 + + + + + 480 + 520 + + + + + 480 + 520 + + + + Dialog + + + + 16 + + + 24 + + + 16 + + + 24 + + + 24 + + + + + + 432 + 46 + + + + + 432 + 46 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + 432 + 360 + + + + + 432 + 360 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 16 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 96 + 0 + + + + + 96 + 16777215 + + + + No + + + + + + + + 96 + 0 + + + + + 96 + 16777215 + + + + Yes + + + + + + + + + + diff --git a/resources/control-panel-resources.qrc b/resources/control-panel-resources.qrc index 2fc9eeae..e460192b 100644 --- a/resources/control-panel-resources.qrc +++ b/resources/control-panel-resources.qrc @@ -93,4 +93,7 @@ images/desktop-file.svg + + images/language.svg + diff --git a/resources/images/language.svg b/resources/images/language.svg new file mode 100644 index 00000000..138d4b71 --- /dev/null +++ b/resources/images/language.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts index 1ba6ea74..995c4364 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -3386,6 +3386,101 @@ KylinSec.保留所有权利. + + LangpackInstaller + + Package Install + 语言包下载 + + + Installing... + 下载中... + + + Install Complete! + 下载完成! + + + + LanguageManager + + Error + 错误 + + + set locale failed + 设置语言失败 + + + %1 inexistence in system + %1 在系统中不存在 + + + + LanguagePage + + Language Select(Reboot to take effect) + 语言选择(重启生效) + + + Simplified Chinese + 简体中文 + + + English + 英语 + + + Tibetan + 藏语 + + + Kirgiz + 柯尔克孜语 + + + Mongolian + 蒙古语 + + + Kazakh + 哈萨克语 + + + Uighur + 维吾尔语 + + + + LanguagePlugin + + Language + 语言设置 + + + + LanguageSelectDialog + + Dialog + + + + No + 取消 + + + Yes + 确认 + + + Add Language + 添加语言 + + + Search + 输入你想找的内容 + + LayoutItem -- Gitee From 3dd0088e509718aef5df427e5c1367baef6d287f Mon Sep 17 00:00:00 2001 From: niko_yhc Date: Thu, 4 Jan 2024 09:24:15 +0800 Subject: [PATCH 17/17] add transfer-ky_KG add transfer-kk_KZ add transfer-mn_MN transfer-ug_CN --- data/category/desktop/about-system.desktop | 6 +- .../desktop/account-management.desktop | 6 +- data/category/desktop/application.desktop | 18 +- data/category/desktop/audio.desktop | 6 +- .../desktop/authentication-manager.desktop | 9 + data/category/desktop/display.desktop | 6 +- data/category/desktop/group.desktop | 9 + data/category/desktop/hardware.desktop | 6 +- data/category/desktop/individuation.desktop | 6 +- data/category/desktop/language.desktop | 18 +- data/category/desktop/login-settings.desktop | 6 +- data/category/desktop/network.desktop | 6 +- .../category/desktop/power-management.desktop | 6 +- data/category/desktop/timedate.desktop | 4 +- plugins/language/data/support_language.json | 2 +- plugins/language/src/language-page.cpp | 2 +- .../src/plugin/setting-widget/ipv4-widget.cpp | 4 + .../src/plugin/setting-widget/ipv6-widget.cpp | 4 + translations/kiran-control-panel.kk_KZ.ts | 4288 +++++++++++----- ....kk_KG.ts => kiran-control-panel.ky_KG.ts} | 4290 ++++++++++++----- translations/kiran-control-panel.mn_MN.ts | 4288 +++++++++++----- translations/kiran-control-panel.ug_CN.ts | 4288 +++++++++++----- 22 files changed, 11872 insertions(+), 5406 deletions(-) rename translations/{kiran-control-panel.kk_KG.ts => kiran-control-panel.ky_KG.ts} (55%) diff --git a/data/category/desktop/about-system.desktop b/data/category/desktop/about-system.desktop index a8e87fdd..b33866d7 100644 --- a/data/category/desktop/about-system.desktop +++ b/data/category/desktop/about-system.desktop @@ -2,7 +2,7 @@ Name=About System Name[zh_CN]=关于系统 Name[bo_CN]=མ་ལག་སྐོར། -Name[kk_KG]=система жөнүндө +Name[ky_KG]=система жөнүндө Name[kk_KZ]=Жүйе туралы Name[mn_MN]=Системийн тухай Name[ug_CN]=سىستېمىغا مۇناسىۋەتلىك @@ -12,7 +12,7 @@ Category=about-system Comment=About System Comment[zh_CN]=关于系统 Comment[bo_CN]=མ་ལག་སྐོར། -Comment[kk_KG]=система жөнүндө +Comment[ky_KG]=система жөнүндө Comment[kk_KZ]=Жүйе туралы Comment[mn_MN]=Системийн тухай Comment[ug_CN]=سىستېمىغا مۇناسىۋەتلىك @@ -22,7 +22,7 @@ Icon=about-system.png Weight=10 Keywords[zh_CN]=关于系统 Keywords[bo_CN]=མ་ལག་སྐོར། -Keywords[kk_KG]=система жөнүндө +Keywords[ky_KG]=система жөнүндө Keywords[kk_KZ]=Жүйе туралы Keywords[mn_MN]=Системийн тухай Keywords[ug_CN]=سىستېمىغا مۇناسىۋەتلىك diff --git a/data/category/desktop/account-management.desktop b/data/category/desktop/account-management.desktop index 64949401..1acc232d 100644 --- a/data/category/desktop/account-management.desktop +++ b/data/category/desktop/account-management.desktop @@ -4,7 +4,7 @@ Category=account-management Name=Account Management Name[zh_CN]=帐户 Name[bo_CN]=ཐོ་ཁོངས། -Name[kk_KG]=эсептери +Name[ky_KG]=эсептери Name[kk_KZ]=шоттар Name[mn_MN]=данс Name[ug_CN]=ھېسابات @@ -12,7 +12,7 @@ Name[ug_CN]=ھېسابات Comment=Account Management Comment[zh_CN]=帐户管理 Comment[bo_CN]=རྩིས་ཐོའི་དོ་དམ། -Comment[kk_KG]=Эсепти башкаруу +Comment[ky_KG]=Эсепти башкаруу Comment[kk_KZ]=Тіркелгіні басқару Comment[mn_MN]=Шилэн дансны удирдлага Comment[ug_CN]=ھېسابات باشقۇرۇش @@ -23,7 +23,7 @@ Weight=6 Keywords[zh_CN]=帐户 Keywords[bo_CN]=ཐོ་ཁོངས། -Keywords[kk_KG]=эсептери +Keywords[ky_KG]=эсептери Keywords[kk_KZ]=шоттар Keywords[mn_MN]=данс Keywords[ug_CN]=ھېسابات diff --git a/data/category/desktop/application.desktop b/data/category/desktop/application.desktop index 4601e729..02c24e88 100644 --- a/data/category/desktop/application.desktop +++ b/data/category/desktop/application.desktop @@ -4,17 +4,17 @@ Category=app-manager Name=appliction Name[zh_CN]=应用程序 Name[bo_CN]=སྐད་སྒྲ། -Name[kk_KG]=үн -Name[kk_KZ]=дыбыс -Name[mn_MN]=дуу чимээ +Name[ky_KG]=программа +Name[kk_KZ]=Қолданбалы бағдарлама +Name[mn_MN]=Хэрэглээний програм Name[ug_CN]=ئاۋاز Comment=appliction settings Comment[zh_CN]=应用程序设置 Comment[bo_CN]=སྐད་སྒྲ་སྒྲིག་པ། -Comment[kk_KG]=Үн параметрлери -Comment[kk_KZ]=Дыбыс параметрлері -Comment[mn_MN]=Дуу чимээний тохиргоо +Comment[ky_KG]=Иштеме параметрлери +Comment[kk_KZ]=Қолданба параметрлері +Comment[mn_MN]=Хэрэглээний тохиргоо Comment[ug_CN]=ئاۋاز تەسىس قىلىش Icon=appliction.png @@ -23,8 +23,8 @@ Weight=5 Keywords[zh_CN]=应用程序 Keywords[bo_CN]=སྐད་སྒྲ། -Keywords[kk_KG]=үн -Keywords[kk_KZ]=дыбыс -Keywords[mn_MN]=дуу чимээ +Keywords[ky_KG]=программа +Keywords[kk_KZ]=Қолданбалы бағдарлама +Keywords[mn_MN]=Хэрэглээний програм Keywords[ug_CN]=ئاۋاز Keywords=appliction diff --git a/data/category/desktop/audio.desktop b/data/category/desktop/audio.desktop index 36ae23d0..38f0b01e 100644 --- a/data/category/desktop/audio.desktop +++ b/data/category/desktop/audio.desktop @@ -4,7 +4,7 @@ Category=audio Name=audio Name[zh_CN]=声音 Name[bo_CN]=སྐད་སྒྲ། -Name[kk_KG]=үн +Name[ky_KG]=үн Name[kk_KZ]=дыбыс Name[mn_MN]=дуу чимээ Name[ug_CN]=ئاۋاز @@ -12,7 +12,7 @@ Name[ug_CN]=ئاۋاز Comment=audio settings Comment[zh_CN]=声音设置 Comment[bo_CN]=སྐད་སྒྲ་སྒྲིག་པ། -Comment[kk_KG]=Үн параметрлери +Comment[ky_KG]=Үн параметрлери Comment[kk_KZ]=Дыбыс параметрлері Comment[mn_MN]=Дуу чимээний тохиргоо Comment[ug_CN]=ئاۋاز تەسىس قىلىش @@ -23,7 +23,7 @@ Weight=10 Keywords[zh_CN]=声音 Keywords[bo_CN]=སྐད་སྒྲ། -Keywords[kk_KG]=үн +Keywords[ky_KG]=үн Keywords[kk_KZ]=дыбыс Keywords[mn_MN]=дуу чимээ Keywords[ug_CN]=ئاۋاز diff --git a/data/category/desktop/authentication-manager.desktop b/data/category/desktop/authentication-manager.desktop index 7b07c199..f6ea62ac 100644 --- a/data/category/desktop/authentication-manager.desktop +++ b/data/category/desktop/authentication-manager.desktop @@ -1,16 +1,25 @@ [Kiran Control Panel Category] Name=Authentication Manager Name[zh_CN]=认证管理 +Name[ky_KG]=Сертификацияны башкаруу +Name[kk_KZ]=Сертификаттауды басқару +Name[mn_MN]=Баталгаажуулалтын менежмент Category=authentication-manager Comment=Authentication Manager Comment[zh_CN]=认证管理 +Comment[ky_KG]=Сертификацияны башкаруу +Comment[kk_KZ]=Сертификаттауды басқару +Comment[mn_MN]=Баталгаажуулалтын менежмент Icon=authentication-manager Weight=10 Keywords[zh_CN]=认证管理 +Keywords[ky_KG]=Сертификацияны башкаруу +Keywords[kk_KZ]=Сертификаттауды басқару +Keywords[mn_MN]=Баталгаажуулалтын менежмент Keywords=Authentication Manager [Desktop Entry] diff --git a/data/category/desktop/display.desktop b/data/category/desktop/display.desktop index 79c26dbb..ee0fb741 100644 --- a/data/category/desktop/display.desktop +++ b/data/category/desktop/display.desktop @@ -4,7 +4,7 @@ Category=display Name=Display Name[zh_CN]=显示 Name[bo_CN]=གསལ་པོར་མངོན་པ། -Name[kk_KG]=дисплей +Name[ky_KG]=дисплей Name[kk_KZ]=дисплей Name[mn_MN]=харуулах Name[ug_CN]=كۆرسىتىش @@ -12,7 +12,7 @@ Name[ug_CN]=كۆرسىتىش Comment=Display Comment[zh_CN]=显示 Comment[bo_CN]=གསལ་པོར་མངོན་པ། -Comment[kk_KG]=дисплей +Comment[ky_KG]=дисплей Comment[kk_KZ]=дисплей Comment[mn_MN]=харуулах Comment[ug_CN]=كۆرسىتىش @@ -23,7 +23,7 @@ Weight=2 Keywords[zh_CN]=显示 Keywords[bo_CN]=གསལ་པོར་མངོན་པ། -Keywords[kk_KG]=дисплей +Keywords[ky_KG]=дисплей Keywords[kk_KZ]=дисплей Keywords[mn_MN]=харуулах Keywords[ug_CN]=كۆرسىتىش diff --git a/data/category/desktop/group.desktop b/data/category/desktop/group.desktop index a1c48f0a..9b46a52a 100644 --- a/data/category/desktop/group.desktop +++ b/data/category/desktop/group.desktop @@ -3,13 +3,22 @@ Category=group Name=Group Name[zh_CN]=用户组 +Name[ky_KG]=Колдонуучу топтор +Name[kk_KZ]=Пайдаланушы тобы +Name[mn_MN]=Хэрэглэгчийн бүлэг Comment=Group Comment[zh_CN]=用户组 +Comment[ky_KG]=Колдонуучу топтор +Comment[kk_KZ]=Пайдаланушы тобы +Comment[mn_MN]=Хэрэглэгчийн бүлэг Icon=group.png Weight=4 Keywords[zh_CN]=用户组 +Keywords[ky_KG]=Колдонуучу топтор +Keywords[kk_KZ]=Пайдаланушы тобы +Keywords[mn_MN]=Хэрэглэгчийн бүлэг Keywords=Group diff --git a/data/category/desktop/hardware.desktop b/data/category/desktop/hardware.desktop index 6be1a3b7..cd618975 100644 --- a/data/category/desktop/hardware.desktop +++ b/data/category/desktop/hardware.desktop @@ -4,7 +4,7 @@ Category=hardware Name=Hardware Name[zh_CN]=设备 Name[bo_CN]=སྒྲིག་ཆས། -Name[kk_KG]=жабдуулар +Name[ky_KG]=жабдуулар Name[kk_KZ]=жабдықпен жабдықта, 10 Name[mn_MN]=тоног төхөөрөмж Name[ug_CN]=ئۈسكۈنىلەر @@ -12,7 +12,7 @@ Name[ug_CN]=ئۈسكۈنىلەر Comment=Hardware Comment[zh_CN]=设备 Comment[bo_CN]=སྒྲིག་ཆས། -Comment[kk_KG]=жабдуулар +Comment[ky_KG]=жабдуулар Comment[kk_KZ]=жабдықпен жабдықта, 10 Comment[mn_MN]=тоног төхөөрөмж Comment[ug_CN]=ئۈسكۈنىلەر @@ -23,7 +23,7 @@ Weight=8 Keywords[zh_CN]=设备 Keywords[bo_CN]=སྒྲིག་ཆས། -Keywords[kk_KG]=жабдуулар +Keywords[ky_KG]=жабдуулар Keywords[kk_KZ]=жабдықпен жабдықта, 10 Keywords[mn_MN]=тоног төхөөрөмж Keywords[ug_CN]=ئۈسكۈنىلەر diff --git a/data/category/desktop/individuation.desktop b/data/category/desktop/individuation.desktop index e80185b4..b339a9b8 100644 --- a/data/category/desktop/individuation.desktop +++ b/data/category/desktop/individuation.desktop @@ -4,7 +4,7 @@ Category=individuation Name=Individuation Name[zh_CN]=个性化 Name[bo_CN]=རང་གཤིས་ཅན། -Name[kk_KG]=жекелештирүү +Name[ky_KG]=жекелештирүү Name[kk_KZ]=жекелендіру Name[mn_MN]=хувийн шинжтэй Name[ug_CN]=خاسلاشتۇرۇش @@ -12,7 +12,7 @@ Name[ug_CN]=خاسلاشتۇرۇش Comment=Individuation Comment[zh_CN]=个性化 Comment[bo_CN]=རང་གཤིས་ཅན། -Comment[kk_KG]=жекелештирүү +Comment[ky_KG]=жекелештирүү Comment[kk_KZ]=жекелендіру Comment[mn_MN]=хувийн шинжтэй Comment[ug_CN]=خاسلاشتۇرۇش @@ -23,7 +23,7 @@ Weight=1 Keywords[zh_CN]=个性化 Keywords[bo_CN]=རང་གཤིས་ཅན། -Keywords[kk_KG]=жекелештирүү +Keywords[ky_KG]=жекелештирүү Keywords[kk_KZ]=жекелендіру Keywords[mn_MN]=хувийн шинжтэй Keywords[ug_CN]=خاسلاشتۇرۇش diff --git a/data/category/desktop/language.desktop b/data/category/desktop/language.desktop index 75b6e223..65cf09c4 100644 --- a/data/category/desktop/language.desktop +++ b/data/category/desktop/language.desktop @@ -4,17 +4,17 @@ Category=language Name=language Name[zh_CN]=语言 Name[bo_CN]=སྐད་སྒྲ། -Name[kk_KG]=үн -Name[kk_KZ]=дыбыс -Name[mn_MN]=дуу чимээ +Name[ky_KG]=тил +Name[kk_KZ]=Тіл +Name[mn_MN]=Хэл Name[ug_CN]=ئاۋاز Comment=language settings Comment[zh_CN]=语言设置 Comment[bo_CN]=སྐད་སྒྲ་སྒྲིག་པ། -Comment[kk_KG]=Үн параметрлери -Comment[kk_KZ]=Дыбыс параметрлері -Comment[mn_MN]=Дуу чимээний тохиргоо +Comment[ky_KG]=Тил параметрлери +Comment[kk_KZ]=Тіл орнату +Comment[mn_MN]=Хэлний тохиргоо Comment[ug_CN]=ئاۋاز تەسىس قىلىش Icon=language.png @@ -23,8 +23,8 @@ Weight=7 Keywords[zh_CN]=语言 Keywords[bo_CN]=སྐད་སྒྲ། -Keywords[kk_KG]=үн -Keywords[kk_KZ]=дыбыс -Keywords[mn_MN]=дуу чимээ +Keywords[ky_KG]=тил +Keywords[kk_KZ]=Тіл +Keywords[mn_MN]=Хэл Keywords[ug_CN]=ئاۋاز Keywords=language diff --git a/data/category/desktop/login-settings.desktop b/data/category/desktop/login-settings.desktop index 0bbc3e26..505d0168 100644 --- a/data/category/desktop/login-settings.desktop +++ b/data/category/desktop/login-settings.desktop @@ -4,7 +4,7 @@ Category=login-settings Name=Login Settings Name[zh_CN]=登录设置 Name[bo_CN]=ཐོ་འགོད་བཀོད་སྒྲིག་བཅས་བྱ་དགོས། -Name[kk_KG]=Кирүү параметрлери +Name[ky_KG]=Кирүү параметрлери Name[kk_KZ]=Кіру параметрлері Name[mn_MN]=Логин тохиргоо Name[ug_CN]=كىرىش تەسىس قىلىش @@ -12,7 +12,7 @@ Name[ug_CN]=كىرىش تەسىس قىلىش Comment=Login Settings Comment[zh_CN]=登录设置 Comment[bo_CN]=ཐོ་འགོད་བཀོད་སྒྲིག་བཅས་བྱ་དགོས། -Comment[kk_KG]=Кирүү параметрлери +Comment[ky_KG]=Кирүү параметрлери Comment[kk_KZ]=Кіру параметрлері Comment[mn_MN]=Логин тохиргоо Comment[ug_CN]=كىرىش تەسىس قىلىش @@ -23,7 +23,7 @@ Weight=7 Keywords[zh_CN]=登录设置 Keywords[bo_CN]=ཐོ་འགོད་བཀོད་སྒྲིག་བཅས་བྱ་དགོས། -Keywords[kk_KG]=Кирүү параметрлери +Keywords[ky_KG]=Кирүү параметрлери Keywords[kk_KZ]=Кіру параметрлері Keywords[mn_MN]=Логин тохиргоо Keywords[ug_CN]=كىرىش تەسىس قىلىش diff --git a/data/category/desktop/network.desktop b/data/category/desktop/network.desktop index 6db55bd6..19069006 100644 --- a/data/category/desktop/network.desktop +++ b/data/category/desktop/network.desktop @@ -4,7 +4,7 @@ Category=network Name=Network Name[zh_CN]=网络 Name[bo_CN]=དྲ་རྒྱ། -Name[kk_KG]=Интернет +Name[ky_KG]=Интернет Name[kk_KZ]=Интернет Name[mn_MN]=Интернэт Name[ug_CN]=تور @@ -12,7 +12,7 @@ Name[ug_CN]=تور Comment=Network Comment[zh_CN]=网络 Comment[bo_CN]=དྲ་རྒྱ། -Comment[kk_KG]=Интернет +Comment[ky_KG]=Интернет Comment[kk_KZ]=Интернет Comment[mn_MN]=Интернэт Comment[ug_CN]=تور @@ -23,7 +23,7 @@ Weight=3 Keywords[zh_CN]=网络 Keywords[bo_CN]=དྲ་རྒྱ། -Keywords[kk_KG]=Интернет +Keywords[ky_KG]=Интернет Keywords[kk_KZ]=Интернет Keywords[mn_MN]=Интернэт Keywords[ug_CN]=تور diff --git a/data/category/desktop/power-management.desktop b/data/category/desktop/power-management.desktop index 97346340..799260ac 100644 --- a/data/category/desktop/power-management.desktop +++ b/data/category/desktop/power-management.desktop @@ -4,7 +4,7 @@ Category=power-management Name=Power Management Name[zh_CN]=电源 Name[bo_CN]=གློག་ཁུངས། -Name[kk_KG]=электр менен камсыз кылуу +Name[ky_KG]=электр менен камсыз кылуу Name[kk_KZ]=электрмен жабдықтау Name[mn_MN]=эрчим хүчний хангамж Name[ug_CN]=توك مەنبەسى @@ -12,7 +12,7 @@ Name[ug_CN]=توك مەنبەسى Comment=Power Management Comment[zh_CN]=电源管理 Comment[bo_CN]=གློག་ཁུངས་དོ་དམ། -Comment[kk_KG]=электр башкаруу +Comment[ky_KG]=электр башкаруу Comment[kk_KZ]=қуатты басқару Comment[mn_MN]=эрчим хүчний менежмент Comment[ug_CN]=توك مەنبەسىنى باشقۇرۇش @@ -23,7 +23,7 @@ Weight=9 Keywords[zh_CN]=电源管理 Keywords[bo_CN]=གློག་ཁུངས་དོ་དམ། -Keywords[kk_KG]=электр башкаруу +Keywords[ky_KG]=электр башкаруу Keywords[kk_KZ]=қуатты басқару Keywords[mn_MN]=эрчим хүчний менежмент Keywords[ug_CN]=توك مەنبەسىنى باشقۇرۇش diff --git a/data/category/desktop/timedate.desktop b/data/category/desktop/timedate.desktop index befba575..ae4ae808 100644 --- a/data/category/desktop/timedate.desktop +++ b/data/category/desktop/timedate.desktop @@ -4,7 +4,7 @@ Category=timedate Name=TimeDate Name[zh_CN]=日期时间 Name[bo_CN]=ཚེས་གྲངས་ཀྱི་དུས་ཚོད། -Name[kk_KG]=Дата убактысы +Name[ky_KG]=Дата убактысы Name[kk_KZ]=Күндізгі уақыт Name[mn_MN]=Огноо Name[ug_CN]=ۋاقىت ۋاقتى @@ -18,7 +18,7 @@ Weight=4 Keywords[zh_CN]=日期时间 Keywords[bo_CN]=ཚེས་གྲངས་ཀྱི་དུས་ཚོད། -Keywords[kk_KG]=Дата убактысы +Keywords[ky_KG]=Дата убактысы Keywords[kk_KZ]=Күндізгі уақыт Keywords[mn_MN]=Огноо Keywords[ug_CN]=ۋاقىت ۋاقتى diff --git a/plugins/language/data/support_language.json b/plugins/language/data/support_language.json index 3c77c50e..65c95bd4 100644 --- a/plugins/language/data/support_language.json +++ b/plugins/language/data/support_language.json @@ -31,7 +31,7 @@ "LanguageName": "Mongolian" }, { - "Locale": "kk_KZ.UTF-8", + "Locale": "kk_KZ", "Description": "Қазақша", "LangCode": "kk", "LanguageName": "Kazakh" diff --git a/plugins/language/src/language-page.cpp b/plugins/language/src/language-page.cpp index b8d5602f..b808c842 100644 --- a/plugins/language/src/language-page.cpp +++ b/plugins/language/src/language-page.cpp @@ -150,7 +150,7 @@ QString LanguagePage::showLanguageName(QString languageCode) { languageName = QString("Монгол") + QString("-%1").arg(tr("Mongolian")); } - else if (languageCode == "kk_KZ.UTF-8") + else if (languageCode == "kk_KZ") { languageName = QString("Қазақша") + QString("-%1").arg(tr("Kazakh")); } diff --git a/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp index da46dabb..fa237085 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 feefdcfa..d19a5e01 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); diff --git a/translations/kiran-control-panel.kk_KZ.ts b/translations/kiran-control-panel.kk_KZ.ts index cf29d46a..629f6c3b 100644 --- a/translations/kiran-control-panel.kk_KZ.ts +++ b/translations/kiran-control-panel.kk_KZ.ts @@ -1,17 +1,32 @@ + + AccountItemWidget + + Create new user + Жаңа пайдаланушыны жасаңыз + + + disable + Өшіреді + + + enable + Тұрақты + + AccountSubItem account - + Есептік жазба New User - + Жаңа пайдаланушы @@ -20,107 +35,222 @@ disable - + Өшіреді enable - + Тұрақты Create new user - + Жаңа пайдаланушыны жасаңыз - AdvanceSettings + ActGuideWidget - - Form - + Please choose activation mode: + Мектептегі белсенділік режимін босату: - - Login shell - + Next + Келесі - - EditLoginShell - + Current machine code: + Ағымдағы машина коды: - - Specify user id (needs to be greater than 1000) - + Please input activation code: + Енгізу әрекетінің кодын шығарыңыз: - - EditSpecifyUserID - + Back + Артқа - - Specify user home - + Please insert the UsbKey device first! + Алдымен UsbKey құрылғысын енгізіңіз! - - EditSpecifyUserHome - + Activate online + Желіде іске қосыңыз - - ButtonConfirm - + Activate with the input activation code + Енгізу әрекеті кодымен әрекет - - confirm - + Activate with insert UsbKey + UsbKey кірістіруімен іске қосыңыз - - ButtonCancel - + Activate + Іске қосыңыз - - cancel - + Please enter the activate server address: + Кәсіпкерге әрекет серверінің мекенжайын шығарыңыз: + + + Activating...... + Белсенді...... + + + System activate successful! + Жүйенің әрекет қабілеттілігі! + + + server activation and remaining points: + Сервер әрекеті және қалған нүктелер: + + + development activation and remaining points: + Даму қызметі және қысқарту нүктелері: + + + industrial activation and remaining points: + Өнеркәсіптік қызмет және қайта өңдеу нүктелері: + + + desktop activation and remaining points: + Жұмыс үстелінің белсенділігі және қалған нүктелер: + + + activation points: + Белсенділік нүктелері: + + + remaining points: + Қалған нүктелер: + + + Close + Жабу + + + System activate failed! + Жүйелік әрекет өрісте! + + + unknow + Белгісіз + + + Activation Mode + Белсенділік режимі + + + Start Activation + Белсенді бастау + + + Activation Complete + Қызмет аяқталды + + + Activation Guide + Белсенділік жөніндегі нұсқаулық + + + Server IP address or Domain name + Сервер IP мекенжайы немесе домен атауы + + + AdvanceSettings Advance Settings - + Advance Settings Securities Automatically generated by system - + Жүйе бойынша автоматтандырылған жалпыланған Please enter the correct path - + Дұрыс жолды босатыңыз Please enter specify user Id - + Шығарылым кәсіпкері пайдаланушы идентификаторын көрсетеді Please enter an integer above 1000 - + Кәсіпкерді 1000-нан жоғары кірістіруді шығарыңыз Please enter the correct home directory - + Дұрыс үй каталогын босатыңыз + + + + Form + Пішіні + + + + Login shell + Тіркеу қабығы + + + + EditLoginShell + EditLoginShell + + + + Specify user id (needs to be greater than 1000) + Пайдаланушы идентификаторы (NEEDS 1000)-тен гөрі жасаушы екенін көрсетіңіз + + + + EditSpecifyUserID + EditSpecifyUserID + + + + Specify user home + Spotify пайдаланушы үйі + + + + EditSpecifyUserHome + EditSpecifyUserHome + + + + ButtonConfirm + ButtonConfirm + + + + confirm + Растаңыз + + + + ButtonCancel + ButtonCancell + + + + cancel + Бас тарту + + + Specify user id + Spotify пайдаланушы идентификаторы @@ -128,30 +258,90 @@ Theme - + Тақырыбы Wallpaper - + Тұсқағаз Font - + Қаріп + + + + ApplicationPlugin + + + DefaultApp + DefaultApp + + + + AutoStart + AutoStart AudioSystemTray - + Volume Setting - + Көлемді реттеу - + Mixed Setting - + Аралас орнату + + + + AuthManagerPage + + Fingerprint Authentication + Саусақ ізінің аутентификациясы + + + Face Authentication + Бет аутентификациясы + + + Password Authentication + Құпия сөздің аутентификациясы + + + save + Сақтаңыз + + + return + Қайтару + + + add fingerprint + Саусақ ізін қосыңыз + + + add face + Бет қосу + + + error + Қате + + + please ensure that at least one authentication option exists + Деректерді кем дегенде бір рұқсат өрнек тарихын шығарыңыз + + + fingerprint_ + ________________________ + + + face_ + Face____ @@ -159,37 +349,126 @@ Fingerprint - + Саусақ ізі FingerVein - + Саусақ венасы + + + + Driver Manager + Жүргізуші менеджері + + + + Prefs + Prefs UKey - + UKey Iris - + Iris Face - + Бет + + + + AutoStartPage + + Boot Setup + Жүктеуді орнату - - Driver Manager - + Desktop files(*.desktop) + Жұмыс үстелі файлдары(*.desktop) - - Prefs - + select autostart desktop + Автоматты іске қосу жұмыс үстелін таңдаңыз + + + Select + Таңдаңыз + + + Cancel + Бас тарту + + + Error + Қате + + + Desktop has existed + Жұмыс үстелі қазірдің өзінде аталды + + + Desktop cant permit to join + Жұмыс үстелі қосылуға рұқсат бермейді + + + Desktop dont support + Жұмыс үстелін басқаруды қолдау + + + + AutostartPage + + + Boot Setup + Жүктеуді орнату + + + + Desktop files(*.desktop) + Жұмыс үстелі файлдары(*.desktop) + + + + select autostart desktop + Автоматты іске қосу жұмыс үстелін таңдаңыз + + + + Select + Таңдаңыз + + + + Cancel + Бас тарту + + + + + + Error + Қате + + + + Desktop has existed + Жұмыс үстелі қазірдің өзінде аталды + + + + Desktop cant permit to join + Жұмыс үстелі қосылуға рұқсат бермейді + + + + Desktop dont support + Жұмыс үстелін басқаруды қолдау @@ -197,81 +476,95 @@ BatterySettingsPage - + BatterySettingsPage After idle for more than the following time, the computer will execute - + Келесі уақыттан артық жұмыс істемей тұрғаннан кейін компьютер орындалады ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction When the battery is lit up, it will be executed - + Деректер жанған жерде ол орындалады ComboLowBatteryAction - + ComboLowBatteryAction The monitor will turn off when it is idle - + Монитор бос тұрған кезде бұрылады ComboMonitorTurnOffIdleTime - + ComboMonitorTurnOffIdleTime Reduce screen brightness when idle - + Экранның жарықтығын азайту Reduce screen brightness when no power - + Туған күнді қысқартыңыз, қуат жоқ The energy saving mode is enabled when the power is low - + Қуат аз болған кезде орташа үнемдеу режимі қосылады Suspend - + пайдалану Shutdown - + Өшіру Hibernate - + Қысқы ұйқы Do nothing - + Ештеңе жасамаңыз + + + + BatterySubItem + + Battery Settings + Батарея параметрлері + + + + BiometricItem + + add + Қосу @@ -279,17 +572,17 @@ CPanelAudioWidget - + CPanelAudioWidget Output - + Шығару Input - + Енгізу @@ -297,39 +590,61 @@ CPanelNetworkWidget - - - - - Wireless Network - + CPanel NetworkWidget - - + + VPN - + VPN - - + + Network Details - + Желілік мәліметтер + + + + + + + + Wired Network + Сымды желі + + + + + + + + + Wireless Network + Сымсыз желі - + Connected - + Қосылған - + Unavailable - + Қолжетімсіз - + Disconnected - + Ажыратылған + + + Wired Network %1 + Сымды желі %1 + + + Wireless Network %1 + Сымсыз желі %1 @@ -337,47 +652,51 @@ Form - + Пішіні Host Name: - + Хост аты: EditHostName - + EditHostName ButtonSaveHostName - + ButtonSaveHostName Save - + Сақтаңыз ButtonCancelChangeHostName - + ButtonCanceChangeHostName Cancel - + Бас тарту + + + Host Name + Хост аты Warning - + Ескерту Change host name failed! Please check the Dbus service! - + Хост атын біріктіріңіз! Dbus қызметін тексеріңіз! @@ -385,12 +704,12 @@ Check password - + Құпия сөзді тексеріңіз Check the current password before you enroll the feature - + Мүмкіндікті енгізер алдында ағымдағы құпия сөзді тексеріңіз @@ -398,7 +717,7 @@ Form - + Пішіні @@ -406,12 +725,12 @@ ConnectionDetailsWidget - + ConnectionDetailsWidget Security type - + Қауіпсіздік түрі @@ -428,129 +747,187 @@ TextLabel - + TextLabel Frequency band - + Freeconny тобы Channel - + Арна Interface - + Интерфейс MAC - + MAC IPv4 - + IPv4 Gateway - + Шлюз DNS - + DNS Subnet mask - + Ішкі желі маскасы IPv6 - + IPv6 Prefix - + Түзету Rate - + Баға + + + Preferred DNS + Таңдаулы DNS - ConnectionNameWidget + ConnectionItemWidget - - ConnectionNameWidget - + + disconnect + Ажыратыңыз - - TextLabel - + + ignore + Елемеу - - EditConnectionName - + + remove + Алып тастаңыз - - Auto Connection - + + The current device:%1 is not available + Ағымдағы құрылғы: %1 қол жетімді емес - - Required - + + The carrier is pulled out + Тасымалдаушы шығарылады - - Wired Connection %1 - + + Are you sure you want to delete the connection %1 + Сіз қосылымды жойғыңыз келе ме %1 - - VPN L2TP %1 - + + Warning + Ескерту - - VPN PPTP %1 - + + + Tips + Кеңестер - - Connection name can not be empty - + + Password required to connect to %1. + Құпия сөз %1-ге қосылуы керек. + + + + Please input a network name + Желі атауын енгізуді босатыңыз - ConnectionShowPage + ConnectionNameWidget + + + ConnectionNameWidget + ConnectionNameWidget + + + + TextLabel + TextLabel + + + + EditConnectionName + EditConnectionName + + + + Auto Connection + Автоматты қосылым + + + + Required + талап ету + + + + Wired Connection %1 + Сымды қосылым %1 + + + + VPN L2TP %1 + VPN L2TP %1 + + + + VPN PPTP %1 + VPN PPTP %1 + + + + Connection name can not be empty + Қосылым атауы ерекше болуы мүмкін емес + + + + ConnectionShowPage ConnectionShowPage - + ConnectionShowPage TextLabel - + TextLabel ButtonCreateConnection - + ButtonCreateConnection @@ -558,190 +935,229 @@ CreateGroupPage - + CreateGroupPage Create Group - + Топ құру Add Group Members - + Топ мүшелерін қосыңыз Confirm - + Растаңыз Please enter your group name - + Топ атыңызды енгізіңіз group name cannot be a pure number - + топ атауы таза сан бола алмайды group name already exists - + Топ атауларының нөмірлері бар Error - + Қате CreateUserPage + + Account type + Есептік жазба түрі + + + + standard + Стандартты + + + + administrator + әкімші + + + + Please enter user name first + Шығару құралының пайдаланушы аты бірінші + + + + Please enter your user name + Пайдаланушы атыңызды шығарыңыз + + + + user name cannot be a pure number + Пайдаланушы атауы таза сан бола алмайды + + + + user name already exists + Пайдаланушы атының колледжі бар + + + + Please enter your password + Құпия сөзіңізді енгізіңіз + + + + Please enter the password again + Құпия сөз мұрасын шығарыңыз + + + + The password you enter must be the same as the former one + Сіз енгізетін құпия сөз бұрынғы сияқты атау болуы керек + + + + + Error + Қате + + + + Password encryption failed + Құпия сөзді шифрлауды қаржыландыру + Form - + Пішіні UserAvatarWidget - + UserAvatarWidget User name - + Пайдаланушы аты EditUserName - + EditUserName User type - + Пайдаланушы түрі ComboUserType - + ComboUserType Password - + Құпия сөз EditPasswd - + EditPasswd Confirm password - + Құпия сөзді растаңыз EditPasswdConfirm - + EditPasswdConfirm ButtonAdvanceSetting - + ButtonAdvanceSetting Advance setting - + Алдын ала орнату ButtonConfirm - + ButtonConfirm Confirm - + Растаңыз ButtonCancel - + ButtonCancell Cancel - - - - - standard - - - - - administrator - - - - - Please enter user name first - + Бас тарту - - Please enter your user name - + Please enter account name first + Кәсіпкер шотының атын бірінші рет шығарыңыз - - user name cannot be a pure number - + Please enter your account name + Кәсіпкер шотының атауын шығарыңыз - - user name already exists - + Account cannot be a pure number + Есеп таза популяция бола алмайды - - Please enter your password - + Account already exists + Дайындалған есеп бар - - Please enter the password again - + Please enter your userName name + Кәсіпкер пайдаланушы атын шығарыңыз + + + CursorThemePage - - The password you enter must be the same as the former one - + + Cursor Themes Settings + Cursor ThemSettings + + + CursorThemes - - - Error - + Cursor Themes Settings + Cursor ThemSettings - - Password encryption failed - + Faild + Дала - - - CursorThemePage - - Cursor Themes Settings - + Set cursor themes failed! + Курсор тақырыптарын орнатыңыз! @@ -749,37 +1165,37 @@ DateTimeSettings - + DateTimeSettings Select Time - + Уақытты таңдаңыз Select Date - + Күнді таңдаңыз ButtonSave - + ButtonSave save - + Сақтаңыз ButtonReset - + ButtonReset reset - + Қалпына келтіру @@ -787,54 +1203,72 @@ %1 - + %1% DefaultApp - + DefaultApp - + DefaultApp - + Web Browser - + Веб-шолғыш - + Email - + Электрондық пошта - + Text - + Мәтін - + Music - + Музыка - + Video - + Бейне - + Image - + Кескін DefaultappPlugin - - + Email + Электрондық пошта + + + Text + Мәтін + + + Music + Музыка + + + Video + Бейне + + + Image + Кескін + + DefaultApp - + DefaultApp @@ -842,22 +1276,48 @@ DetailsPage - + DetailsPage Network Details - + Желілік мәліметтер Please select a connection - + Қосылымды таңдаңыз ComboBoxDetailsSelectConnection - + ComboBoxDetailsSelectConnection + + + + DeviceAvailableConnectionWidget + + + Network card: %1 + Желілік карта: %1 + + + + Other WiFi networks + Басқа WiFi желілері + + + + DeviceList + + + Wired Network Adapter + Сымды желі адаптері + + + + Wireless Network Adapter + Сымсыз желі адаптері @@ -865,57 +1325,57 @@ Form - + Пішіні Rotate left 90 degrees - + Солға бұру 90 градус ButtonLeft - + ButtonLeft Rotate right 90 degrees - + Оңға бұру 90 градус ButtonRight - + ButtonRight Turn left and right - + Солға және оңға бұрылыңыз ButtonHorizontal - + ButtonHorizontal upside down - + Төңкерілген ButtonVertical - + ButtonVertical Identification display - + Сәйкестік дисплейі ButtonIdentifying - + ButtonIdentifying @@ -923,47 +1383,47 @@ DisconnectAndDeleteButton - + AndDeleteButton-ды ажыратыңыз ButtonDisconnect - + ButtonDisconnect Disconnect - + Ажыратыңыз ButtonDelete - + ButtonDelete Delete - + Жою ButtonIgnore - + ButtonIgnore Ignore - + Елемеу - + Are you sure you want to delete the connection %1 - + Сіз қосылымды жойғыңыз келе ме %1 - + Warning - + Ескерту @@ -971,52 +1431,52 @@ DisplayFormatSettings - + DisplayFormatSettings Long date display format - + Ұзақ күнді көрсету пішімінің пішімі ComboLongDateDisplayFormat - + ComboLongDateDisplayFormat Short date display format - + Қысқа күнді көрсету пішімінің пішімі ComboShortDateDisplayFormat - + ComboShortDateDisplayFormat Time format - + Пішім уақыты ComboTimeFormat - + ComboTimeFormat Show time witch seconds - + Уақыт ведьмасының секундтарын көрсету 24-hours - + 24 сағат 12-hours - + 12 сағат @@ -1024,154 +1484,154 @@ DisplayPage - + DisplayPage ButtonCopyDisplay - + ButtonCopyDisplay Copy display - + Көшіру дисплейі ButtonExtendedDisplay - + ButtonExtendedDisplay Extended display - + Кеңейтілген дисплей Resolution ratio - + Ажыратымдылық коэффициенті ComboResolutionRatio - + ComboResolutionRatio Refresh rate - + Сергіту жылдамдығы ComboRefreshRate - + ComboRefreshRate Zoom rate - + Масштабтау жылдамдығы ComboZoomRate - + ComboZoomRate Automatic - + Автоматты 100% (recommended) - + 100% (recombended) 200% - + 200% Open - + Ашық Set as main display - + Негізгі дисплей ретінде орнатыңыз SwitchExtraPrimary - + SwitchExtraPrimary ComboExtraResolutionRatio - + ComboExtraResolutionRatio ComboExtraRefreshRate - + ComboExtraRefreshRate ComboExtraZoomRate - + ComboExtraZoomRate ButtonExtraApply - + ButtonExraApply Apply - + Қолданбалы ButtonExtraCancel - + ButtonExtraCancel Close - + Жабу (recommended) - + (recombended) Is the display normal? - + Дисплей қалыпты ма? Save current configuration(K) - + Currentconfiguration(K) сақтаңыз Restore previous configuration(R) - + Presitiorconfiguration(R) қалпына келтіріңіз The display will resume the previous configuration in %1 seconds - + Дисплей %1 секундта басым конструкцияларға әкеледі @@ -1179,7 +1639,7 @@ Display - + Дисплей @@ -1187,17 +1647,17 @@ DnsWidget - + DnsWidget Preferred DNS - + Таңдаулы DNS Alternate DNS - + Балама DNS @@ -1205,37 +1665,41 @@ device type - + Құрылғы түрі driver list - + Жүргізуші тізімі Fingerprint - + Саусақ ізі + + + FingerVein + Саусақ венасы Fingervein - + Саусақ iris - + Iris ukey - + Ukey face - + Бет @@ -1243,12 +1707,12 @@ DslManager - + DSLManager DSL - + DSL @@ -1256,17 +1720,17 @@ DslSettingPage - + DSLSettingPage Save - + Сақтаңыз Return - + Қайтару @@ -1274,251 +1738,340 @@ EthernetWidget - + EthernetWidget MAC Address Of Ethernet Device - + Ethernet құрылғысының MAC мекенжайы ComboBoxDeviceMac - + ComboBoxDeviceMac Ethernet Clone MAC Address - + Ethernet Clone MAC мекенжайы EditDeviceMac - + EditDeviceMac Custom MTU - + Арнайы MTU SpinBoxCustomMTU - + SpinBoxCustomMTU - + No device specified - + Құрылғы көрсетілмеген - + Clone Mac invalid - + Mac клоны жарамсыз - FacePage + FaceEnrollDialog - - face - + save + Сақтаңыз + + + cancel + Бас тарту + + + initializing face collection environment... + бет саясаты шешімін инициализациялау... + + + failed to initialize face collection environment! + Бет ауқымының нәтижесін инициализациялау өрісі! + + + Failed to start collection + Таңдауды бастау үшін өріс + + + + FaceInputDialog + + save + Сақтаңыз + + + cancel + Бас тарту + + + initializing face collection environment... + бет саясаты шешімін инициализациялау... + + + failed to initialize face collection environment! + Бет ауқымының нәтижесін инициализациялау өрісі! + + Failed to start collection + Таңдауды бастау үшін өріс + + + + FacePage Default face device - + Әдепкі бет құрылғысы face feature list - + Бет мүмкіндіктерінің тізімі + + + + face + Бет Cancel - + Бас тарту Start enroll failed,%1 - + Тіркелу өрісін бастаңыз,%1 Error - + Қате The biometric features were successfully recorded. The feature name is:%1 - + Биометриялық ерекшеліктер барлық жерде жауапкершілікпен жазылған. Мүмкіндік атауы: %1 Tips - + Кеңестер Failed to record biometrics(%1), Please try again - + Biometrics(%1) жазыла алмады, агенді қолданып көріңіз FingerPage + + + Cancel + Бас тарту + fingerprint - + Саусақ ізі fingervein - + Саусақ - - Default %1 device - + default %1 device + Әдепкі %1 құрылғы %1 list - - - - - Cancel - + %1 Тізім Start enroll failed,%1 - + Тіркелу өрісін бастаңыз,%1 Error - + Қате The biometric features were successfully recorded. The feature name is:%1 - + Биометриялық ерекшеліктер барлық жерде жауапкершілікпен жазылған. Мүмкіндік атауы: %1 Tips - + Кеңестер Failed to record biometrics(%1), Please try again - + Biometrics(%1) жазыла алмады, агенді қолданып көріңіз + + + %1list + %1 тізім + + + + Default %1 device + Әдепкі %1 құрылғы - Fonts + FingerprintEnrollDialog - - Form - + save + Сақтаңыз - - Application Font Settings - + cancel + Бас тарту - - ComboAppFontName - + Finger Enroll + Саусақтарды шақыру - - ComboAppFontSize - + This fingerprint is bound to the user(%1) + Бұл жұқа басып шығару user(%1) арқылы байланыстырылған - - Titlebar Font Settings - + Info + Ақпарат + + + Error + Қате + + + + FingerprintInputDialog + + save + Сақтаңыз + + + cancel + Бас тарту + + + Finger Enroll + Саусақтарды шақыру + + + Error + Қате + + + + FingerprintInputWorker + + initializing fingerprint collection environment... + Металл басып шығару ортасын инициализациялау... + + + + Fonts + + + Form + Пішіні - - ComboTitleFontName - + Application Font Settings + Қолданбалы қаріп параметрлері - - ComboTitleFontSize - + Titlebar Font Settings + Титулдық қаріп параметрлері - Monospace Font Settings - + Моноғарыштық қаріп параметрлері + + + + Word size + Сөз өлшемі - - ComboMonospaceFontName - + + System font + Жүйе қаріпі - - ComboMonospaceFontSize - + + Monospaced font + Бір аралықтағы қаріп GeneralBioPage - - Rename Feature - + + default device + әдепкі құрылғы - - Please enter the renamed feature name - + + 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-ді алып тастағыңыз келетінін түсінесіз бе, Ұлыбританияның негізгі шешімі анықталған қоршаған ортаны қорғау; әйтпесе жою үшін ақпарат қоймасы Are you sure you want to delete the feature called %1 - + Мүмкіндік қоңырауын %1 алып тастағыңыз келетініне сенімдісіз бе tips - + Кеңестер Error - + Қате Failed to enroll feature because the password verification failed! - + Құпия сөзді тексеру қоршаған ортаны қорғау белгісіне сәйкес келмеді! - - default device - + + Rename Feature + Мәдениет атауын өзгерту - - feature list - + + Please enter the renamed feature name + Аты өзгертілген мүмкіндік атауын шығарыңыз @@ -1526,83 +2079,87 @@ Form - + Пішіні Capslock Tip - + Capslock Tip Numlock Tip - + Numlock Tip Repeat Key - + ҚайталАУ кілті (Repeat a key while holding it down) - + (Кілтті төмен ұстап тұрып қайталаңыз SwitchRepeatKey - + SwitchRepeatKey Delay - + Кешігу SliderRepeatDelay - + SliderRepeatDelay Short - + Қысқа Long - + Ұзын Interval - + Аралық SliderRepeatInterval - + SliderReptInterval Slow - + Баяу Fast - + Жылдам Enter repeat characters to test - + Тестілеуге арналған кәсіпорын карталары EditTestRepeatKey - + EditTestRepeatKey + + + Enter characters to test the settings + Орнатуды тексеру үшін жарғылар @@ -1610,150 +2167,157 @@ GeneralSettingsPage - + GeneralSettingsPage When the power button is pressed - + Қуат түймесі басылғанда ComboPowerButtonAction - + ComboPowerButtonAction When the suspend button is pressed - + Басу түймесі басылғанда ComboSuspendAction - + ComboSuspendAction When closing the lid - + Қақпақты жапқанда ComboCloseLidAction - + ComboCloseLidAction Computer Mode - + Компьютер режимі Display brightness setting - + Жарықтық жиынын көрсетіңіз 0% - + 0% SliderDisplayBrightness - + SliderDisplayBrightness Color temperature - + Түсті демонстрация Automatic color temperature - + Автоматты түс тарихы cold - + Суық standard - + Стандартты warm - + Жылы Regard computer as idle after - + Компьютерді мақала ретінде қарастырыңыз SliderComputerIdleTime - + SliderComputerIdleTime Lock screen when idle - + Экранды құлыптау кезінде password is required to wake up in standby mode - + Құпия сөз стандартты режимде толтырылуы керек shutdown - + Өшіру hibernate - + Қысқы ұйқы suspend - + пайдалану display off - + Өшіру do nothing - + Ештеңе жасамаңыз ERROR - + ҚАТЕ %1hour - + %1 сағат% %1minute - + %1 минут + + + + GeneralSettingsSubItem + + General Settings + Жалпы параметрлер @@ -1761,7 +2325,7 @@ Keyboard General Option - + Пернетақтаның жалпы нұсқасы @@ -1769,52 +2333,52 @@ Form - + Пішіні TextLabel - + TextLabel Group - + Топ Member List - + Палата тізімі Add User - + Пайдаланушы қосыңыз Delete - + Жою Add Member - + Жад қосыңыз Save - + Сақтаңыз Cancel - + Бас тарту Please input keys for search... - + Іздеу үшін енгізу кілттерін шығарыңыз... @@ -1822,7 +2386,7 @@ Error - + Қате @@ -1830,22 +2394,22 @@ Group - + Топ Creat group - + Ұлы топ Change group name - + Топ атауын өзгерту Add group member - + Топтық хабарды қосыңыз @@ -1853,68 +2417,100 @@ Create User failed - - - - - Failed to connect to the account management service - + Пайдаланушы өрісін жасаңыз update password failed - + Құпия сөзді жаңарту icon file - + Иондық файл userName type - + UserName түрі locked - + Құлыпталған Failed to update user properties,%1 - + Пайдаланушы сипаттарын жаңарту сәтсіз аяқталды, %1 Failed to delete user,%1 - + Пайдаланушыны жоя алмады, %1 + + + password + Құпия сөз + + + home directory + Үй анықтамалығы + + + shell + Қабық + + + icon + Иондық + + + Failed to set user attributes + Пайдаланушыны көздерге орната алмады + + + account type + Есептік жазба түрі + + + Failed to update user properties(%1) + Пайдаланушы property(%1) жаңарта алмады + + + Failed to delete user + Пайдаланушыны жоя алмады + + + + Failed to connect to the account management service + Тіркелгі қызметіне қосылу өрісі Create Group failed - + Топты құру Failed to delete group,%1 - + Топты жоюға дайын, %1 add user to group failed - + Пайдаланушыны groupfaled бағдарламасына қосыңыз change group name failed - + Топ атауының өрісін өзгертіңіз change group name failed, the new group name is occupied - + Топ атауының команда өрісін өзгертіңіз, топтың жаңа атауы бар @@ -1922,60 +2518,95 @@ Form - + Пішіні CPU: - + CPU: LabelCpuInfo - + LabelCpuInfo TextLabel - + TextLabel Memory: - + Жад: LabelMemoryInfo - + Label MemoryInfo Hard disk: - + Қатты диск: Graphics card: - + Графикалық карта: Network card: - + Желілік карта: + + + Copyright © + Авторлық құқық © + + + KylinSec. All rights reserved. + KylinSec. Барлық құқықтарды тексеру. Unknow - + Белгісіз %1 GB (%2 GB available) - + %1 ГБ (%2 ГБ қолжетімді) + + + + HardwareInformationWidget + + CPU: + CPU: + + + Memory: + Жад: + + + Hard disk: + Қатты диск: + + + Graphics card: + Графикалық карта: + + + Network card: + Желілік карта: + + + Unknow + Белгісіз @@ -1983,7 +2614,7 @@ Hardware Information - + Аппараттық ақпарат @@ -1991,12 +2622,46 @@ Form - + Пішіні Icon Themes Setting - + Icon ThemSetting + + + + IconThemes + + Icon Themes Setting + Icon ThemSetting + + + Faild + Дала + + + Set icon themes failed! + Белгіше тақырыптарын орнатыңыз! + + + + IdentificationRenameDialog + + Rename Feature + Мәдениет атауын өзгерту + + + Please enter the renamed feature name + Аты өзгертілген мүмкіндік атауын шығарыңыз + + + Confirm + Растаңыз + + + Cancel + Бас тарту @@ -2004,22 +2669,22 @@ Add Image Failed - + Сурет негізін қосыңыз The image already exists! - + Кескін нөмірлері бар! Delete image - + Кескінді жою Are you sure you want to delete this picture? - + Бұл суретті жойғыңыз келетініне сенімдісіз бе? @@ -2027,12 +2692,12 @@ Confirm - + Растаңыз Cancel - + Бас тарту @@ -2040,37 +2705,42 @@ InputPage - + InputPage + Input cards + Кіріс карталары + + + Input devices - + Енгізу құрылғылары - + ComboBoxInputDevices - + ComboBoxInputDevices - + Input volume - + Кірістің құбылмалы - + SliderVolumeSetting - + SliderVolumeSetting - + Feedback volume - + Кері байланыс көлемі - + No input device detected - + Ешқандай енгізу құрылғысы қорғалмаған @@ -2078,118 +2748,124 @@ Ipv4Widget - + IPv4Widget IPV4 Method - + IPV4 әдісі ComboBoxIpv4Method - + ComboBoxIpv4Method IP Address - + IP мекенжайы EditIpv4Address - + EditIpv4Address Net Mask - + Net маскасы EditIpv4Netmask - + EditIpv4Netmask Gateway - + Шлюз EditIpv4Gateway - + EditIpv4Gateway - DNS 1 - - - - - DNS 2 - + DNS + DNS EditIpv4PreferredDNS - + EditIpv4 PreferredDNS - - EditIpv4AlternateDNS - - - - + Auto - + Автоматты - + Manual - + Нұсқаулық - + Required - + талап ету + + + + Please separate multiple DNS entries by semicolon + Semiconductor арқылы бірнеше DNS жазбаларын бөліңіз + + + + Ipv4 DNS invalid + IPv4 DNS жарамсыз - + Ipv4 address can not be empty - + IPv4 мекенжайы ерекше болуы мүмкін емес - + Ipv4 Address invalid - + IPv4 мекенжайы жарамсыз - + NetMask can not be empty - + NetMask ерекше болуы мүмкін емес - + Netmask invalid - + Netmask жарамсыз - + Ipv4 Gateway invalid - + IPv4 шлюзі жарамсыз + + + Preferred DNS + Таңдаулы DNS + + + Alternate DNS + Балама DNS - Ipv4 Preferred DNS invalid - + IPv4 артықшылықты DNS жарамсыз - Ipv4 Alternate DNS invalid - + IPv4 балама DNS жарамсыз @@ -2197,161 +2873,178 @@ Ipv6Widget - + IPv6Widget IPV6 Method - + IPV6 әдісі ComboBoxIpv6Method - + ComboBoxIpv6Method IP Address - + IP мекенжайы EditIpv6Address - + EditIpv6Address Prefix - + Түзету SpinBoxIpv6Prefix - + SpinBoxIpv6 Prefix Gateway - + Шлюз EditIpv6Gateway - + EditIpv6Gateway - Preferred DNS - + DNS + DNS EditIpv6PreferredDNS - - - - - Alternate DNS - - - - - EditIpv6AlternateDNS - + EditIpv6 PreferredDNS - + Auto - + Автоматты - + Manual - + Нұсқаулық - + Ignored - + Еленбеген - + Required - + талап ету + + + + Please separate multiple DNS entries by semicolon + Semiconductor арқылы бірнеше DNS жазбаларын бөліңіз + + + + Ipv6 DNS invalid + IPv6 DNS жарамсыз - + Ipv6 address can not be empty - + IPv6 мекенжайы ерекше болуы мүмкін емес - + Ipv6 address invalid - + IPv6 мекенжайы жарамсыз - + Ipv6 Gateway invalid - + IPv6 шлюзі жарамсыз + + + Preferred DNS + Таңдаулы DNS + + + Alternate DNS + Балама DNS - Ipv6 Preferred DNS invalid - + IPv6 артықшылықты DNS жарамсыз - Ipv6 Alternate DNS invalid - + IPv6 балама DNS жарамсыз IrisPage - - - iris - - Default Iris device - + Әдепкі Iris құрылғысы Iris feature list - + Iris мүмкіндіктерінің тізімі + + + + iris + Iris Cancel - + Бас тарту Start enroll failed,%1 - + Тіркелу өрісін бастаңыз,%1 Error - + Қате The biometric features were successfully recorded. The feature name is:%1 - + Биометриялық ерекшеліктер барлық жерде жауапкершілікпен жазылған. Мүмкіндік атауы: %1 Tips - + Кеңестер Failed to record biometrics(%1), Please try again - + Biometrics(%1) жазыла алмады, агенді қолданып көріңіз + + + + KcpInterface + + Warning + Ескерту + + + load qss file failed + qss файл файл файлының файлын жүктеңіз @@ -2359,7 +3052,7 @@ Keybinding - + Түйінді байланыстыру @@ -2367,12 +3060,35 @@ None - + Ешқайсысы disabled - + Өшіреді + + + + KiranAccountManager + + disable + Өшіреді + + + enable + Тұрақты + + + Create new user + Жаңа пайдаланушыны жасаңыз + + + User Manager + Пайдаланушы менеджері + + + Create new account + Жаңа тіркелгі жасаңыз @@ -2380,17 +3096,154 @@ Avatar Editor - + Аватар редакторы Confirm - + Растаңыз Cancel - + Бас тарту + + + + KiranCPanelMouse + + Mouse and TouchPad + Үй және сенсорлық тақта + + + + KiranCPanelMouseWidget + + Select Mouse Hand + Үйдің қолын таңдаңыз + + + Mouse Motion Acceleration + Үй қозғалысының үдеуі + + + Natural Scroll + Табиғи шиыршық + + + Middle Emulation Enabled + Орта эмуляцияны қосу + + + Touchpad Enabled + Сенсорлық тақта қосылған + + + Select TouchPad Hand + TouchPad қолын таңдаңыз + + + TouchPad Motion Acceleration + TouchPad Motion Acceleration + + + Select Click Method + Басу әдісін таңдаңыз + + + Select Scroll Method + Айналдыру әдісін таңдаңыз + + + Enabled while Typing + Теру кезінде қосу + + + Tap to Click + Басу үшін түртіңіз + + + Reset + Қалпына келтіру + + + Exit + Шығу + + + Cancel + Бас тарту + + + Save + Сақтаңыз + + + Mouse Settings + Үй параметрлері + + + TouchPad Settings + TouchPad параметрлері + + + Standard + Стандартты + + + Right Hand Mode + Оң қол режимі + + + Left Hand Mode + Сол қол режимі + + + Press and Tap + Басыңыз және түртіңіз + + + Tap + Түртіңіз + + + Two Finger Scroll + Екі саусақ шиыршық + + + Edge Scroll + Жиек айналдыру + + + Slow + Баяу + + + Fast + Жылдам + + + + KiranCollapse + + + ListExpansionSpace + ListExpansionSpace + + + + KiranCpanelAppearance + + Wallpaper Setting + Түсқағаздарды отырғызу + + + Theme Setting + Тақырыптың қоныстануы + + + Font Setting + Қаріптерді орналастыру @@ -2398,7 +3251,7 @@ Form - + Пішіні @@ -2406,15 +3259,34 @@ Create new group - + Жаңа топ құрыңыз KiranModuleWidget + + Warning + Ескерту + + + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + %1 өңделген мазмұн сақталмайды. Ауыстырудан кейін өңделген мазмұн тізім болады. Үнемдегіңіз келетініне сенімдісіз бе? + Form - + Пішіні + + + + KiranSystemWidget + + kiran-system-imformation + Киран-жүйе-имформация + + + 保存 + Сақтаңыз @@ -2422,96 +3294,191 @@ KiranTimeDateWidget - + KiranTimeDateWidget + + + + Automatic synchronizetion + Автокөлікті синхрондау + + + + Change Time Zone + Уақыт аймағын өзгерту + + + + Set Time Manually + Уақытты қолмен орнатыңыз + + + + Time date format setting + Уақыт күні пішімін орнату + + + + %1(%2) + %1(%2) + + + + KiranTimePickerWidget + + + Form + Пішіні + + + + KiranTimeZone + + + Form + Пішіні + + + + Search in all time zones... + Барлық уақыт белдеулерін іздеңіз... + + + + KiranTimeZoneItem + + + Form + Пішіні + + + + No search results, please search again... + Іздеу нәтижелері жоқ, себебі... + + + + KiranTimeZoneList + + + Form + Пішіні + + + + KiranTips + + + + Form + Пішіні + + + + KylinsecLogo + + + Copyright © + Авторлық құқық © + + + + KylinSec. All rights reserved. + KylinSec. Барлық құқықтарды тексеру. + + + + LangpackInstaller + + Package Install + Пакетті орнату + + + Installing... + Орнатыңыз... + + + Install Complete! + Толық орнатыңыз! + + + + LanguageManager + + Error + Қате - - Automatic synchronizetion - + set locale failed + жергілікті мектеп алаңын орнатыңыз - - Change Time Zone - + %1 inexistence in system + %жүйеде %1 + + + LanguagePage - - Set Time Manually - + Language Select(Reboot to take effect) + Әсер ету үшін Language Select(Reboot - - Time date format setting - + Simplified Chinese + Жеңілдетілген қытай - - %1(%2) - + English + Ағылшын - - - KiranTimePickerWidget - - Form - + Tibetan + Тибет - - - KiranTimeZone - - Form - + Kirgiz + Қырғыз - - Search in all time zones... - + Mongolian + Моңғол - - - KiranTimeZoneItem - - Form - + Kazakh + Қазақ - - No search results, please search again... - + Uighur + Ұйғыр - KiranTimeZoneList + LanguagePlugin - - Form - + Language + Тіл - KiranTips + LanguageSelectDialog - - - Form - + Dialog + Диалог - - - KylinsecLogo - - Copyright © - + No + Жоқ - - KylinSec. All rights reserved. - + Yes + Иә + + + Add Language + Тіл қосу + + + Search + Іздеу @@ -2519,7 +3486,7 @@ Form - + Пішіні @@ -2527,7 +3494,7 @@ LayoutList - + LayoutList @@ -2535,44 +3502,44 @@ Form - + Пішіні Select Kayboard Layout - + Қадағай тақтасының орналасуын таңдаңыз Edit - + Өңдеу Add Layout - + Орналасуды қосыңыз ButtonAddLayout - + Button AddLayout Addition - + Қосу ButtonReturn - + ButtonReturn Return - + Қайтару @@ -2580,37 +3547,37 @@ Failed - + Толтырылған You have added this keyboard layout! - + Сіз бұл пернетақта орналасуын қостыңыз! The %1 keyboard layout does not exist! - + %1 пернетақта орналасуы кеңеймейді! The keyboard layout is currently in use and cannot be deleted! - + Пернетақта орналасуы ағымдағы және оны жою мүмкін емес! Delete Layout - + Орналасуды жою You do not appear to have added %1 keyboard layout! - + Сіз %1 пернетақта орналасуына қол қоймайсыз! Finish - + Аяқтау @@ -2618,7 +3585,7 @@ Keyboard Layout - + Пернетақтаның орналасуы @@ -2626,79 +3593,197 @@ Form - + Пішіні BrowserLicense - + BrowserLicense <!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;"> +</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> - + <! DOCTYPE HTML PUBLIC "-/W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <html><><==><="qrichtext" мазмұны>"1"/style type"мәтін/css" + p,li { ақ-кеңістік: алдын ала орау; } + </style><>/head<=body style>" қаріптер тобы: 'Noto Sans CJK SC'; қаріп өлшемі:9pt; қаріп-көру: 400; қаріп стилі: қалыпты; " + <p style="-qt-параграф түрі: қоспағанда; шеткі жоғарғы:0px; маржа-төменгі:0px; маржа-көтеру:0px; маржа-көтеру:0px; маржа-оң жақ:0px; -qt-блок-ent:0; мәтін-индент:0; мәтін-индент:0px; ">/<br/ p></body></html> ButtonExportLicense - + ButtonExportLicense Export - + Экспорттау ButtonCloseLicense - + ButtonCloseLicense Close - + Жабу - + Save - + Сақтаңыз - + PDF(*.pdf) - + PDF(*.pdf) - + Export License - + Экспорттық лицензия - + Export License failed! - + FALED экспорттық лицензиясы! - + User End License Agreement - + Пайдаланушының соңғы лицензиясы - - - - + + + + + + None - + Ешқайсысы - + Version License - + Нұсқа лицензиясы + + + Export EULA + EULA экспорты + + + Export EULA failed! + EULA-ның экспорты! + + + + + Privacy Policy + Құпиялық саясаты + + + + LicenseInfoWidget + + Machine Code: + Машина коды: + + + Activation Code: + Белсенділік кодексі: + + + Activation Information + Белсенділік туралы ақпарат + + + Can't get machine code + Машина кодын алу мүмкін емес + + + Can't get activation code + Белсенділік кодын ала алмаймын + + + + LicenseInformation + + Installation time: + Орнату уақыты: + + + Activation status: + Белсенділік мәртебесі: + + + Expiry date: + Жарамдылық мерзімі: + + + Contact Us: + Бізбен байланысыңыз: + + + Unknow + Белгісіз + + + Can't get activation information + Белсенділік туралы ақпаратты ала алмайды + + + Activate + Іске қосыңыз + + + The current time is illegal + Қазіргі уақыт заңсыз + + + Less than the installation time + Орнату уақытынан аз + + + Not activated. Trail expiration: + Белсенді емес. Жолдың мерзімі: + + + get service status failed + қызмет күйінің күй файлын алыңыз + + + Not yet + ӘЛІ ЖОҚ + + + Activated + Белсенді + + + Forever + Мәңгі + + + Copyright © + Авторлық құқық © + + + KylinSec. All rights reserved. + KylinSec. Барлық құқықтарды тексеру. + + + + ListExpansionSpace + + + ListExpansionSpace + ListExpansionSpace @@ -2706,87 +3791,87 @@ p, li { white-space: pre-wrap; } Audio Play - + Аудио ойнату Search - + Іздеу WWW - + WWW Audio Lower Volume - + Аудио мұнараның көлемі Audio Raise Volume - + Аудио көтеру көлемі Mic Mute - + Микрофонды өшіру Audio Stop - + Аудио дүкен Explorer - + Зерттеуші Calculator - + Калькулятор Audio Mute - + Аудио дыбысты өшіру Audio Pause - + Аудио үзіліс Audio Prev - + Аудио алдын ала Audio Media - + Аудио медиа Audio Next - + Аудио Next Mail - + Пошта Tools - + Құралдар Eject - + Электрондық жоба @@ -2794,7 +3879,7 @@ p, li { white-space: pre-wrap; } MMMM - + МММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММ @@ -2802,62 +3887,62 @@ p, li { white-space: pre-wrap; } Form - + Пішіні Select Mouse Hand - + Үйдің қолын таңдаңыз ComboSelectMouseHand - + ComboSelectMouseHand Mouse Motion Acceleration - + Үй қозғалысының үдеуі SliderMouseMotionAcceleration - + SliderMouseMotionAcceleration Slow - + Баяу Fast - + Жылдам Natural Scroll - + Табиғи шиыршық SwitchMouseNatturalScroll - + SwitchMouseNatturalScroll Middle Emulation Enabled - + Орта эмуляцияны қосу SwitchMiddleEmulation - + SwitchMiddleEmulation Test mouse wheel direction - + Сынақ үйінің доңғалақ бағыты @@ -2911,17 +3996,105 @@ 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-жолы Right Hand Mode - + Оң қол режимі Left Hand Mode - + Сол қол режимі + + + + MouseSettings + + Select Mouse Hand + Үйдің қолын таңдаңыз + + + Mouse Motion Acceleration + Үй қозғалысының үдеуі + + + Natural Scroll + Табиғи шиыршық + + + Middle Emulation Enabled + Орта эмуляцияны қосу + + + Right Hand Mode + Оң қол режимі + + + Left Hand Mode + Сол қол режимі + + + Slow + Баяу + + + Standard + Стандартты + + + Fast + Жылдам @@ -2929,74 +4102,91 @@ This is line 50 of the test text Mouse Settings - + Үй параметрлері NetworkSubItem - + Wired Network %1 - + Сымды желі %1 - + Wired Network - + Сымды желі - + Wireless Network %1 - + Сымсыз желі %1 - + Wireless Network - + Сымсыз желі - + VPN - + VPN - + Network Details - + Желілік мәліметтер NetworkTray - + Network settings - + Желілік слоттар - - + + Network unavailable - + Желі қолжетімсіз + + + + + The network is connected, but you cannot access the Internet + Желі қосылған, бірақ Интернетке қол жеткізе аласыз + + + + Network not connected + Желі қосылмаған - + Wired network card: %1 available - + Сымды желі картасы: %1 қолжетімді - + Wireless network card: %1 available - + Сымсыз желі картасы: %1 қолжетімді - + Wired network card: %1 unavailable - + Сымды желі картасы: %1 қолжетімсіз - + Wireless network card: %1 unavailable - + Сымсыз желі картасы: %1 қолжетімсіз + + + + + Network connected + Желі қосылды @@ -3004,52 +4194,57 @@ This is line 50 of the test text OutputPage - + OutputPage + + + + Output cards + Шығару карталары - + Output devices - + Шығару құрылғылары - + ComboBoxOutputDevices - + ComboBoxOutputDevices - + Output volume - + Шығару құбылмалы - + SlilderVolumeSetting - + SlilderVolumeSetting - + Left/right balance - + Сол/оң баланс - + SliderVolumeBalance - + SliderVolumeBalance - + Left - + Сол - + Right - + Дұрыс - + No output device detected - + Ешқандай шығыс құрылғысы анықталмаған @@ -3057,7 +4252,7 @@ This is line 50 of the test text Control Panel - + Басқару тақтасы @@ -3065,112 +4260,119 @@ This is line 50 of the test text PasswordExpirationPolicyPage - + PasswordExpirationPolicyPage User expires - + Пайдаланушының мерзімі аяқталады SpinBoxUserExpires - + SpinBoxUserExpires yyyy-MM-dd - + Yyyy-MM-dd Last password change - + Соңғы құпия сөзді өзгерту LabelLastPasswdChange - + LabelLastPasswdChange 1990-01-01 - + 1990-01-01 Maximum vaild days of password - + Құпия сөздің максималды пернелері SpinBoxMaximumValidDays - + SpinBoxMaximumValidDays Prompt time before password expiration - + ЖЕДЕЛ УАҚЫТ BEFOWSWORD ӨШІРУ МЕРЗІМІ SpinBoxPromptBeforeExpiration - + SpinBoxPromptBeforeExpiration how many days after password expires will become inactive - + Сөздің баратын жері қалай нәтижелі болады SpinBoxPasswdInactiveTime - + SpinBoxPasswd InteractiveTime ButtonSave - + ButtonSave save - + Сақтаңыз ButtonReturn - + ButtonReturn return - + Қайтару day - + Күні PluginConnectionList - + Other WiFi networks - + Басқа WiFi желілері - + Tips - + Кеңестер - + Please input a network name - + Желі атауын енгізуді босатыңыз + + + + Popup + + cancel + Бас тарту @@ -3178,17 +4380,17 @@ This is line 50 of the test text General Settings - + Жалпы параметрлер Power Settings - + Қуат параметрлері Battery Settings - + Батарея параметрлері @@ -3197,19 +4399,19 @@ This is line 50 of the test text power-saver - + Қуатты үнемдеу balanced - + Теңдестірілген performance - + Өнімділік @@ -3217,52 +4419,59 @@ This is line 50 of the test text PowerSettingsPage - + PowerSettingsPage After idle for more than the following time, the computer will execute - + Келесі уақыттан артық жұмыс істемей тұрғаннан кейін компьютер орындалады ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction The monitor will turn off when it is idle - + Монитор бос тұрған кезде бұрылады ComboMonitorTrunOffIdleTime - + ComboMonitorTrunOffIdleTime Suspend - + пайдалану Shutdown - + Өшіру Hibernate - + Қысқы ұйқы Do nothing - + Ештеңе жасамаңыз + + + + PowerSubItem + + Power Settings + Қуат параметрлері @@ -3270,77 +4479,132 @@ This is line 50 of the test text Authentication type Enabled status - + Аутентификация түрі Қосылатын күй fingerprint - + Саусақ ізі fingervein - - - - - ukey - - - - - iris - - - - - face - + Саусақ ... - + ... Return - + Қайтару login - + Тіркеу unlock - + Құлыптау empowerment - + Мүмкіндік беру Apply the %1 authentication to the following applications - + %1 қолданбасын келесі қолданбаға қолданыңыз + + + + ukey + Ukey + + + + iris + Iris + + + + face + Бет QObject - - Failed - + Did not reply within the specified timeout + Белгіленген күту уақытымен қысқармады + + + The called service is not known + Қоңырау шалу қызметі белгісіз + + + warning + Ескерту + + + Open qss file failed + qss файл пішімін ашыңыз + + + + %1Day + %1 күн % + + + + %1Hour + %1Сағат + + + + %1Minute + %1 минут + + + + never + Ешқашан + + + SLow + Баяу - - Set font failed! - + Standard + Стандартты + + + Fast + Жылдам + + + Faild + Дала + + + Connect Mouse or TouchPad Dbus Failed! + Connect House немесе TouchPad Dbus Faaled! + + + Load qss file failed! + Жүктеме qss файлы жанармаймен жұмыс істейді! + + + + No search results, please search again... + Іздеу нәтижелері жоқ, себебі... @@ -3348,7 +4612,7 @@ This is line 50 of the test text Tips - + Кеңестер @@ -3356,42 +4620,51 @@ This is line 50 of the test text OK(K) - + OK(K) Failed to apply display settings!%1 - + Дисплейлер жиынтығын қолдану ұсынылды! %1% Fallback display setting failed! %1 - + Кері қайтару дисплейі Орнатылған! %1% - - No search results, please search again... - + Failed + Толтырылған - - %1Day - + Set font failed! + Қаріп өрісін орнатыңыз! - - %1Hour - + Get icon themes failed! + Иконалар өрісін алыңыз! - - %1Minute - + Get cursor themes failed! + Бұл тақырыптарды курсорды алыңыз! - - never - + Warning + Ескерту + + + There is no theme to set! + Міне, қоюға болатын тақырып жоқ! + + + + Spring + Көктем + + + + Summer + Жаз @@ -3399,17 +4672,17 @@ This is line 50 of the test text Enter keywords to search - + Іздеу үшін кілт сөздерді енгізіңіз Info - + Ақпарат Failed to find related items, please re-enter! - + Қатысты заттарды таба алмаған, төлем қайта кіреді! @@ -3417,22 +4690,22 @@ This is line 50 of the test text Confirm - + Растаңыз Return - + Қайтару select picture - + Суретті таңдаңыз 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 *.pcdd*.dxf*.ufo *.ups *.ups *. AI *.raw *. WMF *.webp) @@ -3440,14 +4713,14 @@ This is line 50 of the test text Form - + Пішіні TextLabel - + TextLabel @@ -3455,29 +4728,29 @@ This is line 50 of the test text Form - + Пішіні EditSearch - + EditSearch Custom - + Әдеттегі Edit - + Өңдеу ButtonAddShortcut - + ButtonAddShortcut @@ -3485,154 +4758,154 @@ This is line 50 of the test text Add - + Қосу ButtonReset - + ButtonReset Reset - + Қалпына келтіру Custom Shortcut Name - + Арнайы төте жол атауы EditCustomShortcutName - + EditCustomShortcutName Custom Shortcut application - + Арнайы төте жол қолданбасы EditShortcutApp - + EditShortcutApp Custom Shortcut Key - + Арнайы төте жол кілті ButtonAdd - + ButtonAdd ButtonCancel - + ButtonCancell Cancel - + Бас тарту Shortcut Name - + Төте жол атауы EditShortcutName - + EditShortcutName Shortcut application - + Таңбаларды алу қолданбасы Shortcut key - + Төте жол кілті ButtonSave - + ButtonSave Save - + Сақтаңыз ButtonReturn - + ButtonReturn 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 - + Ашық файл System - + Жүйесі Sound - + Дыбыс @@ -3643,64 +4916,64 @@ This is line 50 of the test text Failed - + Толтырылған Delete shortcut failed,error: - + Shortcutfaled, қатені жойыңыз: 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: - + RESET Shortcut қаржысы, қате: 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 көмегімен төлсипатты қолданып көріңіз. Shortcut keys %1 are already used in %2,Please try again! - + Shortcut Keys %1 барлығы %2-де дайын, Қайтадан шығарып көріңіз! @@ -3708,71 +4981,86 @@ This is line 50 of the test text Form - + Пішіні TextLabel - + TextLabel + + + + ShowQRCode + + Scan QR code to get machine code + Машина кодын алу үшін QR кодын сканерлеңіз + + + QRcode of Machine and Activation Code + Машина және белсенділік кодексінің QRcode + + + Scan QR code to get activation code + Әрекет кодын алу үшін QR кодын сканерлеңіз StatusNotification - - - - - + + + + + Connection Failed - + Қосылу өрісі - + the network not found - + Желі табылмады - + The hidden network "%1" to be connected has been detected and exists in the network list - + Қосылатын жасырын желі "%1" қорғалған және желі тізімінде бар - - - + + + Failed to connect to the network "%1" - + "%1" желісіне қосылу өрісі" - + Connection activated - + Қосылу белсенді - + You are now connected to the network "%1" - + Сіз қазір "%1" желісіне қосылдыңыз" - + Connection deactivated - + Қосылым өшірілген - + You have now disconnected the network "%1" - + Сіз қазір "%1" желісін жоғалттыңыз" - + Connection deleted - + Қосылым жойылды - + The connection has been deleted "%1" - + Қосылым "%1" жойылды" @@ -3780,7 +5068,7 @@ This is line 50 of the test text System Information - + Жүйе туралы ақпарат @@ -3788,136 +5076,249 @@ This is line 50 of the test text Form - + Пішіні Host Name: - + Хост аты: - + LabelHostName - + LabelHostName - - - - - + + + + + TextLabel - + TextLabel - + ButtonChangeHostName - + ButtonChangeHostName - + Change - + Өзгерту - + System Version: - + Жүйе нұсқасы: - + LabelSystemVersion - + Label SystemVersion - + Kernel Version: - + Ядро нұсқасы: - + LabelKernelVersion - + LabelKernelVersion - + System Architecture: - + Жүйе архитектурасы: - + LabelSystemArch - + LabelSystemArch - + Activation status: - + Белсенділік мәртебесі: - - - + + + + Show - + Шоу - + EULA: - + ЭУЛА: - + ButtonShowEULA - + ButtonShowEULA - + Version License: - + Нұсқа лицензиясы: - + ButtonShowVersionLicense - + ButtonShowVersionLicense - - - - + + + + Unknow - + Белгісіз - + UnActivated - + Активсіз - + Activation code has expired - + Белсенділік кодексінің мерзімі аяқталды - + Permanently activated - + Тұрақты белсенді - + Activated - + Белсенді - + Error - + Қате - + Failed to open the license activator - + Лицензия актерын ашу алаңы + + + Copyright © + Авторлық құқық © + + + KylinSec. All rights reserved. + KylinSec. Барлық құқықтарды тексеру. + + + + Privacy policy: + Құпиялық саясаты: + + + + SystemInformationWidget + + Host Name: + Хост аты: + + + System Version: + Жүйе нұсқасы: + + + Kernel Version: + Ядро нұсқасы: + + + System Architecture: + Жүйе архитектурасы: + + + Installation time: + Орнату уақыты: + + + Activation status: + Белсенділік мәртебесі: + + + Expiry date: + Жарамдылық мерзімі: + + + EULA: + ЭУЛА: + + + Version License: + Нұсқа лицензиясы: + + + Contact Us: + Бізбен байланысыңыз: + + + Change + Өзгерту + + + Show + Шоу + + + Unknow + Белгісіз + + + The current time is illegal + Қазіргі уақыт заңсыз + + + Less than the installation time + Орнату уақытынан аз + + + Not activated. Trail expiration: + Белсенді емес. Жолдың мерзімі: + + + Can't get activation information + Белсенділік туралы ақпаратты ала алмайды + + + Activate + Іске қосыңыз + + + get service status failed + қызмет күйінің күй файлын алыңыз + + + Not yet + ӘЛІ ЖОҚ + + + Activated + Белсенді + + + Forever + Мәңгі + + + Copyright © + Авторлық құқық © + + + KylinSec. All rights reserved. + KylinSec. Барлық құқықтарды тексеру. @@ -3925,17 +5326,17 @@ This is line 50 of the test text Tips - + Кеңестер Yes - + Иә Cancel - + Бас тарту @@ -3943,53 +5344,95 @@ This is line 50 of the test text Form - + Пішіні Dark and Light Theme - + Қараңғы және жарық тақырыбы Themes Settings - + Тақырыптар параметрлері Open Window Effects - + Терезе әсерлерін ашыңыз - + Unknown - + Белгісіз + + + + Light Theme + Жарық тақырыбы + + + + Auto + Автоматты + + + + Dark Theme + Қараңғы тақырып Choose icon Theme - + Белгіше тақырыбын таңдаңыз - + Choose cursor Themes - + Шланг курсорының тақырыптары + + + + ThemeWidget + + Dark Theme + Қараңғы тақырып - Light Theme - + Жарық тақырыбы - Auto - + Автоматты + + + + Themes + + Dark and Light Theme + Қараңғы және жарық тақырыбы - - Dark Theme - + Themes Settings + Тақырыптар параметрлері + + + Open Window Effects + Терезе әсерлерін ашыңыз + + + Choose icon themes + Иконаларды таңдаңыз + + + Unknown + Белгісіз + + + Choose cursor themes + Шланг курсорының тақырыптары @@ -3997,12 +5440,12 @@ This is line 50 of the test text Failed - + Толтырылған List shortcut failed,error: - + Төлемді қаржыландыру, қате тізімі: @@ -4010,22 +5453,22 @@ This is line 50 of the test text Time Date Settings - + Уақыт күні параметрлері Chnage time Zone - + Сахналық уақыт белдеуі Set time Manually - + Уақытты қолмен орнатыңыз Time date format setting - + Уақыт күні пішімін орнату @@ -4033,32 +5476,50 @@ This is line 50 of the test text TimezoneSettings - + TimezoneSettings Select Time Zone - + Уақыт аймағын таңдаңыз ButtonSave - + ButtonSave save - + Сақтаңыз ButtonReturn - + ButtonReturn reset - + Қалпына келтіру + + + + TopBar + + + ListExpansionSpace + ListExpansionSpace + + + + TITLE + АТАУЫ + + + + FLAG + ЖАЛАУ @@ -4066,127 +5527,206 @@ This is line 50 of the test text Form - + Пішіні TouchPad Enabled - + TouchPad Enable SwitchTouchPadEnable - + SwitchTouchPadEnable Select TouchPad Hand - + TouchPad қолын таңдаңыз ComboTouchPadHand - + ComboTouchPadHand TouchPad Motion Acceleration - + TouchPad Motion Acceleration SliderTouchPadMotionAcceleration - + SliderTouchPadMotionAcceleration Slow - + Баяу Fast - + Жылдам Select Click Method - + Басу әдісін таңдаңыз ComboClickMethod - + ComboClickMethod Select Scroll Method - + Айналдыру әдісін таңдаңыз ComboScrollMethod - + ComboScrollMethod Natural Scroll - + Табиғи шиыршық ComboNaturalScroll - + ComboNaturalScroll Enabled while Typing - + Теру кезінде қосу SwitchTypingEnable - + SwitchTypingEnable Tap to Click - + Басу үшін түртіңіз SwtichTapToClick - + SwtichTapToClick Right Hand Mode - + Оң қол режимі Left Hand Mode - + Сол қол режимі Press and Tap - + Басыңыз және түртіңіз Tap - + Түртіңіз Two Finger Scroll - + Екі саусақ шиыршық Edge Scroll - + Жиек айналдыру + + + + TouchPadSettings + + Touchpad Enabled + Сенсорлық тақта қосылған + + + Disable TouchPad + TouchPad көрсету + + + TouchPad Enabled + TouchPad Enable + + + Select TouchPad Hand + TouchPad қолын таңдаңыз + + + TouchPad Motion Acceleration + TouchPad Motion Acceleration + + + Select Click Method + Басу әдісін таңдаңыз + + + Select Scroll Method + Айналдыру әдісін таңдаңыз + + + Natural Scroll + Табиғи шиыршық + + + Enabled while Typing + Теру кезінде қосу + + + Tap to Click + Басу үшін түртіңіз + + + Slow + Баяу + + + Standard + Стандартты + + + Fast + Жылдам + + + Right Hand Mode + Оң қол режимі + + + Left Hand Mode + Сол қол режимі + + + Press and Tap + Басыңыз және түртіңіз + + + Tap + Түртіңіз + + + Two Finger Scroll + Екі саусақ шиыршық + + + Edge Scroll + Жиек айналдыру @@ -4194,7 +5734,7 @@ This is line 50 of the test text TouchPad Settings - + TouchPad параметрлері @@ -4202,7 +5742,7 @@ This is line 50 of the test text Other WiFi networks - + Басқа WiFi желілері @@ -4210,64 +5750,64 @@ This is line 50 of the test text TrayItemWidget - + TrayItemWidget Icon - + Белгіше Name - + Аты Status - + Күйі Ignore - + Елемеу Disconnect - + Ажыратыңыз Cancel - + Бас тарту Connect - + Қосу Connected - + Қосылған Unconnected - + Жұқтырмаған Please input password - + Енгізу құпия сөзін шығарыңыз Please input a network name - + Желі атауын енгізуді босатыңыз @@ -4275,22 +5815,22 @@ This is line 50 of the test text TrayPage - + TrayPage TextLabel - + TextLabel - + Select wired network card - + Сымдық желі картасын таңдаңыз - + Select wireless network card - + Сымсыз желі картасын таңдаңыз @@ -4298,39 +5838,58 @@ This is line 50 of the test text Ukey - + Аскей Default Ukey device - + Default Ұлыбритания командасы List of devices bound to the Ukey - + UKkey-ге қосылған құрылғылар тізімі error - + Қате No UKey device detected, pelease insert the UKey device and perform operations - + UKey құрылғысы анықталмаған, payase UKey құрылғысын және ақпараттық операцияларды орнатыңыз UKey Enroll - + UKey Enroll Please enter the ukey pin code - + Ukey пин кодын шығарыңыз + + + + UKeyPinCodeDialog + + UKey Enroll + UKey Enroll + + + Please enter the ukey pin code + Ukey пин кодын шығарыңыз + + + Confirm + Растаңыз + + + Cancel + Бас тарту @@ -4338,142 +5897,150 @@ This is line 50 of the test text Form - + Пішіні Account - + Есептік жазба Change password - + Құпия сөзді өзгертіңіз User id - + Пайдаланушы идентификаторы User type - + Пайдаланушы түрі User status - + Пайдаланушы күйі auth manager - + Auth менеджері Password expiration policy - + Құпия сөзді білдіру саясаты Confirm - + Растаңыз Delete - + Жою Current password - + Ағымдағы құпия сөз EditCurrentPasswd - + EditCurrentPasswd New password - + Жаңа құпия сөз EditNewPasswd - + EditNewPasswd Enter the new password again - + Жаңа құпия сөз мұрасын енгізіңіз EditNewPasswdAgain - + EditNewPasswdAgain EditPasswdSave - + EditPasswdSave Save - + Сақтаңыз EditPasswdCancel - + EditPasswdCancel Cancel - + Бас тарту + + + Account type + Есептік жазба түрі + + + Account status + Есептік жазбаның күй күйі standard - + Стандартты administrator - + әкімші Please enter the new user password - + Жаңа пайдаланушы құпия сөзін шығарыңыз Please enter the password again - + Құпия сөз мұрасын шығарыңыз The password you enter must be the same as the former one - + Сіз енгізетін құпия сөз бұрынғы сияқты атау болуы керек Please enter the current user password - + Ағымдағы пайдаланушы құпия сөзін шығарыңыз The current password is incorrect - + Ағымдағы құпия сөз кіреді The new password cannot be the same as the current password - + Жаңа құпия сөз ағымдағы құпия сөз ретінде атау болуы мүмкін @@ -4482,33 +6049,68 @@ This is line 50 of the test text Error - + Қате Password encryption failed - + Құпия сөзді шифрлауды қаржыландыру user information updated successfully - + Пайдаланушы ақпаратын жаңарту күрделілігі Password updated successfully - + Құпия сөзді күрделі түрде жаңартыңыз - 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)? - + 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(% user)%1 құрылғысын жою үшін ішіңізде анық па? Warning - + Ескерту + + + Account information updated successfully + Тіркелгі ақпаратын жаңарту жауапкершілігі + + + + UserlicenseAgreement + + Export + Экспорттау + + + Close + Жабу + + + Save + Сақтаңыз + + + Export EULA + EULA экспорты + + + Export EULA failed! + EULA-ның экспорты! + + + User End License Agreement + Пайдаланушының соңғы лицензиясы + + + None + Ешқайсысы @@ -4516,7 +6118,7 @@ This is line 50 of the test text VolumeInput - + VolumeInput @@ -4524,7 +6126,7 @@ This is line 50 of the test text VolumeOutput - + VolumeOutput @@ -4532,13 +6134,13 @@ This is line 50 of the test text VolumeSettingPage - + VolumeSettingPage Volume - + Көлемі @@ -4546,67 +6148,67 @@ This is line 50 of the test text VpnIPsec - + VPNIPSec Enable IPsec - + IPsec қосыңыз Group Name - + Топ атауы EditGroupName - + EditGroupName Group ID - + Топ идентификаторы EditGroupId - + EditGroupId Pre-Shared Key - + Алдын ала ортақ кілт EditPreSharedKey - + EditPreSharedKey Show Password - + Құпия сөзді көрсету Internet Key Exchange Protocol - + Internet Key Exchange Protocol EditIpsecIKE - + EditIpsecIKE Encapsulating Security Payload - + Қауіпсіздік жүктемесін инкапсуляциялау EditIpsecESP - + EditipsecESP @@ -4614,47 +6216,47 @@ This is line 50 of the test text VpnIpvx - + VpnIpvx IPV4 Method - + IPV4 әдісі ComboBoxVPNIpv4Method - + ComboBoxVPNIpv4Method Only applied in corresponding resources - + Тек ресурстардағы қолдану Preferred DNS - + Таңдаулы DNS EditVPNIpv4PreferredDNS - + EditVPNIpv4 PreferredDNS Alternate DNS - + Балама DNS EditIpv4AlternateDNS - + EditIpv4Alternate DNS - + Auto - + Автоматты @@ -4662,12 +6264,12 @@ This is line 50 of the test text VpnL2tpSetting - + VPNL2tpSetting VPN name - + VPN атауы @@ -4676,42 +6278,42 @@ This is line 50 of the test text VpnManager - + VPNManager VPN type - + VPN түрі Save - + Сақтаңыз Return - + Қайтару - + VPN - + VPN - + L2TP - + L2TP - + Tips - + Кеңестер - + Password required to connect to %1. - + Құпия сөз %1-ге қосылуы керек. @@ -4719,97 +6321,97 @@ This is line 50 of the test text VpnPpp - + VpnPpp Use MPPE - + MPPE пайдаланыңыз Security - + Қауіпсіздік ComboBoxMppeSecurity - + ComboBoxMppeSecurity Stateful MPPE - + Мемлекетті MPPE - + All available (default) - + Барлық қол жетімді (default) - + 40-bit (less secure) - + 40-биттік (less sacer) - + 128-bit (most secure) - + 128-биттік (most sace) - + Refuse EAP Authentication - + EAP аутентификациясынан бас тарту - + Refuse PAP Authentication - + PAP аутентификациясынан бас тарту - + Refuse CHAP Authentication - + CHAP аутентификациясынан бас тарту - + Refuse MSCHAP Authentication - + MSCHAP аутентификациясынан бас тарту - + Refuse MSCHAPv2 Authentication - + MSCHAPv2 аутентификациясынан бас тарту - + No BSD Data Compression - + BSD деректерін қысу жоқ - + No Deflate Data Compression - + Дефляциялық деректерді қысу жоқ - + No TCP Header Compression - + TCP тақырыбының қысылуы жоқ - + No Protocol Field Compression - + Протокол өрісінің прогресс жоқ - + No Address/Control Compression - + Мекенжай жоқ/Басқару барысы - + Send PPP Echo Packets - + PPP жаңғырық пакеттерін жіберіңіз @@ -4817,12 +6419,12 @@ This is line 50 of the test text VpnPptpSetting - + VPNPptpSetting VPN name - + VPN атауы @@ -4830,109 +6432,109 @@ This is line 50 of the test text VpnWidget - + VPNWidget Gateway - + Шлюз EditVPNGateway - + EditVPNGateway User Name - + Пайдаланушы аты EditVPNUserName - + EditVPNUserName Password Options - + Құпия сөз опциялары ComboBoxVPNPasswordOptions - + ComboBoxVPNPasswordOptions Password - + Құпия сөз EditVPNPassword - + EditVPNPassword ButtonPasswordVisual - + ButtonPassword Visual Show Password - + Құпия сөзді көрсету NT Domain - + NT домені EditNTDomain - + EditNTDomain - + Required - + талап ету - + Saved - + Сақталған - + Ask - + Сұрау - + Not required - + Жылтыратпаған - + Gateway can not be empty - + Шлюз ерекше болуы мүмкін емес - + Gateway invalid - + Шлюз жарамсыз - + user name can not be empty - + Пайдаланушы аты ерекше болуы мүмкін емес - + password can not be empty - + Құпия сөзден басқа болуы мүмкін емес @@ -4940,84 +6542,84 @@ This is line 50 of the test text Form - + Пішіні Set wallpaper - + Тұсқағазды орнатыңыз FrameLockScreenPreview - + FrameLockScreenPreview FrameDesktopPreivew - + FrameDesktopPreve Desktop Wallpaper Preview - + Жұмыс үстелі тұсқағаздарын алдын ала қарау Lock Screen WallPaper Preview - + Lock Screen WallPaper шолуы Select wallpaper - + Түсқағазды таңдаңыз Select Wallpaper - + Түсқағазды таңдаңыз Set Desktop Wallpaper - + Жұмыс үстелінің тұсқағазын орнатыңыз Set Lock Screen Wallpaper - + Құлыптау экранының тұсқағазын орнатыңыз set wallpaper - + Түсқағазды орнатыңыз Set wallpaper failed! - + Түсқағаз өрісін орнатыңыз! select picture - + Суретті таңдаңыз 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 *.pcdd*.dxf*.ufo *.ups *.ups *. AI *.raw *. WMF *.webp) Add Image Failed - + Сурет негізін қосыңыз The image already exists! - + Кескін нөмірлері бар! @@ -5025,42 +6627,39 @@ This is line 50 of the test text WiredManager - + WiredManager ButtonSave - + ButtonSave Save - + Сақтаңыз ButtonReturn - + ButtonReturn Return - + Қайтару - Wired Network Adapter - + Сымды желі адаптері - The carrier is pulled out - + Тасымалдаушы шығарылады - The current device is not available - + Ағымдағы құрылғы жоқ @@ -5068,12 +6667,12 @@ This is line 50 of the test text WiredSettingPage - + WiredSettingPage - + Network name - + Желі атауы @@ -5081,37 +6680,33 @@ This is line 50 of the test text WirelessManager - + WirelessManager Save - + Сақтаңыз Return - + Қайтару - Wireless Network Adapter - + Сымсыз желі адаптері - The current device is not available - + Ағымдағы құрылғы жоқ - Tips - + Кеңестер - Password required to connect to %1. - + Құпия сөз %1-ге қосылуы керек. @@ -5119,77 +6714,77 @@ This is line 50 of the test text WirelessSecurityWidget - + Wireless SecurityWidget Security - + Қауіпсіздік ComboBoxWirelessSecurityOption - + ComboBoxWirelessSecurityOption Password Options - + Құпия сөз опциялары ComboBoxWirelessPasswordOption - + ComboBoxWirelessPasswordOption Password - + Құпия сөз EditWirelessPassword - + EditWirelessPassword ButtonWirelessPasswordVisual - + ButtonWirelessPasswordVisual PushButton - + Түймені басыңыз None - + Ешқайсысы WPA/WPA2 Personal - + WPA/WPA2 Жеке Save password for all users - + Барлық пайдаланушылар үшін құпия сөзді сақтаңыз Save password for this user - + Осы пайдаланушы үшін құпия сөзді сақтаңыз Ask me always - + Менен әрқашан сұраңыз Required - + талап ету @@ -5197,20 +6792,20 @@ This is line 50 of the test text WirelessSettingPage - + WirelessSettingPage - + Wireless name - + Сымсыз атау WirelessTrayWidget - + the network "%1" not found - + "%1" желісі табылмады @@ -5218,47 +6813,47 @@ This is line 50 of the test text WirelessWidget - + WirelessWidget SSID - + SSID EditSsid - + EditSid MAC Address Of Device - + MAC құрылғысының мекенжайы ComboBoxWirelessMacAddress - + ComboBoxWirelessMacAddress Custom MTU - + Арнайы MTU SpinBoxWirelessCustomMTU - + SpinBox Wireless CustomMTU - + Required - + талап ету - + No device specified - + Құрылғы көрсетілмеген @@ -5266,7 +6861,22 @@ This is line 50 of the test text yyyy - + Ий + + + + kiranSystemInformation + + System Information + Жүйе туралы ақпарат + + + Hardware Information + Аппараттық ақпарат + + + kiran-system-imformation + Киран-жүйе-имформация diff --git a/translations/kiran-control-panel.kk_KG.ts b/translations/kiran-control-panel.ky_KG.ts similarity index 55% rename from translations/kiran-control-panel.kk_KG.ts rename to translations/kiran-control-panel.ky_KG.ts index cf29d46a..fb0d7fac 100644 --- a/translations/kiran-control-panel.kk_KG.ts +++ b/translations/kiran-control-panel.ky_KG.ts @@ -1,17 +1,32 @@ - + + + AccountItemWidget + + Create new user + Жаңы колдонуучу жаратуу + + + disable + өчүрүү + + + enable + иштетүү + + AccountSubItem account - + Аккаунт New User - + Жаңы колдонуучу @@ -20,107 +35,222 @@ disable - + өчүрүү enable - + иштетүү Create new user - + Жаңы колдонуучу жаратуу - AdvanceSettings + ActGuideWidget - - Form - + Please choose activation mode: + Активация режимин тандаңыз: - - Login shell - + Next + Кийинки - - EditLoginShell - + Current machine code: + Учурдагы машинанын коду: - - Specify user id (needs to be greater than 1000) - + Please input activation code: + Активдүү кодун киргизиңиз: - - EditSpecifyUserID - + Back + Артка - - Specify user home - + Please insert the UsbKey device first! + Алдыңғы UsbKey аспабын киргизиңиз! - - EditSpecifyUserHome - + Activate online + Активдүү - - ButtonConfirm - + Activate with the input activation code + Киргизүү активдүүлүк коду менен активдүү - - confirm - + Activate with insert UsbKey + UsbKey'ди киргизүү менен активдештирүү - - ButtonCancel - + Activate + Активдүү - - cancel - + Please enter the activate server address: + Активдүү сервердин дарегин киргизиңиз: + + + Activating...... + Активдүү жүрүп жатат...... + + + System activate successful! + Система активдүүлүгү ишке ашпады! + + + server activation and remaining points: + сервердин активизациясы жана калган абалдары: + + + development activation and remaining points: + иштетүү активдүүлүгүн жана калган токторлор: + + + industrial activation and remaining points: + индустриалдык активация жана калган токтор: + + + desktop activation and remaining points: + иш столун активдүүлүгү жана калган токторлор: + + + activation points: + активация: + + + remaining points: + калган токтор: + + + Close + Жабуу + + + System activate failed! + Системалык активдүүлүгү ишке ашпады. + + + unknow + белгисиз + + + Activation Mode + Активдүү режими + + + Start Activation + Активдүүлүгүн жүргүзүү + + + Activation Complete + Активдүү аякталды + + + Activation Guide + Руководство по активизации + + + Server IP address or Domain name + Сервердин IP дареги же домен аты + + + AdvanceSettings Advance Settings - + Эскертүү параметрлери Automatically generated by system - + Система боюнча автоматтык түрдө жаратылган Please enter the correct path - + Туура жолду киргизиңиз Please enter specify user Id - + Колдонуучунун идентификаторун келтириңиз Please enter an integer above 1000 - + 1000 ден ашык бүттүк санды киргизиңиз Please enter the correct home directory - + Мекен каталогун туура киргизиңиз + + + + Form + Форма + + + + Login shell + Кирүү командасы + + + + EditLoginShell + EditLoginShell + + + + Specify user id (needs to be greater than 1000) + Колдонуучунун идентификаторун көрсөтөт (1000 ден чоң керек) + + + + EditSpecifyUserID + Идентификацияны оңдоо + + + + Specify user home + Колдонуучунун үйүн көрсөтүү + + + + EditSpecifyUserHome + Колдонуучунун өзгөртүүHome + + + + ButtonConfirm + Баскыч + + + + confirm + кошуу + + + + ButtonCancel + КлавишаCancel + + + + cancel + токтотуу + + + Specify user id + Колдонуучунун идентификаторун көрсөтүү @@ -128,30 +258,90 @@ Theme - + Тема Wallpaper - + Тушкагаз Font - + Шрифт + + + + ApplicationPlugin + + + DefaultApp + Абалкы иштеме + + + + AutoStart + Автоматтык баштоо AudioSystemTray - + Volume Setting - + Үн параметрлери - + Mixed Setting - + Ырастоолор + + + + AuthManagerPage + + Fingerprint Authentication + Басуу баскычын аутентификациясы + + + Face Authentication + Аутентификация + + + Password Authentication + Сырсөз аутентификациясы + + + save + сактоо + + + return + return + + + add fingerprint + бармак баскычын кошуу + + + add face + бет кошуу + + + error + ката + + + please ensure that at least one authentication option exists + кичине бир аутентификация опциясы бар экенин текшериңиз + + + fingerprint_ + Stock label + + + face_ + бет_ @@ -159,37 +349,126 @@ Fingerprint - + Принтерprint FingerVein - + FingerVein + + + + Driver Manager + Драйвер менеджери + + + + Prefs + Prefs UKey - + UKey Iris - + Iris Face - + Фейс + + + + AutoStartPage + + Boot Setup + Жүктөө параметрлери - - Driver Manager - + Desktop files(*.desktop) + Иш столун файлдары (*.desktop) - - Prefs - + select autostart desktop + иш столун автоматтык түрдө тандоо + + + Select + Тандоо + + + Cancel + Айнуу + + + Error + Ката + + + Desktop has existed + Иш столу бар + + + Desktop cant permit to join + Иш столун катышуу уруксаты жок + + + Desktop dont support + Иш столун колдонулбайт + + + + AutostartPage + + + Boot Setup + Жүктөө параметрлери + + + + Desktop files(*.desktop) + Иш столун файлдары (*.desktop) + + + + select autostart desktop + иш столун автоматтык түрдө тандоо + + + + Select + Тандоо + + + + Cancel + Айнуу + + + + + + Error + Ката + + + + Desktop has existed + Иш столу бар + + + + Desktop cant permit to join + Иш столун катышуу уруксаты жок + + + + Desktop dont support + Иш столун колдонулбайт @@ -197,81 +476,95 @@ BatterySettingsPage - + Батарея параметрлериPage After idle for more than the following time, the computer will execute - + Кийинки убакыттан көп иштегеннен кийин компьютер аткарылат ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction When the battery is lit up, it will be executed - + Батарея иштетилгенде, ал иштетилет ComboLowBatteryAction - + BatteryAction The monitor will turn off when it is idle - + Монитор иштегенде өчүрүлөт ComboMonitorTurnOffIdleTime - + ComboMonitorTurnOffIdleTime Reduce screen brightness when idle - + Экрандын ачык түстүүлүгүн чоңойтуу Reduce screen brightness when no power - + Экрандын ачык түстүүлүгүн чоңойтуу The energy saving mode is enabled when the power is low - + Энергияны сактоо режими энергиясы төмөнкү болгон учурда Suspend - + Уктоо режими Shutdown - + Өчүрүү Hibernate - + Түзүү Do nothing - + Эч нерсе кылбоо + + + + BatterySubItem + + Battery Settings + Батарея параметрлери + + + + BiometricItem + + add + кошуу @@ -279,17 +572,17 @@ CPanelAudioWidget - + CPanelAudioWidget Output - + Чыгуу Input - + Киргизүү @@ -297,39 +590,61 @@ CPanelNetworkWidget - - - - - Wireless Network - + Процессордук жерлерWidget - - + + VPN - + VPN - - + + Network Details - + Тармак + + + + + + + + Wired Network + Тармак + + + + + + + + + Wireless Network + Тармак - + Connected - + Туташкан - + Unavailable - + Жеткиликтүү жок - + Disconnected - + Ажыратылган + + + Wired Network %1 + Тармак %1 + + + Wireless Network %1 + Каналсыз тармак% 1 @@ -337,47 +652,51 @@ Form - + Форма Host Name: - + Хост аты: EditHostName - + Оңдоо Хост аты ButtonSaveHostName - + Баскычты сактоо Save - + Сактоо ButtonCancelChangeHostName - + CancelChangeHostName Cancel - + Айнуу + + + Host Name + Хост аты Warning - + Stock label Change host name failed! Please check the Dbus service! - + Хост атын өзгөртүү катасы! Dbus кызматын текшериңиз! @@ -385,12 +704,12 @@ Check password - + Сырсөз текшерүү Check the current password before you enroll the feature - + Проверьте текущий пароль перед запиской @@ -398,7 +717,7 @@ Form - + Форма @@ -406,12 +725,12 @@ ConnectionDetailsWidget - + Туташуу маалыматы Security type - + Коопсуздук түрү @@ -428,129 +747,187 @@ TextLabel - + Текст белгиси Frequency band - + Phonon:: MMF:: EffectFactory Channel - + Канал Interface - + Интерфейс MAC - + MAC IPv4 - + Address Gateway - + Шлюз DNS - + DNS Subnet mask - + Тармактын маскасы IPv6 - + Address Prefix - + Префикс Rate - + Rate + + + Preferred DNS + Жактырылган DNS - ConnectionNameWidget + ConnectionItemWidget - - ConnectionNameWidget - + + disconnect + туташуу - - TextLabel - + + ignore + каралбайт - - EditConnectionName - + + remove + өчүрүү - - Auto Connection - + + The current device:%1 is not available + Учурдагы түзүмдү:% 1 жеткиликтүү жок - - Required - + + The carrier is pulled out + Таратуучу чыгарылды - - Wired Connection %1 - + + Are you sure you want to delete the connection %1 + % 1 туташуудан өчүрүүсүзбү? - - VPN L2TP %1 - + + Warning + Stock label - - VPN PPTP %1 - + + + Tips + Жардамдар - - Connection name can not be empty - + + Password required to connect to %1. + % 1 менен туташуу үчүн сырсөз керек. + + + + Please input a network name + Тармак атын киргизиңиз - ConnectionShowPage + ConnectionNameWidget + + + ConnectionNameWidget + АталышыWidget + + + + TextLabel + Текст белгиси + + + + EditConnectionName + Туташуу + + + + Auto Connection + Автоматтык туташуу + + + + Required + Керек + + + + Wired Connection %1 + Канал туташуу + + + + VPN L2TP %1 + % 1 VPN L2TP + + + + VPN PPTP %1 + PPTP VPN% 1 + + + + Connection name can not be empty + Туташтыруу аты бош болбойт + + + + ConnectionShowPage ConnectionShowPage - + Туташуу TextLabel - + Текст белгиси ButtonCreateConnection - + Баскыч түзүү @@ -558,190 +935,229 @@ CreateGroupPage - + Жаратуучу топтун радиосуPage Create Group - + Топту жаратуу Add Group Members - + Топтун мүшелерин кошуу Confirm - + Текшерүү Please enter your group name - + Топтун атын киргизиңиз group name cannot be a pure number - + топтун аты таза номери болбой калды group name already exists - + топтун аты бар ғой Error - + Ката CreateUserPage + + Account type + Account type + + + + standard + стандарт + + + + administrator + администратор + + + + Please enter user name first + Колдонуучунун атын биринчи киргизиңиз + + + + Please enter your user name + Колдонуучунун атын киргизиңиз + + + + user name cannot be a pure number + колдонуучу аты таза номер болбойт + + + + user name already exists + колдонуучунун аты бар ғой + + + + Please enter your password + Сырсөз киргизиңиз + + + + Please enter the password again + Сырсөз киргизиңиз + + + + The password you enter must be the same as the former one + Введенная пароль должна быть точной же первой + + + + + Error + Ката + + + + Password encryption failed + Шифрлөө үчүн сырсөз катасы + Form - + Форма UserAvatarWidget - + Колдонуучу AvatarWidget User name - + Колдонуучунун аты EditUserName - + Оңдоо колдонуучуларыName User type - + Колдонуучунун түрү ComboUserType - + Колдонуучунун түрү Password - + Топтун сырсөзү EditPasswd - + EditPasswd Confirm password - + Пароль EditPasswdConfirm - + Оңдоо пароль ButtonAdvanceSetting - + Клавиша Advance setting - + Бардык параметрлер ButtonConfirm - + Баскыч Confirm - + Текшерүү ButtonCancel - + КлавишаCancel Cancel - - - - - standard - - - - - administrator - - - - - Please enter user name first - + Айнуу - - Please enter your user name - + Please enter account name first + Бул учурдагы эсептердин атын киргизиңиз - - user name cannot be a pure number - + Please enter your account name + Өзүңүздүн атыңызды киргизиңиз - - user name already exists - + Account cannot be a pure number + Аткаруучу таза номер болбой калды - - Please enter your password - + Account already exists + Аткаруучу алдында бар - - Please enter the password again - + Please enter your userName name + Колдонуучунун атын киргизиңиз + + + CursorThemePage - - The password you enter must be the same as the former one - + + Cursor Themes Settings + Курсордун темаларын параметрлери + + + CursorThemes - - - Error - + Cursor Themes Settings + Курсордун темаларын параметрлери - - Password encryption failed - + Faild + Файл - - - CursorThemePage - - Cursor Themes Settings - + Set cursor themes failed! + Курсордун темаларын орнотуу ишке ашпады. @@ -749,37 +1165,37 @@ DateTimeSettings - + Дата убакытынын параметрлери Select Time - + Убакытты тандоо Select Date - + Датаны тандоо ButtonSave - + Баскыч сактоо save - + сактоо ButtonReset - + Баскыч reset - + reset @@ -787,54 +1203,72 @@ %1 - + % 1 @ subtitle/ plain DefaultApp - + DefaultApp - + Абалкы иштеме - + Web Browser - + Веб-браузер - + Email - + Эл. почта - + Text - + Текст - + Music - + Музыка - + Video - + Видео - + Image - + Сүрөт DefaultappPlugin - - + Email + Эл. почта + + + Text + Текст + + + Music + Музыка + + + Video + Видео + + + Image + Сүрөт + + DefaultApp - + Абалкы иштеме @@ -842,22 +1276,48 @@ DetailsPage - + МаалыматPage Network Details - + Тармак Please select a connection - + Туташтыруу тандоо ComboBoxDetailsSelectConnection - + Комбинациясы + + + + DeviceAvailableConnectionWidget + + + Network card: %1 + Тармак картасы:% 1 + + + + Other WiFi networks + Башка WiFi тармактар + + + + DeviceList + + + Wired Network Adapter + Тармак адаптери + + + + Wireless Network Adapter + Тармак адаптери @@ -865,57 +1325,57 @@ Form - + Форма Rotate left 90 degrees - + Сол 90 градуска айлантуу ButtonLeft - + Клавиша солOrientation Rotate right 90 degrees - + Оң 90 градуска айлантуу ButtonRight - + Оң баскыч Turn left and right - + Сол жана оңго өтүү ButtonHorizontal - + Клавиша горизонталдык upside down - + layer-mode-effects ButtonVertical - + Клавиша Identification display - + Идентификация дисплейи ButtonIdentifying - + КлавишаIdentifying @@ -923,47 +1383,47 @@ DisconnectAndDeleteButton - + Туташуу жана DeleteButton ButtonDisconnect - + Клавиша туташуу Disconnect - + Ажыратуу ButtonDelete - + Клавиша өчүрүү Delete - + Өчүрүү ButtonIgnore - + Баскыч Ignore - + Электенген - + Are you sure you want to delete the connection %1 - + % 1 туташуудан өчүрүүсүзбү? - + Warning - + Stock label @@ -971,52 +1431,52 @@ DisplayFormatSettings - + Форматтын параметрлери Long date display format - + Узун датанын көрсөтүү форматы ComboLongDateDisplayFormat - + ComboLongDateDisplayFormat Short date display format - + Кыска дата көрсөтүү форматы ComboShortDateDisplayFormat - + КомбинаShortDateDisplayFormat Time format - + Убакыт форматы ComboTimeFormat - + ComboTimeFormat Show time witch seconds - + Убакыт өтүү секундын көрсөтүү 24-hours - + 24-hours 12-hours - + 12-саат @@ -1024,154 +1484,154 @@ DisplayPage - + ДисплейPage ButtonCopyDisplay - + ButtonCopyDisplay Copy display - + Дисплейди көчүрүү ButtonExtendedDisplay - + Клавиша кеңейтүүсү Extended display - + Кеңейтилген дисплей Resolution ratio - + Ажырымдуулук рейтинги ComboResolutionRatio - + КомбоResolutionRatio Refresh rate - + Жаңылоо ылдамдыгы ComboRefreshRate - + ComboRefreshRate Zoom rate - + Масштаб ылдамдыгы ComboZoomRate - + ComboZoomRate Automatic - + Автоматтык түрдө 100% (recommended) - + 100% (сунушталган) 200% - + 200% Open - + Ачуу Set as main display - + view-action SwitchExtraPrimary - + SwitchExtraPrimary ComboExtraResolutionRatio - + ComboExtraResolutionRatio ComboExtraRefreshRate - + ComboExtraRefreshRate ComboExtraZoomRate - + Comboextrazomrate ButtonExtraApply - + КлавишаExtraApply Apply - + Колдонуу ButtonExtraCancel - + КлавишаExtraCancel Close - + Жабуу (recommended) - + (сунушталган) Is the display normal? - + Дисплей кадимки? Save current configuration(K) - + Учурдагы конфигурацияны сактоо Restore previous configuration(R) - + Мурунку конфигурацияны калыбына келтирүү The display will resume the previous configuration in %1 seconds - + Дисплей% 1 секундда мурун конфигурацияны улантуу @@ -1179,7 +1639,7 @@ Display - + Дисплей @@ -1187,17 +1647,17 @@ DnsWidget - + Widget Preferred DNS - + Жактырылган DNS Alternate DNS - + Альтернативдик DNS @@ -1205,37 +1665,41 @@ device type - + түзүмдүн түрү driver list - + драйвер тизмеси Fingerprint - + Принтерprint + + + FingerVein + FingerVein Fingervein - + Фингървей iris - + iris ukey - + recurrpage face - + бет @@ -1243,12 +1707,12 @@ DslManager - + DslManager DSL - + DSL @@ -1256,17 +1720,17 @@ DslSettingPage - + Барак параметрлери Save - + Сактоо Return - + keyboard label @@ -1274,251 +1738,340 @@ EthernetWidget - + Ethernet виджети MAC Address Of Ethernet Device - + Ethernet аспабынын MAC дареги ComboBoxDeviceMac - + ComboBoxDeviceMac Ethernet Clone MAC Address - + Ethernet Clone MAC дареги EditDeviceMac - + EditDeviceMac Custom MTU - + Башка MTU SpinBoxCustomMTU - + SpinBoxCustomMTU - + No device specified - + Түзүм аныкталган жок - + Clone Mac invalid - + Mac клонасы туура эмес - FacePage + FaceEnrollDialog - - face - + save + сактоо + + + cancel + токтотуу + + + initializing face collection environment... + Жолчолордун чөйрөсүн инициализациялоо... + + + failed to initialize face collection environment! + коллекциялык чөйрөсүн инициализациялоо ишке ашпады! + + + Failed to start collection + Сүрөттөөнү иштетүүгө болбоду + + + + FaceInputDialog + + save + сактоо + + + cancel + токтотуу + + + initializing face collection environment... + Жолчолордун чөйрөсүн инициализациялоо... + + + failed to initialize face collection environment! + коллекциялык чөйрөсүн инициализациялоо ишке ашпады! + + Failed to start collection + Сүрөттөөнү иштетүүгө болбоду + + + + FacePage Default face device - + Алдыналынган бет түзүмдөрү face feature list - + белги мүмкүнчүлүктөрдүн тизмеси + + + + face + бет Cancel - + Айнуу Start enroll failed,%1 - + Жүктөө ишке ашпады,% 1 Error - + Ката The biometric features were successfully recorded. The feature name is:%1 - + Биометриялык өзгөчөлүктөр ийгиликтүү менен жазылды. Өзгөчөлүктөрдүн аты:% 1 Tips - + Жардамдар Failed to record biometrics(%1), Please try again - + Биометрияларды (% 1) сактоого болбоду, кайта аракет кылып көрүңүз FingerPage + + + Cancel + Айнуу + fingerprint - + Баш баскыч fingervein - + бармак арманы - - Default %1 device - + default %1 device + % 1 жарыяланбасы түзүмдү %1 list - - - - - Cancel - + % 1 тизмеси Start enroll failed,%1 - + Жүктөө ишке ашпады,% 1 Error - + Ката The biometric features were successfully recorded. The feature name is:%1 - + Биометриялык өзгөчөлүктөр ийгиликтүү менен жазылды. Өзгөчөлүктөрдүн аты:% 1 Tips - + Жардамдар Failed to record biometrics(%1), Please try again - + Биометрияларды (% 1) сактоого болбоду, кайта аракет кылып көрүңүз + + + %1list + % 1 тизмеси + + + + Default %1 device + Абалкы% 1 түзүмдү - Fonts + FingerprintEnrollDialog - - Form - + save + сактоо - - Application Font Settings - + cancel + токтотуу - - ComboAppFontName - + Finger Enroll + Finger - - ComboAppFontSize - + This fingerprint is bound to the user(%1) + Бул бармак баскычы колдонуучусу (% 1) менен байланыштырылды - - Titlebar Font Settings - + Info + Маалымат + + + Error + Ката + + + + FingerprintInputDialog + + save + сактоо + + + cancel + токтотуу + + + Finger Enroll + Finger + + + Error + Ката + + + + FingerprintInputWorker + + initializing fingerprint collection environment... + бармак издөө чөйрөсүн инициализациялоо... + + + + Fonts + + + Form + Форма - - ComboTitleFontName - + Application Font Settings + Тиркеме параметрлери - - ComboTitleFontSize - + Titlebar Font Settings + Аталыш панели ариптин параметрлери - Monospace Font Settings - + Моноспас шрифттин параметрлери + + + + Word size + Сөз өлчөмү - - ComboMonospaceFontName - + + System font + Системалык шрифт - - ComboMonospaceFontSize - + + Monospaced font + Моноспас ариби GeneralBioPage - - Rename Feature - + + default device + алдыналынган түзүм - - Please enter the renamed feature name - + + 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 аспабынын келтирүүнү текшериңиз; ушул учурда Укейде сакталган маалымат өчүрүлөт Are you sure you want to delete the feature called %1 - + % 1 деген мүмкүнчүлүктөрдү өчүрүүсүзбү? tips - + жардамдар Error - + Ката Failed to enroll feature because the password verification failed! - + Параметрлерди жазуу ишке ашпады, себеби пароль текшерүү ишке ашпады! - - default device - + + Rename Feature + Касиеттерди өзгөртүү - - feature list - + + Please enter the renamed feature name + Өзгөртүлгөн касиеттердин атын киргизиңиз @@ -1526,83 +2079,87 @@ Form - + Форма Capslock Tip - + Capslock жардамы Numlock Tip - + Numlock радиостанциясы Repeat Key - + Кайталоо клавишасы (Repeat a key while holding it down) - + (Багыттаганда баскычты кайталоо) SwitchRepeatKey - + SwitchRepeatKey Delay - + _Ылдамдык: SliderRepeatDelay - + Слайдер кайталоо убакыты Short - + Кыска Long - + Узун Interval - + Аралык SliderRepeatInterval - + Слайдер кайталоо аралыгы Slow - + Жай Fast - + Тез Enter repeat characters to test - + Текшерүү үчүн кайталоо символдорду киргизиңиз EditTestRepeatKey - + TestRepeatKey оңдоо + + + Enter characters to test the settings + Параметрлерди текшерүү үчүн символдорду киргизиңиз @@ -1610,150 +2167,157 @@ GeneralSettingsPage - + Жалпы параметрлер When the power button is pressed - + Экран баскычы ComboPowerButtonAction - + Action When the suspend button is pressed - + Күтүү баскычы басылганда ComboSuspendAction - + Убакыт When closing the lid - + Кошумча жабууда ComboCloseLidAction - + Комбинация жабуу Computer Mode - + Компьютердин режими Display brightness setting - + Ачыктык параметрлери 0% - + 0% SliderDisplayBrightness - + Ачыктык түстүүлүк Color temperature - + Түс температурасы Automatic color temperature - + Автоматтык түстүн температурасы cold - + суу standard - + стандарт warm - + жылуу Regard computer as idle after - + Компьютерди ишке ашык деп белгилөө SliderComputerIdleTime - + СлайдерComputerIdleTime Lock screen when idle - + Учурдагы учурда экранды кулпулоо password is required to wake up in standby mode - + Пароль необходимо для того чтобы выбудить в режиме подготовки shutdown - + өчүрүү hibernate - + Note this is a KRunner keyword suspend - + күтүү display off - + экранды өчүрүү do nothing - + эч нерсе кылбайт ERROR - + КАТА %1hour - + % 1 саат %1minute - + % 1 мүнөт + + + + GeneralSettingsSubItem + + General Settings + Жалпы параметрлер @@ -1761,7 +2325,7 @@ Keyboard General Option - + Алиптергич жалпы параметрлери @@ -1769,52 +2333,52 @@ Form - + Форма TextLabel - + Текст белгиси Group - + Топ Member List - + Бөлүктөрдүн тизмеси Add User - + Колдонуучуну кошуу Delete - + Өчүрүү Add Member - + Чөлүм кошуу Save - + Сактоо Cancel - + Айнуу Please input keys for search... - + Издөө үчүн ачкычтарды киргизиңиз... @@ -1822,7 +2386,7 @@ Error - + Ката @@ -1830,22 +2394,22 @@ Group - + Топ Creat group - + Топту жаратуу Change group name - + Топтун атын өзгөртүү Add group member - + Топтун катышын кошуу @@ -1853,68 +2417,100 @@ Create User failed - - - - - Failed to connect to the account management service - + Колдонуучуну жаратууга болбоду update password failed - + жаңылоо пароль катасы icon file - + сүрөтбелги файлы userName type - + колдонуучуName type locked - + бекитүлгөн Failed to update user properties,%1 - + Колдонуучунун касиеттерин жаңылоо ишке ашпады,% 1 Failed to delete user,%1 - + Колдонуучуну өчүрүүгө болбоду,% 1 + + + password + пароль + + + home directory + үй каталогу + + + shell + shell + + + icon + белгиси + + + Failed to set user attributes + Колдонуучунун атрибуттарын орнотууга болбоду + + + account type + account type + + + Failed to update user properties(%1) + Колдонуучунун касиеттерин жаңылоо ишке ашпады (% 1) + + + Failed to delete user + Колдонуучуну жоготуу ишке ашпады + + + + Failed to connect to the account management service + Аткаруучу башкаруу кызматына туташуу ишке ашпады Create Group failed - + Топту жаратуу ишке ашпады Failed to delete group,%1 - + Топту өчүрүүгө болбоду,% 1 add user to group failed - + колдонуучуларды группага кошуу ишке ашпады change group name failed - + Топтун атын өзгөртүү ишке ашпады change group name failed, the new group name is occupied - + Топтун атын өзгөртүү ишке ашпады, жаңы топтун аты окутулду @@ -1922,60 +2518,95 @@ Form - + Форма CPU: - + БЖБ: LabelCpuInfo - + Информация белги TextLabel - + Текст белгиси Memory: - + Эс: LabelMemoryInfo - + Белгинин эси Hard disk: - + Катуу диск: Graphics card: - + Графикалык карта: Network card: - + Тармак картасы: + + + Copyright © + Автордук укуктар © + + + KylinSec. All rights reserved. + KylinSec. Бардык укуктар резервирован. Unknow - + Белгисиз %1 GB (%2 GB available) - + % 1 ГБ (% 2 ГБ жеткиликтүү) + + + + HardwareInformationWidget + + CPU: + БЖБ: + + + Memory: + Эс: + + + Hard disk: + Катуу диск: + + + Graphics card: + Графикалык карта: + + + Network card: + Тармак картасы: + + + Unknow + Белгисиз @@ -1983,7 +2614,7 @@ Hardware Information - + Жабдуулар маалыматы @@ -1991,12 +2622,46 @@ Form - + Форма Icon Themes Setting - + Белгилер темаларын параметрлери + + + + IconThemes + + Icon Themes Setting + Белгилер темаларын параметрлери + + + Faild + Файл + + + Set icon themes failed! + Белгилер темаларын орнотуу ишке ашпады. + + + + IdentificationRenameDialog + + Rename Feature + Касиеттерди өзгөртүү + + + Please enter the renamed feature name + Өзгөртүлгөн касиеттердин атын киргизиңиз + + + Confirm + Текшерүү + + + Cancel + Айнуу @@ -2004,22 +2669,22 @@ Add Image Failed - + Сүрөттү кошуу ишке ашпады The image already exists! - + Сүрөт алдында бар! Delete image - + undo-type Are you sure you want to delete this picture? - + Бул сүрөттү өчүрүүсүзбү? @@ -2027,12 +2692,12 @@ Confirm - + Текшерүү Cancel - + Айнуу @@ -2040,37 +2705,42 @@ InputPage - + Киргизүү + Input cards + Киргизүү карталары + + + Input devices - + Киргизүү түзүмдөрү - + ComboBoxInputDevices - + ComboBoxInputDevicesComment - + Input volume - + Киргизүү бийиктиги - + SliderVolumeSetting - + СлайдерVolumeSettings - + Feedback volume - + Кайталоо тому - + No input device detected - + Киргизүү түзүмдү табылган жок @@ -2078,118 +2748,124 @@ Ipv4Widget - + Иpv4Widget IPV4 Method - + IPV4 методу ComboBoxIpv4Method - + ComboBoxIpv4Method IP Address - + IP дарек EditIpv4Address - + EditIpv4Address Net Mask - + Тармак маскасы EditIpv4Netmask - + EditIpv4Netmask Gateway - + Шлюз EditIpv4Gateway - + EditIpv4Gateway - DNS 1 - - - - - DNS 2 - + DNS + DNS EditIpv4PreferredDNS - + EditIpv4PreferredDNS - - EditIpv4AlternateDNS - - - - + Auto - + Авто - + Manual - + Руководство - + Required - + Керек + + + + Please separate multiple DNS entries by semicolon + Бир нече DNS жазуусун тараптуу үчүн бөлүңүз + + + + Ipv4 DNS invalid + Ipv4 DNS туура эмес - + Ipv4 address can not be empty - + Ipv4 дареги бош болбой калды - + Ipv4 Address invalid - + Ipv4 дарек туура эмес - + NetMask can not be empty - + Тармактын маскасы бош болбой калды - + Netmask invalid - + Тармак маскасы туура эмес - + Ipv4 Gateway invalid - + Ipv4 терезеси туура эмес + + + Preferred DNS + Жактырылган DNS + + + Alternate DNS + Альтернативдик DNS - Ipv4 Preferred DNS invalid - + Ipv4 тандалган DNS туура эмес - Ipv4 Alternate DNS invalid - + Альтернативдик DNS Ipv4 туура эмес @@ -2197,161 +2873,178 @@ Ipv6Widget - + Иpv6Widget IPV6 Method - + IPV6 методу ComboBoxIpv6Method - + ComboBoxIpv6Method IP Address - + IP дарек EditIpv6Address - + EditIpv6Address Prefix - + Префикс SpinBoxIpv6Prefix - + SpinBoxIpv6Prefix Gateway - + Шлюз EditIpv6Gateway - + EditIpv6Gateway - Preferred DNS - + DNS + DNS EditIpv6PreferredDNS - - - - - Alternate DNS - - - - - EditIpv6AlternateDNS - + EditIpv6PreferredDNS - + Auto - + Авто - + Manual - + Руководство - + Ignored - + Элегенде - + Required - + Керек + + + + Please separate multiple DNS entries by semicolon + Бир нече DNS жазуусун тараптуу үчүн бөлүңүз + + + + Ipv6 DNS invalid + Ipv6 DNS туура эмес - + Ipv6 address can not be empty - + Ipv6 дареги бош болбойт - + Ipv6 address invalid - + Ipv6 дареги туура эмес - + Ipv6 Gateway invalid - + Ipv6 терезеси туура эмес + + + Preferred DNS + Жактырылган DNS + + + Alternate DNS + Альтернативдик DNS - Ipv6 Preferred DNS invalid - + Ipv6 тандалган DNS туура эмес - Ipv6 Alternate DNS invalid - + Альтернативдик DNS Ipv6 туура эмес IrisPage - - - iris - - Default Iris device - + Default Iris device Iris feature list - + Iris мүмкүнчүлүктөр тизмеси + + + + iris + iris Cancel - + Айнуу Start enroll failed,%1 - + Жүктөө ишке ашпады,% 1 Error - + Ката The biometric features were successfully recorded. The feature name is:%1 - + Биометриялык өзгөчөлүктөр ийгиликтүү менен жазылды. Өзгөчөлүктөрдүн аты:% 1 Tips - + Жардамдар Failed to record biometrics(%1), Please try again - + Биометрияларды (% 1) сактоого болбоду, кайта аракет кылып көрүңүз + + + + KcpInterface + + Warning + Stock label + + + load qss file failed + qss файлын жүктөө ишке ашпады @@ -2359,7 +3052,7 @@ Keybinding - + Тиркеме айкалыш @@ -2367,12 +3060,35 @@ None - + ЖокLanguagesLanguage disabled - + өчүрүлгөн + + + + KiranAccountManager + + disable + өчүрүү + + + enable + иштетүү + + + Create new user + Жаңы колдонуучу жаратуу + + + User Manager + Колдонуучунун менеджери + + + Create new account + Жаңы аккаунт жаратуу @@ -2380,17 +3096,154 @@ Avatar Editor - + Аватар редактору Confirm - + Текшерүү Cancel - + Айнуу + + + + KiranCPanelMouse + + Mouse and TouchPad + Чычкан жана сенсордук панель + + + + KiranCPanelMouseWidget + + Select Mouse Hand + Чычкан колуну тандоо + + + Mouse Motion Acceleration + Чычкан жылдамдыктын ылдамдыгы + + + Natural Scroll + Түзүлдүк масштабы + + + Middle Emulation Enabled + Орточо эмуляциялоо иштетилген + + + Touchpad Enabled + Чычкан клавишасы иштетилген + + + Select TouchPad Hand + Тандоо + + + TouchPad Motion Acceleration + TouchPad жылдамдык + + + Select Click Method + Чертүү методин тандоо + + + Select Scroll Method + Жүктөө методин тандоо + + + Enabled while Typing + Басуу учурунда колдонулган + + + Tap to Click + Чертүү үчүн басыңыз + + + Reset + Түшүрүү + + + Exit + Чыгуу + + + Cancel + Айнуу + + + Save + Сактоо + + + Mouse Settings + Чычкан параметрлери + + + TouchPad Settings + Сегиздик параметрлери + + + Standard + Стандарттык + + + Right Hand Mode + Оңbalance + + + Left Hand Mode + Сол колдон режими + + + Press and Tap + Баскып таштоо + + + Tap + Табуу + + + Two Finger Scroll + Эки Finger Scroll + + + Edge Scroll + Багытты жүктөө + + + Slow + Жай + + + Fast + Тез + + + + KiranCollapse + + + ListExpansionSpace + ТизмеExpansionSpace + + + + KiranCpanelAppearance + + Wallpaper Setting + Тушкагаз параметрлери + + + Theme Setting + Тема параметрлери + + + Font Setting + Алиптерди ырастоо @@ -2398,7 +3251,7 @@ Form - + Форма @@ -2406,15 +3259,34 @@ Create new group - + Жаңы топту жаратуу KiranModuleWidget + + Warning + Stock label + + + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + % 1 дегенде өзгөртүлгөн мазмуну сакталбады. Өзгөртүлгөн соң, өзгөртүлгөн мазмунун жоготулат. Сиз чындыгында сактоону каалайсыз ба? + Form - + Форма + + + + KiranSystemWidget + + kiran-system-imformation + kiran-system-imformation + + + 保存 + preserve @@ -2422,96 +3294,191 @@ KiranTimeDateWidget - + КирантимедиатWidget + + + + Automatic synchronizetion + Автоматтык синхрондоо + + + + Change Time Zone + Убакыт зонасын өзгөртүү + + + + Set Time Manually + Руководственно установить время + + + + Time date format setting + Убакыт датасы форматынын параметрлери + + + + %1(%2) + % 1 (% 2) @ command- with- section/ rich% 1 is the command name,% 2 is its man section + + + + KiranTimePickerWidget + + + Form + Форма + + + + KiranTimeZone + + + Form + Форма + + + + Search in all time zones... + Бардык убакыт зонасында издөө... + + + + KiranTimeZoneItem + + + Form + Форма + + + + No search results, please search again... + Издөө нөлөөлөрү жок, кайта издөөңүз... + + + + KiranTimeZoneList + + + Form + Форма + + + + KiranTips + + + + Form + Форма + + + + KylinsecLogo + + + Copyright © + Автордук укуктар © + + + + KylinSec. All rights reserved. + KylinSec. Бардык укуктар резервирован. + + + + LangpackInstaller + + Package Install + Пакеттерди орнотуу + + + Installing... + Орнотулууда... + + + Install Complete! + Аякталды орнотуу! + + + + LanguageManager + + Error + Ката - - Automatic synchronizetion - + set locale failed + локалдуу орнотуу ишке ашпады - - Change Time Zone - + %1 inexistence in system + % 1 системадагы жок + + + LanguagePage - - Set Time Manually - + Language Select(Reboot to take effect) + Тил тандоо (иштеп чыгуу үчүн кайра жүргүзүү) - - Time date format setting - + Simplified Chinese + Жөнөкөй китайсык - - %1(%2) - + English + Англисче - - - KiranTimePickerWidget - - Form - + Tibetan + Тибет тили - - - KiranTimeZone - - Form - + Kirgiz + Киргиз - - Search in all time zones... - + Mongolian + Монгол тили - - - KiranTimeZoneItem - - Form - + Kazakh + Казах тили - - No search results, please search again... - + Uighur + Уйгур тили - KiranTimeZoneList + LanguagePlugin - - Form - + Language + Тил - KiranTips + LanguageSelectDialog - - - Form - + Dialog + Диалог - - - KylinsecLogo - - Copyright © - + No + Жок - - KylinSec. All rights reserved. - + Yes + Ооба + + + Add Language + Тил кошуу + + + Search + Издөө @@ -2519,7 +3486,7 @@ Form - + Форма @@ -2527,7 +3494,7 @@ LayoutList - + Сызыктар тизмеси @@ -2535,44 +3502,44 @@ Form - + Форма Select Kayboard Layout - + Тандоо Edit - + Оңдоо Add Layout - + Орнотмо кошуу ButtonAddLayout - + Клавиша жайгашуу Addition - + layer-mode-effects ButtonReturn - + keyboard label Return - + keyboard label @@ -2580,37 +3547,37 @@ Failed - + Жокко чыкты You have added this keyboard layout! - + Сиз бул алиптергич жайгашкан жайгашкан жолчолорду кошуңуз! The %1 keyboard layout does not exist! - + % 1 алиптакта жайгашкан жайгашкан жок! The keyboard layout is currently in use and cannot be deleted! - + Алиптергич жайгашкан ырастоо колдонулууда жана өчүрүүгө болбоду! Delete Layout - + Орнотмо өчүрүү You do not appear to have added %1 keyboard layout! - + Сиз% 1 алиптергич жайгашкан жайгашкан окшошпойтсыз! Finish - + Аяктоо @@ -2618,7 +3585,7 @@ Keyboard Layout - + Алиптергич иштемеси @@ -2626,79 +3593,197 @@ Form - + Форма BrowserLicense - + Браузердин лицензиясы <!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;"> +</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> - + <! 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> ButtonExportLicense - + Button ExportLicense Export - + Экспорттоо ButtonCloseLicense - + бекитүү баскычы Close - + Жабуу - + Save - + Сактоо - + PDF(*.pdf) - + PDF(*.pdf) - + Export License - + Экспорттоо лицензиясы - + Export License failed! - + Экспорттоо лицензиясы катасы! - + User End License Agreement - + Колдонуучунун аяктоо лицензиясы келишими - - - - + + + + + + None - + ЖокLanguagesLanguage - + Version License - + Версия лицензиясы + + + Export EULA + EULA экспорттоо + + + Export EULA failed! + Экспорттоо ишке ашпады! + + + + + Privacy Policy + Жеке катышымдык политика + + + + LicenseInfoWidget + + Machine Code: + Машин коду: + + + Activation Code: + Активдүү коду: + + + Activation Information + Активдүү маалыматы + + + Can't get machine code + Код алууга болбоду + + + Can't get activation code + Активдүүлүк код алууга болбоду + + + + LicenseInformation + + Installation time: + Орнотуу убакыты: + + + Activation status: + Активдүү абалы: + + + Expiry date: + Эскертүү датасы: + + + Contact Us: + Контакт + + + Unknow + Белгисиз + + + Can't get activation information + Активация маалыматын алууга болбоду + + + Activate + Активдүү + + + The current time is illegal + Учурдагы убакыт туура эмес + + + Less than the installation time + Орнотуу убакытынан кичине + + + Not activated. Trail expiration: + Активдүү эмес. Трейлин мерзги: + + + get service status failed + кызматтын абалын алуу ишке ашпады + + + Not yet + Дагы эмес + + + Activated + Активдүү + + + Forever + Дайыма + + + Copyright © + Автордук укуктар © + + + KylinSec. All rights reserved. + KylinSec. Бардык укуктар резервирован. + + + + ListExpansionSpace + + + ListExpansionSpace + ТизмеExpansionSpace @@ -2706,87 +3791,87 @@ p, li { white-space: pre-wrap; } Audio Play - + Аудиоойнотуу Search - + Издөө WWW - + WWW Audio Lower Volume - + Үндү азайтуу Audio Raise Volume - + Үндү жоготуу Mic Mute - + Мик өчүрүү Audio Stop - + Үндү токтотуу Explorer - + Эксплорер Calculator - + Калькулятор Audio Mute - + Үндү үндүрүү Audio Pause - + Аудиоpause musicStock label, media Audio Prev - + keyboard label Audio Media - + Музыкалык диск Audio Next - + Кийинки аудио Mail - + Почта Tools - + Аспаптар Eject - + Чыгаруу @@ -2794,7 +3879,7 @@ p, li { white-space: pre-wrap; } MMMM - + MMMM @@ -2802,62 +3887,62 @@ p, li { white-space: pre-wrap; } Form - + Форма Select Mouse Hand - + Чычкан колуну тандоо ComboSelectMouseHand - + ComboSelectMouseHand Mouse Motion Acceleration - + Чычкан жылдамдыктын ылдамдыгы SliderMouseMotionAcceleration - + СлайдерMouseMotionAcceleration Slow - + Жай Fast - + Тез Natural Scroll - + Түзүлдүк масштабы SwitchMouseNatturalScroll - + SwitchMouseNatturalScroll Middle Emulation Enabled - + Орточо эмуляциялоо иштетилген SwitchMiddleEmulation - + SwitchMiddleEmulation Test mouse wheel direction - + Чычкан тегиздин багыты текшерүү @@ -2911,17 +3996,105 @@ 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 сабы Right Hand Mode - + Оңbalance Left Hand Mode - + Сол колдон режими + + + + MouseSettings + + Select Mouse Hand + Чычкан колуну тандоо + + + Mouse Motion Acceleration + Чычкан жылдамдыктын ылдамдыгы + + + Natural Scroll + Түзүлдүк масштабы + + + Middle Emulation Enabled + Орточо эмуляциялоо иштетилген + + + Right Hand Mode + Оңbalance + + + Left Hand Mode + Сол колдон режими + + + Slow + Жай + + + Standard + Стандарттык + + + Fast + Тез @@ -2929,74 +4102,91 @@ This is line 50 of the test text Mouse Settings - + Чычкан параметрлери NetworkSubItem - + Wired Network %1 - + Тармак %1 - + Wired Network - + Тармак - + Wireless Network %1 - + Каналсыз тармак% 1 - + Wireless Network - + Тармак - + VPN - + VPN - + Network Details - + Тармак NetworkTray - + Network settings - + Тармак параметрлери - - + + Network unavailable - + Тармак жок + + + + + The network is connected, but you cannot access the Internet + Тармак туташулган, бирок Интернетке кирүү мүмкүн эмес + + + + Network not connected + Тармак туташуулбады - + Wired network card: %1 available - + Тармак картасы:% 1 жеткиликтүү - + Wireless network card: %1 available - + Тармак картасы жок:% 1 жеткиликтүү - + Wired network card: %1 unavailable - + Тармак картасы:% 1 жеткиликтүү жок - + Wireless network card: %1 unavailable - + Тармак картасы жок:% 1 жеткиликтүү жок + + + + + Network connected + Тармак туташуу @@ -3004,52 +4194,57 @@ This is line 50 of the test text OutputPage - + Чыгуу барагы + + + + Output cards + Чыгуу карталары - + Output devices - + Чыгуу түзүмдөрү - + ComboBoxOutputDevices - + ComboBoxOutputDevice - + Output volume - + Чыгуу бийиктиги - + SlilderVolumeSetting - + SlilderVolumeSetting - + Left/right balance - + Сол/оң балансы - + SliderVolumeBalance - + SliderVolumeBalance - + Left - + keyboard label - + Right - + keyboard label - + No output device detected - + Чыгуу аспабын табылган жок @@ -3057,7 +4252,7 @@ This is line 50 of the test text Control Panel - + Башкаруу панели @@ -3065,112 +4260,119 @@ This is line 50 of the test text PasswordExpirationPolicyPage - + ПарольExpirationPolicyPage User expires - + Колдонуучунун мерзги бүттү SpinBoxUserExpires - + SpinBoxUserExpires yyyy-MM-dd - + yyyy-MM-dd Last password change - + Акыркы пароль өзгөртүү LabelLastPasswdChange - + Белги LastPasswdChange 1990-01-01 - + 1990-01-01 Maximum vaild days of password - + Топтун максималдык күндери SpinBoxMaximumValidDays - + SpinBoxMaximumValidDays Prompt time before password expiration - + Спросите время до истечения пароля SpinBoxPromptBeforeExpiration - + SpinBoxPromptBeforeExpiration how many days after password expires will become inactive - + канча күндөн кийин пароль мерзгинен кийин ишке ашырылат SpinBoxPasswdInactiveTime - + SpinBoxPasswdInactiveTime ButtonSave - + Баскыч сактоо save - + сактоо ButtonReturn - + keyboard label return - + return day - + күн PluginConnectionList - + Other WiFi networks - + Башка WiFi тармактар - + Tips - + Жардамдар - + Please input a network name - + Тармак атын киргизиңиз + + + + Popup + + cancel + токтотуу @@ -3178,17 +4380,17 @@ This is line 50 of the test text General Settings - + Жалпы параметрлер Power Settings - + Экран параметрлери Battery Settings - + Батарея параметрлери @@ -3197,19 +4399,19 @@ This is line 50 of the test text power-saver - + power-saver balanced - + балансы performance - + Иштеме @@ -3217,52 +4419,59 @@ This is line 50 of the test text PowerSettingsPage - + Панель параметрлериPage After idle for more than the following time, the computer will execute - + Кийинки убакыттан көп иштегеннен кийин компьютер аткарылат ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction The monitor will turn off when it is idle - + Монитор иштегенде өчүрүлөт ComboMonitorTrunOffIdleTime - + ComboMonitorTrunOffIdleTime Suspend - + Уктоо режими Shutdown - + Өчүрүү Hibernate - + Түзүү Do nothing - + Эч нерсе кылбоо + + + + PowerSubItem + + Power Settings + Экран параметрлери @@ -3270,77 +4479,132 @@ This is line 50 of the test text Authentication type Enabled status - + Аутентификация түрү иштетилген абалы fingerprint - + Баш баскыч fingervein - - - - - ukey - - - - - iris - - - - - face - + бармак арманы ... - + Жаңы Return - + keyboard label login - + кирүү unlock - + Ачуу empowerment - + күчтүү Apply the %1 authentication to the following applications - + Келесі иштемелерге% 1 аутентификациясын колдонуу + + + + ukey + recurrpage + + + + iris + iris + + + + face + бет QObject - - Failed - + Did not reply within the specified timeout + Көрсөтүлгөн убакыт аралыгында жауап берилген жок + + + The called service is not known + Бул аталган кызмат белгисиз + + + warning + эскертүү + + + Open qss file failed + qss файлын ачуу ишке ашпады + + + + %1Day + % 1күн + + + + %1Hour + hour + + + + %1Minute + minute + + + + never + эч качан + + + SLow + Слоу - - Set font failed! - + Standard + Стандарттык + + + Fast + Тез + + + Faild + Файл + + + Connect Mouse or TouchPad Dbus Failed! + Чычкан же TouchPad менен туташуу ишке ашпады! + + + Load qss file failed! + Жүктөө мүмкүн эмес! + + + + No search results, please search again... + Издөө нөлөөлөрү жок, кайта издөөңүз... @@ -3348,7 +4612,7 @@ This is line 50 of the test text Tips - + Жардамдар @@ -3356,42 +4620,51 @@ This is line 50 of the test text OK(K) - + OK(K) Failed to apply display settings!%1 - + Экран параметрлерин иштетүүгө болбоду!% 1" (msgctxt: "panel:showusername") to "1 Fallback display setting failed! %1 - + Экран параметрлери ишке ашпады! 1" (msgctxt: "panel:showusername") to "1 - - No search results, please search again... - + Failed + Жокко чыкты - - %1Day - + Set font failed! + Шрифтти орнотуу ишке ашпады. - - %1Hour - + Get icon themes failed! + Белгилер темаларын алуу ишке ашпады! - - %1Minute - + Get cursor themes failed! + Курсордун темаларын алуу ишке ашпады! - - never - + Warning + Stock label + + + There is no theme to set! + Орнотуу үчүн тема жок! + + + + Spring + Spring + + + + Summer + Summer @@ -3399,17 +4672,17 @@ This is line 50 of the test text Enter keywords to search - + Издөө үчүн ачкыч сөздөрүн киргизиңиз Info - + Маалымат Failed to find related items, please re-enter! - + Башка элементтерди табууга болбоду, кайта киргизиңиз! @@ -3417,22 +4690,22 @@ This is line 50 of the test text Confirm - + Текшерүү Return - + keyboard label select picture - + сүрөт тандоо 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) @@ -3440,14 +4713,14 @@ This is line 50 of the test text Form - + Форма TextLabel - + Текст белгиси @@ -3455,29 +4728,29 @@ This is line 50 of the test text Form - + Форма EditSearch - + Оңдоо Custom - + Башка Edit - + Оңдоо ButtonAddShortcut - + Клавиша кошууShortcut @@ -3485,154 +4758,154 @@ This is line 50 of the test text Add - + Кошуу ButtonReset - + Баскыч Reset - + Түшүрүү Custom Shortcut Name - + Комбинациянын аты EditCustomShortcutName - + Комбинацияны оңдоо Custom Shortcut application - + Комбинация EditShortcutApp - + Комбинацияны оңдоо Custom Shortcut Key - + Комбинация баскычы ButtonAdd - + Клавиша кошуу ButtonCancel - + КлавишаCancel Cancel - + Айнуу Shortcut Name - + Комбинация аты EditShortcutName - + Комбинацияны оңдооName Shortcut application - + Комбинация Shortcut key - + Комбинация баскычы ButtonSave - + Баскыч сактоо Save - + Сактоо ButtonReturn - + keyboard label return - + return Please enter a search keyword... - + Издөө ачкыч сөздү киргизиңиз... Required - + Керек Please press the new shortcut key - + Жаңы комбинацияны басыңыз Finished - + print operation status failed to load shortcut key data! - + Комбинацияны баскыч маалыматын жүктөөгө болбоду! List shortcut failed,error:%1 - + Тизмесин комбинациясы катасы, ката:% 1 Error - + Ката Get shortcut failed,error: - + Комбинацияны алуу катасы: Open File - + Файлды ачуу System - + Системаinput method menu Sound - + Үн @@ -3643,64 +4916,64 @@ This is line 50 of the test text Failed - + Жокко чыкты Delete shortcut failed,error: - + Комбинацияны өчүрүү катасы: Warning - + Stock label 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", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. - + "% 1" комбинациясын колдонууга болбоду, себеби бул ачкыч менен кирүү мүмкүн эмес. Ctrl, Alt, же Shift менен бир учурда кайра колдонуп көрүңүз. Shortcut keys %1 are already used in %2,Please try again! - + % 1 комбинациясы алдында% 2 дегенде колдонулууда, кайталап көрүңүз! @@ -3708,71 +4981,86 @@ This is line 50 of the test text Form - + Форма TextLabel - + Текст белгиси + + + + ShowQRCode + + Scan QR code to get machine code + Кодду алуу үчүн QR кодун издөө + + + QRcode of Machine and Activation Code + Машин жана активдүүлүк кодун QRcode + + + Scan QR code to get activation code + Активдүүлүк коду алуу үчүн QR кодун издөө StatusNotification - - - - - + + + + + Connection Failed - + Туташуу ишке ашпады - + the network not found - + тармак табылбады - + The hidden network "%1" to be connected has been detected and exists in the network list - + «% 1 » туташуу үчүн жашырылган тармак табылды жана тармак тизмесинде бар - - - + + + Failed to connect to the network "%1" - + "% 1" тармагына туташуу ишке ашпады - + Connection activated - + Туташуу активдүү - + You are now connected to the network "%1" - + Сиз азыр "% 1" тармагына туташтырылсыз - + Connection deactivated - + Туташтыруу ишке ашпады - + You have now disconnected the network "%1" - + Азыр "% 1" тармагын ажыратып калды - + Connection deleted - + Туташтыруу өчүрүлдү - + The connection has been deleted "%1" - + Туташтыруу "% 1" өчүрүлдү @@ -3780,7 +5068,7 @@ This is line 50 of the test text System Information - + Системалык маалымат @@ -3788,136 +5076,249 @@ This is line 50 of the test text Form - + Форма Host Name: - + Хост аты: - + LabelHostName - + Белгинин аты - - - - - + + + + + TextLabel - + Текст белгиси - + ButtonChangeHostName - + ButtonChangeHost - + Change - + Өзгөртүү - + System Version: - + Системалык версиясы: - + LabelSystemVersion - + Белги системасынын версиясы - + Kernel Version: - + Kernel версиясы: - + LabelKernelVersion - + БелгилKernelVersion - + System Architecture: - + Системалык архитектура: - + LabelSystemArch - + paper size - + Activation status: - + Активдүү абалы: - - - + + + + Show - + Көрсөтүү - + EULA: - + EULA: - + ButtonShowEULA - + Баскычты көрсөтүү - + Version License: - + Версиясы: - + ButtonShowVersionLicense - + Баскыч - - - - + + + + Unknow - + Белгисиз - + UnActivated - + Активдүү эмес - + Activation code has expired - + Активдүүлүк коду мерзги бүттү - + Permanently activated - + Активдүү - + Activated - + Активдүү - + Error - + Ката - + Failed to open the license activator - + Лицензия активаторын ачууга болбоду + + + Copyright © + Автордук укуктар © + + + KylinSec. All rights reserved. + KylinSec. Бардык укуктар резервирован. + + + + Privacy policy: + Жашырыктык саясаты: + + + + SystemInformationWidget + + Host Name: + Хост аты: + + + System Version: + Системалык версиясы: + + + Kernel Version: + Kernel версиясы: + + + System Architecture: + Системалык архитектура: + + + Installation time: + Орнотуу убакыты: + + + Activation status: + Активдүү абалы: + + + Expiry date: + Эскертүү датасы: + + + EULA: + EULA: + + + Version License: + Версиясы: + + + Contact Us: + Контакт + + + Change + Өзгөртүү + + + Show + Көрсөтүү + + + Unknow + Белгисиз + + + The current time is illegal + Учурдагы убакыт туура эмес + + + Less than the installation time + Орнотуу убакытынан кичине + + + Not activated. Trail expiration: + Активдүү эмес. Трейлин мерзги: + + + Can't get activation information + Активация маалыматын алууга болбоду + + + Activate + Активдүү + + + get service status failed + кызматтын абалын алуу ишке ашпады + + + Not yet + Дагы эмес + + + Activated + Активдүү + + + Forever + Дайыма + + + Copyright © + Автордук укуктар © + + + KylinSec. All rights reserved. + KylinSec. Бардык укуктар резервирован. @@ -3925,17 +5326,17 @@ This is line 50 of the test text Tips - + Жардамдар Yes - + Ооба Cancel - + Айнуу @@ -3943,53 +5344,95 @@ This is line 50 of the test text Form - + Форма Dark and Light Theme - + view-padding-color Themes Settings - + Темалар параметрлери Open Window Effects - + Терезе эффекттерин ачуу - + Unknown - + Белгисиз + + + + Light Theme + Ачык тема + + + + Auto + Авто + + + + Dark Theme + Кара темасы Choose icon Theme - + Белгилер темасын тандоо - + Choose cursor Themes - + Курсордун темаларын тандоо + + + + ThemeWidget + + Dark Theme + Кара темасы - Light Theme - + Ачык тема - Auto - + Авто + + + + Themes + + Dark and Light Theme + view-padding-color - - Dark Theme - + Themes Settings + Темалар параметрлери + + + Open Window Effects + Терезе эффекттерин ачуу + + + Choose icon themes + Белгилер темаларын тандоо + + + Unknown + Белгисиз + + + Choose cursor themes + Курсордун темаларын тандоо @@ -3997,12 +5440,12 @@ This is line 50 of the test text Failed - + Жокко чыкты List shortcut failed,error: - + Тизмедин комбинациясы катасы,ката: @@ -4010,22 +5453,22 @@ This is line 50 of the test text Time Date Settings - + Убакыт датасы параметрлери Chnage time Zone - + Chnage убакыт зонасы Set time Manually - + Руководственно установить время Time date format setting - + Убакыт датасы форматынын параметрлери @@ -4033,32 +5476,50 @@ This is line 50 of the test text TimezoneSettings - + Убакыт зонасы Select Time Zone - + Убакыт зонасын тандоо ButtonSave - + Баскыч сактоо save - + сактоо ButtonReturn - + keyboard label reset - + reset + + + + TopBar + + + ListExpansionSpace + ТизмеExpansionSpace + + + + TITLE + TITLE + + + + FLAG + ФЛАГ @@ -4066,127 +5527,206 @@ This is line 50 of the test text Form - + Форма TouchPad Enabled - + TouchPad иштетилген SwitchTouchPadEnable - + SwitchPadEnable Select TouchPad Hand - + Тандоо ComboTouchPadHand - + ComboTouchPadHand TouchPad Motion Acceleration - + TouchPad жылдамдык SliderTouchPadMotionAcceleration - + СлайдерTouchPadMotionAcceleration Slow - + Жай Fast - + Тез Select Click Method - + Чертүү методин тандоо ComboClickMethod - + ComboClickMethod Select Scroll Method - + Жүктөө методин тандоо ComboScrollMethod - + ScrollMethod Natural Scroll - + Түзүлдүк масштабы ComboNaturalScroll - + ComboNaturalScroll Enabled while Typing - + Басуу учурунда колдонулган SwitchTypingEnable - + Алмаштыруу Tap to Click - + Чертүү үчүн басыңыз SwtichTapToClick - + SwtichTapToClick Right Hand Mode - + Оңbalance Left Hand Mode - + Сол колдон режими Press and Tap - + Баскып таштоо Tap - + Табуу Two Finger Scroll - + Эки Finger Scroll Edge Scroll - + Багытты жүктөө + + + + TouchPadSettings + + Touchpad Enabled + Чычкан клавишасы иштетилген + + + Disable TouchPad + Токтотуу-панелин өчүрүү + + + TouchPad Enabled + TouchPad иштетилген + + + Select TouchPad Hand + Тандоо + + + TouchPad Motion Acceleration + TouchPad жылдамдык + + + Select Click Method + Чертүү методин тандоо + + + Select Scroll Method + Жүктөө методин тандоо + + + Natural Scroll + Түзүлдүк масштабы + + + Enabled while Typing + Басуу учурунда колдонулган + + + Tap to Click + Чертүү үчүн басыңыз + + + Slow + Жай + + + Standard + Стандарттык + + + Fast + Тез + + + Right Hand Mode + Оңbalance + + + Left Hand Mode + Сол колдон режими + + + Press and Tap + Баскып таштоо + + + Tap + Табуу + + + Two Finger Scroll + Эки Finger Scroll + + + Edge Scroll + Багытты жүктөө @@ -4194,7 +5734,7 @@ This is line 50 of the test text TouchPad Settings - + Сегиздик параметрлери @@ -4202,7 +5742,7 @@ This is line 50 of the test text Other WiFi networks - + Башка WiFi тармактар @@ -4210,64 +5750,64 @@ This is line 50 of the test text TrayItemWidget - + Аралык өлчөмү Icon - + tab-style Name - + Аты Status - + Абалы Ignore - + Электенген Disconnect - + Ажыратуу Cancel - + Айнуу Connect - + Туташуу Connected - + Туташкан Unconnected - + Туташкан жок Please input password - + Сырсөз киргизиңиз Please input a network name - + Тармак атын киргизиңиз @@ -4275,22 +5815,22 @@ This is line 50 of the test text TrayPage - + TrayPage TextLabel - + Текст белгиси - + Select wired network card - + Тармак картасын тандоо - + Select wireless network card - + Тармак картасын тандоо @@ -4298,39 +5838,58 @@ This is line 50 of the test text Ukey - + Жума Default Ukey device - + Абалкы Ukey түзүмдөрү List of devices bound to the Ukey - + Ukey менен байланыштырылган түзүмдөрдүн тизмеси error - + ката No UKey device detected, pelease insert the UKey device and perform operations - + UKey аспабы табылган жок, UKey аспабын табылып операцияларды иштетүү UKey Enroll - + UKey башкаруу Please enter the ukey pin code - + ukey-pin кодун киргизиңиз + + + + UKeyPinCodeDialog + + UKey Enroll + UKey башкаруу + + + Please enter the ukey pin code + ukey-pin кодун киргизиңиз + + + Confirm + Текшерүү + + + Cancel + Айнуу @@ -4338,142 +5897,150 @@ This is line 50 of the test text Form - + Форма Account - + Аткарылды Change password - + Сырсөз өзгөртүү User id - + Колдонуучунун идентификатору User type - + Колдонуучунун түрү User status - + Колдонуучунун абалы auth manager - + автоматтык менеджери Password expiration policy - + Список истекания пароля Confirm - + Текшерүү Delete - + Өчүрүү Current password - + Учурдагы пароль EditCurrentPasswd - + Учурдагы пароль оңдоо New password - + Жаңы сырсөз EditNewPasswd - + ЖаңыPasswd өзгөртүү Enter the new password again - + Жаңы пароль киргизиңиз EditNewPasswdAgain - + Жаңы PasswdAgain оңдоо EditPasswdSave - + Оңдоо пароль сактоо Save - + Сактоо EditPasswdCancel - + Оңдоо парольCancel Cancel - + Айнуу + + + Account type + Account type + + + Account status + Аккаунт абалы standard - + стандарт administrator - + администратор Please enter the new user password - + Колдонуучунун жаңы пароль киргизиңиз Please enter the password again - + Сырсөз киргизиңиз The password you enter must be the same as the former one - + Введенная пароль должна быть точной же первой Please enter the current user password - + Учурдагы колдонуучунун сырсөзү киргизиңиз The current password is incorrect - + Учурдагы пароль туура эмес The new password cannot be the same as the current password - + Новая пароль не может быть одной из текущих паролей @@ -4482,33 +6049,68 @@ This is line 50 of the test text Error - + Ката Password encryption failed - + Шифрлөө үчүн сырсөз катасы user information updated successfully - + колдонуучу маалыматы ишке ашпады Password updated successfully - + Пароль успешно обновлен - 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)? - + 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) өчүрүүсүзбү? Warning - + Stock label + + + Account information updated successfully + Аткарылды + + + + UserlicenseAgreement + + Export + Экспорттоо + + + Close + Жабуу + + + Save + Сактоо + + + Export EULA + EULA экспорттоо + + + Export EULA failed! + Экспорттоо ишке ашпады! + + + User End License Agreement + Колдонуучунун аяктоо лицензиясы келишими + + + None + ЖокLanguagesLanguage @@ -4516,7 +6118,7 @@ This is line 50 of the test text VolumeInput - + Үндүн киргизүү @@ -4524,7 +6126,7 @@ This is line 50 of the test text VolumeOutput - + Толук чыгуу @@ -4532,13 +6134,13 @@ This is line 50 of the test text VolumeSettingPage - + Толук параметрлери Volume - + Үндүн үн @@ -4546,67 +6148,67 @@ This is line 50 of the test text VpnIPsec - + VpnIPsec Enable IPsec - + IPsec иштетүү Group Name - + Топтун аты EditGroupName - + Оңдоо тобуName Group ID - + Топтун идентификатору EditGroupId - + Топтун идентификатору Pre-Shared Key - + Бөлүшүлгөн ачкыч EditPreSharedKey - + PreSharedKey оңдоо Show Password - + Топтун сырсөзү Internet Key Exchange Protocol - + Интернет клавишаларын алмаштыруу протоколу EditIpsecIKE - + EditIpsecIKE Encapsulating Security Payload - + Коопсуздук пайдаланун символдоо EditIpsecESP - + ESP @@ -4614,47 +6216,47 @@ This is line 50 of the test text VpnIpvx - + VpnIpvx IPV4 Method - + IPV4 методу ComboBoxVPNIpv4Method - + ComboBoxVPNIpv4Method Only applied in corresponding resources - + Бардык ресурстарда гана иштетилген Preferred DNS - + Жактырылган DNS EditVPNIpv4PreferredDNS - + EditVPNIpv4PreferredDNS Alternate DNS - + Альтернативдик DNS EditIpv4AlternateDNS - + EditIpv4AlternateDNS - + Auto - + Авто @@ -4662,12 +6264,12 @@ This is line 50 of the test text VpnL2tpSetting - + ВpnL2tp параметрлери VPN name - + VPN аты @@ -4676,42 +6278,42 @@ This is line 50 of the test text VpnManager - + VpnManager VPN type - + VPN түрү Save - + Сактоо Return - + keyboard label - + VPN - + VPN - + L2TP - + L2TP - + Tips - + Жардамдар - + Password required to connect to %1. - + % 1 менен туташуу үчүн сырсөз керек. @@ -4719,97 +6321,97 @@ This is line 50 of the test text VpnPpp - + VpnPpp Use MPPE - + MPPE колдонуу Security - + Коопсуздук ComboBoxMppeSecurity - + BoxMppeSecurity Stateful MPPE - + Абалкы MPPE - + All available (default) - + Бардык жеткиликтүү (алдынала тандалган) - + 40-bit (less secure) - + 40 бит (коопсуз) - + 128-bit (most secure) - + 128 бит (эң коопсуз) - + Refuse EAP Authentication - + EAP аутентификациясын өчүрүү - + Refuse PAP Authentication - + PAP аутентификациясын өчүрүү - + Refuse CHAP Authentication - + CHAP аутентификациясын өчүрүү - + Refuse MSCHAP Authentication - + MSCHAP аутентификациясын эскиргизүү - + Refuse MSCHAPv2 Authentication - + MSCHAPv2 аутентификациясын эскиргизүү - + No BSD Data Compression - + part-type - + No Deflate Data Compression - + Deflate Data Compression - + No TCP Header Compression - + TCP башкы-маалыматтарынын компрессиясы жок - + No Protocol Field Compression - + Протокол талаасынын компрессиясы жок - + No Address/Control Compression - + Дареги/башкаруу компрессиясы жок - + Send PPP Echo Packets - + PPP Echo пакеттерин жөнөтүү @@ -4817,12 +6419,12 @@ This is line 50 of the test text VpnPptpSetting - + ВПП параметрлери VPN name - + VPN аты @@ -4830,109 +6432,109 @@ This is line 50 of the test text VpnWidget - + Видеотек Gateway - + Шлюз EditVPNGateway - + VPNGateway User Name - + Колдонуучунун аты EditVPNUserName - + EditVPNUзерName Password Options - + Параметрлер ComboBoxVPNPasswordOptions - + Пароль Password - + Топтун сырсөзү EditVPNPassword - + Сырсөз өзгөртүү ButtonPasswordVisual - + Баскыч паролуVisual Show Password - + Топтун сырсөзү NT Domain - + NT домен EditNTDomain - + Домен өзгөртүү - + Required - + Керек - + Saved - + Сакталган - + Ask - + суроо - + Not required - + Керек жок - + Gateway can not be empty - + Шлюз бош болбойт - + Gateway invalid - + Шлюз туура эмес - + user name can not be empty - + колдонуучунун аты бош болбой калды - + password can not be empty - + пароль бош болбойт @@ -4940,84 +6542,84 @@ This is line 50 of the test text Form - + Форма Set wallpaper - + Түс кагаздарын орнотуу FrameLockScreenPreview - + Экранды кулпулоо FrameDesktopPreivew - + FrameDesktopPreivew Desktop Wallpaper Preview - + Иш столунун тик бетин алдын ала көрүү Lock Screen WallPaper Preview - + Экрандын тилкемесин бекитүү Select wallpaper - + Тушкагаз тандоо Select Wallpaper - + Тушкагаз тандоо Set Desktop Wallpaper - + Иш столунун тизмесин орнотуу Set Lock Screen Wallpaper - + Экранды кулпулоо set wallpaper - + тилкемесин орнотуу Set wallpaper failed! - + Тармаккагаз орнотуу ишке ашпады. select picture - + сүрөт тандоо 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) Add Image Failed - + Сүрөттү кошуу ишке ашпады The image already exists! - + Сүрөт алдында бар! @@ -5025,42 +6627,39 @@ This is line 50 of the test text WiredManager - + WiredManager ButtonSave - + Баскыч сактоо Save - + Сактоо ButtonReturn - + keyboard label Return - + keyboard label - Wired Network Adapter - + Тармак адаптери - The carrier is pulled out - + Таратуучу чыгарылды - The current device is not available - + Учурдагы түзүмдү жок @@ -5068,12 +6667,12 @@ This is line 50 of the test text WiredSettingPage - + Кадр параметрлери - + Network name - + Тармак аты @@ -5081,37 +6680,33 @@ This is line 50 of the test text WirelessManager - + WirelessManager Save - + Сактоо Return - + keyboard label - Wireless Network Adapter - + Тармак адаптери - The current device is not available - + Учурдагы түзүмдү жок - Tips - + Жардамдар - Password required to connect to %1. - + % 1 менен туташуу үчүн сырсөз керек. @@ -5119,77 +6714,77 @@ This is line 50 of the test text WirelessSecurityWidget - + Wireless SecurityWidget Security - + Коопсуздук ComboBoxWirelessSecurityOption - + WirelessSecurityOption Password Options - + Параметрлер ComboBoxWirelessPasswordOption - + WirelessPasswordOption Password - + Топтун сырсөзү EditWirelessPassword - + Password ButtonWirelessPasswordVisual - + БаскычWirelessPasswordVisual PushButton - + Баскыч баскычы None - + ЖокLanguagesLanguage WPA/WPA2 Personal - + WPA/WPA2 жеке Save password for all users - + Бардык колдонуучулардын сырсөзүн сактоо Save password for this user - + Бул колдонуучунун сырсөзүн сактоо Ask me always - + Мага ар дайым суроо Required - + Керек @@ -5197,20 +6792,20 @@ This is line 50 of the test text WirelessSettingPage - + Бетбелгисиз параметрлер - + Wireless name - + Каналсыз аты WirelessTrayWidget - + the network "%1" not found - + "% 1" тармагы табылбады @@ -5218,47 +6813,47 @@ This is line 50 of the test text WirelessWidget - + Wireless Widget SSID - + SSID EditSsid - + Оңдоо MAC Address Of Device - + Түзүмдүн MAC дареги ComboBoxWirelessMacAddress - + WirelessMacAddress Custom MTU - + Башка MTU SpinBoxWirelessCustomMTU - + SpinBoxWirelessCustomMTU - + Required - + Керек - + No device specified - + Түзүм аныкталган жок @@ -5266,7 +6861,22 @@ This is line 50 of the test text yyyy - + yyyy + + + + kiranSystemInformation + + System Information + Системалык маалымат + + + Hardware Information + Жабдуулар маалыматы + + + kiran-system-imformation + kiran-system-imformation diff --git a/translations/kiran-control-panel.mn_MN.ts b/translations/kiran-control-panel.mn_MN.ts index 59914b26..0ad9ee6f 100644 --- a/translations/kiran-control-panel.mn_MN.ts +++ b/translations/kiran-control-panel.mn_MN.ts @@ -1,17 +1,32 @@ + + AccountItemWidget + + Create new user + Шинэ хэрэглэгч үүсгэх + + + disable + Тахир дутуу + + + enable + Тогтвортой + + AccountSubItem account - + Дансны New User - + Шинэ хэрэглэгч @@ -20,107 +35,222 @@ disable - + Тахир дутуу enable - + Тогтвортой Create new user - + Шинэ хэрэглэгч үүсгэх - AdvanceSettings + ActGuideWidget - - Form - + Please choose activation mode: + Сургуулийн үйл ажиллагааны горимыг гаргах: - - Login shell - + Next + Дараагийн - - EditLoginShell - + Current machine code: + Одоогийн машины код: - - Specify user id (needs to be greater than 1000) - + Please input activation code: + Оролтын үйл ажиллагааны кодыг гаргах: - - EditSpecifyUserID - + Back + Буцах - - Specify user home - + Please insert the UsbKey device first! + Эхлээд UsbKey төхөөрөмжийг гарга! - - EditSpecifyUserHome - + Activate online + Онлайнаар идэвхжүүлэх - - ButtonConfirm - + Activate with the input activation code + Оролтын үйл ажиллагааны кодтой ажиллах чадвар - - confirm - + Activate with insert UsbKey + UsbKey оруулах замаар идэвхжүүлнэ - - ButtonCancel - + Activate + Идэвхжүүлэх - - cancel - + Please enter the activate server address: + Үйл ажиллагааны серверийн хаягийг бизнес эрхлэгчээс гарга: + + + Activating...... + Идэвхжүүлэх...... + + + System activate successful! + Системийн үйл ажиллагааны хүчин чадал! + + + server activation and remaining points: + Серверийн үйлдэл ба үлдсэн цэгүүд: + + + development activation and remaining points: + Хөгжлийн үйл ажиллагаа ба бууруулах цэгүүд: + + + industrial activation and remaining points: + Аж үйлдвэрийн үйл ажиллагаа, дахин байгуулах цэгүүд: + + + desktop activation and remaining points: + Ширээний үйл ажиллагаа ба үлдсэн цэгүүд: + + + activation points: + Үйл ажиллагааны цэгүүд: + + + remaining points: + Үлдсэн цэгүүд: + + + Close + Ойртох + + + System activate failed! + Системийн үйл ажиллагаа талбарт! + + + unknow + Үл мэдэгдэх + + + Activation Mode + Үйл ажиллагааны горим + + + Start Activation + Эхлэх үйл ажиллагаа + + + Activation Complete + Үйл ажиллагааны бүрэн + + + Activation Guide + Үйл ажиллагааны гарын авлага + + + Server IP address or Domain name + Серверийн IP хаяг эсвэл Домэйн нэр + + + AdvanceSettings Advance Settings - + Урьдчилсан тохиргооны үнэт цаас Automatically generated by system - + Системээр ерөнхийлсөн автоматжуулсан Please enter the correct path - + Зөв замыг суллана Please enter specify user Id - + Хувилбар гаргах бизнес эрхлэгч хэрэглэгчийн ID-г зааж өгнө Please enter an integer above 1000 - + Бизнес эрхлэгчийг 1000-аас дээш оруулга гарга Please enter the correct home directory - + Гэрийн зөв лавлахыг суллана уу + + + + Form + Хэлбэр + + + + Login shell + Бүртгэлийн бүрхүүл + + + + EditLoginShell + EditLoginShell + + + + Specify user id (needs to be greater than 1000) + Хэрэглэгчийн id (NEEDS-ийг 1000)-ээс илүү бүтээгч гэж зааж өгнө үү + + + + EditSpecifyUserID + EditSpecifyUserID + + + + Specify user home + Spotify хэрэглэгчийн гэр + + + + EditSpecifyUserHome + EditSpecifyUserHome + + + + ButtonConfirm + ButtonConfirm + + + + confirm + Батлах + + + + ButtonCancel + ButtonCancell + + + + cancel + Цуцлах + + + Specify user id + Spotify хэрэглэгчийн ID @@ -128,30 +258,90 @@ Theme - + Сэдэв Wallpaper - + Ханын цаас Font - + Үсгийн + + + + ApplicationPlugin + + + DefaultApp + DefaultApp + + + + AutoStart + AutoStart AudioSystemTray - + Volume Setting - + Эзлэхүүн тунгаах - + Mixed Setting - + Холимог тохиргоо + + + + AuthManagerPage + + Fingerprint Authentication + Хурууны хээний баталгаажуулалт + + + Face Authentication + Нүүрний баталгаажуулалт + + + Password Authentication + Нууц үгийн баталгаажуулалт + + + save + Хадгалах + + + return + Буцах + + + add fingerprint + Хурууны хээ нэмнэ + + + add face + Нүүр нэмэх + + + error + Алдаа + + + please ensure that at least one authentication option exists + Өгөгдлийг дор хаяж нэг зөвшөөрлийн илэрхийллийн түүхийг гаргах + + + fingerprint_ + _______________________________________________________________________________ + + + face_ + Face____ @@ -159,37 +349,126 @@ Fingerprint - + Хурууны хээ FingerVein - + Хурууны судал + + + + Driver Manager + Жолооч менежер + + + + Prefs + Бэлтгэл UKey - + UKey Iris - + Цахилдаг Face - + Нүүр + + + + AutoStartPage + + Boot Setup + Ачаалах тохиргоо - - Driver Manager - + Desktop files(*.desktop) + Ширээний файлууд(*.desktop) - - Prefs - + select autostart desktop + Автостарт ширээний компьютерийг сонго + + + Select + Сонгох + + + Cancel + Цуцлах + + + Error + Алдаа + + + Desktop has existed + Ширээний компьютер аль хэдийн нэрлэгдсэн + + + Desktop cant permit to join + Ширээний кант нэгдэхийг зөвшөөрнө + + + Desktop dont support + Ширээний хяналтын дэмжлэг + + + + AutostartPage + + + Boot Setup + Ачаалах тохиргоо + + + + Desktop files(*.desktop) + Ширээний файлууд(*.desktop) + + + + select autostart desktop + Автостарт ширээний компьютерийг сонго + + + + Select + Сонгох + + + + Cancel + Цуцлах + + + + + + Error + Алдаа + + + + Desktop has existed + Ширээний компьютер аль хэдийн нэрлэгдсэн + + + + Desktop cant permit to join + Ширээний кант нэгдэхийг зөвшөөрнө + + + + Desktop dont support + Ширээний хяналтын дэмжлэг @@ -197,81 +476,95 @@ BatterySettingsPage - + BatterySettingsPage After idle for more than the following time, the computer will execute - + Дараагийн хугацаанаас илүү хугацаанд сул зогссоны дараа компьютер ажиллах болно ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction When the battery is lit up, it will be executed - + Өгөгдлийг асаасан газар түүнийг гүйцэтгэнэ ComboLowBatteryAction - + ComboLowBatteryAction The monitor will turn off when it is idle - + Монитор эргэж, дараа нь сул зогсолт хийнэ ComboMonitorTurnOffIdleTime - + ComboMonitorTurnOffIdleTime Reduce screen brightness when idle - + Дэлгэцийн гэрэлтэлтийг багасгах Reduce screen brightness when no power - + Төрсөн өдрийн төрсөн өдрийг ямар ч хүчгүй болго The energy saving mode is enabled when the power is low - + Эрчим хүч бага байх үед дундаж хадгалах горим идэвхждэг Suspend - + зарцуулах Shutdown - + Унтраах Hibernate - + Өвөлждөг Do nothing - + Юу ч хийхгүй + + + + BatterySubItem + + Battery Settings + Батерейны тохиргоо + + + + BiometricItem + + add + Нэмэх @@ -279,17 +572,17 @@ CPanelAudioWidget - + CPanelAudioWidget Output - + Гаралтын Input - + Оролт @@ -297,39 +590,61 @@ CPanelNetworkWidget - - - - - Wireless Network - + CPanel NetworkWidget - - + + VPN - + VPN - - + + Network Details - + Сүлжээний дэлгэрэнгүй мэдээлэл + + + + + + + + Wired Network + Утастай сүлжээ + + + + + + + + + Wireless Network + Утасгүй сүлжээ - + Connected - + Холбогдсон - + Unavailable - + Боломжгүй - + Disconnected - + Салгах + + + Wired Network %1 + Утастай сүлжээ %1 + + + Wireless Network %1 + Утасгүй сүлжээ %1 @@ -337,47 +652,51 @@ Form - + Хэлбэр Host Name: - + Хост нэр: EditHostName - + EditHostName ButtonSaveHostName - + ButtonSaveHostName Save - + Хадгалах ButtonCancelChangeHostName - + ButtonCanceChangeHostName Cancel - + Цуцлах + + + Host Name + Хост нэр Warning - + Анхааруулга Change host name failed! Please check the Dbus service! - + Хөтлөгчийн нэрийг хамтад нь өөрчил! Dbus үйлчилгээг гарга! @@ -385,12 +704,12 @@ Check password - + Нууц үг шалгах Check the current password before you enroll the feature - + Онцлог руу орохоосоо өмнө одоогийн нууц үгийг шалгана уу @@ -398,7 +717,7 @@ Form - + Хэлбэр @@ -406,12 +725,12 @@ ConnectionDetailsWidget - + ConnectionDetailsWidget Security type - + Аюулгүй байдлын төрөл @@ -428,129 +747,187 @@ TextLabel - + TextLabel Frequency band - + Freeconny хамтлаг Channel - + Суваг Interface - + Интерфэйс MAC - + MAC IPv4 - + IPv4 Gateway - + Гарц DNS - + DNS Subnet mask - + Дэд сүлжээний маск IPv6 - + IPv6 Prefix - + Шинэчилсэн найруулга Rate - + Хувь хэмжээ + + + Preferred DNS + Давуу эрхтэй DNS - ConnectionNameWidget + ConnectionItemWidget - - ConnectionNameWidget - + + disconnect + Салгах - - TextLabel - + + ignore + Үл тоомсорлох - - EditConnectionName - + + remove + Устгах - - Auto Connection - + + The current device:%1 is not available + Одоогийн төхөөрөмж: %1 байхгүй байна - - Required - + + The carrier is pulled out + Тээвэрлэгчийг гаргаж авдаг - - Wired Connection %1 - + + Are you sure you want to delete the connection %1 + Та %1 холболтыг арилгахыг хүсч байна уу? - - VPN L2TP %1 - + + Warning + Анхааруулга - - VPN PPTP %1 - + + + Tips + Зөвлөгөө - - Connection name can not be empty - + + Password required to connect to %1. + Нууц үг нь %1-д холбогдохыг шаарддаг. + + + + Please input a network name + Сүлжээний нэрийг гаргах - ConnectionShowPage + ConnectionNameWidget + + + ConnectionNameWidget + ConnectionNameWidget + + + + TextLabel + TextLabel + + + + EditConnectionName + EditConnectionName + + + + Auto Connection + Автомат холболт + + + + Required + шаардлагатай + + + + Wired Connection %1 + Утастай холболт %1 + + + + VPN L2TP %1 + VPN L2TP %1 + + + + VPN PPTP %1 + VPN PPTP %1 + + + + Connection name can not be empty + Холболтын нэрийг эс тооцвол байж болохгүй + + + + ConnectionShowPage ConnectionShowPage - + ConnectionShowPage TextLabel - + TextLabel ButtonCreateConnection - + ButtonCreateConnection @@ -558,190 +935,229 @@ CreateGroupPage - + CreateGroupPage Create Group - + Групп байгуулах Add Group Members - + Бүлгийн гишүүдийг нэмнэ үү Confirm - + Батлах Please enter your group name - + Бүлгийн нэрээ оруулна уу group name cannot be a pure number - + бүлгийн нэр цэвэр тоо байж болохгүй group name already exists - + Бүлгийн нэрийн дугаарууд байдаг Error - + Алдаа CreateUserPage + + Account type + Дансны төрөл + + + + standard + Стандарт + + + + administrator + удирдах + + + + Please enter user name first + Хувилагчийн хэрэглэгчийн нэр эхлээд + + + + Please enter your user name + Хөдөлгүүрийг хэрэглэгчийн нэрээ гарга + + + + user name cannot be a pure number + Хэрэглэгчийн нэр цэвэр тоо байж болохгүй + + + + user name already exists + Хэрэглэгчийн нэрийн коллеж байдаг + + + + Please enter your password + Нууц үгээ оруулна уу + + + + Please enter the password again + Нууц үгийн өвийг суллагч + + + + The password you enter must be the same as the former one + Таны оруулсан нууц үг нь өмнөхтэй адил нэр байх ёстой + + + + + Error + Алдаа + + + + Password encryption failed + Нууц үг шифрлэлтийн санхүүжилт + Form - + Хэлбэр UserAvatarWidget - + UserAvatarWidget User name - + Хэрэглэгчийн нэр EditUserName - + EditUserName User type - + Хэрэглэгчийн төрөл ComboUserType - + ComboUserType Password - + Нууц үг EditPasswd - + EditPasswd Confirm password - + Нууц үг баталгаажуулах EditPasswdConfirm - + EditPasswdConfirm ButtonAdvanceSetting - + ButtonAdvanceSetting Advance setting - + Урьдчилсан тохиргоо ButtonConfirm - + ButtonConfirm Confirm - + Батлах ButtonCancel - + ButtonCancell Cancel - - - - - standard - - - - - administrator - - - - - Please enter user name first - + Цуцлах - - Please enter your user name - + Please enter account name first + Бизнес эрхлэгчийн дансны нэрийг эхлээд гарга - - user name cannot be a pure number - + Please enter your account name + Бизнес эрхлэгчийн дансны нэрийг гаргах - - user name already exists - + Account cannot be a pure number + Данс нь цэвэр хүн ам байж болохгүй - - Please enter your password - + Account already exists + Бэлтгэсэн данс байна - - Please enter the password again - + Please enter your userName name + Бизнес эрхлэгч хэрэглэгчийн нэрийг гарга + + + CursorThemePage - - The password you enter must be the same as the former one - + + Cursor Themes Settings + Cursor ThemSettings + + + CursorThemes - - - Error - + Cursor Themes Settings + Cursor ThemSettings - - Password encryption failed - + Faild + Хий - - - CursorThemePage - - Cursor Themes Settings - + Set cursor themes failed! + Курсорын сэдвүүдийг бүдгэрүүл! @@ -749,37 +1165,37 @@ DateTimeSettings - + DateTimeSettings Select Time - + Цаг сонгох Select Date - + Огноо сонгох ButtonSave - + ButtonSave save - + Хадгалах ButtonReset - + ButtonReset reset - + Дахин тохируулах @@ -787,54 +1203,72 @@ %1 - + %1% DefaultApp - + DefaultApp - + DefaultApp - + Web Browser - + Вэб хөтөч - + Email - + Имэйл - + Text - + Текст - + Music - + Хөгжим - + Video - + Видео - + Image - + Зураг DefaultappPlugin - - + Email + Имэйл + + + Text + Текст + + + Music + Хөгжим + + + Video + Видео + + + Image + Зураг + + DefaultApp - + DefaultApp @@ -842,22 +1276,48 @@ DetailsPage - + Дэлгэрэнгүй мэдээлэл Network Details - + Сүлжээний дэлгэрэнгүй мэдээлэл Please select a connection - + Холболтыг сонго ComboBoxDetailsSelectConnection - + ComboBoxDetailsSelectConnection + + + + DeviceAvailableConnectionWidget + + + Network card: %1 + Сүлжээний карт: %1 + + + + Other WiFi networks + Бусад WiFi сүлжээнүүд + + + + DeviceList + + + Wired Network Adapter + Утастай сүлжээний адаптер + + + + Wireless Network Adapter + Утасгүй сүлжээний адаптер @@ -865,57 +1325,57 @@ Form - + Хэлбэр Rotate left 90 degrees - + Эргүүлэх нь 90 градус үлдсэн ButtonLeft - + ButtonLeft Rotate right 90 degrees - + Баруун тийш 90 градус эргүүлнэ ButtonRight - + ButtonRight Turn left and right - + Зүүн, баруун тийш эргэ ButtonHorizontal - + ButtonHorizontal upside down - + Дээш доош ButtonVertical - + ButtonVertical Identification display - + Таних тэмдгийн дэлгэц ButtonIdentifying - + Товчлуур @@ -923,47 +1383,47 @@ DisconnectAndDeleteButton - + AndDeleteButton-г салга ButtonDisconnect - + ButtonDisconnect Disconnect - + Салгах ButtonDelete - + ButtonDelete Delete - + Устгах ButtonIgnore - + ButtonIgnore Ignore - + Үл тоомсорлох - + Are you sure you want to delete the connection %1 - + Та %1 холболтыг арилгахыг хүсч байна уу? - + Warning - + Анхааруулга @@ -971,52 +1431,52 @@ DisplayFormatSettings - + DisplayFormatSettings Long date display format - + Урт огнооны дэлгэцийн формат ComboLongDateDisplayFormat - + ComboLongDateDisplayFormat Short date display format - + Богино огнооны дэлгэцийн формат ComboShortDateDisplayFormat - + ComboShortDateDisplayFormat Time format - + Форматын цаг ComboTimeFormat - + ComboTimeFormat Show time witch seconds - + Цагийн шулмын секундийг харуул 24-hours - + 24 цаг 12-hours - + 12 цаг @@ -1024,154 +1484,154 @@ DisplayPage - + DisplayPage ButtonCopyDisplay - + ButtonCopyDisplay Copy display - + Хуулбарлах дэлгэц ButtonExtendedDisplay - + ButtonExtendedDisplay Extended display - + Өргөтгөсөн дэлгэц Resolution ratio - + Тогтоолын харьцаа ComboResolutionRatio - + ComboResolutionRatio Refresh rate - + Сэргээх үнэ ComboRefreshRate - + ComboRefreshRate Zoom rate - + Томруулах хурд ComboZoomRate - + ComboZoomRate Automatic - + Автомат 100% (recommended) - + 100% (recombended) 200% - + 200% Open - + Нээлттэй Set as main display - + Үндсэн дэлгэц болгон тохируулна уу SwitchExtraPrimary - + SwitchExtraPrimary ComboExtraResolutionRatio - + ComboExtraResolutionRatio ComboExtraRefreshRate - + ComboExtraRefreshRate ComboExtraZoomRate - + ComboExtraZoomRate ButtonExtraApply - + ButtonExraApply Apply - + Хэрэглэнэ ButtonExtraCancel - + ButtonExtraCancel Close - + Ойртох (recommended) - + (recombended) Is the display normal? - + Дэлгэц хэвийн байна уу? Save current configuration(K) - + Одоогийн тохиргоо(K)-г хадгална уу Restore previous configuration(R) - + Priorityconfiguration(R)-г сэргээнэ үү The display will resume the previous configuration in %1 seconds - + Дэлгэц нь %1 секундын дотор тэргүүлэх ач холбогдолтой бүтээцүүдийг бий болгоно @@ -1179,7 +1639,7 @@ Display - + Харуулах @@ -1187,17 +1647,17 @@ DnsWidget - + DnsWidget Preferred DNS - + Давуу эрхтэй DNS Alternate DNS - + Өөр DNS @@ -1205,37 +1665,41 @@ device type - + Төхөөрөмжийн төрөл driver list - + Жолоочийн жагсаалт Fingerprint - + Хурууны хээ + + + FingerVein + Хурууны судал Fingervein - + Хурууны iris - + Цахилдаг ukey - + Ukey face - + Нүүр @@ -1243,12 +1707,12 @@ DslManager - + DSLManager DSL - + DSL @@ -1256,17 +1720,17 @@ DslSettingPage - + DSLSettingPage Save - + Хадгалах Return - + Буцах @@ -1274,251 +1738,340 @@ EthernetWidget - + EthernetWidget MAC Address Of Ethernet Device - + Ethernet төхөөрөмжийн MAC хаяг ComboBoxDeviceMac - + ComboBoxDeviceMac Ethernet Clone MAC Address - + Ethernet Clone MAC хаяг EditDeviceMac - + EditDeviceMac Custom MTU - + Захиалгат MTU SpinBoxCustomMTU - + SpinBoxCustomMTU - + No device specified - + Ямар ч төхөөрөмж заагаагүй - + Clone Mac invalid - + Clone Mac хүчингүй - FacePage + FaceEnrollDialog - - face - + save + Хадгалах + + + cancel + Цуцлах + + + initializing face collection environment... + нүүр царайны бодлогын шийдвэрийг эхлүүлэх... + + + failed to initialize face collection environment! + Нүүрний хамрах хүрээний үр дүнг эхлүүлэх талбар! + + + Failed to start collection + Сонгон шалгаруулалтыг эхлүүлэх талбар + + + + FaceInputDialog + + save + Хадгалах + + + cancel + Цуцлах + + + initializing face collection environment... + нүүр царайны бодлогын шийдвэрийг эхлүүлэх... + + + failed to initialize face collection environment! + Нүүрний хамрах хүрээний үр дүнг эхлүүлэх талбар! + + Failed to start collection + Сонгон шалгаруулалтыг эхлүүлэх талбар + + + + FacePage Default face device - + Анхдагч нүүрний төхөөрөмж face feature list - + Нүүрний онцлог жагсаалт + + + + face + Нүүр Cancel - + Цуцлах Start enroll failed,%1 - + Элсэлтийн талбарыг эхлүүл,%1 Error - + Алдаа The biometric features were successfully recorded. The feature name is:%1 - + Биометрийн шинж чанаруудыг хаа сайгүй хариуцлагатайгаар бүртгэдэг. Онцлогын нэр нь: %1 Tips - + Зөвлөгөө Failed to record biometrics(%1), Please try again - + Биометрикс(%1)-г бүртгэж чадаагүй тул агеныг туршиж үзээрэй FingerPage + + + Cancel + Цуцлах + fingerprint - + Хурууны хээ fingervein - + Хурууны - - Default %1 device - + default %1 device + Анхдагч %1 төхөөрөмж %1 list - - - - - Cancel - + %1 жагсаалт Start enroll failed,%1 - + Элсэлтийн талбарыг эхлүүл,%1 Error - + Алдаа The biometric features were successfully recorded. The feature name is:%1 - + Биометрийн шинж чанаруудыг хаа сайгүй хариуцлагатайгаар бүртгэдэг. Онцлогын нэр нь: %1 Tips - + Зөвлөгөө Failed to record biometrics(%1), Please try again - + Биометрикс(%1)-г бүртгэж чадаагүй тул агеныг туршиж үзээрэй + + + %1list + %1 жагсаалт + + + + Default %1 device + Анхдагч %1 төхөөрөмж - Fonts + FingerprintEnrollDialog - - Form - + save + Хадгалах - - Application Font Settings - + cancel + Цуцлах - - ComboAppFontName - + Finger Enroll + Хурууны элсэлт - - ComboAppFontSize - + This fingerprint is bound to the user(%1) + Энэхүү нарийн хээ нь хэрэглэгчийн(%1)-тэй холбогддог - - Titlebar Font Settings - + Info + Мэдээлэл + + + Error + Алдаа + + + + FingerprintInputDialog + + save + Хадгалах + + + cancel + Цуцлах + + + Finger Enroll + Хурууны элсэлт + + + Error + Алдаа + + + + FingerprintInputWorker + + initializing fingerprint collection environment... + Металл хээг эхлүүлэх байгаль орчин... + + + + Fonts + + + Form + Хэлбэр - - ComboTitleFontName - + Application Font Settings + Хэрэглээний үсгийн тохиргоо - - ComboTitleFontSize - + Titlebar Font Settings + Гарчгийн мөрийн үсгийн тохиргоо - Monospace Font Settings - + Monospace Font Settings + + + + Word size + Үгийн хэмжээ - - ComboMonospaceFontName - + + System font + Системийн фонт - - ComboMonospaceFontSize - + + Monospaced font + Нэг зайтай фонт GeneralBioPage - - Rename Feature - + + default device + анхдагч төхөөрөмж - - Please enter the renamed feature name - + + 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-ийг арилгахыг хүсч байгаагаа тодорхой хэлж байна уу, Байгаль орчин Их Британийн гол шийдлийг тодорхойлсон; эс бөгөөс устгахын тулд мэдээллийн сан Are you sure you want to delete the feature called %1 - + Та %1 функцийн дуудлагыг устгахыг хүсч байгаа гэдэгт итгэлтэй байна уу tips - + Зөвлөгөө Error - + Алдаа Failed to enroll feature because the password verification failed! - + Байгаль орчны шошго нь бүтэлгүйтсэн нууц үгийн баталгаажуулалт хүчингүй болсон! - - default device - + + Rename Feature + Соёл гэж нэрлэх - - feature list - + + Please enter the renamed feature name + Нэрийг нь өөрчилсөн функцийн нэрийг гаргасан @@ -1526,83 +2079,87 @@ Form - + Хэлбэр Capslock Tip - + Capslock Tip Numlock Tip - + Numlock Tip Repeat Key - + RepEAT түлхүүр (Repeat a key while holding it down) - + (Repeat түлхүүрийг доош нь барьж байхад SwitchRepeatKey - + SwitchRepeatKey Delay - + Хойшлуулах SliderRepeatDelay - + SliderRepeatDelay Short - + Богино Long - + Урт Interval - + Интервал SliderRepeatInterval - + SliderReptInterval Slow - + Удаан Fast - + Хурдан Enter repeat characters to test - + Туршилт хийх аж ахуйн нэгжийн картууд EditTestRepeatKey - + EditTestRepeatKey + + + Enter characters to test the settings + Тохиргоог турших дүрэм @@ -1610,150 +2167,157 @@ GeneralSettingsPage - + GeneralSettingsPage When the power button is pressed - + Цахилгаан товчийг тавих үед ComboPowerButtonAction - + ComboPowerButtonAction When the suspend button is pressed - + Түлхэх товчлуур тавигдах үед ComboSuspendAction - + ComboSuspendAction When closing the lid - + Тагийг хаах үед ComboCloseLidAction - + ComboCloseLidAction Computer Mode - + Компьютерийн горим Display brightness setting - + Гэрэлтүүлгийн цуглуулгыг харуулах 0% - + 0% SliderDisplayBrightness - + SliderDisplayBrightness Color temperature - + Өнгөний демо Automatic color temperature - + Автомат өнгөний түүх cold - + Хүйтэн standard - + Стандарт warm - + Дулаан Regard computer as idle after - + Дараа нь нийтлэл болгон компьютерийг авч үзье SliderComputerIdleTime - + SliderComputerIdleTime Lock screen when idle - + Дэлгэцийг хэзээ түгжих үед password is required to wake up in standby mode - + Нууц үг нь стандарт горимд нөхөх шаардлагатай shutdown - + Унтраах hibernate - + Өвөлждөг suspend - + зарцуулах display off - + Дэлгэц унтраах do nothing - + Юу ч хийхгүй ERROR - + АЛДАА %1hour - + %1 цаг% %1minute - + %1 минут + + + + GeneralSettingsSubItem + + General Settings + Ерөнхий тохиргоо @@ -1761,7 +2325,7 @@ Keyboard General Option - + Гарны ерөнхий сонголт @@ -1769,52 +2333,52 @@ Form - + Хэлбэр TextLabel - + TextLabel Group - + Бүлэг Member List - + Танхимын жагсаалт Add User - + Хэрэглэгч нэмэх Delete - + Устгах Add Member - + Санах ой нэмнэ Save - + Хадгалах Cancel - + Цуцлах Please input keys for search... - + Хайлтын оролтын түлхүүрүүдийг суллана уу... @@ -1822,7 +2386,7 @@ Error - + Алдаа @@ -1830,22 +2394,22 @@ Group - + Бүлэг Creat group - + Их бүлэг Change group name - + Бүлгийн нэрийг өөрчлөх Add group member - + Бүлгийн мессеж нэмнэ үү @@ -1853,68 +2417,100 @@ Create User failed - - - - - Failed to connect to the account management service - + Хэрэглэгчийн талбар үүсгэх update password failed - + Товлосон нууц үгээ шинэчлэх icon file - + Ионы файл userName type - + UserName төрөл locked - + Түгжээтэй Failed to update user properties,%1 - + Хэрэглэгчийн шинж чанарыг шинэчилж чадаагүй,%1 Failed to delete user,%1 - + Хэрэглэгчийг устгаж чадаагүй, %1 + + + password + Нууц үг + + + home directory + Гэрийн лавлах + + + shell + Бүрхүүл + + + icon + Ионы + + + Failed to set user attributes + Хэрэглэгчийг эх сурвалжид тохируулж чадаагүй + + + account type + Дансны төрөл + + + Failed to update user properties(%1) + Хэрэглэгчийн property(%1)-г шинэчилж чадаагүй + + + Failed to delete user + Хэрэглэгчийг устгаж чадаагүй + + + + Failed to connect to the account management service + Дансны үйлчилгээнд холбогдох талбар Create Group failed - + Бүлэг байгуулах Failed to delete group,%1 - + Бүлгийг устгах гэж байна, %1 add user to group failed - + Бүлэглэсэн хэрэглэгчдэд нэмнэ үү change group name failed - + Бүлгийн нэрийн талбарыг өөрчлөх change group name failed, the new group name is occupied - + Бүлгийн нэрийн багийн талбайг өөрчил, бүлгийн шинэ нэрийг эзэлнэ @@ -1922,60 +2518,95 @@ Form - + Хэлбэр CPU: - + CPU: LabelCpuInfo - + LabelCpuInfo TextLabel - + TextLabel Memory: - + Санах ой: LabelMemoryInfo - + Label MemoryInfo Hard disk: - + Хатуу диск: Graphics card: - + График карт: Network card: - + Сүлжээний карт: + + + Copyright © + Зохиогчийн эрх © + + + KylinSec. All rights reserved. + KylinSec. Бүх эрхийн хяналт. Unknow - + Үл мэдэгдэх %1 GB (%2 GB available) - + %1 GB (%2 GB боломжтой) + + + + HardwareInformationWidget + + CPU: + CPU: + + + Memory: + Санах ой: + + + Hard disk: + Хатуу диск: + + + Graphics card: + График карт: + + + Network card: + Сүлжээний карт: + + + Unknow + Үл мэдэгдэх @@ -1983,7 +2614,7 @@ Hardware Information - + Техник хангамжийн мэдээлэл @@ -1991,12 +2622,46 @@ Form - + Хэлбэр Icon Themes Setting - + Icon ThemSetting + + + + IconThemes + + Icon Themes Setting + Icon ThemSetting + + + Faild + Хий + + + Set icon themes failed! + Дүрсүүдийн сэдвүүдийг бүдгэрүүлсэн! + + + + IdentificationRenameDialog + + Rename Feature + Соёл гэж нэрлэх + + + Please enter the renamed feature name + Нэрийг нь өөрчилсөн функцийн нэрийг гаргасан + + + Confirm + Батлах + + + Cancel + Цуцлах @@ -2004,22 +2669,22 @@ Add Image Failed - + Зургийн санг нэмнэ үү The image already exists! - + Зургийн дугаарууд байна! Delete image - + Зургийг устгах Are you sure you want to delete this picture? - + Та энэ зургийг устгахыг хүсч байгаа гэдэгт итгэлтэй байна уу? @@ -2027,12 +2692,12 @@ Confirm - + Батлах Cancel - + Цуцлах @@ -2040,37 +2705,42 @@ InputPage - + InputPage + Input cards + Оролтын картууд + + + Input devices - + Оролтын төхөөрөмжүүд - + ComboBoxInputDevices - + ComboBoxInputDevices - + Input volume - + Оролтын тогтворгүй байдал - + SliderVolumeSetting - + SliderVolumeSetting - + Feedback volume - + Санал хүсэлтийн боть - + No input device detected - + Оролтын төхөөрөмж хамгаалалтгүй @@ -2078,118 +2748,124 @@ Ipv4Widget - + IPv4Widget IPV4 Method - + IPV4 арга ComboBoxIpv4Method - + ComboBoxIpv4Method IP Address - + IP хаяг EditIpv4Address - + EditIpv4Address Net Mask - + Цэвэр маск EditIpv4Netmask - + EditIpv4Netmask Gateway - + Гарц EditIpv4Gateway - + EditIpv4Gateway - DNS 1 - - - - - DNS 2 - + DNS + DNS EditIpv4PreferredDNS - + EditIpv4 PreferredDNS - - EditIpv4AlternateDNS - - - - + Auto - + Автомат - + Manual - + Гарын авлага - + Required - + шаардлагатай + + + + Please separate multiple DNS entries by semicolon + Semiconductor-ийн олон DNS оруулгуудыг хуваах + + + + Ipv4 DNS invalid + IPv4 DNS хүчингүй - + Ipv4 address can not be empty - + IPv4 хаягийг эс тооцвол байж болохгүй - + Ipv4 Address invalid - + IPv4 хаяг хүчингүй - + NetMask can not be empty - + NetMask-ийг эс тооцвол байж болохгүй - + Netmask invalid - + Netmask хүчингүй - + Ipv4 Gateway invalid - + IPv4 гарц хүчингүй + + + Preferred DNS + Давуу эрхтэй DNS + + + Alternate DNS + Өөр DNS - Ipv4 Preferred DNS invalid - + IPv4 Давуу эрхтэй DNS хүчингүй - Ipv4 Alternate DNS invalid - + IPv4 Alternate DNS хүчингүй @@ -2197,161 +2873,178 @@ Ipv6Widget - + IPv6Widget IPV6 Method - + IPV6 арга ComboBoxIpv6Method - + ComboBoxIpv6Method IP Address - + IP хаяг EditIpv6Address - + EditIpv6Address Prefix - + Шинэчилсэн найруулга SpinBoxIpv6Prefix - + SpinBoxIpv6 Prefix Gateway - + Гарц EditIpv6Gateway - + EditIpv6Gateway - Preferred DNS - + DNS + DNS EditIpv6PreferredDNS - - - - - Alternate DNS - - - - - EditIpv6AlternateDNS - + EditIpv6 PreferredDNS - + Auto - + Автомат - + Manual - + Гарын авлага - + Ignored - + Үл тоомсорлох - + Required - + шаардлагатай + + + + Please separate multiple DNS entries by semicolon + Semiconductor-ийн олон DNS оруулгуудыг хуваах + + + + Ipv6 DNS invalid + IPv6 DNS хүчингүй - + Ipv6 address can not be empty - + IPv6 хаягийг эс тооцвол байж болохгүй - + Ipv6 address invalid - + IPv6 хаяг хүчингүй - + Ipv6 Gateway invalid - + IPv6 гарц хүчингүй + + + Preferred DNS + Давуу эрхтэй DNS + + + Alternate DNS + Өөр DNS - Ipv6 Preferred DNS invalid - + IPv6 Давуу эрхтэй DNS хүчингүй - Ipv6 Alternate DNS invalid - + IPv6 Alternate DNS хүчингүй IrisPage - - - iris - - Default Iris device - + Цахилдаг төхөөрөмжийн анхдагч Iris feature list - + Цахилдаг онцлогийн жагсаалт + + + + iris + Цахилдаг Cancel - + Цуцлах Start enroll failed,%1 - + Элсэлтийн талбарыг эхлүүл,%1 Error - + Алдаа The biometric features were successfully recorded. The feature name is:%1 - + Биометрийн шинж чанаруудыг хаа сайгүй хариуцлагатайгаар бүртгэдэг. Онцлогын нэр нь: %1 Tips - + Зөвлөгөө Failed to record biometrics(%1), Please try again - + Биометрикс(%1)-г бүртгэж чадаагүй тул агеныг туршиж үзээрэй + + + + KcpInterface + + Warning + Анхааруулга + + + load qss file failed + Qss файлын файлын файлыг ачаална уу @@ -2359,7 +3052,7 @@ Keybinding - + Түлхүүр холбох @@ -2367,12 +3060,35 @@ None - + Аль нь ч disabled - + Тахир дутуу + + + + KiranAccountManager + + disable + Тахир дутуу + + + enable + Тогтвортой + + + Create new user + Шинэ хэрэглэгч үүсгэх + + + User Manager + Хэрэглэгчийн менежер + + + Create new account + Шинэ данс үүсгэх @@ -2380,17 +3096,154 @@ Avatar Editor - + Аватар редактор Confirm - + Батлах Cancel - + Цуцлах + + + + KiranCPanelMouse + + Mouse and TouchPad + Байшин ба мэдрэгчтэй самбар + + + + KiranCPanelMouseWidget + + Select Mouse Hand + Байшингийн гарыг сонго + + + Mouse Motion Acceleration + House Motion Acceleration + + + Natural Scroll + Байгалийн гүйлгэх + + + Middle Emulation Enabled + Дунд эмуляцийг идэвхжүүлэх боломжтой + + + Touchpad Enabled + Мэдрэгч самбарыг идэвхжүүлсэн + + + Select TouchPad Hand + Хүрзний гарыг сонго + + + TouchPad Motion Acceleration + TouchPad хөдөлгөөнийг хурдасгах + + + Select Click Method + Товших аргыг сонгох + + + Select Scroll Method + Гүйлгэх аргыг сонгох + + + Enabled while Typing + Бичиж байхдаа идэвхжүүлнэ + + + Tap to Click + Товших + + + Reset + Дахин тохируулах + + + Exit + Гарах + + + Cancel + Цуцлах + + + Save + Хадгалах + + + Mouse Settings + Байшингийн тохиргоо + + + TouchPad Settings + Хүрч самбарын тохиргоо + + + Standard + Стандарт + + + Right Hand Mode + Баруун гарын горим + + + Left Hand Mode + Зүүн гарын горим + + + Press and Tap + Дарж, товш + + + Tap + Товших + + + Two Finger Scroll + Хоёр хурууны гүйлгэх + + + Edge Scroll + Edge Scroll + + + Slow + Удаан + + + Fast + Хурдан + + + + KiranCollapse + + + ListExpansionSpace + ListExpansionSpace + + + + KiranCpanelAppearance + + Wallpaper Setting + Ханын цаасны суурьшил + + + Theme Setting + Сэдэвт суурьших + + + Font Setting + Үсгийн суурьшил @@ -2398,7 +3251,7 @@ Form - + Хэлбэр @@ -2406,15 +3259,34 @@ Create new group - + Шинэ бүлэг байгуулах KiranModuleWidget + + Warning + Анхааруулга + + + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + %1 дэх засварласан контент хадгалагдаагүй болно. Шилжүүлсний дараа засварласан контент нь жагсаалт байх болно. Та хэмнэхийг хүсч байгаа гэдэгт итгэлтэй байна уу? + Form - + Хэлбэр + + + + KiranSystemWidget + + kiran-system-imformation + Киран-систем-имформаци + + + 保存 + Хадгалах @@ -2422,96 +3294,191 @@ KiranTimeDateWidget - + KiranTimeDateWidget + + + + Automatic synchronizetion + Автомашины синхрончлол + + + + Change Time Zone + Цагийн бүсийг өөрчлөх + + + + Set Time Manually + Цагийг гараар тохируулна уу + + + + Time date format setting + Хугацаа огнооны форматыг тохируулах + + + + %1(%2) + %1(%2) + + + + KiranTimePickerWidget + + + Form + Хэлбэр + + + + KiranTimeZone + + + Form + Хэлбэр + + + + Search in all time zones... + Бүх цагийн бүсээс хайх... + + + + KiranTimeZoneItem + + + Form + Хэлбэр + + + + No search results, please search again... + Хайлтын үр дүн байхгүй, шалтгаан (... + + + + KiranTimeZoneList + + + Form + Хэлбэр + + + + KiranTips + + + + Form + Хэлбэр + + + + KylinsecLogo + + + Copyright © + Зохиогчийн эрх © + + + + KylinSec. All rights reserved. + KylinSec. Бүх эрхийн хяналт. + + + + LangpackInstaller + + Package Install + Багц суулгах + + + Installing... + Суулгах... + + + Install Complete! + Бүрэн суулгах! + + + + LanguageManager + + Error + Алдаа - - Automatic synchronizetion - + set locale failed + орон нутгийн сургуулийн талбайг тогтооно - - Change Time Zone - + %1 inexistence in system + %Систем дэх %1 + + + LanguagePage - - Set Time Manually - + Language Select(Reboot to take effect) + Language Select(Reboot нь )-г хэрэгжүүлэх болно - - Time date format setting - + Simplified Chinese + Хялбаршуулсан хятад - - %1(%2) - + English + Англи хэл - - - KiranTimePickerWidget - - Form - + Tibetan + Төвд - - - KiranTimeZone - - Form - + Kirgiz + Киргиз - - Search in all time zones... - + Mongolian + Монгол - - - KiranTimeZoneItem - - Form - + Kazakh + Казак - - No search results, please search again... - + Uighur + Уйгар - KiranTimeZoneList + LanguagePlugin - - Form - + Language + Хэл - KiranTips + LanguageSelectDialog - - - Form - + Dialog + Хэлэлцүүлэг - - - KylinsecLogo - - Copyright © - + No + Үгүй - - KylinSec. All rights reserved. - + Yes + Тийм + + + Add Language + Хэл нэмнэ + + + Search + Хайлт @@ -2519,7 +3486,7 @@ Form - + Хэлбэр @@ -2527,7 +3494,7 @@ LayoutList - + LayoutList @@ -2535,44 +3502,44 @@ Form - + Хэлбэр Select Kayboard Layout - + Kayboard Layout-ийг сонго Edit - + Засварлах Add Layout - + Байршлыг нэмэх ButtonAddLayout - + Товчлуур AddLayout Addition - + Нэмэлт ButtonReturn - + ButtonReturn Return - + Буцах @@ -2580,37 +3547,37 @@ Failed - + Хонхойсон You have added this keyboard layout! - + Та энэ гарны зохион байгуулалтыг нэмсэн! The %1 keyboard layout does not exist! - + %1 гарны зохион байгуулалт нь устахгүй! The keyboard layout is currently in use and cannot be deleted! - + Гарын зохион байгуулалт нь одоо байгаа бөгөөд устгах боломжгүй! Delete Layout - + Байршлыг устгах You do not appear to have added %1 keyboard layout! - + Та %1 гарны зохион байгуулалттай байхаар гарын үсэг зурахгүй байна! Finish - + Дуусгах @@ -2618,7 +3585,7 @@ Keyboard Layout - + Гарны зохион байгуулалт @@ -2626,79 +3593,197 @@ Form - + Хэлбэр BrowserLicense - + BrowserLicense <!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;"> +</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> - + <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <html><><==>"qrichtext" content<"1" /=>style type"text/css" + p,li { цагаан орон зай: урьдчилан боодол; } + </style><>/head<=body style>" үсгийн гэр бүл: 'Noto Sans CJK SC'; үсгийн хэмжээ:9pt; үсгийн хараа: 400; үсгийн хэв маяг: хэвийн; " + <p style="-qt- догол мөрийн төрөл: эс тооцвол; захын дээд:0px; маржин-доод:0px; маржин-өргөлт:0px; маржин-өргөлт:0px; маржин-баруун:0px; -qt-block-ent:0; текст-индент:0; текст-индент:0; текст-индент:0px; ">/<br/ p></body></html> ButtonExportLicense - + ButtonExportLicense Export - + Экспортлох ButtonCloseLicense - + ButtonCloseLicense Close - + Ойртох - + Save - + Хадгалах - + PDF(*.pdf) - + PDF(*.pdf) - + Export License - + Экспортын лиценз - + Export License failed! - + Экспортын лиценз FALED! - + User End License Agreement - + Хэрэглэгчийн эцсийн лиценз - - - - + + + + + + None - + Аль нь ч - + Version License - + Хувилбарын лиценз + + + Export EULA + EULA экспортлох + + + Export EULA failed! + Экспортын EULA-г битүүмжилсэн! + + + + + Privacy Policy + Нууцлалын бодлого + + + + LicenseInfoWidget + + Machine Code: + Машины код: + + + Activation Code: + Үйл ажиллагааны код: + + + Activation Information + Үйл ажиллагааны мэдээлэл + + + Can't get machine code + Машины код авч чадахгүй + + + Can't get activation code + Үйл ажиллагааны код авч чадахгүй + + + + LicenseInformation + + Installation time: + Суурилуулах хугацаа: + + + Activation status: + Үйл ажиллагааны байдал: + + + Expiry date: + Хугацаа дуусах огноо: + + + Contact Us: + Бидэнтэй холбоо бариарай: + + + Unknow + Үл мэдэгдэх + + + Can't get activation information + Үйл ажиллагааны мэдээлэл авч чадахгүй + + + Activate + Идэвхжүүлэх + + + The current time is illegal + Одоогийн цаг нь хууль бус юм + + + Less than the installation time + Суулгах хугацаанаас бага + + + Not activated. Trail expiration: + Идэвхгүй. Замын хасалт: + + + get service status failed + үйлчилгээний статусын статусын файлыг аваарай + + + Not yet + ХАРААХАН БОЛООГҮЙ БАЙНА + + + Activated + Идэвхжүүлсэн + + + Forever + Үүрд мөнх + + + Copyright © + Зохиогчийн эрх © + + + KylinSec. All rights reserved. + KylinSec. Бүх эрхийн хяналт. + + + + ListExpansionSpace + + + ListExpansionSpace + ListExpansionSpace @@ -2706,87 +3791,87 @@ p, li { white-space: pre-wrap; } Audio Play - + Аудио тоглуулах Search - + Хайлт WWW - + WWW Audio Lower Volume - + Аудио цамхагийн хэмжээ Audio Raise Volume - + Аудио өсгөх хэмжээ Mic Mute - + Микро дуугүй Audio Stop - + Аудио дэлгүүр Explorer - + Судлаач Calculator - + Тооцоологч Audio Mute - + Аудио дуугүй Audio Pause - + Аудио түр зогсоох Audio Prev - + Аудио Prev Audio Media - + Аудио медиа Audio Next - + Аудио Next Mail - + Захиа Tools - + Хэрэгсэл Eject - + Цахим төсөл @@ -2794,7 +3879,7 @@ p, li { white-space: pre-wrap; } MMMM - + МММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММММ @@ -2802,62 +3887,62 @@ p, li { white-space: pre-wrap; } Form - + Хэлбэр Select Mouse Hand - + Байшингийн гарыг сонго ComboSelectMouseHand - + ComboSelectMouseHand Mouse Motion Acceleration - + House Motion Acceleration SliderMouseMotionAcceleration - + SliderMouseMotionAcceleration Slow - + Удаан Fast - + Хурдан Natural Scroll - + Байгалийн гүйлгэх SwitchMouseNatturalScroll - + SwitchMouseNatturalScroll Middle Emulation Enabled - + Дунд эмуляцийг идэвхжүүлэх боломжтой SwitchMiddleEmulation - + SwitchMiddleEmulation Test mouse wheel direction - + Туршилтын байшингийн дугуйны чиглэл @@ -2911,17 +3996,105 @@ 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-р мөр юм Right Hand Mode - + Баруун гарын горим Left Hand Mode - + Зүүн гарын горим + + + + MouseSettings + + Select Mouse Hand + Байшингийн гарыг сонго + + + Mouse Motion Acceleration + House Motion Acceleration + + + Natural Scroll + Байгалийн гүйлгэх + + + Middle Emulation Enabled + Дунд эмуляцийг идэвхжүүлэх боломжтой + + + Right Hand Mode + Баруун гарын горим + + + Left Hand Mode + Зүүн гарын горим + + + Slow + Удаан + + + Standard + Стандарт + + + Fast + Хурдан @@ -2929,74 +4102,91 @@ This is line 50 of the test text Mouse Settings - + Байшингийн тохиргоо NetworkSubItem - + Wired Network %1 - + Утастай сүлжээ %1 - + Wired Network - + Утастай сүлжээ - + Wireless Network %1 - + Утасгүй сүлжээ %1 - + Wireless Network - + Утасгүй сүлжээ - + VPN - + VPN - + Network Details - + Сүлжээний дэлгэрэнгүй мэдээлэл NetworkTray - + Network settings - + Сүлжээний үүр - - + + Network unavailable - + Сүлжээ боломжгүй + + + + + The network is connected, but you cannot access the Internet + Сүлжээ холбогдсон боловч та интернетэд холбогдох боломжтой + + + + Network not connected + Сүлжээ холбогдоогүй - + Wired network card: %1 available - + Утастай сүлжээний карт: %1 боломжтой - + Wireless network card: %1 available - + Утасгүй сүлжээний карт: %1 боломжтой - + Wired network card: %1 unavailable - + Утастай сүлжээний карт: %1 боломжгүй - + Wireless network card: %1 unavailable - + Утасгүй сүлжээний карт: %1 боломжгүй + + + + + Network connected + Сүлжээ холбогдсон @@ -3004,52 +4194,57 @@ This is line 50 of the test text OutputPage - + OutputPage + + + + Output cards + Гаралтын картууд - + Output devices - + Гаралтын төхөөрөмжүүд - + ComboBoxOutputDevices - + ComboBoxOutputDevices - + Output volume - + Гаралтын тогтворгүй байдал - + SlilderVolumeSetting - + SlilderVolumeSetting - + Left/right balance - + Зүүн/баруун тэнцвэр - + SliderVolumeBalance - + SliderVolumeBalance - + Left - + Зүүн - + Right - + Зөв - + No output device detected - + Гаралтын төхөөрөмж илрээгүй @@ -3057,7 +4252,7 @@ This is line 50 of the test text Control Panel - + Хяналтын самбар @@ -3065,112 +4260,119 @@ This is line 50 of the test text PasswordExpirationPolicyPage - + PasswordExpirationPolicyPage User expires - + Хэрэглэгчийн хугацаа дуусна SpinBoxUserExpires - + SpinBoxUserExpires yyyy-MM-dd - + Yyyy-MM-dd Last password change - + Сүүлийн нууц үгийн өөрчлөлт LabelLastPasswdChange - + LabelLastPasswdChange 1990-01-01 - + 1990-01-01 Maximum vaild days of password - + Нууц үгийн хамгийн их өдөр SpinBoxMaximumValidDays - + SpinBoxMaximumValidDays Prompt time before password expiration - + ЦАГ ХУГАЦААНЫ BEFOWSWORD ЭКСПРЕСС SpinBoxPromptBeforeExpiration - + SpinBoxPromptBeforeExpiration how many days after password expires will become inactive - + Үг хэлэх хугацаа дууссаны дараа хүн хэрхэн үр бүтээлтэй байх вэ SpinBoxPasswdInactiveTime - + SpinBoxPasswd InteractiveTime ButtonSave - + ButtonSave save - + Хадгалах ButtonReturn - + ButtonReturn return - + Буцах day - + Өдөр PluginConnectionList - + Other WiFi networks - + Бусад WiFi сүлжээнүүд - + Tips - + Зөвлөгөө - + Please input a network name - + Сүлжээний нэрийг гаргах + + + + Popup + + cancel + Цуцлах @@ -3178,17 +4380,17 @@ This is line 50 of the test text General Settings - + Ерөнхий тохиргоо Power Settings - + Эрчим хүчний тохиргоо Battery Settings - + Батерейны тохиргоо @@ -3197,19 +4399,19 @@ This is line 50 of the test text power-saver - + Эрчим хүч хэмнэгч balanced - + Тэнцвэртэй performance - + Гүйцэтгэл @@ -3217,52 +4419,59 @@ This is line 50 of the test text PowerSettingsPage - + PowerSettingsPage After idle for more than the following time, the computer will execute - + Дараагийн хугацаанаас илүү хугацаанд сул зогссоны дараа компьютер ажиллах болно ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction The monitor will turn off when it is idle - + Монитор эргэж, дараа нь сул зогсолт хийнэ ComboMonitorTrunOffIdleTime - + ComboMonitorTrunOffIdleTime Suspend - + зарцуулах Shutdown - + Унтраах Hibernate - + Өвөлждөг Do nothing - + Юу ч хийхгүй + + + + PowerSubItem + + Power Settings + Эрчим хүчний тохиргоо @@ -3270,77 +4479,132 @@ This is line 50 of the test text Authentication type Enabled status - + Баталгаажуулалтын төрлийн Идэвхжүүлэх статус fingerprint - + Хурууны хээ fingervein - - - - - ukey - - - - - iris - - - - - face - + Хурууны ... - + ... Return - + Буцах login - + Нэвтрэх unlock - + Түгжээг тайлах empowerment - + Эрх мэдэл Apply the %1 authentication to the following applications - + Дараах програмд %1 програмыг хэрэглэнэ үү + + + + ukey + Ukey + + + + iris + Цахилдаг + + + + face + Нүүр QObject - - Failed - + Did not reply within the specified timeout + Заасан завсарлагатайгаар бууруулаагүй + + + The called service is not known + Дуудлагын үйлчилгээ тодорхойгүй байна + + + warning + Анхааруулга + + + Open qss file failed + qss файлын форматыг нээх + + + + %1Day + %1 өдөр % + + + + %1Hour + %1 цаг + + + + %1Minute + %1 минут + + + + never + Хэзээ ч + + + SLow + НАЛУУ - - Set font failed! - + Standard + Стандарт + + + Fast + Хурдан + + + Faild + Хий + + + Connect Mouse or TouchPad Dbus Failed! + House эсвэл TouchPad Dbus Faaled-ийг холбоно уу! + + + Load qss file failed! + Ачаалал qss файлыг цэнэглэв! + + + + No search results, please search again... + Хайлтын үр дүн байхгүй, шалтгаан (... @@ -3348,7 +4612,7 @@ This is line 50 of the test text Tips - + Зөвлөгөө @@ -3356,42 +4620,51 @@ This is line 50 of the test text OK(K) - + OK(K) Failed to apply display settings!%1 - + Дэлгэцийн багц түрхэхэд бэлэн боллоо! %1% Fallback display setting failed! %1 - + Failled-г суурьшуулах буцаах дэлгэц! %1% - - No search results, please search again... - + Failed + Хонхойсон - - %1Day - + Set font failed! + Фонтын талбарыг тохируул! - - %1Hour - + Get icon themes failed! + Дүрс талбарыг аваарай! - - %1Minute - + Get cursor themes failed! + Эдгээр сэдвүүдийг бүдгэрүүлсэн курсорыг аваарай! - - never - + Warning + Анхааруулга + + + There is no theme to set! + Энд тохируулах сэдэв байхгүй! + + + + Spring + Булаг + + + + Summer + Зуны @@ -3399,17 +4672,17 @@ This is line 50 of the test text Enter keywords to search - + Хайлтын түлхүүр үгсийг оруулна уу Info - + Мэдээлэл Failed to find related items, please re-enter! - + Холбогдох зүйлсийг олж чадаагүй тул дахин оруулаарай! @@ -3417,22 +4690,22 @@ This is line 50 of the test text Confirm - + Батлах Return - + Буцах select picture - + Зургийг сонгох 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 *.pcdd*.dxf*.ufo *.ups *. AI *.raw *. WMF *.webp) @@ -3440,14 +4713,14 @@ This is line 50 of the test text Form - + Хэлбэр TextLabel - + TextLabel @@ -3455,29 +4728,29 @@ This is line 50 of the test text Form - + Хэлбэр EditSearch - + EditSearch Custom - + Захиалгат Edit - + Засварлах ButtonAddShortcut - + ButtonAddShortcut @@ -3485,154 +4758,154 @@ This is line 50 of the test text Add - + Нэмэх ButtonReset - + ButtonReset Reset - + Дахин тохируулах Custom Shortcut Name - + Захиалгат товчлолын нэр EditCustomShortcutName - + EditCustomShortcutName Custom Shortcut application - + Захиалгат товчлолын програм EditShortcutApp - + EditShortcutApp Custom Shortcut Key - + Захиалгат товчлолын түлхүүр ButtonAdd - + ButtonAdd ButtonCancel - + ButtonCancell Cancel - + Цуцлах Shortcut Name - + Товчлолын нэр EditShortcutName - + EditShortcutName Shortcut application - + Товчлолын програм Shortcut key - + Товчлолын түлхүүр ButtonSave - + ButtonSave Save - + Хадгалах ButtonReturn - + ButtonReturn 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 - + Нээлттэй файл System - + Систем Sound - + Дуу чимээ @@ -3643,64 +4916,64 @@ This is line 50 of the test text 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: - + RESET Shortcut санхүү, алдаа: Cannot use shortcut "%1", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. - + "%1" suffercut ашиглаж болохгүй, учир нь та энэ түлхүүрээр бизнес эрхлэгчдэд тэмдэглэгээ хийх боломжтой. Тоглоомын үеэр Ctrl, Alt эсвэл Shift ашиглан шинж чанарыг туршиж үзээрэй. Shortcut keys %1 are already used in %2,Please try again! - + Товчлолын түлхүүрүүд %1 бүгд %2-д бэлэн байна, Release дахин оролдоорой! @@ -3708,71 +4981,86 @@ This is line 50 of the test text Form - + Хэлбэр TextLabel - + TextLabel + + + + ShowQRCode + + Scan QR code to get machine code + Машины код авахын тулд QR кодыг сканнердах + + + QRcode of Machine and Activation Code + Машин ба үйл ажиллагааны кодын QRcode + + + Scan QR code to get activation code + Үйлдлийн код авахын тулд QR кодыг сканнердах StatusNotification - - - - - + + + + + Connection Failed - + Холболтын талбар - + the network not found - + Сүлжээ олдсонгүй - + The hidden network "%1" to be connected has been detected and exists in the network list - + Холбогдох далд сүлжээ "%1" хамгаалагдсан бөгөөд сүлжээний жагсаалтад байна - - - + + + Failed to connect to the network "%1" - + "%1" сүлжээнд холбогдох талбар" - + Connection activated - + Холболтын идэвхтэй - + You are now connected to the network "%1" - + Та одоо "%1" сүлжээнд холбогдсон байна" - + Connection deactivated - + Холболт идэвхгүй болсон - + You have now disconnected the network "%1" - + Та одоо "%1" сүлжээгээ алдсан" - + Connection deleted - + Холболт устгагдсан - + The connection has been deleted "%1" - + Холболтыг "%1" устгасан" @@ -3780,7 +5068,7 @@ This is line 50 of the test text System Information - + Системийн мэдээлэл @@ -3788,136 +5076,249 @@ This is line 50 of the test text Form - + Хэлбэр Host Name: - + Хост нэр: - + LabelHostName - + LabelHostName - - - - - + + + + + TextLabel - + TextLabel - + ButtonChangeHostName - + ButtonChangeHostName - + Change - + Өөрчлөлт - + System Version: - + Системийн хувилбар: - + LabelSystemVersion - + Label SystemVersion - + Kernel Version: - + Цөмийн хувилбар: - + LabelKernelVersion - + LabelKernelVersion - + System Architecture: - + Системийн архитектур: - + LabelSystemArch - + LabelSystemArch - + Activation status: - + Үйл ажиллагааны байдал: - - - + + + + Show - + Шоу - + EULA: - + EULA: - + ButtonShowEULA - + ButtonShowEULA - + Version License: - + Хувилбарын лиценз: - + ButtonShowVersionLicense - + ButtonShowVersionLicense - - - - + + + + Unknow - + Үл мэдэгдэх - + UnActivated - + Идэвхгүй - + Activation code has expired - + Үйл ажиллагааны кодын хугацаа дууссан - + Permanently activated - + Байнгын идэвхтэй - + Activated - + Идэвхжүүлсэн - + Error - + Алдаа - + Failed to open the license activator - + Лицензийн жүжигчнийг нээх талбар + + + Copyright © + Зохиогчийн эрх © + + + KylinSec. All rights reserved. + KylinSec. Бүх эрхийн хяналт. + + + + Privacy policy: + Нууцлалын бодлого: + + + + SystemInformationWidget + + Host Name: + Хост нэр: + + + System Version: + Системийн хувилбар: + + + Kernel Version: + Цөмийн хувилбар: + + + System Architecture: + Системийн архитектур: + + + Installation time: + Суурилуулах хугацаа: + + + Activation status: + Үйл ажиллагааны байдал: + + + Expiry date: + Хугацаа дуусах огноо: + + + EULA: + EULA: + + + Version License: + Хувилбарын лиценз: + + + Contact Us: + Бидэнтэй холбоо бариарай: + + + Change + Өөрчлөлт + + + Show + Шоу + + + Unknow + Үл мэдэгдэх + + + The current time is illegal + Одоогийн цаг нь хууль бус юм + + + Less than the installation time + Суулгах хугацаанаас бага + + + Not activated. Trail expiration: + Идэвхгүй. Замын хасалт: + + + Can't get activation information + Үйл ажиллагааны мэдээлэл авч чадахгүй + + + Activate + Идэвхжүүлэх + + + get service status failed + үйлчилгээний статусын статусын файлыг аваарай + + + Not yet + ХАРААХАН БОЛООГҮЙ БАЙНА + + + Activated + Идэвхжүүлсэн + + + Forever + Үүрд мөнх + + + Copyright © + Зохиогчийн эрх © + + + KylinSec. All rights reserved. + KylinSec. Бүх эрхийн хяналт. @@ -3925,17 +5326,17 @@ This is line 50 of the test text Tips - + Зөвлөгөө Yes - + Тийм Cancel - + Цуцлах @@ -3943,53 +5344,95 @@ This is line 50 of the test text Form - + Хэлбэр Dark and Light Theme - + Харанхуй ба гэрлийн сэдэв Themes Settings - + Сэдвийн тохиргоо Open Window Effects - + Цонхны эффектийг нээх - + Unknown - + Үл мэдэгдэх + + + + Light Theme + Гэрлийн сэдэв + + + + Auto + Автомат + + + + Dark Theme + Харанхуй сэдэв Choose icon Theme - + Дүрс сэдвийг сонго - + Choose cursor Themes - + Курсорыг сонго + + + + ThemeWidget + + Dark Theme + Харанхуй сэдэв - Light Theme - + Гэрлийн сэдэв - Auto - + Автомат + + + + Themes + + Dark and Light Theme + Харанхуй ба гэрлийн сэдэв - - Dark Theme - + Themes Settings + Сэдвийн тохиргоо + + + Open Window Effects + Цонхны эффектийг нээх + + + Choose icon themes + Дүрс сонгох + + + Unknown + Үл мэдэгдэх + + + Choose cursor themes + Курсорыг сонго @@ -3997,12 +5440,12 @@ This is line 50 of the test text Failed - + Хонхойсон List shortcut failed,error: - + Жагсаалтын санхүүжилт, алдаа: @@ -4010,22 +5453,22 @@ This is line 50 of the test text Time Date Settings - + Хугацааны огнооны тохиргоо Chnage time Zone - + Тайзны цагийн бүс Set time Manually - + Гараар цагийг тохируулна уу Time date format setting - + Хугацаа огнооны форматыг тохируулах @@ -4033,32 +5476,50 @@ This is line 50 of the test text TimezoneSettings - + TimezoneSettings Select Time Zone - + Цагийн бүсийг сонгох ButtonSave - + ButtonSave save - + Хадгалах ButtonReturn - + ButtonReturn reset - + Дахин тохируулах + + + + TopBar + + + ListExpansionSpace + ListExpansionSpace + + + + TITLE + ГАРЧИГ + + + + FLAG + ТУГ @@ -4066,127 +5527,206 @@ This is line 50 of the test text Form - + Хэлбэр TouchPad Enabled - + TouchPad-ийг идэвхжүүлэх боломжтой SwitchTouchPadEnable - + SwitchTouchPadEnable Select TouchPad Hand - + Хүрзний гарыг сонго ComboTouchPadHand - + ComboTouchPadHand TouchPad Motion Acceleration - + TouchPad хөдөлгөөнийг хурдасгах SliderTouchPadMotionAcceleration - + SliderTouchPadMotionAcceleration Slow - + Удаан Fast - + Хурдан Select Click Method - + Товших аргыг сонгох ComboClickMethod - + ComboClickMethod Select Scroll Method - + Гүйлгэх аргыг сонгох ComboScrollMethod - + ComboScrollMethod Natural Scroll - + Байгалийн гүйлгэх ComboNaturalScroll - + ComboNaturalScroll Enabled while Typing - + Бичиж байхдаа идэвхжүүлнэ SwitchTypingEnable - + SwitchTypingEnable Tap to Click - + Товших SwtichTapToClick - + SwtichTapToClick Right Hand Mode - + Баруун гарын горим Left Hand Mode - + Зүүн гарын горим Press and Tap - + Дарж, товш Tap - + Товших Two Finger Scroll - + Хоёр хурууны гүйлгэх Edge Scroll - + Edge Scroll + + + + TouchPadSettings + + Touchpad Enabled + Мэдрэгч самбарыг идэвхжүүлсэн + + + Disable TouchPad + Хүрзний самбарыг харуулах + + + TouchPad Enabled + TouchPad-ийг идэвхжүүлэх боломжтой + + + Select TouchPad Hand + Хүрзний гарыг сонго + + + TouchPad Motion Acceleration + TouchPad хөдөлгөөнийг хурдасгах + + + Select Click Method + Товших аргыг сонгох + + + Select Scroll Method + Гүйлгэх аргыг сонгох + + + Natural Scroll + Байгалийн гүйлгэх + + + Enabled while Typing + Бичиж байхдаа идэвхжүүлнэ + + + Tap to Click + Товших + + + Slow + Удаан + + + Standard + Стандарт + + + Fast + Хурдан + + + Right Hand Mode + Баруун гарын горим + + + Left Hand Mode + Зүүн гарын горим + + + Press and Tap + Дарж, товш + + + Tap + Товших + + + Two Finger Scroll + Хоёр хурууны гүйлгэх + + + Edge Scroll + Edge Scroll @@ -4194,7 +5734,7 @@ This is line 50 of the test text TouchPad Settings - + Хүрч самбарын тохиргоо @@ -4202,7 +5742,7 @@ This is line 50 of the test text Other WiFi networks - + Бусад WiFi сүлжээнүүд @@ -4210,64 +5750,64 @@ This is line 50 of the test text TrayItemWidget - + TrayItemWidget Icon - + Дүрс Name - + Нэр Status - + Байдал Ignore - + Үл тоомсорлох Disconnect - + Салгах Cancel - + Цуцлах Connect - + Холбох Connected - + Холбогдсон Unconnected - + Халдваргүй Please input password - + Оролтын нууц үгийг гарга Please input a network name - + Сүлжээний нэрийг гаргах @@ -4275,22 +5815,22 @@ This is line 50 of the test text TrayPage - + TrayPage TextLabel - + TextLabel - + Select wired network card - + Утасны сүлжээний картыг сонгоно уу - + Select wireless network card - + Утасгүй сүлжээний картыг сонгоно уу @@ -4298,39 +5838,58 @@ This is line 50 of the test text Ukey - + Асуух Default Ukey device - + Их Британийн баг List of devices bound to the Ukey - + UKkey-тэй холбогдсон төхөөрөмжүүдийн жагсаалт error - + Алдаа No UKey device detected, pelease insert the UKey device and perform operations - + Ямар ч UKey төхөөрөмж илрүүлээгүй, payase нь UKey төхөөрөмж болон мэдээллийн ажиллагааг суулгадаг UKey Enroll - + UKey Enroll Please enter the ukey pin code - + Ukey pin кодыг суллана уу + + + + UKeyPinCodeDialog + + UKey Enroll + UKey Enroll + + + Please enter the ukey pin code + Ukey pin кодыг суллана уу + + + Confirm + Батлах + + + Cancel + Цуцлах @@ -4338,142 +5897,150 @@ This is line 50 of the test text Form - + Хэлбэр Account - + Дансны Change password - + Нууц үг өөрчлөх User id - + Хэрэглэгчийн id User type - + Хэрэглэгчийн төрөл User status - + Хэрэглэгчийн статус auth manager - + Auth менежер Password expiration policy - + Нууц үг илэрхийлэх бодлого Confirm - + Батлах Delete - + Устгах Current password - + Одоогийн нууц үг EditCurrentPasswd - + EditCurrentPasswd New password - + Шинэ нууц үг EditNewPasswd - + EditNewPasswd Enter the new password again - + Нууц үгийн шинэ өвийг оруулна уу EditNewPasswdAgain - + EditNewPasswdAgain EditPasswdSave - + EditPasswdSave Save - + Хадгалах EditPasswdCancel - + EditPasswdCanccel Cancel - + Цуцлах + + + Account type + Дансны төрөл + + + Account status + Дансны статусын байдал standard - + Стандарт administrator - + удирдах Please enter the new user password - + Шинэ хэрэглэгчийн нууц үгийг суллана уу Please enter the password again - + Нууц үгийн өвийг суллагч The password you enter must be the same as the former one - + Таны оруулсан нууц үг нь өмнөхтэй адил нэр байх ёстой Please enter the current user password - + Одоогийн хэрэглэгчийн нууц үгийг суллана уу The current password is incorrect - + Одоогийн нууц үг багтсан болно The new password cannot be the same as the current password - + Шинэ нууц үг нь одоогийн нууц үгийн нэр байж болно @@ -4482,33 +6049,68 @@ This is line 50 of the test text Error - + Алдаа Password encryption failed - + Нууц үг шифрлэлтийн санхүүжилт user information updated successfully - + Хэрэглэгчийн мэдээллийг шинэчлэх нарийн төвөгтэй байдал Password updated successfully - + Нууц үгийг нарийн төвөгтэй байдлаар шинэчлэх - 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)? - + 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(% хэрэглэгчийн)%1-г устгах боломжтой юу? Warning - + Анхааруулга + + + Account information updated successfully + Дансны мэдээллийн шинэчлэлийн хариуцлага + + + + UserlicenseAgreement + + Export + Экспортлох + + + Close + Ойртох + + + Save + Хадгалах + + + Export EULA + EULA экспортлох + + + Export EULA failed! + Экспортын EULA-г битүүмжилсэн! + + + User End License Agreement + Хэрэглэгчийн эцсийн лиценз + + + None + Аль нь ч @@ -4516,7 +6118,7 @@ This is line 50 of the test text VolumeInput - + VolumeInput @@ -4524,7 +6126,7 @@ This is line 50 of the test text VolumeOutput - + Эзлэхүүн гаралт @@ -4532,13 +6134,13 @@ This is line 50 of the test text VolumeSettingPage - + VolumeSettingPage Volume - + Хэмжээ @@ -4546,67 +6148,67 @@ This is line 50 of the test text VpnIPsec - + VPNIPSec Enable IPsec - + IPsec-ийг идэвхжүүлэх Group Name - + Бүлгийн нэр EditGroupName - + EditGroupName Group ID - + Бүлгийн ID EditGroupId - + EditGroupId Pre-Shared Key - + Урьдчилан хуваалцсан түлхүүр EditPreSharedKey - + EditPreSharedKey Show Password - + Нууц үг харуулах Internet Key Exchange Protocol - + Интернет түлхүүр солилцох протокол EditIpsecIKE - + EditIpsecIKE Encapsulating Security Payload - + Аюулгүй байдлын ачааллыг багтаасан EditIpsecESP - + EditipsecESP @@ -4614,47 +6216,47 @@ This is line 50 of the test text VpnIpvx - + VpnIpvx IPV4 Method - + IPV4 арга ComboBoxVPNIpv4Method - + ComboBoxVPNIpv4Method Only applied in corresponding resources - + Зөвхөн нөөцөд ашиглах Preferred DNS - + Давуу эрхтэй DNS EditVPNIpv4PreferredDNS - + EditVPNIpv4 PreferredDNS Alternate DNS - + Өөр DNS EditIpv4AlternateDNS - + EditIpv4Alternate DNS - + Auto - + Автомат @@ -4662,12 +6264,12 @@ This is line 50 of the test text VpnL2tpSetting - + VPNL2tpSetting VPN name - + VPN нэр @@ -4676,42 +6278,42 @@ This is line 50 of the test text VpnManager - + VPNManager VPN type - + VPN төрөл Save - + Хадгалах Return - + Буцах - + VPN - + VPN - + L2TP - + L2TP - + Tips - + Зөвлөгөө - + Password required to connect to %1. - + Нууц үг нь %1-д холбогдохыг шаарддаг. @@ -4719,97 +6321,97 @@ This is line 50 of the test text VpnPpp - + VpnPpp Use MPPE - + MPPE ашиглах Security - + Аюулгүй байдал ComboBoxMppeSecurity - + ComboBoxMppeSecurity Stateful MPPE - + Төрийн МАН - + All available (default) - + Бүх боломжтой (default) - + 40-bit (less secure) - + 40 бит (less safety) - + 128-bit (most secure) - + 128 бит (most safety) - + Refuse EAP Authentication - + EAP баталгаажуулалтаас татгалз - + Refuse PAP Authentication - + PAP баталгаажуулалтаас татгалз - + Refuse CHAP Authentication - + CHAP баталгаажуулалтаас татгалз - + Refuse MSCHAP Authentication - + MSCHAP баталгаажуулалтаас татгалз - + Refuse MSCHAPv2 Authentication - + MSCHAPv2 баталгаажуулалтаас татгалз - + No BSD Data Compression - + BSD өгөгдлийн шахалт байхгүй - + No Deflate Data Compression - + Өгөгдлийн задралыг арилгахгүй - + No TCP Header Compression - + TCP толгойн шахалт байхгүй - + No Protocol Field Compression - + Протоколын талбарын ахиц дэвшил байхгүй - + No Address/Control Compression - + Хаяггүй/Хяналтын явц - + Send PPP Echo Packets - + PPP Echo пакетуудыг илгээнэ үү @@ -4817,12 +6419,12 @@ This is line 50 of the test text VpnPptpSetting - + VPNPptpSetting VPN name - + VPN нэр @@ -4830,109 +6432,109 @@ This is line 50 of the test text VpnWidget - + VPNWidget Gateway - + Гарц EditVPNGateway - + EditVPNGateway User Name - + Хэрэглэгчийн нэр EditVPNUserName - + EditVPNUserName Password Options - + Нууц үгийн сонголтууд ComboBoxVPNPasswordOptions - + ComboBoxVPNPasswordOptions Password - + Нууц үг EditVPNPassword - + EditVPNPassword ButtonPasswordVisual - + ButtonPassword Visual Show Password - + Нууц үг харуулах NT Domain - + NT домэйн EditNTDomain - + EditNTDomain - + Required - + шаардлагатай - + Saved - + Хадгалсан - + Ask - + Асуух - + Not required - + Хэрэм биш - + Gateway can not be empty - + Гарцыг эс тооцвол байж болохгүй - + Gateway invalid - + Гарц хүчингүй - + user name can not be empty - + Хэрэглэгчийн нэрийг эс тооцвол байж болохгүй - + password can not be empty - + Нууц үг нь үл хамаарах зүйл байж болохгүй @@ -4940,84 +6542,84 @@ This is line 50 of the test text Form - + Хэлбэр Set wallpaper - + Ханын цаас тохируулах FrameLockScreenPreview - + FrameLockScreenPreview FrameDesktopPreivew - + FrameDesktopPreve Desktop Wallpaper Preview - + Ширээний ханын цаасны урьдчилсан тойм Lock Screen WallPaper Preview - + Lock Screen WallPaper тойм Select wallpaper - + Ханын цаасыг сонго Select Wallpaper - + Ханын цаасыг сонго Set Desktop Wallpaper - + Ширээний ханын цаасыг тохируулна уу Set Lock Screen Wallpaper - + Түгжээний дэлгэцийн ханын цаасыг тохируулна уу set wallpaper - + Ханын цаас тохируулах Set wallpaper failed! - + Ханын цаасны талбайг тохируул! select picture - + Зургийг сонгох 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 *.pcdd*.dxf*.ufo *.ups *. AI *.raw *. WMF *.webp) Add Image Failed - + Зургийн санг нэмнэ үү The image already exists! - + Зургийн дугаарууд байна! @@ -5025,42 +6627,39 @@ This is line 50 of the test text WiredManager - + WiredManager ButtonSave - + ButtonSave Save - + Хадгалах ButtonReturn - + ButtonReturn Return - + Буцах - Wired Network Adapter - + Утастай сүлжээний адаптер - The carrier is pulled out - + Тээвэрлэгчийг гаргаж авдаг - The current device is not available - + Одоогийн төхөөрөмж байхгүй байна @@ -5068,12 +6667,12 @@ This is line 50 of the test text WiredSettingPage - + WiredSettingPage - + Network name - + Сүлжээний нэр @@ -5081,37 +6680,33 @@ This is line 50 of the test text WirelessManager - + WirelessManager Save - + Хадгалах Return - + Буцах - Wireless Network Adapter - + Утасгүй сүлжээний адаптер - The current device is not available - + Одоогийн төхөөрөмж байхгүй байна - Tips - + Зөвлөгөө - Password required to connect to %1. - + Нууц үг нь %1-д холбогдохыг шаарддаг. @@ -5119,77 +6714,77 @@ This is line 50 of the test text WirelessSecurityWidget - + Утасгүй аюулгүй байдлын хэрэгсэл Security - + Аюулгүй байдал ComboBoxWirelessSecurityOption - + ComboBoxWirelessSecurityOption Password Options - + Нууц үгийн сонголтууд ComboBoxWirelessPasswordOption - + ComboBoxWirelessPasswordOption Password - + Нууц үг EditWirelessPassword - + EditWirelessPassword ButtonWirelessPasswordVisual - + ButtonWirelessPasswordVisual PushButton - + Товчлуур None - + Аль нь ч WPA/WPA2 Personal - + WPA/WPA2 Хувийн Save password for all users - + Бүх хэрэглэгчдэд нууц үг хадгална уу Save password for this user - + Энэ хэрэглэгчийн нууц үгийг хадгална уу Ask me always - + Надаас үргэлж асуу Required - + шаардлагатай @@ -5197,20 +6792,20 @@ This is line 50 of the test text WirelessSettingPage - + WirelessSettingPage - + Wireless name - + Утасгүй нэр WirelessTrayWidget - + the network "%1" not found - + Сүлжээ "%1" олдсонгүй @@ -5218,47 +6813,47 @@ This is line 50 of the test text WirelessWidget - + WirelessWidget SSID - + SSID EditSsid - + EditSid MAC Address Of Device - + MAC төхөөрөмжийн хаяг ComboBoxWirelessMacAddress - + ComboBoxWirelessMacAddress Custom MTU - + Захиалгат MTU SpinBoxWirelessCustomMTU - + SpinBox Wireless CustomMTU - + Required - + шаардлагатай - + No device specified - + Ямар ч төхөөрөмж заагаагүй @@ -5266,7 +6861,22 @@ This is line 50 of the test text yyyy - + Бөө + + + + kiranSystemInformation + + System Information + Системийн мэдээлэл + + + Hardware Information + Техник хангамжийн мэдээлэл + + + kiran-system-imformation + Киран-систем-имформаци diff --git a/translations/kiran-control-panel.ug_CN.ts b/translations/kiran-control-panel.ug_CN.ts index 58a3e072..daada9e2 100644 --- a/translations/kiran-control-panel.ug_CN.ts +++ b/translations/kiran-control-panel.ug_CN.ts @@ -1,17 +1,32 @@ + + AccountItemWidget + + Create new user + يېڭى ئىشلەتكۈچى قۇرۇش + + + disable + چەكلەش + + + enable + مۇقىم + + AccountSubItem account - + ھېسابات New User - + يېڭى ئىشلەتكۈچى @@ -20,107 +35,222 @@ disable - + چەكلەش enable - + مۇقىم Create new user - + يېڭى ئىشلەتكۈچى قۇرۇش - AdvanceSettings + ActGuideWidget - - Form - + Please choose activation mode: + مەكتەپ پائالىيەت ھالىتىنى ئېلان قىلىڭ: - - Login shell - + Next + كېيىنكى - - EditLoginShell - + Current machine code: + نۆۋەتتىكى ماشىنا كودى: - - Specify user id (needs to be greater than 1000) - + Please input activation code: + كىرگۈزۈش پائالىيەت كودىنى ئېلان قىلىڭ: - - EditSpecifyUserID - + Back + كەينىگە قايتىش - - Specify user home - + Please insert the UsbKey device first! + ئالدى بىلەن UsbKey ئۈسكۈنىسىنى قىستۇرۇڭ! - - EditSpecifyUserHome - + Activate online + توردا ئاكتىپلاش - - ButtonConfirm - + Activate with the input activation code + كىرگۈزۈش پائالىيەت كودى بىلەن پائالىيەت - - confirm - + Activate with insert UsbKey + UsbKey نى قىستۇرۇش ئارقىلىق ئاكتىپلاڭ - - ButtonCancel - + Activate + ئاكتىپلاش - - cancel - + Please enter the activate server address: + ئىگىلىك تىكلىگۈچىنى پائالىيەت مۇلازىمېتىر ئادرېسىنى ئېلان قىلىڭ: + + + Activating...... + ئاكتىپلاش...... + + + System activate successful! + سىستېما پائالىيەت ئىقتىدارى! + + + server activation and remaining points: + مۇلازىمېتىر ھەرىكىتى ۋە قالغان نۇقتىلار: + + + development activation and remaining points: + تەرەققىيات پائالىيىتى ۋە ئازايتىش نۇقتىلىرى: + + + industrial activation and remaining points: + سانائەت پائالىيىتى ۋە قايتا ئېرىشىش نۇقتىلىرى: + + + desktop activation and remaining points: + ئۈستەل يۈزى پائالىيىتى ۋە قالغان نۇقتىلار: + + + activation points: + پائالىيەت نۇقتىلىرى: + + + remaining points: + قالغان نۇقتىلار: + + + Close + تاقاش + + + System activate failed! + سىستېما پائالىيىتى مەيدانغا كەلدى! + + + unknow + نامەلۇم + + + Activation Mode + پائالىيەت ھالىتى + + + Start Activation + پائالىيەتنى باشلاش + + + Activation Complete + پائالىيەت تولۇق + + + Activation Guide + پائالىيەت قوللانمىسى + + + Server IP address or Domain name + مۇلازىمېتىر IP ئادرېسى ياكى دائىرە ئىسمى + + + AdvanceSettings Advance Settings - + ئالدىن راسچوت ئاكسىيەسى Automatically generated by system - + سىستېما ئارقىلىق ئاپتوماتىك ئومۇملاشتۇرۇلغان Please enter the correct path - + توغرا يولنى قويۇپ بەرگۈچى Please enter specify user Id - + ئىگىلىك تىكلىگۈچى ئىشلەتكۈچى Id نى بەلگىلەيدۇ Please enter an integer above 1000 - + ئىگىلىك تىكلىگۈچىگە 1000 دىن يۇقىرى قىستۇرما قويۇپ بېرىڭ Please enter the correct home directory - + توغرا ئۆي مۇندەرىجىسى + + + + Form + شەكىل + + + + Login shell + كىرىش قېپى + + + + EditLoginShell + EditLoginShell + + + + Specify user id (needs to be greater than 1000) + ئىشلەتكۈچى id (NEEDS نى 1000) دىن ئىجادكار قىلىپ بەلگىلەڭ + + + + EditSpecifyUserID + EditSpecifyUserID + + + + Specify user home + ئىشلەتكۈچى ئۆيىنى Spotify + + + + EditSpecifyUserHome + EditSpecifyUserHome + + + + ButtonConfirm + ButtonConfirm + + + + confirm + جەزملەشتۈرۈڭ + + + + ButtonCancel + ButtonCancellor + + + + cancel + ئەمەلدىن قالدۇرۇڭ + + + Specify user id + ئىشلەتكۈچى كىملىكىنى Spotify @@ -128,30 +258,90 @@ Theme - + تېما Wallpaper - + تام قەغىزى Font - + خەت نۇسخىسى + + + + ApplicationPlugin + + + DefaultApp + DefaultApp + + + + AutoStart + AutoStart AudioSystemTray - + Volume Setting - + ھەجىم ئولتۇراقلاشتۇرۇش - + Mixed Setting - + ئارىلاش تەڭشەش + + + + AuthManagerPage + + Fingerprint Authentication + بارماق ئىزىنى دەلىللەش + + + Face Authentication + چىراي دەلىللەش + + + Password Authentication + پارول دەلىللەش + + + save + تېجەڭ + + + return + قايتىش + + + add fingerprint + بارماق ئىزىنى قوشۇڭ + + + add face + چىراي قوشۇڭ + + + error + خاتالىق + + + please ensure that at least one authentication option exists + سانلىق مەلۇماتلارنى كەم دېگەندە بىر ھوقۇق ئىپادىلەش تارىخى ئېلان قىلىڭ + + + fingerprint_ + Finger______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ + + + face_ + Face___ @@ -159,37 +349,126 @@ Fingerprint - + بارماق ئىزى FingerVein - + بارماق تومۇرى + + + + Driver Manager + شوپۇر باشقۇرغۇچى + + + + Prefs + Prefs UKey - + UKey Iris - + Iris Face - + چىراي + + + + AutoStartPage + + Boot Setup + قوزغىتىش - - Driver Manager - + Desktop files(*.desktop) + ئۈستەل يۈزى ھۆججىتى(*.desktop) - - Prefs - + select autostart desktop + ئاپتوماتىك ئۈستەلئۈستىنى تاللاڭ + + + Select + تاللاڭ + + + Cancel + ئەمەلدىن قالدۇرۇڭ + + + Error + خاتالىق + + + Desktop has existed + ئۈستەل يۈزىنىڭ ئىسمى ئاللىقاچان قويۇلغان + + + Desktop cant permit to join + ئۈستەل يۈزى كانت قاتنىشىشقا ئىجازەت بېرىدۇ + + + Desktop dont support + ئۈستەلئۈستى كونترول قوللاش + + + + AutostartPage + + + Boot Setup + قوزغىتىش + + + + Desktop files(*.desktop) + ئۈستەل يۈزى ھۆججىتى(*.desktop) + + + + select autostart desktop + ئاپتوماتىك ئۈستەلئۈستىنى تاللاڭ + + + + Select + تاللاڭ + + + + Cancel + ئەمەلدىن قالدۇرۇڭ + + + + + + Error + خاتالىق + + + + Desktop has existed + ئۈستەل يۈزىنىڭ ئىسمى ئاللىقاچان قويۇلغان + + + + Desktop cant permit to join + ئۈستەل يۈزى كانت قاتنىشىشقا ئىجازەت بېرىدۇ + + + + Desktop dont support + ئۈستەلئۈستى كونترول قوللاش @@ -197,81 +476,95 @@ BatterySettingsPage - + BatterySettingsPage After idle for more than the following time, the computer will execute - + كېيىنكى ۋاقىتتىن ئارتۇق بىكار تۇرغاندىن كېيىن، كومپيۇتېر ئىجرا قىلىدۇ ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction When the battery is lit up, it will be executed - + سانلىق مەلۇماتلار يورۇتۇلغان يەردە ئىجرا قىلىنىدۇ ComboLowBatteryAction - + ComboLowBatteryAction The monitor will turn off when it is idle - + نازارەتچى بۇرۇلۇپ ئاندىن بىكار بولىدۇ ComboMonitorTurnOffIdleTime - + ComboMonitorTurnOffIdleTime Reduce screen brightness when idle - + ئېكراننىڭ يورۇقلۇقىنى تۆۋەنلىتىڭ Reduce screen brightness when no power - + تۇغۇلغان كۈنىنى كۈچلەندۈرمەڭ The energy saving mode is enabled when the power is low - + توك تۆۋەن بولغاندا ئوتتۇرىچە تېجەش ھالىتى قوزغىتىلىدۇ Suspend - + چىقىم Shutdown - + تاقاش Hibernate - + قىشلىق ئۇيقۇ Do nothing - + ھېچ ئىش قىلماڭ + + + + BatterySubItem + + Battery Settings + باتارېيە تەڭشىكى + + + + BiometricItem + + add + قوش @@ -279,17 +572,17 @@ CPanelAudioWidget - + CPanelAudioWidget Output - + چىقىرىش Input - + كىرگۈزۈش @@ -297,39 +590,61 @@ CPanelNetworkWidget - - - - - Wireless Network - + CPanel NetworkWidget - - + + VPN - + VPN - - + + Network Details - + تور تەپسىلاتلىرى + + + + + + + + Wired Network + سىملىق تور + + + + + + + + + Wireless Network + سىمسىز تور - + Connected - + ئۇلاندى - + Unavailable - + ئىشلەتكىلى بولمايدۇ - + Disconnected - + ئۈزۈلۈپ قالدى + + + Wired Network %1 + سىملىق تور% 1 + + + Wireless Network %1 + سىمسىز تور% 1 @@ -337,47 +652,51 @@ Form - + شەكىل Host Name: - + ساھىبجامال ئىسمى: EditHostName - + EditHostName ButtonSaveHostName - + ButtonSaveHostName Save - + تېجەڭ ButtonCancelChangeHostName - + ButtonCanceChangeHostName Cancel - + ئەمەلدىن قالدۇرۇڭ + + + Host Name + ساھىبجامال ئىسمى Warning - + ئاگاھلاندۇرۇش Change host name failed! Please check the Dbus service! - + ساھىبجامال نامىنى ئۆزگەرتىڭ! Dbus مۇلازىمىتىنى ئېلان قىلىڭ! @@ -385,12 +704,12 @@ Check password - + پارولنى تەكشۈرۈڭ Check the current password before you enroll the feature - + ئىقتىدارنى كىرگۈزۈشتىن بۇرۇن نۆۋەتتىكى پارولنى تەكشۈرۈپ بېقىڭ @@ -398,7 +717,7 @@ Form - + شەكىل @@ -406,12 +725,12 @@ ConnectionDetailsWidget - + ConnectionDetailsWidget Security type - + بىخەتەرلىك تىپى @@ -428,129 +747,187 @@ TextLabel - + TextLabel Frequency band - + Freeconny band Channel - + Channel Interface - + كۆرۈنمە يۈزى MAC - + MAC IPv4 - + IPv4 Gateway - + دەرۋازا DNS - + DNS Subnet mask - + Subnet mask IPv6 - + IPv6 Prefix - + Refix Rate - + نىسبىتى + + + Preferred DNS + ياقتۇرىدىغان DNS - ConnectionNameWidget + ConnectionItemWidget - - ConnectionNameWidget - + + disconnect + ئۈزۈش - - TextLabel - + + ignore + پەرۋا قىلمايدۇ - - EditConnectionName - + + remove + چىقىرىۋېتىڭ - - Auto Connection - + + The current device:%1 is not available + ھازىرقى ئۈسكۈنە:% 1 نى ئىشلەتكىلى بولمايدۇ - - Required - + + The carrier is pulled out + توشۇغۇچى تارتىپ چىقىرىلدى - - Wired Connection %1 - + + Are you sure you want to delete the connection %1 + ئۇلىنىشنى ئۆچۈرمەكچىمۇ؟ % 1 - - VPN L2TP %1 - + + Warning + ئاگاھلاندۇرۇش - - VPN PPTP %1 - + + + Tips + كۆرسەتمە - - Connection name can not be empty - + + Password required to connect to %1. + پارول% 1 گە ئۇلىنىشنى تەلەپ قىلىدۇ. + + + + Please input a network name + تور نامىنى كىرگۈزۈڭ - ConnectionShowPage + ConnectionNameWidget + + + ConnectionNameWidget + ConnectionNameWidget + + + + TextLabel + TextLabel + + + + EditConnectionName + EditConnectionName + + + + Auto Connection + ئاپتوماتىك ئۇلىنىش + + + + Required + تەلەپ قىلىندى + + + + Wired Connection %1 + سىملىق ئۇلىنىش% 1 + + + + VPN L2TP %1 + VPN L2TP% 1 + + + + VPN PPTP %1 + VPN PPTP% 1 + + + + Connection name can not be empty + ئۇلىنىش نامىنى ھېسابقا ئالمىغاندا بولمايدۇ + + + + ConnectionShowPage ConnectionShowPage - + ConnectionShowPage TextLabel - + TextLabel ButtonCreateConnection - + ButtonCreateConnection @@ -558,190 +935,229 @@ CreateGroupPage - + CreateGroupPage Create Group - + گۇرۇپپا قۇرۇش Add Group Members - + گۇرۇپپا ئەزالىرىنى قوشۇڭ Confirm - + جەزملەشتۈرۈڭ Please enter your group name - + گۇرۇپپا ئىسمىڭىزنى كىرگۈزۈڭ group name cannot be a pure number - + گۇرۇپپا ئىسمى canannot ساپ سان بولۇشى مۇمكىن group name already exists - + گۇرۇپپا ئىسىم نومۇرى مەۋجۇت Error - + خاتالىق CreateUserPage + + Account type + ھېسابات تىپى + + + + standard + ئۆلچەملىك + + + + administrator + باشقۇرغۇچى + + + + Please enter user name first + قويۇپ بەرگۈچى ئىشلەتكۈچى ئىسمى ئالدى بىلەن + + + + Please enter your user name + ئىشلەتكۈچى ئىسمىڭىزنى ماتور قويۇپ بېرىڭ + + + + user name cannot be a pure number + ئىشلەتكۈچى ئىسمى canannot ساپ سان بولالايدۇ + + + + user name already exists + ئىشلەتكۈچى ئىسمى ئالىي مەكتەپ مەۋجۇت + + + + Please enter your password + پارولىڭىزنى كىرگۈزۈڭ + + + + Please enter the password again + پارول مىراسلىرىنى قويۇپ بەرگۈچى + + + + The password you enter must be the same as the former one + سىز كىرگۈزگەن پارول چوقۇم بۇرۇنقى ئىسىم بولۇشى كېرەك + + + + + Error + خاتالىق + + + + Password encryption failed + پارول مەخپىيلەشتۈرۈش مەبلىغى + Form - + شەكىل UserAvatarWidget - + UserAvatarWidget User name - + ئىشلەتكۈچى ئىسمى EditUserName - + EditUserName User type - + ئىشلەتكۈچى تىپى ComboUserType - + ComboUserType Password - + پارول EditPasswd - + EditPasswd Confirm password - + پارولنى جەزملەشتۈرۈڭ EditPasswdConfirm - + EditPasswdConfirm ButtonAdvanceSetting - + ButtonAdvanceSetting Advance setting - + ئالدىن تەڭشەش ButtonConfirm - + ButtonConfirm Confirm - + جەزملەشتۈرۈڭ ButtonCancel - + ButtonCancellor Cancel - - - - - standard - - - - - administrator - - - - - Please enter user name first - + ئەمەلدىن قالدۇرۇڭ - - Please enter your user name - + Please enter account name first + ئىگىلىك تىكلىگۈچىلەرنىڭ ھېسابات نامىنى ئالدى بىلەن ئېلان قىلىڭ - - user name cannot be a pure number - + Please enter your account name + ئىگىلىك تىكلىگۈچىلەرنىڭ ھېسابات نامىنى ئېلان قىلىڭ - - user name already exists - + Account cannot be a pure number + ھېسابات ساپ نوپۇس بولالمايدۇ - - Please enter your password - + Account already exists + تەييارلانغان ھېسابات مەۋجۇت - - Please enter the password again - + Please enter your userName name + ئىگىلىك تىكلىگۈچى ئىشلەتكۈچى نامىنى ئېلان قىلىڭ + + + CursorThemePage - - The password you enter must be the same as the former one - + + Cursor Themes Settings + Cursor ThemSettings + + + CursorThemes - - - Error - + Cursor Themes Settings + Cursor ThemSettings - - Password encryption failed - + Faild + Feld - - - CursorThemePage - - Cursor Themes Settings - + Set cursor themes failed! + نۇر بەلگە تېمىلىرىنى چوڭ قىلىپ تەڭشەڭ! @@ -749,37 +1165,37 @@ DateTimeSettings - + DateTimeSettings Select Time - + ۋاقىتنى تاللاڭ Select Date - + چېسلانى تاللاڭ ButtonSave - + ButtonSave save - + تېجەڭ ButtonReset - + ButtonReset reset - + ئەسلىگە كەلتۈرۈش @@ -787,54 +1203,72 @@ %1 - + %1% DefaultApp - + DefaultApp - + DefaultApp - + Web Browser - + تور كۆرگۈ - + Email - + ئېلېكترونلۇق خەت - + Text - + تېكىست - + Music - + مۇزىكا - + Video - + Video - + Image - + رەسىم DefaultappPlugin - - + Email + ئېلېكترونلۇق خەت + + + Text + تېكىست + + + Music + مۇزىكا + + + Video + Video + + + Image + رەسىم + + DefaultApp - + DefaultApp @@ -842,22 +1276,48 @@ DetailsPage - + DetailsPage Network Details - + تور تەپسىلاتلىرى Please select a connection - + ئۇلىنىشنى تاللاڭ ComboBoxDetailsSelectConnection - + ComboBoxDetailsSelectConnection + + + + DeviceAvailableConnectionWidget + + + Network card: %1 + تور كارتىسى:% 1 + + + + Other WiFi networks + باشقا WiFi تورى + + + + DeviceList + + + Wired Network Adapter + سىملىق تور ماسلاشتۇرغۇچ + + + + Wireless Network Adapter + سىمسىز تور ماسلاشتۇرغۇچ @@ -865,57 +1325,57 @@ Form - + شەكىل Rotate left 90 degrees - + ئايلىنىش 90 گرادۇستىن ئايرىلدى ButtonLeft - + ButtonLeft Rotate right 90 degrees - + ئوڭ 90 گرادۇس ئايلاندۇرۇڭ ButtonRight - + ButtonRight Turn left and right - + سول ۋە ئوڭغا بۇرۇلۇڭ ButtonHorizontal - + ButtonHorizontal upside down - + ئۈستى-ئۈستى ButtonVertical - + ButtonVertical Identification display - + كىملىك كۆرسىتىش ButtonIdentifying - + ButtonIdentification @@ -923,47 +1383,47 @@ DisconnectAndDeleteButton - + AndDeleteButton نى ئۈزۈڭ ButtonDisconnect - + ButtonDisconnect Disconnect - + ئۈزۈش ButtonDelete - + ButtonDelete Delete - + ئۆچۈرۈش ButtonIgnore - + ButtonIgnore Ignore - + پەرۋا قىلمايدۇ - + Are you sure you want to delete the connection %1 - + ئۇلىنىشنى ئۆچۈرمەكچىمۇ؟ % 1 - + Warning - + ئاگاھلاندۇرۇش @@ -971,52 +1431,52 @@ DisplayFormatSettings - + DisplayFormatSettings Long date display format - + ئۇزۇن چېسلا كۆرسىتىش فورماتى ComboLongDateDisplayFormat - + ComboLongDateDisplayFormat Short date display format - + قىسقا چېسلا كۆرسىتىش فورماتى ComboShortDateDisplayFormat - + ComboShortDateDisplayFormat Time format - + فورماتنىڭ ۋاقتى ComboTimeFormat - + ComboTimeFormat Show time witch seconds - + ۋاقىت جادۇگەر سېكۇنتلىرىنى كۆرسىتىڭ 24-hours - + 24-سائەت 12-hours - + 12-سائەت @@ -1024,154 +1484,154 @@ DisplayPage - + DisplayPage ButtonCopyDisplay - + ButtonCopyDisplay Copy display - + كۆپەيتىلگەن ئېكران ButtonExtendedDisplay - + ButtonExtendedDisplay Extended display - + كېڭەيتىلگەن ئېكران Resolution ratio - + ئېنىقلىق نىسبىتى ComboResolutionRatio - + ComboResolutionRatio Refresh rate - + يېڭىلاش نىسبىتى ComboRefreshRate - + ComboRefreshRate Zoom rate - + چوڭايتىش نىسبىتى ComboZoomRate - + ComboZoomRate Automatic - + ئاپتوماتىك 100% (recommended) - + 100% (recombended) 200% - + 200% Open - + ئوچۇق Set as main display - + ئاساسلىق ئېكران قىلىپ تەڭشەڭ SwitchExtraPrimary - + SwitchExtraPrimary ComboExtraResolutionRatio - + ComboExtraResolutionRatio ComboExtraRefreshRate - + ComboExtraRefreshRate ComboExtraZoomRate - + ComboExtraZoomRate ButtonExtraApply - + ButtonExraApply Apply - + ئىلتىماس قىلىڭ ButtonExtraCancel - + ButtonExtraCancel Close - + تاقاش (recommended) - + (recombended) Is the display normal? - + كۆرسىتىش نورمالمۇ? Save current configuration(K) - + نۆۋەتتىكى تەڭشەش(K) نى ساقلاڭ Restore previous configuration(R) - + ئالدىن تاللاشنى تەڭشەش(R) نى ئەسلىگە كەلتۈرۈڭ The display will resume the previous configuration in %1 seconds - + بۇ ئېكران% 1 سېكۇنتتا ئالدىن قۇرۇلۇشنى كەلتۈرۈپ چىقىرىدۇ @@ -1179,7 +1639,7 @@ Display - + كۆرسىتىش @@ -1187,17 +1647,17 @@ DnsWidget - + DnsWidget Preferred DNS - + ياقتۇرىدىغان DNS Alternate DNS - + باشقا DNS @@ -1205,37 +1665,41 @@ device type - + ئۈسكۈنە تىپى driver list - + شوپۇرلار تىزىملىكى Fingerprint - + بارماق ئىزى + + + FingerVein + بارماق تومۇرى Fingervein - + Fingervein iris - + Iris ukey - + Ukey face - + چىراي @@ -1243,12 +1707,12 @@ DslManager - + DSLManager DSL - + DSL @@ -1256,17 +1720,17 @@ DslSettingPage - + DSLSettingPage Save - + تېجەڭ Return - + قايتىش @@ -1274,251 +1738,340 @@ EthernetWidget - + EthernetWidget MAC Address Of Ethernet Device - + Ethernet ئۈسكۈنىسىنىڭ MAC ئادرېسى ComboBoxDeviceMac - + ComboBoxDeviceMac Ethernet Clone MAC Address - + Ethernet Clone MAC ئادرېسى EditDeviceMac - + EditDeviceMac Custom MTU - + Custom MTU SpinBoxCustomMTU - + SpinBoxCustomMTU - + No device specified - + ھېچقانداق ئۈسكۈنە ئېنىق ئەمەس - + Clone Mac invalid - + كلون Mac ئىناۋەتسىز - FacePage + FaceEnrollDialog - - face - + save + تېجەڭ + + + cancel + ئەمەلدىن قالدۇرۇڭ + + + initializing face collection environment... + يۈز سىياسىتى قارارىنى باشلاش... + + + failed to initialize face collection environment! + يۈز دائىرىسى نەتىجىسىنى باشلايدىغان مەيدان! + + + Failed to start collection + تاللاشنى باشلايدىغان مەيدان + + + + FaceInputDialog + + save + تېجەڭ + + + cancel + ئەمەلدىن قالدۇرۇڭ + + + initializing face collection environment... + يۈز سىياسىتى قارارىنى باشلاش... + + + failed to initialize face collection environment! + يۈز دائىرىسى نەتىجىسىنى باشلايدىغان مەيدان! + + Failed to start collection + تاللاشنى باشلايدىغان مەيدان + + + + FacePage Default face device - + يۈز ئۈسكۈنىسى face feature list - + يۈز ئىقتىدار تىزىملىكى + + + + face + چىراي Cancel - + ئەمەلدىن قالدۇرۇڭ Start enroll failed,%1 - + تىزىمغا ئالدۇرۇش مەيدانىنى باشلاڭ،% 1 Error - + خاتالىق The biometric features were successfully recorded. The feature name is:%1 - + بىئولوگىيەلىك ئىقتىدارلار ھەممە يەردە مەسئۇلىيەتچانلىق بىلەن خاتىرىلەنگەن. ئىقتىدار ئىسمى:% 1 Tips - + كۆرسەتمە Failed to record biometrics(%1), Please try again - + Biometrics(%11) نى خاتىرىلىيەلمىدى، ئاگېننى سىناپ بېقىڭ FingerPage + + + Cancel + ئەمەلدىن قالدۇرۇڭ + fingerprint - + بارماق ئىزى fingervein - + Fingervein - - Default %1 device - + default %1 device + سۈكۈتتىكى% 1 ئۈسكۈنى %1 list - - - - - Cancel - + %1 تىزىملىك Start enroll failed,%1 - + تىزىمغا ئالدۇرۇش مەيدانىنى باشلاڭ،% 1 Error - + خاتالىق The biometric features were successfully recorded. The feature name is:%1 - + بىئولوگىيەلىك ئىقتىدارلار ھەممە يەردە مەسئۇلىيەتچانلىق بىلەن خاتىرىلەنگەن. ئىقتىدار ئىسمى:% 1 Tips - + كۆرسەتمە Failed to record biometrics(%1), Please try again - + Biometrics(%11) نى خاتىرىلىيەلمىدى، ئاگېننى سىناپ بېقىڭ + + + %1list + %1 تىزىملىك + + + + Default %1 device + سۈكۈتتىكى% 1 ئۈسكۈنى - Fonts + FingerprintEnrollDialog - - Form - + save + تېجەڭ - - Application Font Settings - + cancel + ئەمەلدىن قالدۇرۇڭ - - ComboAppFontName - + Finger Enroll + بارماقنى تىزىملاش - - ComboAppFontSize - + This fingerprint is bound to the user(%1) + بۇ ئىنچىكە پرىنتېر ئىشلەتكۈچى(%11) بىلەن باغلانغان - - Titlebar Font Settings - + Info + ئۇچۇر + + + Error + خاتالىق + + + + FingerprintInputDialog + + save + تېجەڭ + + + cancel + ئەمەلدىن قالدۇرۇڭ + + + Finger Enroll + بارماقنى تىزىملاش + + + Error + خاتالىق + + + + FingerprintInputWorker + + initializing fingerprint collection environment... + مېتال بېسىش مۇھىتىنى باشلاش... + + + + Fonts + + + Form + شەكىل - - ComboTitleFontName - + Application Font Settings + قوللىنىشچان خەت نۇسخىسى - - ComboTitleFontSize - + Titlebar Font Settings + تېما خەت نۇسخىسى - Monospace Font Settings - + Monospace Font Settings + + + + Word size + سۆز چوڭلۇقى - - ComboMonospaceFontName - + + System font + سىستېما خەت نۇسخىسى - - ComboMonospaceFontSize - + + Monospaced font + يەككە خەت GeneralBioPage - - Rename Feature - + + default device + سۈكۈتتىكى ئۈسكۈنە - - Please enter the renamed feature name - + + 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 نى ئېلىۋەتمەكچىمۇ، مۇھىت ئەنگلىيەنىڭ مۇھىم ھەل قىلىش چارىسى ئېنىقلاندى بولمىسا ئۇچۇر دۇكىنى ئۆچۈرۈش ئۈچۈن Are you sure you want to delete the feature called %1 - + ئىقتىدار چاقىرىش% 1 نى ئۆچۈرمەكچىمۇ؟ tips - + كۆرسەتمە Error - + خاتالىق Failed to enroll feature because the password verification failed! - + پارولنى دەلىللەشنىڭ مۇھىت بەلگىسىگە مەغلۇپ بولدى! - - default device - + + Rename Feature + مەدەنىيەتنىڭ نامىنى ئۆزگەرتىش - - feature list - + + Please enter the renamed feature name + ئۆزگەرتىلگەن ئىقتىدار نامىنى ئېلان قىلىڭ @@ -1526,83 +2079,87 @@ Form - + شەكىل Capslock Tip - + Capslock Tip Numlock Tip - + Numlock Tip Repeat Key - + RepEAT Key (Repeat a key while holding it down) - + (Repeat بىر كۇنۇپكىنى تۆۋەنگە تۇتقاندا SwitchRepeatKey - + SwitchRepeatKey Delay - + كېچىكىش SliderRepeatDelay - + SliderRepeatDelay Short - + قىسقا Long - + ئۇزۇن Interval - + ئارىلىق SliderRepeatInterval - + SliderReptInterval Slow - + ئاستا Fast - + تېز Enter repeat characters to test - + سىناق قىلىدىغان كارخانا كارتىلىرى EditTestRepeatKey - + EditTestRepeatKey + + + Enter characters to test the settings + تەڭشەشنى سىنايدىغان نىزامنامە @@ -1610,150 +2167,157 @@ GeneralSettingsPage - + GeneralSettingsPage When the power button is pressed - + توك كۇنۇپكىسى قويۇلغاندا ComboPowerButtonAction - + ComboPowerButtonAction When the suspend button is pressed - + ئىتتىرىش كۇنۇپكىسى قويۇلغاندا ComboSuspendAction - + ComboSuspendAction When closing the lid - + قاپاقنى تاقىغاندا ComboCloseLidAction - + ComboCloseLidAction Computer Mode - + كومپيۇتېر ھالىتى Display brightness setting - + يورۇقلۇق يىغىلىشىنى كۆرسىتىڭ 0% - + 0% SliderDisplayBrightness - + SliderDisplayBrightness Color temperature - + رەڭ كۆرسىتىش Automatic color temperature - + ئاپتوماتىك رەڭ ھېكايىسى cold - + سوغۇق standard - + ئۆلچەملىك warm - + ئىللىق Regard computer as idle after - + كومپيۇتېر كېيىنكى ماقالە سۈپىتىدە SliderComputerIdleTime - + SliderComputerIdleTime Lock screen when idle - + قۇلۇپ ئېكران قاچان password is required to wake up in standby mode - + پارول ئۆلچەملىك ھالەتتە تولۇقلاشنى تەلەپ قىلىدۇ shutdown - + تاقاش hibernate - + قىشلىق ئۇيقۇ suspend - + چىقىم display off - + كۆرسىتىش do nothing - + ھېچ ئىش قىلماڭ ERROR - + خاتالىق %1hour - + %1 سائەت% %1minute - + %1 مىنۇت + + + + GeneralSettingsSubItem + + General Settings + ئادەتتىكى تەڭشەكلەر @@ -1761,7 +2325,7 @@ Keyboard General Option - + كۇنۇپكا تاختىسى ئادەتتىكى تاللاش @@ -1769,52 +2333,52 @@ Form - + شەكىل TextLabel - + TextLabel Group - + گۇرۇپپا Member List - + پالاتا تىزىملىكى Add User - + ئىشلەتكۈچىنى قوشۇڭ Delete - + ئۆچۈرۈش Add Member - + ئىچكى ساقلىغۇچ قوشۇڭ Save - + تېجەڭ Cancel - + ئەمەلدىن قالدۇرۇڭ Please input keys for search... - + ئىزدەش ئۈچۈن كىرگۈزۈش كۇنۇپكىسىنى ئېلان قىلىڭ... @@ -1822,7 +2386,7 @@ Error - + خاتالىق @@ -1830,22 +2394,22 @@ Group - + گۇرۇپپا Creat group - + Great Group Change group name - + گۇرۇپپا نامىنى ئۆزگەرتىڭ Add group member - + گۇرۇپپا ئۇچۇرىنى قوشۇڭ @@ -1853,68 +2417,100 @@ Create User failed - - - - - Failed to connect to the account management service - + ئىشلەتكۈچى مەيدانى قۇرۇش update password failed - + مەخپىي نومۇرنى يېڭىلاش icon file - + Ion ھۆججىتى userName type - + UserName تىپى locked - + قۇلۇپلاندى Failed to update user properties,%1 - + ئىشلەتكۈچى خاسلىقىنى يېڭىلىمىدى،% 1 Failed to delete user,%1 - + ئىشلەتكۈچىنى ئۆچۈرەلمىدى،% 1 + + + password + پارول + + + home directory + ئائىلە مۇندەرىجىسى + + + shell + Shell + + + icon + Ionic + + + Failed to set user attributes + ئىشلەتكۈچىنى مەنبەگە تەڭشىمىدى + + + account type + ھېسابات تىپى + + + Failed to update user properties(%1) + ئىشلەتكۈچى خاسلىقى (%1) نى يېڭىلىمىدى + + + Failed to delete user + ئىشلەتكۈچىنى ئۆچۈرەلمىدى + + + + Failed to connect to the account management service + ھېسابات مۇلازىمىتىگە ئۇلىنىدىغان مەيدان Create Group failed - + گۇرۇپپا قۇرۇش Failed to delete group,%1 - + گۇرۇپپىنى ئۆچۈرۈشكە ماس كېلىدۇ،% 1 add user to group failed - + گۇرۇپپىلارغا ئىشلەتكۈچى قوشۇڭ change group name failed - + گۇرۇپپا ئىسىم مەيدانىنى ئۆزگەرتىڭ change group name failed, the new group name is occupied - + گۇرۇپپا نامىنى گۇرۇپپا مەيدانىنى ئۆزگەرتىڭ، يېڭى گۇرۇپپا ئىسمى ئىگىلىدى @@ -1922,60 +2518,95 @@ Form - + شەكىل CPU: - + CPU: LabelCpuInfo - + LabelCpuInfo TextLabel - + TextLabel Memory: - + ئىچكى ساقلىغۇچ: LabelMemoryInfo - + Label MemoryInfo Hard disk: - + قاتتىق دىسكا: Graphics card: - + گرافىك كارتىسى: Network card: - + تور كارتىسى: + + + Copyright © + نەشر ھوقۇقى © + + + KylinSec. All rights reserved. + KylinSec. بارلىق ھوقۇقلارنى تەكشۈرۈش. Unknow - + نامەلۇم %1 GB (%2 GB available) - + %1 GB (%2 GB ئىشلەتكىلى بولىدۇ + + + + HardwareInformationWidget + + CPU: + CPU: + + + Memory: + ئىچكى ساقلىغۇچ: + + + Hard disk: + قاتتىق دىسكا: + + + Graphics card: + گرافىك كارتىسى: + + + Network card: + تور كارتىسى: + + + Unknow + نامەلۇم @@ -1983,7 +2614,7 @@ Hardware Information - + قاتتىق دېتال ئۇچۇرلىرى @@ -1991,12 +2622,46 @@ Form - + شەكىل Icon Themes Setting - + Icon ThemSetting + + + + IconThemes + + Icon Themes Setting + Icon ThemSetting + + + Faild + Feld + + + Set icon themes failed! + سىنبەلگە باشتېمىلىرىنى تەڭشەڭ! + + + + IdentificationRenameDialog + + Rename Feature + مەدەنىيەتنىڭ نامىنى ئۆزگەرتىش + + + Please enter the renamed feature name + ئۆزگەرتىلگەن ئىقتىدار نامىنى ئېلان قىلىڭ + + + Confirm + جەزملەشتۈرۈڭ + + + Cancel + ئەمەلدىن قالدۇرۇڭ @@ -2004,22 +2669,22 @@ Add Image Failed - + رەسىم فوندى قوشۇڭ The image already exists! - + رەسىم نومۇرى مەۋجۇت! Delete image - + رەسىمنى ئۆچۈرۈڭ Are you sure you want to delete this picture? - + بۇ رەسىمنى ئۆچۈرمەكچىمۇ? @@ -2027,12 +2692,12 @@ Confirm - + جەزملەشتۈرۈڭ Cancel - + ئەمەلدىن قالدۇرۇڭ @@ -2040,37 +2705,42 @@ InputPage - + InputPage + Input cards + كىرگۈزۈش كارتىسى + + + Input devices - + كىرگۈزۈش ئۈسكۈنىلىرى - + ComboBoxInputDevices - + ComboBoxInputDevices - + Input volume - + كىرگۈزۈش تۇراقسىز - + SliderVolumeSetting - + SliderVolumeSetting - + Feedback volume - + ئىنكاس ئاۋازى - + No input device detected - + ھېچقانداق كىرگۈزۈش ئۈسكۈنىسى ئۈسكۈنىسى قوغدالمىدى @@ -2078,118 +2748,124 @@ Ipv4Widget - + IPv4Widget IPV4 Method - + IPV4 ئۇسۇلى ComboBoxIpv4Method - + ComboBoxIpv4Method IP Address - + IP ئادرېس EditIpv4Address - + EditIpv4Address Net Mask - + Net Mask EditIpv4Netmask - + EditIpv4Netmask Gateway - + دەرۋازا EditIpv4Gateway - + EditIpv4Gateway - DNS 1 - - - - - DNS 2 - + DNS + DNS EditIpv4PreferredDNS - + EditIpv4 PreferredDNS - - EditIpv4AlternateDNS - - - - + Auto - + ئاپتوماتىك - + Manual - + قولدا - + Required - + تەلەپ قىلىندى + + + + Please separate multiple DNS entries by semicolon + يېرىم ئۆتكۈزگۈچنىڭ كۆپ خىل DNS تۈرلىرىنى تارقىتىڭ + + + + Ipv4 DNS invalid + IPv4 DNS ئىناۋەتسىز - + Ipv4 address can not be empty - + IPv4 ئادرېسىنى ھېسابقا ئالمىغاندا بولمايدۇ - + Ipv4 Address invalid - + IPv4 ئادرېس ئىناۋەتسىز - + NetMask can not be empty - + NetMask بۇنىڭ سىرتىدا ئەمەس - + Netmask invalid - + Netmask ئىناۋەتسىز - + Ipv4 Gateway invalid - + IPv4 كىرىش ئېغىزى ئىناۋەتسىز + + + Preferred DNS + ياقتۇرىدىغان DNS + + + Alternate DNS + باشقا DNS - Ipv4 Preferred DNS invalid - + IPv4 ياقتۇرىدىغان DNS ئىناۋەتسىز - Ipv4 Alternate DNS invalid - + IPv4 باشقا DNS ئىناۋەتسىز @@ -2197,161 +2873,178 @@ Ipv6Widget - + IPv6Widget IPV6 Method - + IPV6 ئۇسۇلى ComboBoxIpv6Method - + ComboBoxIpv6Method IP Address - + IP ئادرېس EditIpv6Address - + EditIpv6Address Prefix - + Refix SpinBoxIpv6Prefix - + SpinBoxIpv6 Prefix Gateway - + دەرۋازا EditIpv6Gateway - + EditIpv6Gateway - Preferred DNS - + DNS + DNS EditIpv6PreferredDNS - - - - - Alternate DNS - - - - - EditIpv6AlternateDNS - + EditIpv6 PreferredDNS - + Auto - + ئاپتوماتىك - + Manual - + قولدا - + Ignored - + پەرۋا قىلمىدى - + Required - + تەلەپ قىلىندى + + + + Please separate multiple DNS entries by semicolon + يېرىم ئۆتكۈزگۈچنىڭ كۆپ خىل DNS تۈرلىرىنى تارقىتىڭ + + + + Ipv6 DNS invalid + IPv6 DNS ئىناۋەتسىز - + Ipv6 address can not be empty - + IPv6 ئادرېسىنى ھېسابقا ئالمىغاندا بولمايدۇ - + Ipv6 address invalid - + IPv6 ئادرېسى ئىناۋەتسىز - + Ipv6 Gateway invalid - + IPv6 كىرىش ئېغىزى ئىناۋەتسىز + + + Preferred DNS + ياقتۇرىدىغان DNS + + + Alternate DNS + باشقا DNS - Ipv6 Preferred DNS invalid - + IPv6 ياقتۇرىدىغان DNS ئىناۋەتسىز - Ipv6 Alternate DNS invalid - + IPv6 باشقا DNS ئىناۋەتسىز IrisPage - - - iris - - Default Iris device - + سۈكۈتتىكى Iris ئۈسكۈنىسى Iris feature list - + Iris ئىقتىدار تىزىملىكى + + + + iris + Iris Cancel - + ئەمەلدىن قالدۇرۇڭ Start enroll failed,%1 - + تىزىمغا ئالدۇرۇش مەيدانىنى باشلاڭ،% 1 Error - + خاتالىق The biometric features were successfully recorded. The feature name is:%1 - + بىئولوگىيەلىك ئىقتىدارلار ھەممە يەردە مەسئۇلىيەتچانلىق بىلەن خاتىرىلەنگەن. ئىقتىدار ئىسمى:% 1 Tips - + كۆرسەتمە Failed to record biometrics(%1), Please try again - + Biometrics(%11) نى خاتىرىلىيەلمىدى، ئاگېننى سىناپ بېقىڭ + + + + KcpInterface + + Warning + ئاگاھلاندۇرۇش + + + load qss file failed + qss ھۆججەت ھۆججەت ھۆججىتىنى يۈكلەڭ @@ -2359,7 +3052,7 @@ Keybinding - + Keybinding @@ -2367,12 +3060,35 @@ None - + ھېچكىم يوق disabled - + چەكلەش + + + + KiranAccountManager + + disable + چەكلەش + + + enable + مۇقىم + + + Create new user + يېڭى ئىشلەتكۈچى قۇرۇش + + + User Manager + ئىشلەتكۈچى باشقۇرغۇچى + + + Create new account + يېڭى ھېسابات قۇرۇش @@ -2380,17 +3096,154 @@ Avatar Editor - + ئاۋات تەھرىر Confirm - + جەزملەشتۈرۈڭ Cancel - + ئەمەلدىن قالدۇرۇڭ + + + + KiranCPanelMouse + + Mouse and TouchPad + House and TouchPad + + + + KiranCPanelMouseWidget + + Select Mouse Hand + ئۆي قولىنى تاللاڭ + + + Mouse Motion Acceleration + ئۆي ھەرىكىتىنى تېزلىتىش + + + Natural Scroll + تەبىئىي سىيرىلما + + + Middle Emulation Enabled + ئوتتۇرا تەقلىد قىلىش ئىقتىدارى + + + Touchpad Enabled + Touchpad قوزغىتىلغان + + + Select TouchPad Hand + TouchPad Hand نى تاللاڭ + + + TouchPad Motion Acceleration + TouchPad ھەرىكەتنى تېزلىتىش + + + Select Click Method + چېكىش ئۇسۇلىنى تاللاڭ + + + Select Scroll Method + سىيرىلما ئۇسۇلنى تاللاڭ + + + Enabled while Typing + خەت يېزىش جەريانىدا قوزغىتىڭ + + + Tap to Click + چېكىڭ + + + Reset + ئەسلىگە كەلتۈرۈش + + + Exit + چىقىش + + + Cancel + ئەمەلدىن قالدۇرۇڭ + + + Save + تېجەڭ + + + Mouse Settings + ئۆي تەڭشەكلىرى + + + TouchPad Settings + TouchPad تەڭشەكلىرى + + + Standard + ئۆلچەملىك + + + Right Hand Mode + ئوڭ قول ھالىتى + + + Left Hand Mode + سول قول ھالىتى + + + Press and Tap + بېسىش ۋە چېكىش + + + Tap + چېكىش + + + Two Finger Scroll + ئىككى بارماق دومىلىمىسى + + + Edge Scroll + Edge Scroll + + + Slow + ئاستا + + + Fast + تېز + + + + KiranCollapse + + + ListExpansionSpace + ListExpansionSpace + + + + KiranCpanelAppearance + + Wallpaper Setting + تام قەغىزى + + + Theme Setting + تېما ھەل قىلىش + + + Font Setting + خەت يېزىش @@ -2398,7 +3251,7 @@ Form - + شەكىل @@ -2406,15 +3259,34 @@ Create new group - + يېڭى گۇرۇپپا قۇرۇش KiranModuleWidget + + Warning + ئاگاھلاندۇرۇش + + + The edited content in %1 is not saved. After switching, the edited content will be lost. Are you sure you want to save? + % 1 دىكى تەھرىرلەنگەن مەزمۇن ساقلانمايدۇ. ئالماشتۇرغاندىن كېيىن، تەھرىرلەنگەن مەزمۇنلار تىزىملىك بولىدۇ. تېجەپ قالماقچىمۇ? + Form - + شەكىل + + + + KiranSystemWidget + + kiran-system-imformation + كىران سىستېمىسى-شەكىل + + + 保存 + تېجەڭ @@ -2422,96 +3294,191 @@ KiranTimeDateWidget - + KiranTimeDateWidget + + + + Automatic synchronizetion + ماشىنا ماس قەدەملەشتۈرۈش + + + + Change Time Zone + ۋاقىت رايونىنى ئۆزگەرتىش + + + + Set Time Manually + ۋاقىتنى قولدا بەلگىلەڭ + + + + Time date format setting + ۋاقىت چېسلا فورماتى تەڭشەش + + + + %1(%2) + %1(%2) + + + + KiranTimePickerWidget + + + Form + شەكىل + + + + KiranTimeZone + + + Form + شەكىل + + + + Search in all time zones... + بارلىق ۋاقىت رايونىنى ئىزدەڭ... + + + + KiranTimeZoneItem + + + Form + شەكىل + + + + No search results, please search again... + ئىزدەش نەتىجىسى يوق، سەۋەبى... + + + + KiranTimeZoneList + + + Form + شەكىل + + + + KiranTips + + + + Form + شەكىل + + + + KylinsecLogo + + + Copyright © + نەشر ھوقۇقى © + + + + KylinSec. All rights reserved. + KylinSec. بارلىق ھوقۇقلارنى تەكشۈرۈش. + + + + LangpackInstaller + + Package Install + بوغچا ئورنىتىش + + + Installing... + قاچىلاش... + + + Install Complete! + قاچىلاش تامام! + + + + LanguageManager + + Error + خاتالىق - - Automatic synchronizetion - + set locale failed + يەرلىك مەكتەپ مەيدانىنى بەلگىلەڭ - - Change Time Zone - + %1 inexistence in system + %سىستېمىدا% 1 + + + LanguagePage - - Set Time Manually - + Language Select(Reboot to take effect) + تىل Select(Reboot ئۈنۈم بېرىدۇ - - Time date format setting - + Simplified Chinese + ئاددىيلاشتۇرۇلغان خەنزۇچە - - %1(%2) - + English + ئىنگىلىزچە - - - KiranTimePickerWidget - - Form - + Tibetan + زاڭزۇ - - - KiranTimeZone - - Form - + Kirgiz + Kirgiz - - Search in all time zones... - + Mongolian + موڭغۇل - - - KiranTimeZoneItem - - Form - + Kazakh + قازاقىستان - - No search results, please search again... - + Uighur + ئۇيغۇر - KiranTimeZoneList + LanguagePlugin - - Form - + Language + تىل - KiranTips + LanguageSelectDialog - - - Form - + Dialog + دىئالوگ - - - KylinsecLogo - - Copyright © - + No + ياق - - KylinSec. All rights reserved. - + Yes + ھەئە + + + Add Language + تىل قوشۇڭ + + + Search + ئىزدەش @@ -2519,7 +3486,7 @@ Form - + شەكىل @@ -2527,7 +3494,7 @@ LayoutList - + LayoutList @@ -2535,44 +3502,44 @@ Form - + شەكىل Select Kayboard Layout - + كۇنۇپكا تاختىسىنى تاللاڭ Edit - + تەھرىرلەش Add Layout - + ئورۇنلاشتۇرۇش قوشۇڭ ButtonAddLayout - + Button AddLayout Addition - + قوشۇش ButtonReturn - + ButtonReturn Return - + قايتىش @@ -2580,37 +3547,37 @@ Failed - + تاماملاندى You have added this keyboard layout! - + سىز بۇ كۇنۇپكا تاختىسىنى قوشتىڭىز! The %1 keyboard layout does not exist! - + % 1 كۇنۇپكا تاختىسىنىڭ ئورۇنلاشتۇرۇلۇشى يوق! The keyboard layout is currently in use and cannot be deleted! - + كۇنۇپكا تاختىسىنىڭ ئورۇنلاشتۇرۇلۇشى نۆۋەتتىكى بولۇپ، ئۆچۈرگىلى بولمايدۇ! Delete Layout - + ئورۇنلاشتۇرۇشنى ئۆچۈرۈڭ You do not appear to have added %1 keyboard layout! - + سىز% 1 كۇنۇپكا تاختىسىنىڭ ئورۇنلاشتۇرۇلۇشىغا ئىمزا قويمايسىز! Finish - + تامام @@ -2618,7 +3585,7 @@ Keyboard Layout - + كۇنۇپكا تاختىسى ئورۇنلاشتۇرۇش @@ -2626,79 +3593,197 @@ Form - + شەكىل BrowserLicense - + BrowserLicense <!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;"> +</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> - + <! DOCTYPE HTML PUBLIC "-/W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <html><><==>< "qrichtext" مەزمۇن= "1" />style type" تېكىست/css " + p,li { ئاق بوشلۇق: ئالدىن ئوراش } + </style><>/head<=body style>" خەت نۇسخىسى: "Noto Sans CJK SC"؛ خەت چوڭلۇقى: 9pt؛ خەت نۇسخىسى: 400؛ خەت شەكلى: نورمال " + <p style="-qt- ئابزاس تىپى: بۇنىڭ سىرتىدا margin-top: 0px؛ margin-bottom: 0px؛ margin-lift: 0px؛ margin-lift: 0px؛ -qt-block-ent: 0؛ تېكىست كۆرسەتكۈچى: 0؛ تېكىست كۆرسەتكۈچى: 0px؛ ">/<br/ p></body></html> ButtonExportLicense - + ButtonExportLicense Export - + ئېكسپورت ButtonCloseLicense - + ButtonCloseLicense Close - + تاقاش - + Save - + تېجەڭ - + PDF(*.pdf) - + PDF(*.pdf) - + Export License - + ئېكسپورت ئىجازەتنامىسى - + Export License failed! - + ئېكسپورت ئىجازەتنامىسى FALED! - + User End License Agreement - + ئىشلەتكۈچى ئاخىرقى ئىجازەتنامىسى - - - - + + + + + + None - + ھېچكىم يوق - + Version License - + نەشرى ئىجازەتنامىسى + + + Export EULA + ئېكسپورت EULA + + + Export EULA failed! + EULA ئېكىسپورت قىلىندى! + + + + + Privacy Policy + مەخپىيەتلىك سىياسىتى + + + + LicenseInfoWidget + + Machine Code: + ماشىنا كودى: + + + Activation Code: + پائالىيەت كودى: + + + Activation Information + پائالىيەت ئۇچۇرلىرى + + + Can't get machine code + ماشىنا كودىغا ئېرىشەلمەيدۇ + + + Can't get activation code + پائالىيەت كودىغا ئېرىشەلمەيدۇ + + + + LicenseInformation + + Installation time: + قاچىلاش ۋاقتى: + + + Activation status: + پائالىيەت ھالىتى: + + + Expiry date: + ۋاقتى توشقان: + + + Contact Us: + بىز بىلەن ئالاقىلىشىڭ: + + + Unknow + نامەلۇم + + + Can't get activation information + پائالىيەت ئۇچۇرلىرىغا ئېرىشەلمەيدۇ + + + Activate + ئاكتىپلاش + + + The current time is illegal + ھازىرقى ۋاقىت قانۇنسىز + + + Less than the installation time + قاچىلاش ۋاقتىدىن ئاز + + + Not activated. Trail expiration: + ئاكتىپ ئەمەس. يول كەچۈرۈم قىلىش: + + + get service status failed + مۇلازىمەت ھالىتى ھۆججىتىگە ئېرىشىڭ + + + Not yet + تېخى ئەمەس + + + Activated + ئاكتىپلاندى + + + Forever + مەڭگۈ + + + Copyright © + نەشر ھوقۇقى © + + + KylinSec. All rights reserved. + KylinSec. بارلىق ھوقۇقلارنى تەكشۈرۈش. + + + + ListExpansionSpace + + + ListExpansionSpace + ListExpansionSpace @@ -2706,87 +3791,87 @@ p, li { white-space: pre-wrap; } Audio Play - + Audio Play Search - + ئىزدەش WWW - + WWW Audio Lower Volume - + ئاۋاز مۇنارى ھەجىمى Audio Raise Volume - + Audio Raise Volume Mic Mute - + Mic Mute Audio Stop - + ئاۋاز دۇكىنى Explorer - + Explorer Calculator - + ھېسابلىغۇچ Audio Mute - + Audio Mute Audio Pause - + Audio Pause Audio Prev - + Audio Prev Audio Media - + Audio Media Audio Next - + Audio Next Mail - + خەت Tools - + قوراللار Eject - + E-project @@ -2794,7 +3879,7 @@ p, li { white-space: pre-wrap; } MMMM - + MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM @@ -2802,62 +3887,62 @@ p, li { white-space: pre-wrap; } Form - + شەكىل Select Mouse Hand - + ئۆي قولىنى تاللاڭ ComboSelectMouseHand - + ComboSelectMouseHand Mouse Motion Acceleration - + ئۆي ھەرىكىتىنى تېزلىتىش SliderMouseMotionAcceleration - + SliderMouseMotionAcceleration Slow - + ئاستا Fast - + تېز Natural Scroll - + تەبىئىي سىيرىلما SwitchMouseNatturalScroll - + SwitchMouseNatturalScroll Middle Emulation Enabled - + ئوتتۇرا تەقلىد قىلىش ئىقتىدارى SwitchMiddleEmulation - + SwitchMiddleEmulation Test mouse wheel direction - + سىناق ئۆي چاقى يۆنىلىشى @@ -2911,17 +3996,105 @@ 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-قۇر Right Hand Mode - + ئوڭ قول ھالىتى Left Hand Mode - + سول قول ھالىتى + + + + MouseSettings + + Select Mouse Hand + ئۆي قولىنى تاللاڭ + + + Mouse Motion Acceleration + ئۆي ھەرىكىتىنى تېزلىتىش + + + Natural Scroll + تەبىئىي سىيرىلما + + + Middle Emulation Enabled + ئوتتۇرا تەقلىد قىلىش ئىقتىدارى + + + Right Hand Mode + ئوڭ قول ھالىتى + + + Left Hand Mode + سول قول ھالىتى + + + Slow + ئاستا + + + Standard + ئۆلچەملىك + + + Fast + تېز @@ -2929,74 +4102,91 @@ This is line 50 of the test text Mouse Settings - + ئۆي تەڭشەكلىرى NetworkSubItem - + Wired Network %1 - + سىملىق تور% 1 - + Wired Network - + سىملىق تور - + Wireless Network %1 - + سىمسىز تور% 1 - + Wireless Network - + سىمسىز تور - + VPN - + VPN - + Network Details - + تور تەپسىلاتلىرى NetworkTray - + Network settings - + تور نۇقتىلىرى - - + + Network unavailable - + تورنى ئىشلەتكىلى بولمايدۇ + + + + + The network is connected, but you cannot access the Internet + تور ئۇلانغان، ئەمما تورغا چىقالايسىز + + + + Network not connected + تور ئۇلانمىدى - + Wired network card: %1 available - + سىملىق تور كارتىسى:% 1 ئىشلەتكىلى بولىدۇ - + Wireless network card: %1 available - + سىمسىز تور كارتىسى:% 1 ئىشلەتكىلى بولىدۇ - + Wired network card: %1 unavailable - + سىملىق تور كارتىسى:% 1 ئىشلەتكىلى بولمايدۇ - + Wireless network card: %1 unavailable - + سىمسىز تور كارتىسى:% 1 ئىشلەتكىلى بولمايدۇ + + + + + Network connected + تور ئۇلاندى @@ -3004,52 +4194,57 @@ This is line 50 of the test text OutputPage - + OutputPage + + + + Output cards + چىقىرىش كارتىسى - + Output devices - + چىقىرىش ئۈسكۈنىلىرى - + ComboBoxOutputDevices - + ComboBoxOutputDevices - + Output volume - + چىقىرىش تۇراقسىزلىقى - + SlilderVolumeSetting - + SlilderVolumeSetting - + Left/right balance - + سول/ئوڭ تەڭپۇڭلۇق - + SliderVolumeBalance - + SliderVolumeBalance - + Left - + سول - + Right - + توغرا - + No output device detected - + ھېچقانداق چىقىرىش ئۈسكۈنىسى بايقالمىدى @@ -3057,7 +4252,7 @@ This is line 50 of the test text Control Panel - + كونترول تاختىسى @@ -3065,112 +4260,119 @@ This is line 50 of the test text PasswordExpirationPolicyPage - + PasswordExpirationPolicyPage User expires - + ئىشلەتكۈچىنىڭ ۋاقتى توشىدۇ SpinBoxUserExpires - + SpinBoxUserExpires yyyy-MM-dd - + Yyyy-MM-dd Last password change - + ئاخىرقى پارول ئۆزگەرتىش LabelLastPasswdChange - + LabelLastPasswdChange 1990-01-01 - + 1990-01-01 Maximum vaild days of password - + پارولنىڭ ئەڭ چوڭ مايسىلىرى SpinBoxMaximumValidDays - + SpinBoxMaximumValidDays Prompt time before password expiration - + تېز سۈرئەتلىك BEFOWSWORD كەچۈرۈم قىلىش SpinBoxPromptBeforeExpiration - + SpinBoxPromptBeforeExpiration how many days after password expires will become inactive - + ئىنسان سۆز مەنزىلىدىن بىر نەچچە كۈن كېيىن قانداق ئۈنۈم بېرىدۇ SpinBoxPasswdInactiveTime - + SpinBoxPasswd InteractiveTime ButtonSave - + ButtonSave save - + تېجەڭ ButtonReturn - + ButtonReturn return - + قايتىش day - + كۈن PluginConnectionList - + Other WiFi networks - + باشقا WiFi تورى - + Tips - + كۆرسەتمە - + Please input a network name - + تور نامىنى كىرگۈزۈڭ + + + + Popup + + cancel + ئەمەلدىن قالدۇرۇڭ @@ -3178,17 +4380,17 @@ This is line 50 of the test text General Settings - + ئادەتتىكى تەڭشەكلەر Power Settings - + توك تەڭشەكلىرى Battery Settings - + باتارېيە تەڭشىكى @@ -3197,19 +4399,19 @@ This is line 50 of the test text power-saver - + قۇۋۋەت ساقلىغۇچى balanced - + تەڭپۇڭلاشتۇرۇلغان performance - + ئىقتىدار @@ -3217,52 +4419,59 @@ This is line 50 of the test text PowerSettingsPage - + PowerSettingsPage After idle for more than the following time, the computer will execute - + كېيىنكى ۋاقىتتىن ئارتۇق بىكار تۇرغاندىن كېيىن، كومپيۇتېر ئىجرا قىلىدۇ ComboIdleTime - + ComboIdleTime ComboIdleAction - + ComboIdleAction The monitor will turn off when it is idle - + نازارەتچى بۇرۇلۇپ ئاندىن بىكار بولىدۇ ComboMonitorTrunOffIdleTime - + ComboMonitorTrunOffIdleTime Suspend - + چىقىم Shutdown - + تاقاش Hibernate - + قىشلىق ئۇيقۇ Do nothing - + ھېچ ئىش قىلماڭ + + + + PowerSubItem + + Power Settings + توك تەڭشەكلىرى @@ -3270,77 +4479,132 @@ This is line 50 of the test text Authentication type Enabled status - + دەلىللەش تىپى قوزغىتىش ھالىتى fingerprint - + بارماق ئىزى fingervein - - - - - ukey - - - - - iris - - - - - face - + Fingervein ... - + ... Return - + قايتىش login - + كىرىش unlock - + قۇلۇپ ئېچىش empowerment - + ھوقۇق بېرىش Apply the %1 authentication to the following applications - + تۆۋەندىكى پروگراممىغا% 1 قوللىنىشچان پروگراممىنى ئىشلىتىڭ + + + + ukey + Ukey + + + + iris + Iris + + + + face + چىراي QObject - - Failed - + Did not reply within the specified timeout + بەلگىلەنگەن ۋاقىت بىلەن ئازايمىدى + + + The called service is not known + چاقىرىش مۇلازىمىتى ئېنىق ئەمەس + + + warning + ئاگاھلاندۇرۇش + + + Open qss file failed + Qss ھۆججەت فورماتىنى ئېچىڭ + + + + %1Day + %1Day % + + + + %1Hour + %1 سائەت + + + + %1Minute + %1 مىنۇت + + + + never + ھەرگىز بولمايدۇ + + + SLow + ئاستا - - Set font failed! - + Standard + ئۆلچەملىك + + + Fast + تېز + + + Faild + Feld + + + Connect Mouse or TouchPad Dbus Failed! + ئۇلىنىش ئۆيى ياكى TouchPad Dbus Faaled! + + + Load qss file failed! + يۈك qss ھۆججىتى يېقىلغۇ قىلىندى! + + + + No search results, please search again... + ئىزدەش نەتىجىسى يوق، سەۋەبى... @@ -3348,7 +4612,7 @@ This is line 50 of the test text Tips - + كۆرسەتمە @@ -3356,42 +4620,51 @@ This is line 50 of the test text OK(K) - + OK(K) Failed to apply display settings!%1 - + كۆرسىتىش يۈرۈشلۈكلىرىنى ئىشلىتىشكە ماس كېلىدۇ! %1% Fallback display setting failed! %1 - + Fallback Display Settling Failled! %1% - - No search results, please search again... - + Failed + تاماملاندى - - %1Day - + Set font failed! + خەت مەيدانىنى بەلگىلەڭ! - - %1Hour - + Get icon themes failed! + سىنبەلگە مەيدانىغا ئېرىشىڭ! - - %1Minute - + Get cursor themes failed! + نۇر بەلگىنى ئېلىڭ بۇ باشتېمىلار سۇسلاشتى! - - never - + Warning + ئاگاھلاندۇرۇش + + + There is no theme to set! + بۇ يەردە تەڭشەيدىغان تېما يوق! + + + + Spring + باھار + + + + Summer + ياز @@ -3399,17 +4672,17 @@ This is line 50 of the test text Enter keywords to search - + ئىزدەش ئۈچۈن ئاچقۇچلۇق سۆزلەرنى كىرگۈزۈڭ Info - + ئۇچۇر Failed to find related items, please re-enter! - + مۇناسىۋەتلىك تۈرلەرنى تاپالمىدى، مائاش قايتا كىردى! @@ -3417,22 +4690,22 @@ This is line 50 of the test text Confirm - + جەزملەشتۈرۈڭ Return - + قايتىش select picture - + رەسىمنى تاللاڭ 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 *.ups *. AI *.raw *. WMF *.webp) @@ -3440,14 +4713,14 @@ This is line 50 of the test text Form - + شەكىل TextLabel - + TextLabel @@ -3455,29 +4728,29 @@ This is line 50 of the test text Form - + شەكىل EditSearch - + EditSearch Custom - + ئادەت Edit - + تەھرىرلەش ButtonAddShortcut - + ButtonAddShortcut @@ -3485,154 +4758,154 @@ This is line 50 of the test text Add - + قوش ButtonReset - + ButtonReset Reset - + ئەسلىگە كەلتۈرۈش Custom Shortcut Name - + ئىختىيارى تېزلەتمە ئىسمى EditCustomShortcutName - + EditCustomShortcutName Custom Shortcut application - + ئىختىيارى تېزلەتمە قوللىنىشچان پروگرامما EditShortcutApp - + EditShortcutApp Custom Shortcut Key - + ئىختىيارى تېزلەتمە ئاچقۇچ ButtonAdd - + ButtonAdd ButtonCancel - + ButtonCancellor Cancel - + ئەمەلدىن قالدۇرۇڭ Shortcut Name - + تېزلەتمە ئىسمى EditShortcutName - + EditShortcutName Shortcut application - + تېزلەتمە قوللىنىشچان پروگرامما Shortcut key - + تېزلەتمە ئاچقۇچ ButtonSave - + ButtonSave Save - + تېجەڭ ButtonReturn - + ButtonReturn 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 - + ھۆججەتنى ئېچىڭ System - + سىستېما Sound - + ئاۋاز @@ -3643,64 +4916,64 @@ This is line 50 of the test text 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", Because you cannot enter with this key.Please try again using Ctrl, Alt, or Shift at the same time. - + "% 1" سايلام ھوقۇقىنى ئىشلىتەلمەيسىز، چۈنكى سىز بۇ ئاچقۇچ بىلەن ئىگىلىك تىكلىگۈچىنى ئىزاھلىيالايسىز. ئويۇن ۋاقتىدا Ctrl، Alt ياكى Shift ئارقىلىق خاسلىقنى سىناپ بېقىڭ. Shortcut keys %1 are already used in %2,Please try again! - + تېزلەتمە ئاچقۇچ% 1 نىڭ ھەممىسى% 2 تەييار، قايتا سىناپ بېقىڭ! @@ -3708,71 +4981,86 @@ This is line 50 of the test text Form - + شەكىل TextLabel - + TextLabel + + + + ShowQRCode + + Scan QR code to get machine code + ماشىنا كودىغا ئېرىشىش ئۈچۈن QR كودىنى سايىلەڭ + + + QRcode of Machine and Activation Code + ماشىنا ۋە پائالىيەت كودىنىڭ QRcode + + + Scan QR code to get activation code + ھەرىكەت كودىغا ئېرىشىش ئۈچۈن QR كودىنى سايىلەڭ StatusNotification - - - - - + + + + + Connection Failed - + ئۇلىنىش مەيدانى - + the network not found - + تور تېپىلمىدى - + The hidden network "%1" to be connected has been detected and exists in the network list - + ئۇلىنىدىغان يوشۇرۇن تور "% 1" قوغدالدى ۋە تور تىزىملىكىدە مەۋجۇت - - - + + + Failed to connect to the network "%1" - + تورغا ئۇلىنىدىغان مەيدان "% 1" - + Connection activated - + ئۇلىنىش ئاكتىپ - + You are now connected to the network "%1" - + سىز ھازىر "% 1" تورىغا ئۇلاندىڭىز" - + Connection deactivated - + ئۇلىنىش توختىتىلدى - + You have now disconnected the network "%1" - + سىز ھازىر "% 1" تورىدىن ئايرىلدىڭىز" - + Connection deleted - + ئۇلىنىش ئۆچۈرۈلدى - + The connection has been deleted "%1" - + ئۇلىنىش ئۆچۈرۈلدى "% 1" @@ -3780,7 +5068,7 @@ This is line 50 of the test text System Information - + سىستېما ئۇچۇرى @@ -3788,136 +5076,249 @@ This is line 50 of the test text Form - + شەكىل Host Name: - + ساھىبجامال ئىسمى: - + LabelHostName - + LabelHostName - - - - - + + + + + TextLabel - + TextLabel - + ButtonChangeHostName - + ButtonChangeHostName - + Change - + ئۆزگەرتىش - + System Version: - + سىستېما نەشرى: - + LabelSystemVersion - + بەلگە SystemVersion - + Kernel Version: - + مېغىز نۇسخىسى: - + LabelKernelVersion - + LabelKernelVersion - + System Architecture: - + سىستېما قۇرۇلمىسى: - + LabelSystemArch - + LabelSystemArch - + Activation status: - + پائالىيەت ھالىتى: - - - + + + + Show - + كۆرسەت - + EULA: - + EULA: - + ButtonShowEULA - + ButtonShowEULA - + Version License: - + نەشرى ئىجازەتنامىسى: - + ButtonShowVersionLicense - + ButtonShowVersionLicense - - - - + + + + Unknow - + نامەلۇم - + UnActivated - + قەتئىي ئەمەس - + Activation code has expired - + پائالىيەت كودىنىڭ ۋاقتى توشتى - + Permanently activated - + مەڭگۈلۈك ئاكتىپ - + Activated - + ئاكتىپلاندى - + Error - + خاتالىق - + Failed to open the license activator - + ئىجازەتنامە ئارتىسى ئېچىش مەيدانى + + + Copyright © + نەشر ھوقۇقى © + + + KylinSec. All rights reserved. + KylinSec. بارلىق ھوقۇقلارنى تەكشۈرۈش. + + + + Privacy policy: + مەخپىيەتلىك سىياسىتى: + + + + SystemInformationWidget + + Host Name: + ساھىبجامال ئىسمى: + + + System Version: + سىستېما نەشرى: + + + Kernel Version: + مېغىز نۇسخىسى: + + + System Architecture: + سىستېما قۇرۇلمىسى: + + + Installation time: + قاچىلاش ۋاقتى: + + + Activation status: + پائالىيەت ھالىتى: + + + Expiry date: + ۋاقتى توشقان: + + + EULA: + EULA: + + + Version License: + نەشرى ئىجازەتنامىسى: + + + Contact Us: + بىز بىلەن ئالاقىلىشىڭ: + + + Change + ئۆزگەرتىش + + + Show + كۆرسەت + + + Unknow + نامەلۇم + + + The current time is illegal + ھازىرقى ۋاقىت قانۇنسىز + + + Less than the installation time + قاچىلاش ۋاقتىدىن ئاز + + + Not activated. Trail expiration: + ئاكتىپ ئەمەس. يول كەچۈرۈم قىلىش: + + + Can't get activation information + پائالىيەت ئۇچۇرلىرىغا ئېرىشەلمەيدۇ + + + Activate + ئاكتىپلاش + + + get service status failed + مۇلازىمەت ھالىتى ھۆججىتىگە ئېرىشىڭ + + + Not yet + تېخى ئەمەس + + + Activated + ئاكتىپلاندى + + + Forever + مەڭگۈ + + + Copyright © + نەشر ھوقۇقى © + + + KylinSec. All rights reserved. + KylinSec. بارلىق ھوقۇقلارنى تەكشۈرۈش. @@ -3925,17 +5326,17 @@ This is line 50 of the test text Tips - + كۆرسەتمە Yes - + ھەئە Cancel - + ئەمەلدىن قالدۇرۇڭ @@ -3943,53 +5344,95 @@ This is line 50 of the test text Form - + شەكىل Dark and Light Theme - + قاراڭغۇ ۋە يېنىك تېما Themes Settings - + تېما تەڭشەكلىرى Open Window Effects - + كۆزنەك ئۈنۈمىنى ئېچىڭ - + Unknown - + نامەلۇم + + + + Light Theme + نۇر تېمىسى + + + + Auto + ئاپتوماتىك + + + + Dark Theme + قاراڭغۇ تېما Choose icon Theme - + سىنبەلگە تېمىسىنى تاللاڭ - + Choose cursor Themes - + نۇر بەلگە تېمىسىنى تاللاڭ + + + + ThemeWidget + + Dark Theme + قاراڭغۇ تېما - Light Theme - + نۇر تېمىسى - Auto - + ئاپتوماتىك + + + + Themes + + Dark and Light Theme + قاراڭغۇ ۋە يېنىك تېما - - Dark Theme - + Themes Settings + تېما تەڭشەكلىرى + + + Open Window Effects + كۆزنەك ئۈنۈمىنى ئېچىڭ + + + Choose icon themes + سىنبەلگىلەرنى تاللاڭ + + + Unknown + نامەلۇم + + + Choose cursor themes + نۇر بەلگە تېمىسىنى تاللاڭ @@ -3997,12 +5440,12 @@ This is line 50 of the test text Failed - + تاماملاندى List shortcut failed,error: - + تېزلەتمە مالىيە، خاتالىق: @@ -4010,22 +5453,22 @@ This is line 50 of the test text Time Date Settings - + ۋاقىت ۋاقتى تەڭشەكلىرى Chnage time Zone - + سەھنە ۋاقتى رايونى Set time Manually - + ۋاقىتنى قولدا بەلگىلەڭ Time date format setting - + ۋاقىت چېسلا فورماتى تەڭشەش @@ -4033,32 +5476,50 @@ This is line 50 of the test text TimezoneSettings - + TimezoneSettings Select Time Zone - + ۋاقىت رايونىنى تاللاڭ ButtonSave - + ButtonSave save - + تېجەڭ ButtonReturn - + ButtonReturn reset - + ئەسلىگە كەلتۈرۈش + + + + TopBar + + + ListExpansionSpace + ListExpansionSpace + + + + TITLE + ماۋزۇ + + + + FLAG + بايراق @@ -4066,127 +5527,206 @@ This is line 50 of the test text Form - + شەكىل TouchPad Enabled - + TouchPad قوزغىتىڭ SwitchTouchPadEnable - + SwitchTouchPadEnable Select TouchPad Hand - + TouchPad Hand نى تاللاڭ ComboTouchPadHand - + ComboTouchPadHand TouchPad Motion Acceleration - + TouchPad ھەرىكەتنى تېزلىتىش SliderTouchPadMotionAcceleration - + SliderTouchPadMotionAcceleration Slow - + ئاستا Fast - + تېز Select Click Method - + چېكىش ئۇسۇلىنى تاللاڭ ComboClickMethod - + ComboClickMethod Select Scroll Method - + سىيرىلما ئۇسۇلنى تاللاڭ ComboScrollMethod - + ComboScrollMethod Natural Scroll - + تەبىئىي سىيرىلما ComboNaturalScroll - + ComboNaturalScroll Enabled while Typing - + خەت يېزىش جەريانىدا قوزغىتىڭ SwitchTypingEnable - + SwitchTypingEnable Tap to Click - + چېكىڭ SwtichTapToClick - + SwtichTapToClick Right Hand Mode - + ئوڭ قول ھالىتى Left Hand Mode - + سول قول ھالىتى Press and Tap - + بېسىش ۋە چېكىش Tap - + چېكىش Two Finger Scroll - + ئىككى بارماق دومىلىمىسى Edge Scroll - + Edge Scroll + + + + TouchPadSettings + + Touchpad Enabled + Touchpad قوزغىتىلغان + + + Disable TouchPad + TouchPad نى كۆرسىتىڭ + + + TouchPad Enabled + TouchPad قوزغىتىڭ + + + Select TouchPad Hand + TouchPad Hand نى تاللاڭ + + + TouchPad Motion Acceleration + TouchPad ھەرىكەتنى تېزلىتىش + + + Select Click Method + چېكىش ئۇسۇلىنى تاللاڭ + + + Select Scroll Method + سىيرىلما ئۇسۇلنى تاللاڭ + + + Natural Scroll + تەبىئىي سىيرىلما + + + Enabled while Typing + خەت يېزىش جەريانىدا قوزغىتىڭ + + + Tap to Click + چېكىڭ + + + Slow + ئاستا + + + Standard + ئۆلچەملىك + + + Fast + تېز + + + Right Hand Mode + ئوڭ قول ھالىتى + + + Left Hand Mode + سول قول ھالىتى + + + Press and Tap + بېسىش ۋە چېكىش + + + Tap + چېكىش + + + Two Finger Scroll + ئىككى بارماق دومىلىمىسى + + + Edge Scroll + Edge Scroll @@ -4194,7 +5734,7 @@ This is line 50 of the test text TouchPad Settings - + TouchPad تەڭشەكلىرى @@ -4202,7 +5742,7 @@ This is line 50 of the test text Other WiFi networks - + باشقا WiFi تورى @@ -4210,64 +5750,64 @@ This is line 50 of the test text TrayItemWidget - + TrayItemWidget Icon - + سىنبەلگە Name - + ئىسمى Status - + ھالەت Ignore - + پەرۋا قىلمايدۇ Disconnect - + ئۈزۈش Cancel - + ئەمەلدىن قالدۇرۇڭ Connect - + ئۇلىنىش Connected - + ئۇلاندى Unconnected - + يۇقۇملانمىغان Please input password - + كىرگۈزۈش پارولىنى تارقىتىڭ Please input a network name - + تور نامىنى كىرگۈزۈڭ @@ -4275,22 +5815,22 @@ This is line 50 of the test text TrayPage - + TrayPage TextLabel - + TextLabel - + Select wired network card - + سىملىق تور كارتىسىنى تاللاڭ - + Select wireless network card - + سىمسىز تور كارتىسىنى تاللاڭ @@ -4298,39 +5838,58 @@ This is line 50 of the test text Ukey - + ئېشەك Default Ukey device - + سۈكۈتتىكى ئەنگىلىيە كوماندىسى List of devices bound to the Ukey - + UKkey غا باغلانغان ئۈسكۈنىلەرنىڭ تىزىملىكى error - + خاتالىق No UKey device detected, pelease insert the UKey device and perform operations - + ھېچقانداق UKey ئۈسكۈنىسى بايقالمىدى، مائاش UKey ئۈسكۈنىسى ۋە ئۇچۇر مەشغۇلاتىنى قوزغىمايدۇ UKey Enroll - + UKey Enroll Please enter the ukey pin code - + قويۇپ بەرگۈچى ukey pin كودى + + + + UKeyPinCodeDialog + + UKey Enroll + UKey Enroll + + + Please enter the ukey pin code + قويۇپ بەرگۈچى ukey pin كودى + + + Confirm + جەزملەشتۈرۈڭ + + + Cancel + ئەمەلدىن قالدۇرۇڭ @@ -4338,142 +5897,150 @@ This is line 50 of the test text Form - + شەكىل Account - + ھېسابات Change password - + پارولنى ئۆزگەرتىڭ User id - + ئىشلەتكۈچى كىملىكى User type - + ئىشلەتكۈچى تىپى User status - + ئىشلەتكۈچى ھالىتى auth manager - + ئاپتور باشقۇرغۇچى Password expiration policy - + پارول ئىپادىلەش سىياسىتى Confirm - + جەزملەشتۈرۈڭ Delete - + ئۆچۈرۈش Current password - + نۆۋەتتىكى پارول EditCurrentPasswd - + EditCurrentPasswd New password - + يېڭى پارول EditNewPasswd - + EditNewPasswd Enter the new password again - + يېڭى پارول مىراسىغا كىرىڭ EditNewPasswdAgain - + EditNewPasswdAgain EditPasswdSave - + EditPasswdSave Save - + تېجەڭ EditPasswdCancel - + EditPasswdCanccel Cancel - + ئەمەلدىن قالدۇرۇڭ + + + Account type + ھېسابات تىپى + + + Account status + ھېسابات ئەھۋالى standard - + ئۆلچەملىك administrator - + باشقۇرغۇچى Please enter the new user password - + يېڭى ئىشلەتكۈچى پارولىنى ئېلان قىلىڭ Please enter the password again - + پارول مىراسلىرىنى قويۇپ بەرگۈچى The password you enter must be the same as the former one - + سىز كىرگۈزگەن پارول چوقۇم بۇرۇنقى ئىسىم بولۇشى كېرەك Please enter the current user password - + نۆۋەتتىكى ئىشلەتكۈچى پارولىنى ئېلان قىلىڭ The current password is incorrect - + نۆۋەتتىكى پارول ئۆز ئىچىگە ئالىدۇ The new password cannot be the same as the current password - + يېڭى پارول ھازىرقى پارول سۈپىتىدە ئىسىم بولالايدۇ @@ -4482,33 +6049,68 @@ This is line 50 of the test text Error - + خاتالىق Password encryption failed - + پارول مەخپىيلەشتۈرۈش مەبلىغى user information updated successfully - + ئىشلەتكۈچى ئۇچۇرلىرىنى يېڭىلاش مۇرەككەپلىكى Password updated successfully - + پارولنى مۇرەككەپ يېڭىلاش - 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)? - + 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( ئىشلەتكۈچى)%11 نى ئۆچۈرۈۋېتىسىز? Warning - + ئاگاھلاندۇرۇش + + + Account information updated successfully + ھېسابات ئۇچۇرلىرىنى يېڭىلاش مەسئۇلىيىتى + + + + UserlicenseAgreement + + Export + ئېكسپورت + + + Close + تاقاش + + + Save + تېجەڭ + + + Export EULA + ئېكسپورت EULA + + + Export EULA failed! + EULA ئېكىسپورت قىلىندى! + + + User End License Agreement + ئىشلەتكۈچى ئاخىرقى ئىجازەتنامىسى + + + None + ھېچكىم يوق @@ -4516,7 +6118,7 @@ This is line 50 of the test text VolumeInput - + VolumeInput @@ -4524,7 +6126,7 @@ This is line 50 of the test text VolumeOutput - + VolumeOutput @@ -4532,13 +6134,13 @@ This is line 50 of the test text VolumeSettingPage - + VolumeSettingPage Volume - + ھەجىمى @@ -4546,67 +6148,67 @@ This is line 50 of the test text VpnIPsec - + VPNIPsec Enable IPsec - + IPsec نى قوزغىتىڭ Group Name - + گۇرۇپپا ئىسمى EditGroupName - + EditGroupName Group ID - + گۇرۇپپا كىملىكى EditGroupId - + EditGroupId Pre-Shared Key - + ئالدىن ھەمبەھىرلەنگەن ئاچقۇچ EditPreSharedKey - + EditPreSharedKey Show Password - + پارولنى كۆرسەت Internet Key Exchange Protocol - + ئىنتېرنېت ئاچقۇچ ئالماشتۇرۇش كېلىشىمنامىسى EditIpsecIKE - + EditIpsecIKE Encapsulating Security Payload - + بىخەتەرلىك يۈكىنى ئۆز ئىچىگە ئالىدۇ EditIpsecESP - + EditipsecESP @@ -4614,47 +6216,47 @@ This is line 50 of the test text VpnIpvx - + VpnIpvx IPV4 Method - + IPV4 ئۇسۇلى ComboBoxVPNIpv4Method - + ComboBoxVPNIPv4Method Only applied in corresponding resources - + پەقەت بايلىقتىكى قوللىنىشچان پروگراممىلار Preferred DNS - + ياقتۇرىدىغان DNS EditVPNIpv4PreferredDNS - + EditVPNIpv4 PreferredDNS Alternate DNS - + باشقا DNS EditIpv4AlternateDNS - + EditIpv4Alternate DNS - + Auto - + ئاپتوماتىك @@ -4662,12 +6264,12 @@ This is line 50 of the test text VpnL2tpSetting - + VPNL2tpSetting VPN name - + VPN ئىسمى @@ -4676,42 +6278,42 @@ This is line 50 of the test text VpnManager - + VPNManager VPN type - + VPN تىپى Save - + تېجەڭ Return - + قايتىش - + VPN - + VPN - + L2TP - + L2TP - + Tips - + كۆرسەتمە - + Password required to connect to %1. - + پارول% 1 گە ئۇلىنىشنى تەلەپ قىلىدۇ. @@ -4719,97 +6321,97 @@ This is line 50 of the test text VpnPpp - + VpnPpp Use MPPE - + MPPE نى ئىشلىتىڭ Security - + بىخەتەرلىك ComboBoxMppeSecurity - + ComboBoxMppeSecurity Stateful MPPE - + دۆلەت MPPE - + All available (default) - + بارلىق ئىشلەتكىلى بولىدىغان (default) - + 40-bit (less secure) - + 40-bit (less secure) - + 128-bit (most secure) - + 128-bit (most secure) - + Refuse EAP Authentication - + EAP دەلىللەشنى رەت قىلىڭ - + Refuse PAP Authentication - + PAP دەلىللەشنى رەت قىلىڭ - + Refuse CHAP Authentication - + CHAP دەلىللەشنى رەت قىلىڭ - + Refuse MSCHAP Authentication - + MSCHAP دەلىللەشنى رەت قىلىڭ - + Refuse MSCHAPv2 Authentication - + MSCHAPv2 دەلىللەشنى رەت قىلىڭ - + No BSD Data Compression - + BSD سانلىق مەلۇمات پىرىسلاش يوق - + No Deflate Data Compression - + سانلىق مەلۇمات مەجلىسى يوق - + No TCP Header Compression - + TCP ماۋزۇ پىرىسلاش يوق - + No Protocol Field Compression - + كېلىشىم مەيدانىنىڭ ئىلگىرىلىشى يوق - + No Address/Control Compression - + ئادرېس/كونترول ئىلگىرىلەش يوق - + Send PPP Echo Packets - + PPP Echo بوغچىسىنى ئەۋەتىڭ @@ -4817,12 +6419,12 @@ This is line 50 of the test text VpnPptpSetting - + VPNPptpSetting VPN name - + VPN ئىسمى @@ -4830,109 +6432,109 @@ This is line 50 of the test text VpnWidget - + VPNWidget Gateway - + دەرۋازا EditVPNGateway - + EditVPNGateway User Name - + ئىشلەتكۈچى ئىسمى EditVPNUserName - + EditVPNUserName Password Options - + پارول تاللانمىلىرى ComboBoxVPNPasswordOptions - + ComboBoxVPNPasswordOptions Password - + پارول EditVPNPassword - + EditVPNPassword ButtonPasswordVisual - + ButtonPassword Visual Show Password - + پارولنى كۆرسەت NT Domain - + NT دائىرە EditNTDomain - + EditNTDomain - + Required - + تەلەپ قىلىندى - + Saved - + قۇتقۇزۇۋېلىندى - + Ask - + سوراڭ - + Not required - + Squired ئەمەس - + Gateway can not be empty - + كىرىش ئېغىزىدىن مۇستەسنا بولمايدۇ - + Gateway invalid - + دەرۋازا ئىناۋەتسىز - + user name can not be empty - + ئىشلەتكۈچى نامىنى ھېسابقا ئالمىغاندا بولمايدۇ - + password can not be empty - + پارولنى ھېسابقا ئالمىغاندا بولمايدۇ @@ -4940,84 +6542,84 @@ This is line 50 of the test text Form - + شەكىل Set wallpaper - + تام قەغىزى FrameLockScreenPreview - + FrameLockScreenPreview FrameDesktopPreivew - + FrameDesktopPreve Desktop Wallpaper Preview - + ئۈستەل يۈزى تام قەغىزى ئالدىن كۆرۈش Lock Screen WallPaper Preview - + قۇلۇپ ئېكران تام قەغىزى ئوبزورى Select wallpaper - + تام قەغىزىنى تاللاڭ Select Wallpaper - + تام قەغىزىنى تاللاڭ Set Desktop Wallpaper - + ئۈستەل يۈزى تام قەغىزى Set Lock Screen Wallpaper - + قۇلۇپ ئېكران تام قەغىزى set wallpaper - + تام قەغىزى قويۇڭ Set wallpaper failed! - + تام قەغىزى ئورنىتىڭ! select picture - + رەسىمنى تاللاڭ 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 *.ups *. AI *.raw *. WMF *.webp) Add Image Failed - + رەسىم فوندى قوشۇڭ The image already exists! - + رەسىم نومۇرى مەۋجۇت! @@ -5025,42 +6627,39 @@ This is line 50 of the test text WiredManager - + WiredManager ButtonSave - + ButtonSave Save - + تېجەڭ ButtonReturn - + ButtonReturn Return - + قايتىش - Wired Network Adapter - + سىملىق تور ماسلاشتۇرغۇچ - The carrier is pulled out - + توشۇغۇچى تارتىپ چىقىرىلدى - The current device is not available - + نۆۋەتتىكى ئۈسكۈنىنى ئىشلەتكىلى بولمايدۇ @@ -5068,12 +6667,12 @@ This is line 50 of the test text WiredSettingPage - + WiredSettingPage - + Network name - + تور ئىسمى @@ -5081,37 +6680,33 @@ This is line 50 of the test text WirelessManager - + WirelessManager Save - + تېجەڭ Return - + قايتىش - Wireless Network Adapter - + سىمسىز تور ماسلاشتۇرغۇچ - The current device is not available - + نۆۋەتتىكى ئۈسكۈنىنى ئىشلەتكىلى بولمايدۇ - Tips - + كۆرسەتمە - Password required to connect to %1. - + پارول% 1 گە ئۇلىنىشنى تەلەپ قىلىدۇ. @@ -5119,77 +6714,77 @@ This is line 50 of the test text WirelessSecurityWidget - + سىمسىز بىخەتەرلىكWidget Security - + بىخەتەرلىك ComboBoxWirelessSecurityOption - + ComboBoxWirelessSecurityOption Password Options - + پارول تاللانمىلىرى ComboBoxWirelessPasswordOption - + ComboBoxWirelessPasswordOption Password - + پارول EditWirelessPassword - + EditWirelessPassword ButtonWirelessPasswordVisual - + ButtonWirelessPasswordVisual PushButton - + ئىتتىرىش كۇنۇپكىسى None - + ھېچكىم يوق WPA/WPA2 Personal - + WPA/WPA2 شەخسىي Save password for all users - + بارلىق ئىشلەتكۈچىلەر ئۈچۈن پارول ساقلاڭ Save password for this user - + بۇ ئىشلەتكۈچى ئۈچۈن پارول تېجەڭ Ask me always - + مەندىن دائىم سوراڭ Required - + تەلەپ قىلىندى @@ -5197,20 +6792,20 @@ This is line 50 of the test text WirelessSettingPage - + WirelessSettingPage - + Wireless name - + سىمسىز ئىسىم WirelessTrayWidget - + the network "%1" not found - + تور "% 1" تېپىلمىدى @@ -5218,47 +6813,47 @@ This is line 50 of the test text WirelessWidget - + WirelessWidget SSID - + SSID EditSsid - + EditSid MAC Address Of Device - + ئۈسكۈنىنىڭ MAC ئادرېسى ComboBoxWirelessMacAddress - + ComboBoxWirelessMacAddress Custom MTU - + Custom MTU SpinBoxWirelessCustomMTU - + SpinBox سىمسىز CustomMTU - + Required - + تەلەپ قىلىندى - + No device specified - + ھېچقانداق ئۈسكۈنە ئېنىق ئەمەس @@ -5266,7 +6861,22 @@ This is line 50 of the test text yyyy - + Yyyy + + + + kiranSystemInformation + + System Information + سىستېما ئۇچۇرى + + + Hardware Information + قاتتىق دېتال ئۇچۇرلىرى + + + kiran-system-imformation + كىران سىستېمىسى-شەكىل -- Gitee