diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fe976526cd733221153ed61e70316b4e8acbf57..07a668da265aabbac4c11884bd741e9aadb675fe 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 f6f628749c4334058847bf72e2e87f2f6880aabe..1315fda33382e0d3719cc5a8bc988291b7164d40 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/data/CMakeLists.txt b/data/CMakeLists.txt index 9fd982e2c1cad8f452bf4d8250a18d5f417a7a60..9f66d68158f8f96e8d4dfc55b08a154c00bb5dd6 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/data/category/desktop/about-system.desktop b/data/category/desktop/about-system.desktop index a8e87fdd4c5e465b0f70633ff4a9ac30ffffa140..b33866d7db65c0fcd1c1e3c22fd500d1c37b79c1 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 64949401c63366dfdf2f76b081880ee4c5840652..1acc232d2b1f214ba9d7a153bb83c7c21e60a5e0 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 4601e729598eaa4e7c919ce380287a7bdc5afc1b..02c24e88ad2b157f045a131c0d07d5aff0cd96f8 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 36ae23d00c482daaccc6b635be8e105dd18d85da..38f0b01ec2904c478504f55167f4b88dfa71db66 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 7b07c199b0a0ded86b9ba2d2c2b3d965ea3533bc..f6ea62ac1f2c541d92cb469e2a0b4341f3a9224f 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 79c26dbbd3df4491da7c0598d134ac08b221cd05..ee0fb7412035e8aca0ebcacb7c92e0f1bd5741b3 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 a1c48f0a93002a86d464324627a8a398f075dd6b..9b46a52ac8f0f5f5d22c8e29aee340dea06ee6ae 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 6be1a3b78b4a67a0126628936818a6fe64d1c961..cd618975fad05c2c6e3e83900f303b4589cdd6ce 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 e80185b4d4a393dd6ffa28f15a2c393309268a4e..b339a9b8313d8e93ac16b60a2cb77b4a1041e563 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 new file mode 100644 index 0000000000000000000000000000000000000000..65cf09c49f38f2a59111d5e16466aaae0b980a66 --- /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[ky_KG]=тил +Name[kk_KZ]=Тіл +Name[mn_MN]=Хэл +Name[ug_CN]=ئاۋاز + +Comment=language settings +Comment[zh_CN]=语言设置 +Comment[bo_CN]=སྐད་སྒྲ་སྒྲིག་པ། +Comment[ky_KG]=Тил параметрлери +Comment[kk_KZ]=Тіл орнату +Comment[mn_MN]=Хэлний тохиргоо +Comment[ug_CN]=ئاۋاز تەسىس قىلىش + +Icon=language.png + +Weight=7 + +Keywords[zh_CN]=语言 +Keywords[bo_CN]=སྐད་སྒྲ། +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 0bbc3e26b2647fecfe1fc98217753812eaf52f43..505d01688e6603b364937b0590361145ad8b1c41 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 6db55bd635e9d14d0810f752cbb8cf63abb307f6..19069006bb2b530f3763af139babab540b844b57 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 97346340e19740c5aee6cdaae33035e81d9c6946..799260ac9ef4cfda06a92de70da3809e34c232b6 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 befba5752e9393f4854cfccd25dbfe85f25f3ddb..ae4ae808cfa5d4e33e3ad57effc62ebb5b381f17 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/data/category/images/language.png b/data/category/images/language.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0befefed885ef549c7bff1f3ee4693a2f23d91 Binary files /dev/null and b/data/category/images/language.png differ diff --git a/data/hicolor/scalable/apps/kcp-audio-loud.svg b/data/hicolor/scalable/apps/kcp-audio-loud.svg index d762557103215d94f5202ec7e4ca043ea7217f78..211fe116b006307dbba1fedfb98a944f056cc208 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 e3c93a048184616f373b80f15e8e8f384ad844c6..406e96b7d9379b679f031bf107e0cd55d34c51e0 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 3a61f7f4ddd3a14e38038f67d10c89a0610762b2..15a618b9e39bf5ae73fd659c9e1684f958887c94 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 428ec25d0b2181f34053f443d5ddc0af5ade0aab..0b9d97ab150bf5a3ffaf6ab867bbf958acef87a2 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/data/kiran-control-panel.pc.in b/data/kiran-control-panel.pc.in index de3ae6ba3282fa789d9e18cc8592fe259a79e961..1e50a0d1b76a3c3559fe99fb595fa423ba927b06 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@ diff --git a/lib/common-widgets/kiran-setting-container/kiran-setting-item.cpp b/lib/common-widgets/kiran-setting-container/kiran-setting-item.cpp index afa431a979aece951e30a30706843c6a99fb2381..b320b92ec14b84bb170d9fac5c8ffeb72cf4eb6c 100644 --- a/lib/common-widgets/kiran-setting-container/kiran-setting-item.cpp +++ b/lib/common-widgets/kiran-setting-container/kiran-setting-item.cpp @@ -63,6 +63,14 @@ void KiranSettingItem::setRightButtonVisible(bool visible, const QIcon& icon, bo updateIcon(); } +void KiranSettingItem::setMidButtonVisible(bool visible, const QIcon& icon, bool midIconChanged) +{ + m_midButton->setVisible(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 48da4cae0eab95a94cc4fb9e0d8178110aa4a61a..f2dd9acd1727f9282fe67569e461a5f5cb515e0c 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/libexec/avatar-editor/CMakeLists.txt b/libexec/avatar-editor/CMakeLists.txt index a6147b3f30a0d786e4c70fb72e9d615bda6eb270..cc5f013177059e4eae16139353701369b82768be 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} ) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 9acb921e27fafef62cca30d260225f50e254ea97..832e380b3a5f645673b26d3836fd3e6d6d9584fa 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/account/CMakeLists.txt b/plugins/account/CMakeLists.txt index 98c5383f16cfb887c22c9faaf08d496a45e3b878..586c6c8def84ecf1b0b1da19828fc28f8afc5609 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}/) diff --git a/plugins/appearance/pages/theme/icon/icon-theme-page.cpp b/plugins/appearance/pages/theme/icon/icon-theme-page.cpp index 7aaa1429975efc01fd10ad786e173c599bfa0af0..845d5bf7c28f5c76cb63e359801bf5d1c21b16fb 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 853ef13249ddce3e923c9ca48c4c539f26ce1e05..dbc52e149fd3974151f25f05d98b1458793df7de 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 a20c4a5e0730b377a9933ba17279977b844f91e3..7c303b76dcf32d1f2f96a85b63aedadc43ee796a 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/plugins/audio/CMakeLists.txt b/plugins/audio/CMakeLists.txt index 21d6210b5aac3027e1f4ead182e7b9976ce9a204..9ebdad8ce028a93c36ecca658658da25f968355b 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/dbus/audio-device-interface.cpp b/plugins/audio/src/dbus/audio-device-interface.cpp index 7ec201d72274e499d007e2b1b950248047905553..cada0bed1b1d98e9a9fb8e623eda76fac44a5f68 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; @@ -54,6 +55,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 +63,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 8bea01a1fc13fccf678063983de74d1478ee74ef..a009b63236af775999484d7e4e95c720468a1d9c 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 6d34ebb1159492f3f17b506a9cee9eaf3e25d69b..85bdc50964598974cc19fb5ad32d47e8f42eeebd 100644 --- a/plugins/audio/src/dbus/audio-interface.cpp +++ b/plugins/audio/src/dbus/audio-interface.cpp @@ -14,6 +14,8 @@ #include "audio-interface.h" #include "kiran-session-daemon/audio-i.h" +#include +#include "logging-category.h" /* * Implementation of interface class AudioInterface */ @@ -43,6 +45,36 @@ AudioInterface::~AudioInterface() { } +QList AudioInterface::getCards() +{ + QDBusPendingReply cards = GetCards(); + 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) || + (!doc.isArray())) + { + return QList(); + } + + QList cardInfoList; + 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 c4eee871d6b967b22c578b2e725c1ed55935fc65..a36cb773b0a1f1bd4738ce9eda6689106fa13806 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/audio-plugin.cpp b/plugins/audio/src/plugin/audio-plugin.cpp index e572f60a0ab17415ee96d26c8140296744c7061f..f52f6bb46ddb5c1c656c8b483f372796f864eceb 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-cpanel-audio", - ".", - 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 d82b225a7f6bf78339d639844e44bf58d9fad449..37224d6f54cff91eba1bcc4fc2969b260bf17352 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 11275ec96973dfe7dd7a1f1d58331c739e2e56cd..c8a01df611098488c3e5f9001837679d3624c700 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 @@ -178,186 +180,258 @@ 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(qLcAudio) << "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() +{ + QSignalBlocker blocker(ui->inputCards); + 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); } void InputPage::initActivedPort() { - QList portsInfo = m_defaultSource->getPortsInfo(); - - if(portsInfo.isEmpty()) + if (!m_defaultSource->isAvailablePorts()) { - KLOG_DEBUG() << "ports is null"; + KLOG_INFO(qLcAudio) << "No available ports for current default source"; disableSettings(); return; } - Q_FOREACH (auto portInfo, portsInfo) + QSignalBlocker blocker(ui->inputDevices); + 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); - //默认选中已激活的端口 - 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); + } + + QSignalBlocker blocker(ui->volumeSetting); double currentVolumeDouble = m_defaultSource->volume() * 100; int currentVolume = round(currentVolumeDouble); ui->volumeSetting->setValue(currentVolume); ui->inputVolume->setText(QString::number(currentVolume) + "%"); + + KLOG_DEBUG(qLcAudio) << "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(m_defaultSource, &AudioDeviceInterface::volumeChanged, this, &InputPage::handleVolumeChanged); - connect(m_defaultSource, &AudioDeviceInterface::active_portChanged, this, &InputPage::handleActivePortChanged); + 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); - // 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() { + QSignalBlocker inputDevicesBlocker(ui->inputDevices); + QSignalBlocker volumeSettingBlocker(ui->volumeSetting); + 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->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(qLcAudio) << "input device (active port) changed :" << value; + QSignalBlocker blocker(ui->inputDevices); + ui->inputDevices->clear(); + clearFeedBack(); + + initActivedPort(); } -void InputPage::handleVolumeChanged(double value) +void InputPage::onVolumeChanged(double value) { - ui->volumeSetting->blockSignals(true); + QSignalBlocker blocker(ui->volumeSetting); 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(qLcAudio) << "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(qLcAudio) << "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()) && + (audioSource.isAvailablePorts())) + { + sourceIndex = audioSource.index(); + break; + } + } - ui->volumeScale->setPercent(0); + if (sourceIndex == -1) + { + 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; + } - 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(qLcAudio) << "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(qLcAudio) << QString("set default sourcee:%1").arg(sourceIndex); + disableSettings(); +} + +void InputPage::setVolume(int value) +{ + double volumeValue = value / 100.0; + if (m_defaultSource != nullptr) { - m_audioInput->deleteLater(); - m_audioInput = nullptr; + m_defaultSource->SetVolume(volumeValue); + KLOG_DEBUG(qLcAudio) << "set input Volume:" << volumeValue; } - if (m_isValidPort) + else { - initVoulumeFeedBack(); + KLOG_INFO(qLcAudio) << "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(qLcAudio) << "Default Source Changed:" << index; + // delete and restart init defaultSource + reload(); } -//暂时没有处理Source增加减少的需求 -void InputPage::handleSourceAdded(int index) +void InputPage::setActivePort(int index) { - KLOG_DEBUG() << "Source Added:" << index; + QString portName = ui->inputDevices->itemData(index, Qt::UserRole).toString(); + if ((m_defaultSource != nullptr) && !portName.isNull()) + { + m_defaultSource->SetActivePort(portName); + KLOG_INFO(qLcAudio) << " set default source Active Port:" << portName; + } + else + { + KLOG_INFO(qLcAudio) << QString("set default source active port: %1 failed").arg(portName); + } +} + +// 暂时没有处理Source增加减少的需求 +void InputPage::addSource(int index) +{ + KLOG_INFO(qLcAudio) << "Source Added:" << index; + reload(); } -void InputPage::handleSourceDelete(int index) +void InputPage::deleteSource(int index) { - KLOG_DEBUG() << "Source Delete:" << index; + KLOG_INFO(qLcAudio) << "Source Delete:" << index; + reload(); } QSize InputPage::sizeHint() const @@ -365,9 +439,9 @@ QSize InputPage::sizeHint() const return {500, 657}; } -//通过QMultimedia模块获取反馈音量 -//首先使用QAudioFormat类设置音频流参数信息,然后从QIODevice中读取PCM数据 -//最后使用QAudioInput类接收从输入设备来的音频数据 +// 通过QMultimedia模块获取反馈音量 +// 首先使用QAudioFormat类设置音频流参数信息,然后从QIODevice中读取PCM数据 +// 最后使用QAudioInput类接收从输入设备来的音频数据 void InputPage::initVoulumeFeedBack() { initAudioFormat(); @@ -407,3 +481,44 @@ void InputPage::refreshFeedBack() { ui->volumeScale->setPercent(m_audioInfo->level()); } + +void InputPage::reload() +{ + KLOG_INFO(qLcAudio) << "reload input settings"; + clear(); + initSettings(); +} + +void InputPage::clear() +{ + ui->volumeScale->setPercent(0); + + if (m_defaultSource != nullptr) + { + m_defaultSource->deleteLater(); + m_defaultSource = nullptr; + } + + QSignalBlocker inputDevicesBlocker(ui->inputDevices); + QSignalBlocker inputCardsBlocker(ui->inputCards); + ui->inputDevices->clear(); + ui->inputCards->clear(); + + 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 e9f69095567f0c72e33569ea54f70f8088ba0914..91b4b51e6f5b2b22f0dbaa238f6d07057bd058f8 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 c291ef06eafa4ed60594f322654a26003a5ba929..3052765757253cc510c013f028ddf4f2b3609d38 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 72834cc28bdf2becd0609325718be74d03763a91..eddc99603b7ffad1118f87909089d436bad675a6 100644 --- a/plugins/audio/src/plugin/output-page.cpp +++ b/plugins/audio/src/plugin/output-page.cpp @@ -16,17 +16,19 @@ #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 #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 +36,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(qLcAudio) << "dbus service unregistered:" << service; + disableSettings(); }); } OutputPage::~OutputPage() @@ -57,221 +59,299 @@ 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(qLcAudio) << "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(qLcAudio) << "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); + 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); } void OutputPage::initActivedPort() { - QList portsInfo = m_defaultSink->getPortsInfo(); - if(portsInfo.isEmpty()) + if (!m_defaultSink->isAvailablePorts()) { - //无激活端口则禁用音量设置和平衡 - KLOG_DEBUG() << "default sink ports is null"; + // 无激活端口则禁用音量设置和平衡 + KLOG_DEBUG(qLcAudio) << "No available ports for current default sink"; disableSettings(); return; } - Q_FOREACH (auto portInfo, portsInfo) + QSignalBlocker blocker(ui->outputDevices); + 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); -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); + } + + QSignalBlocker volumeSettingBlocker(ui->volumeSetting); + QSignalBlocker volumeBalanceBlocker(ui->volumeBalance); + 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)); + + KLOG_DEBUG(qLcAudio) << "current output volume:" << currentVolume; + KLOG_DEBUG(qLcAudio) << "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, 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); } -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(qLcAudio) << "output device (active Port) changed :" << value; + QSignalBlocker blocker(ui->outputDevices); + ui->outputDevices->clear(); + + initActivedPort(); } -void OutputPage::handleVolumeChanged(double value) +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::handleBalanceChanged(double value) +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 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 = ui->volumeSetting->sliderPosition() / 100.0; + if (!m_defaultSink) + { + 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 = value / 100.0; + if (!m_defaultSink) + { + KLOG_INFO(qLcAudio) << "set balance failed, default Sink is null"; + return; + } + m_defaultSink->SetBalance(balanceValue); + KLOG_DEBUG(qLcAudio) << "set balance" << balanceValue; +} + +/** + * NOTE: + * 目前切换声卡实际只是切换了defaultSink + */ +void OutputPage::changeDefaultOutputCard(int index) +{ + int cardIndex = ui->outputCards->itemData(index, Qt::UserRole).toInt(); + KLOG_INFO(qLcAudio) << "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() && audioSink.isAvailablePorts()) + { + sinkIndex = audioSink.index(); + break; + } + } + + if (sinkIndex == -1) + { + 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; + } + + QDBusPendingReply dbusReply = m_audioInterface->GetDefaultSink(); + QString defaultSinkPath = dbusReply.value(); + AudioDeviceInterface defaultSink(AUDIO_DBUS_NAME, defaultSinkPath, QDBusConnection::sessionBus(), this); + if (sinkIndex == defaultSink.index()) + { + KLOG_DEBUG(qLcAudio) << "current default sink:" << sinkIndex; + reload(); + return; + } + + setDefaultSink(sinkIndex); } void OutputPage::disableSettings() { + 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->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); } -void OutputPage::handleDefaultSinkChanged(int index) +void OutputPage::setDefaultSink(int sinkIndex) { - // delete and restart init defaultSource - if(m_defaultSink != nullptr) + /** + * NOTE: + * 由于SetDefaultSink不一定生效,且没有返回值表明是否切换DefaultSink成功。 + * 调用SetDefaultSink后统一禁用音量设置,等待 DefaultSinkChange 信号的接收 + * 接收到DefaultSinkChange信号后,确认SetDefaultSink生效后(即切换sink成功),界面再打开和更新设置 + */ + + m_audioInterface->SetDefaultSink(sinkIndex); + KLOG_INFO(qLcAudio) << QString("set default sink:%1").arg(sinkIndex); + disableSettings(); +} + +void OutputPage::reload() +{ + KLOG_INFO(qLcAudio) << "reload output device and settings"; + // delete and restart init defaultSink + clear(); + initSettins(); +} + +void OutputPage::clear() +{ + if (m_defaultSink != nullptr) { m_defaultSink->deleteLater(); m_defaultSink = nullptr; } - ui->outputDevices->blockSignals(true); + QSignalBlocker outputDevicesBlocker(ui->outputDevices); ui->outputDevices->clear(); - ui->outputDevices->blockSignals(false); - initOutputDevice(); - initOutputSettins(); + QSignalBlocker outputCardsBlocker(ui->outputCards); + ui->outputCards->clear(); } - -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(qLcAudio) << "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(qLcAudio) << "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(qLcAudio) << "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 11283695add8ced4dd6843efe4aededefc6ad9f3..84ea048a1ede9de2e98a8890b40abe29fe3b7b59 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 f7f8de8440ae961e849dbc7dc3bde9c4426c9e64..d5d68c6070a7efbf7c46bcc731a5a81f9f98a670 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 diff --git a/plugins/audio/src/plugin/volume-scale.cpp b/plugins/audio/src/plugin/volume-scale.cpp index 7646f802507344bb2900c11f8bf2d95549f6f6ea..a355b9f0a8f66fd890db67a09794d9e050f958ee 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 cc4015d3868dbe3c4211b1b712def0ea65916403..eb554b2509a8535cdbc74e3d97076a696f14f91b 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()); @@ -206,7 +201,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) { @@ -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:频繁调用函数,需要优化 @@ -257,23 +251,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(); @@ -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 fd5f150d8fa381f8558e906ec100d10c9010679f..077f1991f32058d4a66bb19d32f8a5361fe3710a 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 8c36383a07bd0f20ddd7673f4c9a2130c51641ba..fec8300f910c660e2ac73068eacf8d7f070dd0a5 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-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); + 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 627e82b253b0aca590102750726545fe29e0b6e7..e01eb5d0fc06ad4d3b443e10d8257a8c04f059ef 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 54b8f104f32f7e11fed42d3511172cf759cc50d4..03116c7442402895d59080fce8cfe094f2a2baa9 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) { @@ -196,19 +194,20 @@ 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(qLcAudio) << "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)); + //重新设置音量时,会自动解除静音状态 + audio->SetVolume(m_volumeBeforeMute / 100.0); m_volumeBeforeMute = 0; } } @@ -219,26 +218,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) { 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 e64604906e8f013fdc134f19b9280b27d1b91eaf..0000000000000000000000000000000000000000 --- 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 92dd2061b4e1e3f78007f7523d8cc58f821eccb2..0000000000000000000000000000000000000000 --- 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 dc6431e70014f6cde754aa67d7626324a6f811da..0000000000000000000000000000000000000000 --- 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 693779d785aabb3be475b5ed5c0a3a4e0c5383b9..0000000000000000000000000000000000000000 --- 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 e7088f9dfcaf504b0fc20392805ab7c1851b7aee..0000000000000000000000000000000000000000 --- 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 551262b5d8de4b1b77dccfe51fa3442e894fdf4e..0000000000000000000000000000000000000000 --- 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/plugins/language/CMakeLists.txt b/plugins/language/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..79e787ad74dafd7d6cdccf82599eb4523573557e --- /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 0000000000000000000000000000000000000000..9400f2869ed1bd0576169e9591a26c98bd506128 --- /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 0000000000000000000000000000000000000000..14904b8181a5cab8c303aed3fdd97e9ce0ad34a5 --- /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 0000000000000000000000000000000000000000..65c95bd4fc5012fdb0f7e270aa870919bd603b5d --- /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", + "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 0000000000000000000000000000000000000000..6bf6ec6eff46b880d7f4de4233f9562c63b181b6 --- /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 0000000000000000000000000000000000000000..ac73cc972f45d19c5f5f54005241f6c04dee0938 --- /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 0000000000000000000000000000000000000000..9ddca3e424a7e88a3b1d77ccdb91605671da8c9a --- /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 0000000000000000000000000000000000000000..9c325eca77558157aa4f9f3dbbf0c9c70c6c1934 --- /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 0000000000000000000000000000000000000000..66f04c366fd1e326ee53c6adfc33c9432fe1db68 --- /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 0000000000000000000000000000000000000000..2c872d1a65e52dbea834c7d44ed0971599043e72 --- /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 0000000000000000000000000000000000000000..e71499a65f65da643be0f5acc7dd309e8528e760 --- /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 0000000000000000000000000000000000000000..552edf617e32e42889bd764dd277b35f84a0756d --- /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 0000000000000000000000000000000000000000..b803c5f5e0e4b3b9f155473155cb103bab399074 --- /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 0000000000000000000000000000000000000000..639bbe2d0f0f0191063eccc2e985901c12327c62 --- /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 0000000000000000000000000000000000000000..b808c84281ba1826c0c01f1890e231e276d7711d --- /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") + { + 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 0000000000000000000000000000000000000000..89ad883a43afd10881dee7ad21c42b85b22fc111 --- /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 0000000000000000000000000000000000000000..c5e538272a521ce5f5057829ae9ef13a054fdb7b --- /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 0000000000000000000000000000000000000000..4aeb885b0c349d79bfe8ca00f1dd8576931a04f7 --- /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 0000000000000000000000000000000000000000..e4ff5da0d0672a39bf016f294ac33ab6c1556529 --- /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/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt index 68d6345adf8e0b53a084a5bb12e33fe2ed1db4e9..8708fcb8ee1351b685a7741968693b4d15b97180 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,18 @@ 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}/) + #安装插件和二进制文件 install(TARGETS ${TARGET_NAME} DESTINATION ${PLUGIN_LIBS_DIR}/) install(TARGETS ${TRAY_PROCESS} DESTINATION ${INSTALL_BINDIR}) diff --git a/plugins/network/resources/kcp-network-images/wired-connection.svg b/plugins/network/resources/kcp-network-images/wired-connection.svg index b1838c0393e46faf1562d8c244970861d6589c7c..f911b583cd0a06e709517c30ac113aaf610c4f7b 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 19fc887bdb6bf80129214b771d25878ba20ef342..690b0760844ffc834e95f6e0b5d405847ce33c17 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/resources/kcp-network-images/wired-error.svg b/plugins/network/resources/kcp-network-images/wired-error.svg index 3d76722a56905d360234d38f6cbf985db9650ef3..2b2b3a0df3f7d3da2d063aa3e9fde081170c518e 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/connection-list.cpp b/plugins/network/src/connection-list.cpp index dbd7a35c7841d49a8924fae51f2687f79bf62f96..adfdd4bd198dc242f9e7bbbc735ca25719280f91 100644 --- a/plugins/network/src/connection-list.cpp +++ b/plugins/network/src/connection-list.cpp @@ -18,6 +18,8 @@ #include #include "general.h" #include +#include "utils.h" +#include "logging-category.h" using namespace NetworkManager; @@ -96,17 +98,17 @@ 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) { - 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); } } @@ -128,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(); @@ -263,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); @@ -306,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/connection-list.h b/plugins/network/src/connection-list.h index 8725ed0640a9d62705f8967883a90db96440cb6c..14b937cc5553539dad62702a3b8a54e00d8f8198 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 8d8cc13978be0a09dc4f6723c89e909d0d81494a..8aa4f67c21afbc9db9be9e3e4f8c5c180faf4e89 100644 --- a/plugins/network/src/general.h +++ b/plugins/network/src/general.h @@ -15,7 +15,46 @@ #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 + +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; + 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 6735e7bbe2e4bbe3fdb84de4a7092d728df20ca5..5c3b245a9769873eb5a70b73dcffffec2f068bd0 100644 --- a/plugins/network/src/plugin/connection-itemwidget.cpp +++ b/plugins/network/src/plugin/connection-itemwidget.cpp @@ -13,21 +13,45 @@ */ #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" +#include "logging-category.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 +59,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 +73,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:名称过长进行缩略 @@ -76,16 +138,11 @@ 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)); } -QString ConnectionItemWidget::getName() -{ - return m_connectionName->text(); -} - // TODO:其他状态信息的显示,以及优化 void ConnectionItemWidget::activatedStatus() { @@ -97,7 +154,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 +195,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 +224,306 @@ 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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "the binding device MAC has changed"; + 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(qLcNetwork) << "Disconnect failed:" << reply.error(); + } + else + { + KLOG_INFO(qLcNetwork) << "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(qLcNetwork) << "Delete the connection failed:" << reply.error(); + } + else + { + KLOG_INFO(qLcNetwork) << "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(qLcNetwork) << "remove the connection failed:" << reply.error(); + } + else + { + KLOG_INFO(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "accessPointPath" << accessPointPath; + + QDBusPendingReply reply = + NetworkManager::addAndActivateConnection(connectionSettings->toMap(), devicePath, accessPointPath); + + reply.waitForFinished(); + if (reply.isError()) + { + KLOG_DEBUG(qLcNetwork) << "Connection failed: " << reply.error(); + StatusNotification::connectitonFailedNotifyByName(ssid); + } +} + +void ConnectionItemWidget::activateWirelessNetwork() +{ + QString ssid = m_connectionInfo.wirelessInfo.ssid; + KLOG_DEBUG(qLcNetwork) << "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); + return; + } + + 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(); + return; + } + addAndActivateWirelessConnection(m_connnectionSettings); +} + void ConnectionItemWidget::handleThemeChanged(Kiran::PaletteType paletteType) { QImage image = m_connectionTypeIcon->pixmap()->toImage(); @@ -179,6 +537,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 56a1241278b9c8ca51250f08891aec44e19797e8..1915b7e778a0a7308d2ab9aa43ba87fef1e70e1f 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/connection-show-page.cpp b/plugins/network/src/plugin/connection-show-page.cpp index a0d8150798a5783e19114c9bcfa724f379ce2ea7..fee53a0124065930999e07de81a7364236abf7e4 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 24b8b1ee607480d7450c11d6ab4001e913532379..9e7012b7b7afbfbb06dd8a62ff4dacff72e5ffd2 100644 --- a/plugins/network/src/plugin/cpanel-network-widget.cpp +++ b/plugins/network/src/plugin/cpanel-network-widget.cpp @@ -16,22 +16,27 @@ #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" #include "wired-manager.h" #include "wireless-manager.h" +#include "logging-category.h" 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 +56,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); + + if (device->state() == Device::Activated) + { + setSidebarItemStatus(wiredSidebarItem, Device::State::Activated); + } + } +} -void CPanelNetworkWidget::handleManagedChanged() +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(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 ptr is null"; + KLOG_DEBUG(qLcNetwork) << "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 +287,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 +303,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(); @@ -299,29 +320,82 @@ void CPanelNetworkWidget::handleSideBarItemClicked(QListWidgetItem *item) 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 name:" << wirelessDevice->interfaceName() << " requestScan error:" << replyRequestScan.error(); } } } } -// XXX:需要优化,改成动态增减侧边栏subItems,而不是全部重新加载 -void CPanelNetworkWidget::handleDeviceAdded(const QString &devicePath) +void CPanelNetworkWidget::removeDevice(const QString &devicePath) +{ + KLOG_DEBUG(qLcNetwork) << "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::removeSidebarItem(const QString &text, int index) +{ + 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() { - KLOG_DEBUG() << "DeviceAdded :" << devicePath; - reload(); - emit subItemsChanged(); + for (auto item : m_kiranSidebarItems) + { + if (item->text() == tr("Wired Network")) + { + return true; + } + } + return false; } -void CPanelNetworkWidget::handleDeviceRemoved(const QString &devicePath) +bool CPanelNetworkWidget::isExistWirelessItem() { - KLOG_DEBUG() << "DeviceRemoved: " << devicePath; - reload(); - emit subItemsChanged(); + 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 e9b11d591ecd476262d77eaf4cad7d30dafa29ae..68f3537c13ed115e8ff24df71572218902fa4fea 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/details-page/connection-details-widget.cpp b/plugins/network/src/plugin/details-page/connection-details-widget.cpp index 235c48d4b3f2ee469d49f68dc70c9d14d15ad7f5..08e04f746fad2efba26863370eb4754e9abc75f3 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,11 @@ #include #include #include "ui_connection-details-widget.h" +#include "utils.h" +#include "logging-category.h" + using namespace NetworkManager; +using namespace NetworkUtils; ConnectionDetailsWidget::ConnectionDetailsWidget(Device::Ptr device, QWidget *parent) : QWidget(parent), ui(new Ui::ConnectionDetailsWidget) @@ -81,7 +85,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 +146,8 @@ void ConnectionDetailsWidget::setWirelessSpecificDetails() void ConnectionDetailsWidget::setIpDetails() { + KLOG_INFO(qLcNetwork) << m_device << "ip details"; + IpConfig ipV4Config = m_activeConnection->ipV4Config(); IpAddress ipv4Address = ipV4Config.addresses().value(0); QString address = ipv4Address.ip().toString(); @@ -206,4 +212,11 @@ void ConnectionDetailsWidget::setIpDetails() int prefix = ipv6Address.prefixLength(); ui->ipv6->setText(ipv6); ui->prefix->setText(QString::number(prefix)); + + 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/connection-details-widget.h b/plugins/network/src/plugin/details-page/connection-details-widget.h index 7af3c430a7090d97bf0d18a7c6419013b2d0695f..c7ebcd5365ade9dc76b41f527abbb239b4c3087a 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 c879a83d196d7d7feb21b15833be194039cda164..5f4dd32ad713acb7517843765f02c1d2eccfda84 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 "logging-category.h" #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() @@ -31,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()) { - ActiveConnection::Ptr activeConnection = device->activeConnection(); - if (activeConnection != nullptr) - { - if (activeConnection->state() == ActiveConnection::Activated) - { - m_deviceList << device; - } - } + continue; + } + + if (activeConnection->state() == ActiveConnection::Activated) + { + m_deviceList << device; } } @@ -86,26 +97,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 +114,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(qLcNetwork) << device << "ipV4 Config Changed"; + updateDetails(); +} +void DetailsPage::changeIpV6Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG(qLcNetwork) << device << "ipV6 Config Changed"; + updateDetails(); +} +void DetailsPage::changeDhcp4Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG(qLcNetwork) << device << "dhcp4 config changed"; + updateDetails(); +} +void DetailsPage::changeDhcp6Config() +{ + auto device = qobject_cast(sender()); + KLOG_DEBUG(qLcNetwork) << device << "dhcp6 config changed"; + updateDetails(); +} + +void DetailsPage::updateDetails() +{ + m_reloadTimer.start(); +} + void DetailsPage::clear() { m_deviceList.clear(); @@ -146,8 +175,21 @@ void DetailsPage::clear() void DetailsPage::reload() { - QTimer::singleShot(1000, this, [=]() - { - clear(); - initUI(); }); + KLOG_DEBUG(qLcNetwork) << "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 604d3f8e6b6915e9d6245fa65d1c9069bfbb39af..19fdd02d9f9c47d1dcbd7c7fb3d9ea3ef2ea227f 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/plugin/device-available-connection-widget.cpp b/plugins/network/src/plugin/device-available-connection-widget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b05a12028882bc97415237c8e375f792504bf8f7 --- /dev/null +++ b/plugins/network/src/plugin/device-available-connection-widget.cpp @@ -0,0 +1,507 @@ +/** + * 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" +#include "logging-category.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(qLcNetwork) << 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(qLcNetwork) << "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(qLcNetwork) << "add activatedConnection id:" << activatedConnection->id(); + QStringList deviceList = activatedConnection->devices(); + if (!deviceList.contains(m_devicePath)) + { + return; + } + + ConnectionItemWidget *activeItem; + QString uuid = activatedConnection->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(qLcNetwork) << "add activatedConnection ssid:" << ssid; + activeItem = findConnectionItemBySsid(ssid); + } + + if (activeItem == nullptr) + { + KLOG_DEBUG(qLcNetwork) << "no found connection by uuid and ssid"; + return; + } + + KLOG_DEBUG(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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 0000000000000000000000000000000000000000..20bf526170951bd7f6622f8467973ab655a92c40 --- /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 0000000000000000000000000000000000000000..a78840a5df921253375c2d8a626afc5549d493fa --- /dev/null +++ b/plugins/network/src/plugin/device-list.cpp @@ -0,0 +1,199 @@ +/** + * 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 +#include +#include "device-available-connection-widget.h" +#include "signal-forward.h" +#include "utils.h" +#include "logging-category.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) + { + return; + } + + for (auto device : managedDeviceList) + { + WirelessDevice::Ptr wirelessDevice = qobject_cast(device); + QDBusPendingReply<> replyRequestScan = wirelessDevice->requestScan(); + replyRequestScan.waitForFinished(); + if (replyRequestScan.isError()) + { + KLOG_DEBUG(qLcNetwork) << "wireless Device:" << wirelessDevice << " requestScan error:" << replyRequestScan.error(); + continue; + } + KLOG_DEBUG(qLcNetwork) << "wireless Device:" << wirelessDevice << " 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(qLcNetwork) << "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) + { + continue; + } + + removeWidget(deviceItem); + m_managedDevicePaths.removeOne(devicePath); + KLOG_INFO(qLcNetwork) << "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 0000000000000000000000000000000000000000..793799d4e3dc1fb8afafb05c4da8dc13401efd77 --- /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.cpp b/plugins/network/src/plugin/manager/manager.cpp index cffe69ce0d7fae829e57380bda3dafcf30c0c29e..cb0f48c42ca683117821949870cd5c0213d598ce 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/manager.h b/plugins/network/src/plugin/manager/manager.h index 7ba5b469c7c419260503de204dde46225bc0494c..1b004b48099d2e010efc216b1e81a720252e6e1c 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/vpn-manager.cpp b/plugins/network/src/plugin/manager/vpn-manager.cpp index 23d2cfdaa92d9f77ad13c9a5dd1cd8f476943ffd..c21e73d437a065e2bfc348fd380d75b4f7099e53 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 32ac227646e97288c7c83d15e8131b96c43a80f6..70a02b05e2731a630c7cbd5ac81d83f707432957 100644 --- a/plugins/network/src/plugin/manager/wired-manager.cpp +++ b/plugins/network/src/plugin/manager/wired-manager.cpp @@ -23,12 +23,16 @@ #include "signal-forward.h" #include "status-notification.h" #include "ui_wired-manager.h" +#include "device-list.h" +#include +#include "logging-category.h" + 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 +45,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,152 +76,23 @@ 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 { - KLOG_DEBUG() << "Invalid input exists"; + KLOG_DEBUG(qLcNetwork) << "Invalid input exists"; } } -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 db78bdf2e2052bf3eac75e23c326841a73b14ca2..e16195ab4c7ce884f1c79262703396688a9889ea 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 8e1903cfdd4f55533d58f383d190c7e77fee2f4c..ebfee870ae147dbf8a46bb479541ca7b88a0dceb 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 9f2385007a20032321fb99f09527933270b65b34..4796e241e52311af73fc0388287c861e84900799 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 fe210c70339cbd75b7e1c1b551c345af512dea8a..7b7497001c4f8c9f17618345d195777721481b93 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 8c74491980a06f6519ce68ad1eab6a1edd079556..49c2102445bfffc059f6f60e376b1024483abeae 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 ba9ee3ff1fdfb6a32c09da399b6249e74820b199..27377d7dda8ca96c1dedf6ae1a1fd9123110e2f7 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-cpanel-network", - ".", - 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 dfaf1ac0a32859bbb391515b2ed03cbb3a8d8678..3dd023f572ee4ac03457e674c5925980b3877cc6 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 106335689f9432e90d569fdd3ca4a41d93cb39a4..03456d845cc232ae555060ae12fcbb7109f56154 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 4608ba3444380c2c26c8efd3cc198d41d33049b8..e689e4ebc78da1e92259ce738141c268f035f94a 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 c6970729d6521b7dabe7e8399aad3eab28c74163..99467ab2be0ad92b6b8a9f4d8995d80bd469f631 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,20 +48,22 @@ void PluginConnectionList::addConnection(NetworkManager::Connection::Ptr ptr, co { if (ptr == nullptr) { - KLOG_ERROR() << "ptr == null"; return; } // 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) @@ -105,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; @@ -209,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); @@ -226,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; } @@ -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; @@ -280,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")); @@ -295,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 27e298d9ea38c61b5821a893ba665bbbf3e30397..13b925d56e6a7fdb356c73d4f933a3ba7e72a35b 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 88e58b6f06b36553f73372009e06cdb48c2485ea..ac4c10e25d7d50413cbbcbdfca4cb81f26694910 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 7e09a546965a7fa9bed50d30bac7f24f7899b782..b0230d4342af96d9512c77d17b127733ff712267 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) @@ -83,58 +84,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(qLcNetwork) << "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) @@ -165,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; @@ -181,3 +184,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 9d96dbfa706bfc2e579a2dcae231771583aef7ca..6d036c1c92bcdae5c3a4ec169822de07f0ea5639 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/ipv4-widget.cpp b/plugins/network/src/plugin/setting-widget/ipv4-widget.cpp index 8dc420fe50b6838d15d0385e8123655de8ca1818..fa23708545f19cb1404803b5ff05af8f0ea96671 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) @@ -39,6 +40,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,18 +96,18 @@ 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); } else { - KLOG_DEBUG() << "Net prefix length error"; + KLOG_DEBUG(qLcNetwork) << "Net prefix length error"; } } else @@ -114,10 +116,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(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; @@ -125,72 +127,76 @@ 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(); +#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); + } } - KLOG_DEBUG() << "ipv4DNS:" << ipv4DNS; + KLOG_DEBUG(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "address:" << address; + KLOG_DEBUG(qLcNetwork) << "netmask:" << netmask; + KLOG_DEBUG(qLcNetwork) << "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(qLcNetwork) << "ipv4 DNS:" << dnsString; } - else - resetSettings(); + ui->ipv4DNS->setText(dnsString); } void Ipv4Widget::resetSettings() @@ -200,8 +206,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 +223,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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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 ccbb305fdff31683f397f54d6bc63e7872edd9b4..04450724f435a5623d8d7a7dfae70dfbe78e463d 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 93b23556408c735de931ff8bd2b5ff900dbd4373..f2999c2aab8bef9d47221892f648a3fc54975b10 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 509aba12992405db3bdf6262342a16340599f718..d19a5e01e9fe5bd06ebc7c847fc71d07d62b7dd7 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) @@ -40,6 +41,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() @@ -64,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; @@ -81,89 +83,109 @@ 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(qLcNetwork) << "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(); +#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); } } + KLOG_DEBUG(qLcNetwork) << "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(qLcNetwork) << "current ipv6 DNS:" << dnsString; } - else - resetSettings(); + ui->ipv6DNS->setText(dnsString); } void Ipv6Widget::resetSettings() @@ -173,8 +195,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 +215,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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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(qLcNetwork) << "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 2b2f6e30f224dd5ddf660dd7960750ed9d5fe602..e3744cc6e992decf823097b21cbf4f30cf1d16f1 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 fe0cf1e28f848375292ea4c06d1fbb6cc3e86d9b..90d2b6c0abf506ebc672680febb6ec3fe86aa7d2 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/setting-widget/vpn/vpn-ipsec.cpp b/plugins/network/src/plugin/setting-widget/vpn/vpn-ipsec.cpp index eea5c4a4f9d56bc35b80e78601be7d4b4092031f..27e0d45bf21051a6667d1b42d4e05a7f96d3b462 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 4a415017e0a3a53f9f088b70c2b2740b83d799fd..c5842714b92c3ae6df3be1c02dc164396b9c5a2f 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 73472fcaef5c5ecae07b56893453a1af10e2e5ab..aeeb41a42eb28f11e4f2d690191d602091252267 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 01e9b830d5de850660c765d1af37a4dd2670fcd7..14aa8bc70cf32285997e704eebd5808eda5a107d 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-security-widget.cpp b/plugins/network/src/plugin/setting-widget/wireless-security-widget.cpp index 4936be1f58c7c17f0182ef7e88ef8b56b1db264c..9a5aa18d6228e2f0eca3546e0487577c0b9ac588 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/setting-widget/wireless-widget.cpp b/plugins/network/src/plugin/setting-widget/wireless-widget.cpp index ab796c55aae7327ef1c947b4439e9ce025b632e0..8374ea407de6ef169f0db8c9f83842e582ddbd45 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 3aa920192cfdb8208bf47ff7f1285a58f71b67ea..39339cd991b97bdb87c3256c999fb21acba694f0 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 99951024b9399fa1e98a36309443c0c36c2ea228..51ab26b76523e8c77b7d92d55d1394d3aeb20dce 100644 --- a/plugins/network/src/plugin/settings/wired-setting-page.cpp +++ b/plugins/network/src/plugin/settings/wired-setting-page.cpp @@ -21,6 +21,8 @@ #include #include "kiran-tips/kiran-tips.h" #include "ui_wired-setting-page.h" +#include +#include "logging-category.h" using namespace NetworkManager; @@ -114,10 +116,27 @@ 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(qLcNetwork) << "binding MAC Address:" << macAddress; + ui->ethernetWidget->setDefaultMacAddress(macAddress); +} + 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; diff --git a/plugins/network/src/plugin/settings/wired-setting-page.h b/plugins/network/src/plugin/settings/wired-setting-page.h index 3096d62de621bf1164b2142b595cbf75e78370e8..e19f317a6102dd36ea036bc54c62231bb0cdb7b8 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/plugin/settings/wireless-setting-page.cpp b/plugins/network/src/plugin/settings/wireless-setting-page.cpp index cc3be8771d7491685f999e1b46355ac12c2c97d2..c4334507ec6a8d7e434523db13a2ea1e7a047aae 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 0b53db1084641f19b7c70df0d713e3890bc0a85b..82f4de9a8097949e20e761a9994d6d95cccad5d8 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() @@ -54,6 +55,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(qLcNetwork) << "this device interface is invalid!"; + m_Timer.start(); + } + m_waitCounts++; + if(m_waitCounts > MAX_WAIT_COUNTS) + { + KLOG_INFO(qLcNetwork) << "This device is currently invalid by NetworkManager"; + m_Timer.stop(); + } }); } void SignalForward::handleActiveConnectionAdded(const QString &activePath) @@ -111,3 +140,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(qLcNetwork) << "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(qLcNetwork) << "this device interface is invalid!"; + m_Timer.start(); + KLOG_INFO(qLcNetwork) << "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 e7c62afdf27203ae2bbc214b06f185b782e9e510..2fd07465ca5e071751ffdd041e5d6ad1b1e38dba 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/status-notification.cpp b/plugins/network/src/status-notification.cpp index 657b605617c581db9df3e155c8008daa22cf2006..41bd5de142546e8ac6ac849f1615a7eed12e53ea 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 5c4bb65b4945738bd47988ee0e8e2a33515e44cc..9ccde9cca2203f95d429678be6a000054dd447be 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-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); + 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 9834a0e0863ea72fa7e94b8211fa55b59c017f2f..00b6685ac7e6be8824854e78e7b502c6b4ef8cc2 100644 --- a/plugins/network/src/tray/network-tray.cpp +++ b/plugins/network/src/tray/network-tray.cpp @@ -21,12 +21,17 @@ #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" @@ -49,6 +54,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(); @@ -86,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); @@ -112,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()) @@ -122,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(); } }); @@ -158,8 +164,8 @@ void NetworkTray::initConnect() void NetworkTray::initTrayIcon() { m_systemTray = new QSystemTrayIcon(); - setTrayIcon(NetworkManager::status()); - KLOG_DEBUG() << " NetworkManager::status():" << NetworkManager::status(); + updateTrayIcon(); + KLOG_DEBUG(qLcNetwork) << " NetworkManager::status():" << NetworkManager::status(); m_systemTray->show(); } @@ -180,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); @@ -258,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(); } } } @@ -312,15 +318,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); @@ -330,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); @@ -356,49 +356,67 @@ void NetworkTray::getTrayGeometry() m_yTray = static_cast(y); } -// TODO:增加其他状态图标 -void NetworkTray::setTrayIcon(NetworkManager::Status status) +void NetworkTray::updateTrayIcon() { - QIcon icon; - if (status == NetworkManager::Status::Connected) + auto status = NetworkManager::status(); + if (status != NetworkManager::Status::Connected) { - // 判断主连接类型,托盘网络图标以主连接类型为准 - // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 - ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); - if (primaryActiveConnection != nullptr) - { - 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)); - } - } + setTrayIcon(DISCONNECTED); + return; + } + + // 判断主连接类型,托盘网络图标以主连接类型为准 + // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + if (primaryActiveConnection.isNull()) + { + KLOG_INFO(qLcNetwork) << "update tray icon failed, primary active connection is null"; + return; + } + + // 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:加载动画 - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg", 64)); + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; } else { - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg")); - icon.addPixmap(NetworkUtils::trayIconColorSwitch(":/kcp-network-images/wired-disconnected.svg", 64)); + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; } + 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) +{ + QIcon icon; + icon.addPixmap(NetworkUtils::trayIconColorSwitch(iconPath)); + icon.addPixmap(NetworkUtils::trayIconColorSwitch(iconPath, 64)); m_systemTray->setIcon(icon); + m_systemTray->setToolTip(toolTip); } // 重新获取device、初始化,刷新 // 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(); @@ -426,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)) @@ -449,14 +467,13 @@ 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; - - //设备变为可用 - if ((oldstate == Device::Unavailable || oldstate == Device::Unmanaged || oldstate == Device::UnknownState) - && + 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) && (newstate != Device::Unmanaged && newstate != Device::Unavailable && newstate != Device::UnknownState)) { if (deviceType == Device::Ethernet) @@ -477,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"; } } } @@ -485,19 +502,15 @@ 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"; + KLOG_DEBUG(qLcNetwork) << "device is unavailable"; if ((NetworkUtils::getAvailableDeviceList(Device::Ethernet).count() == 0) && (NetworkUtils::getAvailableDeviceList(Device::Wifi).count() == 0)) { @@ -530,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) { @@ -546,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; @@ -575,12 +588,14 @@ void NetworkTray::handleWirelessEnabledChanged(bool enable) void NetworkTray::handleNetworkManagerStatusChanged(NetworkManager::Status status) { - setTrayIcon(status); + KLOG_DEBUG(qLcNetwork) << "network status changed: " << status; + updateTrayIcon(); } void NetworkTray::handlePrimaryConnectionChanged(const QString &uni) { - setTrayIcon(NetworkManager::status()); + KLOG_DEBUG(qLcNetwork) << "primary connection changed: " << uni; + updateTrayIcon(); } void NetworkTray::UnavailableTrayPage() @@ -599,19 +614,18 @@ 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"; - + 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); @@ -633,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); @@ -673,18 +687,75 @@ 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(); }); } 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() +{ + 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("Network/Address")); + QVariant port = confSettings.value(QString("Network/Port")); + m_tcpClient->connectToHost(address.toString(), port.toInt()); +} + +void NetworkTray::internetConnected() +{ + KLOG_DEBUG(qLcNetwork) << "Connectivity check pass"; + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + NetworkState state; + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) + { + state = WIRELESS_CONNECTED; + } + else + { + state = WIRED_CONNECTED; + } + setTrayIcon(state); + + m_tcpClient->abort(); +} + +void NetworkTray::internetError(QAbstractSocket::SocketError socketError) +{ + KLOG_INFO(qLcNetwork) << "Connectivity check fail: " << socketError; + NetworkState state; + if (primaryConnectionType() == ConnectionSettings::Wireless) + { + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; + } + else + { + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; + } + setTrayIcon(state); + + m_tcpClient->abort(); } diff --git a/plugins/network/src/tray/network-tray.h b/plugins/network/src/tray/network-tray.h index df2dba99100757a2b791e9017d57b70487e1ea7f..273a3a3db95af8ee6bc34a5c13b0e71f6741f436 100644 --- a/plugins/network/src/tray/network-tray.h +++ b/plugins/network/src/tray/network-tray.h @@ -19,14 +19,17 @@ #include #include #include -#include #include +#include "general.h" #include "kiran-rounded-tray-popup/kiran-rounded-tray-popup.h" class WiredTrayWidget; class WirelessTrayWidget; class StatusNotifierManagerInterface; class TrayPage; +class QTcpSocket; +class QVBoxLayout; + class NetworkTray : public KiranRoundedTrayPopup { Q_OBJECT @@ -53,7 +56,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 +73,17 @@ public slots: void handleThemeChanged(Kiran::PaletteType paletteType); +private: + void updateTrayIcon(); + void setTrayIcon(NetworkState state); + 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 +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 bc7391b071ba14a7616499bac57621b152d85e27..b5c51987fb4fe9a6b20363b98132aa5d8bf1a171 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 2e50f22d497ed6aa890327453d1bf1d055076cb3..e1d8743f68a5a4f96206b211d7ab808af656e458 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 ea2d07c31b0a11646b355e01dd060bf5aee2b1e8..616df2df871258558fae21edd1328f7ea0d6c055 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 67b2224ff4033b7c9f86bf913e94a83e0c5daf10..af5dbdfa9bd3ce37d675c1a0e6dae2c067048870 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(); } } @@ -131,7 +132,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) @@ -154,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; } @@ -177,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: @@ -210,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) @@ -220,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 7680376161e1690a930856058ca67270b9373670..c4e0743b789a7a593671eb560303cc7ceb2c87e7 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.cpp b/plugins/network/src/utils.cpp index 2c58ec4d16a872328b28991127a95079b3fa54e4..f9976cf1c9a3174bb025ce9209548f84dd9ed0e1 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; @@ -93,3 +99,155 @@ 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(); +} + +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 a4c84412277dc6df71c77051edd29ec410d9cad5..265e627620351fa10802ba32f349c13897d8982f 100644 --- a/plugins/network/src/utils.h +++ b/plugins/network/src/utils.h @@ -15,8 +15,8 @@ #ifndef KIRAN_CPANEL_NETWORK_UTILS_H #define KIRAN_CPANEL_NETWORK_UTILS_H -#include #include +#include namespace NetworkUtils { @@ -31,6 +31,16 @@ 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 #endif // KIRAN_CPANEL_NETWORK_UTILS_H 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 50d02b7c1e663258b7e3b86f708c17d855bd80ce..0000000000000000000000000000000000000000 --- 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 84a320bc3b82cc70832d2310315c59fe36467778..0000000000000000000000000000000000000000 --- 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 9cc240a68297115cc3363bc7b40212bc23a0fdd8..0000000000000000000000000000000000000000 --- 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 c399071f3cbd8f8e9eeaad36bcbbc2d20443062d..0000000000000000000000000000000000000000 --- 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 ed65b116a6990c1ebad72d8e05687eaff3e4c6c0..0000000000000000000000000000000000000000 --- 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 a50574b7cb2af88aa34c8bab51b87ed3ea7c6e29..0000000000000000000000000000000000000000 --- 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 12f1c2ae17f58421045d26c39dcd6a89004bd3c7..e460192b9c160f5589e9da3022f1df57c6a40154 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 @@ -92,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 0000000000000000000000000000000000000000..138d4b7164a40e97964bd68b590fc258c419c35f --- /dev/null +++ b/resources/images/language.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/more-options.svg b/resources/images/more-options.svg new file mode 100644 index 0000000000000000000000000000000000000000..503cb70b63ae65f30135e0f090b544f16426adaa --- /dev/null +++ b/resources/images/more-options.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.ini.in b/settings.ini.in index 5ccc080fc77e850676108304a4e6a9437a4333e5..92fc09e1322a696bf91148e936281929cdc83b56 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 diff --git a/src/main.cpp b/src/main.cpp index 05f71539932539aac6724aff755f5879360f8b3a..981fdbfe02ab9702aea331e416a1b2d7b99a36d2 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(); diff --git a/translations/kiran-control-panel.kk_KZ.ts b/translations/kiran-control-panel.kk_KZ.ts index cf29d46a47b09f6b85214545bbbecc0e09af760d..629f6c3bb1e8b18a179fd573a6150f9231a24c4b 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 cf29d46a47b09f6b85214545bbbecc0e09af760d..fb0d7fac01e00321222ce0c5d6801244a08d87b0 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 59914b2608ebe5c463a2bc8fab9174b96706b1c0..0ad9ee6f8df547a372b77b6fbafc3e6086622546 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 58a3e072fb221d1d764be59feb5de8618ea2dbf3..daada9e287e44221c77786e9286484646262b1da 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 + كىران سىستېمىسى-شەكىل diff --git a/translations/kiran-control-panel.zh_CN.ts b/translations/kiran-control-panel.zh_CN.ts index 913c84f16453cb8cb0bb7fdd146111d2868cd12c..995c4364dceb2ca4e1eda031cb220a9bde1e485b 100644 --- a/translations/kiran-control-panel.zh_CN.ts +++ b/translations/kiran-control-panel.zh_CN.ts @@ -19,10 +19,12 @@ AccountSubItem + account 帐户 + New User 创建新用户 @@ -30,14 +32,19 @@ AccountWidget + + disable 禁用 + + enable 启用 + Create new user 创建新用户 @@ -156,70 +163,88 @@ 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 登录Shell + EditLoginShell + Specify user id (needs to be greater than 1000) 指定用户ID(需大于或等于1000) + EditSpecifyUserID + Specify user home 指定用户目录 + EditSpecifyUserHome + ButtonConfirm + confirm 确认 + ButtonCancel + cancel 取消 @@ -231,14 +256,17 @@ AppearancePlugin + Theme 主题 + Wallpaper 壁纸 + Font 字体 @@ -246,10 +274,12 @@ ApplicationPlugin + DefaultApp 默认程序 + AutoStart 开机启动 @@ -257,10 +287,12 @@ AudioSystemTray + Volume Setting 声音设置 + Mixed Setting 混合设置 @@ -315,30 +347,37 @@ AuthPlugin + Fingerprint 指纹 + FingerVein 指静脉 + Driver Manager 驱动管理 + Prefs 配置 + UKey UKey + Iris 虹膜 + Face 人脸 @@ -385,38 +424,49 @@ AutostartPage + Boot Setup 开机启动设置 + Desktop files(*.desktop) 桌面类型(*.desktop) + select autostart desktop 选择自启动应用 + Select 选择 + Cancel 取消 + + + Error 错误 + Desktop has existed 该程序已存在 + Desktop cant permit to join 该程序不允许添加 + Desktop dont support 不支持该程序 @@ -424,62 +474,81 @@ BatterySettingsPage + BatterySettingsPage 电池设置 + After idle for more than the following time, the computer will execute 空闲超过以下时间后,计算机将执行 + ComboIdleTime + ComboIdleAction + When the battery is lit up, it will be executed 电池电量将用尽时 + ComboLowBatteryAction + The monitor will turn off when it is idle 显示器空闲以下时间关闭 + 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 不执行操作 @@ -501,14 +570,17 @@ CPanelAudioWidget + CPanelAudioWidget + Output 输出 + Input 输入 @@ -516,41 +588,60 @@ CPanelNetworkWidget + CPanelNetworkWidget + + VPN VPN + + Network Details 网络详情 + + + + + + Wired Network + 有线网络 + + + + + + + + + Wireless Network + 无线网络 + + + Connected 已连接 + Unavailable 已禁用 + Disconnected 已断开 - - Wireless Network - 无线网络 - Wired Network %1 有线网络 %1 - - Wired Network - 有线网络 - Wireless Network %1 无线网络 %1 @@ -559,30 +650,37 @@ ChangeHostNameWidget + Form + Host Name: 主机名: + EditHostName + ButtonSaveHostName + Save 保存 + ButtonCancelChangeHostName + Cancel 取消 @@ -591,10 +689,12 @@ 主机名 + Warning 警告 + Change host name failed! Please check the Dbus service! 修改主机名失败!请 检查Dbus服务! @@ -602,10 +702,12 @@ CheckpasswdDialog + Check password 校验当前用户密码 + Check the current password before you enroll the feature 录入特征之前需要校验当前密码 @@ -613,6 +715,7 @@ ChooseItem + Form @@ -620,101 +723,191 @@ ConnectionDetailsWidget + ConnectionDetailsWidget + Security type 安全类型 + + + + + + + + + + + + + TextLabel + Frequency band 频段 + Channel 网络通道 + Interface 接口 + MAC + IPv4 + + Gateway 网关 - Preferred DNS - 首选DNS + + DNS + + Subnet mask 子网掩码 + IPv6 + Prefix 前缀 + Rate 速率 - DNS - + Preferred DNS + 首选DNS + + + + ConnectionItemWidget + + + disconnect + 断开 + + + + ignore + 忽略 + + + + remove + 移除 + + + + The current device:%1 is not available + 当前设备:%1 不可用 + + + + The carrier is pulled out + 网线被拔出 + + + + Are you sure you want to delete the connection %1 + 您是否确定要删除连接 "%1" + + + + Warning + 警告 + + + + + Tips + 提示 + + + + Password required to connect to %1. + 连接网络 "%1" 需要密码 + + + + Please input a network name + 请输入网络名称 ConnectionNameWidget + ConnectionNameWidget + TextLabel + EditConnectionName + Auto Connection 自动连接 + Required 必填 + Wired Connection %1 有线网络%1 + VPN L2TP %1 + VPN PPTP %1 + Connection name can not be empty 网络名称不能为空 @@ -722,14 +915,17 @@ ConnectionShowPage + ConnectionShowPage + TextLabel + ButtonCreateConnection @@ -737,34 +933,43 @@ 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 错误 @@ -776,110 +981,138 @@ 帐户类型 + 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 + User name 用户名 + EditUserName + User type 用户类型 + ComboUserType + Password 用户密码 + EditPasswd + Confirm password 确认密码 + EditPasswdConfirm + ButtonAdvanceSetting + Advance setting 高级设置 + ButtonConfirm + Confirm 创建 + ButtonCancel + Cancel 取消 @@ -907,6 +1140,7 @@ CursorThemePage + Cursor Themes Settings 光标主题设置 @@ -929,30 +1163,37 @@ DateTimeSettings + DateTimeSettings 日期时间设置 + Select Time 选择时间 + Select Date 选择日期 + ButtonSave + save 保存 + ButtonReset + reset 重置 @@ -960,6 +1201,7 @@ DaySpinBox + %1 %1日 @@ -967,30 +1209,37 @@ DefaultApp + DefaultApp 默认程序 + Web Browser web浏览器 + Email 电子邮件 + Text 文档查看器 + Music 音乐播放器 + Video 视频播放器 + Image 图片查看器 @@ -1025,65 +1274,106 @@ DetailsPage + DetailsPage + Network Details 网络详情 + Please select a connection 请选择连接 + ComboBoxDetailsSelectConnection + + DeviceAvailableConnectionWidget + + + Network card: %1 + 网卡:%1 + + + + Other WiFi networks + 其它WIFI网络 + + + + DeviceList + + + Wired Network Adapter + 有线网络配置 + + + + Wireless Network Adapter + 无线网络配置 + + DevicePanel + Form + Rotate left 90 degrees 左旋转90度 + ButtonLeft + Rotate right 90 degrees 右旋转90度 + ButtonRight + Turn left and right 左右翻转 + ButtonHorizontal + upside down 上下翻转 + ButtonVertical + Identification display 标识显示器 + ButtonIdentifying @@ -1091,38 +1381,47 @@ DisconnectAndDeleteButton + DisconnectAndDeleteButton + ButtonDisconnect + Disconnect 断开 + ButtonDelete + Delete 删除 + ButtonIgnore + Ignore 忽略 + Are you sure you want to delete the connection %1 您是否确定要删除连接 "%1" + Warning 警告 @@ -1130,42 +1429,52 @@ DisplayFormatSettings + DisplayFormatSettings 日期时间格式设置 + Long date display format 长日期显示格式 + ComboLongDateDisplayFormat + Short date display format 短日期显示格式 + ComboShortDateDisplayFormat + Time format 时间格式 + ComboTimeFormat + Show time witch seconds 时间显示秒 + 24-hours 二十四小时制 + 12-hours 十二小时制 @@ -1173,118 +1482,154 @@ DisplayPage + DisplayPage + ButtonCopyDisplay + Copy display 复制显示 + ButtonExtendedDisplay + Extended display 扩展显示 + + Resolution ratio 分辨率 + ComboResolutionRatio + + Refresh rate 刷新率 + ComboRefreshRate + + Zoom rate 缩放率 + ComboZoomRate + + Automatic 自动 + + 100% (recommended) 100% (推荐) + + 200% + Open 开启 + Set as main display 设为主显示器 + SwitchExtraPrimary + ComboExtraResolutionRatio + ComboExtraRefreshRate + ComboExtraZoomRate + ButtonExtraApply + Apply 应用 + ButtonExtraCancel + Close 关闭 + + (recommended) (推荐) + 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 秒后恢复之前的配置 @@ -1292,6 +1637,7 @@ DisplaySubitem + Display 显示 @@ -1299,14 +1645,17 @@ DnsWidget + DnsWidget + Preferred DNS 首选DNS + Alternate DNS 备选DNS @@ -1314,14 +1663,17 @@ DriverPage + device type 设备类型 + driver list 驱动列表 + Fingerprint 指纹 @@ -1330,18 +1682,22 @@ 指静脉 + Fingervein 指静脉 + iris 虹膜 + ukey UKey + face 人脸 @@ -1349,10 +1705,12 @@ DslManager + DslManager + DSL @@ -1360,14 +1718,17 @@ DslSettingPage + DslSettingPage + Save 保存 + Return 返回 @@ -1375,38 +1736,47 @@ 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地址 @@ -1460,38 +1830,48 @@ 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),请重试 @@ -1499,14 +1879,17 @@ FingerPage + Cancel 取消 + fingerprint 指纹 + fingervein 指静脉 @@ -1515,26 +1898,33 @@ 默认%1设备 + %1 list %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),请重试 @@ -1543,6 +1933,7 @@ %1列表 + Default %1 device 默认%1设备 @@ -1603,54 +1994,34 @@ Fonts + Form Application Font Settings - 应用程序字体设置 - - - ComboAppFontName - - - - ComboAppFontSize - + 应用程序字体设置 Titlebar Font Settings - 窗口标题字体设置 - - - ComboTitleFontName - - - - ComboTitleFontSize - + 窗口标题字体设置 Monospace Font Settings - 等宽字体设置 - - - ComboMonospaceFontName - - - - ComboMonospaceFontSize - + 等宽字体设置 + Word size 字号 + System font 系统字体 + Monospaced font 等宽字体 @@ -1658,38 +2029,47 @@ GeneralBioPage + default device 默认设备 + feature list 特征列表 + Are you sure you want to delete the feature called %1, Ensure that the Ukey device is inserted; otherwise the information stored in the Ukey will not be deleted 您确定要删除特征名为%1的UKey绑定吗?请确保已插入Ukey设备;否则存储在Ukey中的信息将不会被删除 + Are you sure you want to delete the feature called %1 您确定要删除特征名为%1的特征吗 + tips 提示 + Error 错误 + Failed to enroll feature because the password verification failed! 由于密码校验失败,录入特征失败! + Rename Feature 重命名特征值 + Please enter the renamed feature name 请输入特征名 @@ -1697,66 +2077,83 @@ GeneralPage + Form + Capslock Tip 大写锁定提示 + Numlock Tip 数字键盘锁定提示 + Repeat Key 重复键 + (Repeat a key while holding it down) (按住某一键时重复该键) + SwitchRepeatKey + Delay 延时 + SliderRepeatDelay + Short + Long + Interval 速度 + SliderRepeatInterval + Slow + Fast + + Enter repeat characters to test 输入重复字符测试 + EditTestRepeatKey @@ -1768,114 +2165,150 @@ GeneralSettingsPage + GeneralSettingsPage 通用设置页面 + When the power button is pressed 按下电源按钮时 + ComboPowerButtonAction + When the suspend button is pressed 按下挂起按钮时 + ComboSuspendAction + When closing the lid 合上盖子操作 + ComboCloseLidAction + Computer Mode 计算机模式 + Display brightness setting 显示亮度设置 + 0% + SliderDisplayBrightness + Color temperature 色温 + Automatic color temperature 自动色温 + cold + standard 标准 + warm + Regard computer as idle after 于此时间后视计算机为空闲 + 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分钟 @@ -1890,6 +2323,7 @@ GeneralSubItem + Keyboard General Option 键盘通用选项 @@ -1897,46 +2331,60 @@ GroupInfoPage + Form + TextLabel + Group + Member List + Add User + Delete + Add Member + Save 保存 + Cancel 取消 + Please input keys for search... + + + + Error 错误 @@ -1944,18 +2392,22 @@ GroupSubItem + Group + Creat group + Change group name + Add group member @@ -1963,30 +2415,37 @@ HardWorker + Create User failed 创建用户失败 + update password failed 更新密码失败 + icon file 头像 + userName type 用户名 + locked 启用状态 + Failed to update user properties,%1 更新用户属性失败,%1 + Failed to delete user,%1 删除用户失败,%1 @@ -2023,26 +2482,33 @@ 删除用户失败 + Failed to connect to the account management service + Create Group failed + Failed to delete group,%1 + + add user to group failed + change group name failed + change group name failed, the new group name is occupied @@ -2050,38 +2516,48 @@ HardwareInformation + Form + CPU: CPU: + LabelCpuInfo + + TextLabel + Memory: 内存: + LabelMemoryInfo + Hard disk: 硬盘: + Graphics card: 显卡: + Network card: 网卡: @@ -2094,10 +2570,14 @@ KylinSec.保留所有权利. + + + Unknow 未知 + %1 GB (%2 GB available) %1 GB (%2 GB 可用) @@ -2132,6 +2612,7 @@ HardwareSubItem + Hardware Information 硬件信息 @@ -2139,10 +2620,12 @@ IconThemePage + Form + Icon Themes Setting 图标主题设置 @@ -2184,18 +2667,22 @@ ImageSelector + Add Image Failed 添加壁纸失败 + The image already exists! 该壁纸已存在! + Delete image 删除壁纸 + Are you sure you want to delete this picture? 您确定要删除此壁纸? @@ -2203,10 +2690,12 @@ InputDialog + Confirm 确认 + Cancel 取消 @@ -2214,30 +2703,42 @@ InputPage + InputPage + + Input cards + 输入声卡 + + + Input devices 输入设备 + ComboBoxInputDevices + Input volume 输入音量 + SliderVolumeSetting + Feedback volume 反馈音量 + No input device detected 未检测到输入设备 @@ -2245,232 +2746,292 @@ Ipv4Widget + Ipv4Widget + IPV4 Method IPV4方法 + ComboBoxIpv4Method + IP Address IP地址 + EditIpv4Address + Net Mask 子网掩码 + EditIpv4Netmask + Gateway 网关 + EditIpv4Gateway - Preferred DNS - 首选DNS - - - EditIpv4PreferredDNS + + DNS - Alternate DNS - 备选DNS - - - EditIpv4AlternateDNS + + EditIpv4PreferredDNS + 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网关 - Ipv4 Preferred DNS invalid - 无效的Ipv4首选DNS + Preferred DNS + 首选DNS - Ipv4 Alternate DNS invalid - 无效的Ipv4备选DNS + Alternate DNS + 备选DNS - DNS 1 - + Ipv4 Preferred DNS invalid + 无效的Ipv4首选DNS - DNS 2 - + Ipv4 Alternate DNS invalid + 无效的Ipv4备选DNS Ipv6Widget + Ipv6Widget + IPV6 Method IPV6方法 + ComboBoxIpv6Method + IP Address IP地址 + EditIpv6Address + Prefix 前缀 + SpinBoxIpv6Prefix + Gateway 网关 + EditIpv6Gateway - Preferred DNS - 首选DNS + + DNS + + EditIpv6PreferredDNS - Alternate DNS - 备选DNS - - - EditIpv6AlternateDNS - - - + 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首选DNS Ipv6 Alternate DNS invalid - 无效的Ipv6备选DNS + 无效的Ipv6备选DNS IrisPage + 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),请重试 @@ -2489,6 +3050,7 @@ KeybindingSubItem + Keybinding 快捷键 @@ -2496,10 +3058,12 @@ KeycodeTranslator + None 暂无 + disabled 禁用 @@ -2530,14 +3094,17 @@ KiranAvatarEditor + Avatar Editor 头像编辑器 + Confirm 确认 + Cancel 取消 @@ -2659,6 +3226,7 @@ KiranCollapse + ListExpansionSpace @@ -2681,6 +3249,7 @@ KiranDatePickerWidget + Form @@ -2688,6 +3257,7 @@ KiranGroupManager + Create new group @@ -2703,6 +3273,7 @@ %1中编辑的内容未保存,切换后编辑的内容将会丢失。您确定要保存吗? + Form @@ -2721,26 +3292,32 @@ KiranTimeDateWidget + KiranTimeDateWidget + Automatic synchronizetion 自动同步 + Change Time Zone 更改时区 + Set Time Manually 手动设置时间 + Time date format setting 日期时间格式设置 + %1(%2) %1时间(%2) @@ -2748,6 +3325,7 @@ KiranTimePickerWidget + Form @@ -2755,10 +3333,12 @@ KiranTimeZone + Form + Search in all time zones... 在所有时区中搜索... @@ -2766,10 +3346,12 @@ KiranTimeZoneItem + Form + No search results, please search again... 无搜索结果,请重新搜索... @@ -2777,6 +3359,7 @@ KiranTimeZoneList + Form @@ -2784,6 +3367,8 @@ KiranTips + + Form @@ -2791,17 +3376,115 @@ KylinsecLogo + Copyright © 版权所有 © + KylinSec. All rights reserved. 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 + Form @@ -2809,6 +3492,7 @@ LayoutList + LayoutList @@ -2816,62 +3500,82 @@ LayoutPage + Form + Select Kayboard Layout 选择布局 + + Edit 编辑 + + Add Layout 添加布局 + ButtonAddLayout + Addition 添加 + ButtonReturn + Return 返回 + + + + 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 完成 @@ -2879,6 +3583,7 @@ LayoutSubItem + Keyboard Layout 键盘布局 @@ -2886,14 +3591,17 @@ LicenseAgreement + 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; } @@ -2902,46 +3610,62 @@ p, li { white-space: pre-wrap; } + ButtonExportLicense + Export 导出 + ButtonCloseLicense + Close 关闭 + Save 保存 + PDF(*.pdf) + Export License 导出协议 + Export License failed! 导出协议失败! + User End License Agreement 最终用户许可协议 + + + + + + None 暂无 + Version License 版本协议 @@ -2954,6 +3678,8 @@ p, li { white-space: pre-wrap; } 导出最终用户许可协议失败! + + Privacy Policy 隐私协议 @@ -3051,6 +3777,7 @@ p, li { white-space: pre-wrap; } ListExpansionSpace + ListExpansionSpace @@ -3058,70 +3785,87 @@ p, li { white-space: pre-wrap; } Media Key + Audio Play 音频播放 + Search 搜索 + WWW 万维网 + Audio Lower Volume 减小音量 + Audio Raise Volume 增大音量 + Mic Mute 输入静音 + Audio Stop 音频停止 + Explorer 浏览 + Calculator 计算器 + Audio Mute 音频暂停 + Audio Pause 音频暂停 + Audio Prev 音频上一个 + Audio Media 音频媒体 + Audio Next 音频下一个 + Mail 邮件 + Tools 工具 + Eject 弹出 @@ -3129,6 +3873,7 @@ p, li { white-space: pre-wrap; } MonthSpinBox + MMMM MMMM @@ -3136,54 +3881,67 @@ p, li { white-space: pre-wrap; } MousePage + Form + Select Mouse Hand 选择鼠标手持模式 + ComboSelectMouseHand + Mouse Motion Acceleration 鼠标移动加速 + SliderMouseMotionAcceleration + Slow + Fast + Natural Scroll 是否为自然滚动 + SwitchMouseNatturalScroll + Middle Emulation Enabled 同时按下左右键模拟中键 + SwitchMiddleEmulation + Test mouse wheel direction 鼠标滚轮方向测试 + This is line 1 of the test text This is line 2 of the test text This is line 3 of the test text @@ -3286,10 +4044,12 @@ This is line 50 of the test text 这是第50行测试文字 + Right Hand Mode 右手模式 + Left Hand Mode 左手模式 @@ -3336,6 +4096,7 @@ This is line 50 of the test text MouseSubItem + Mouse Settings 鼠标设置 @@ -3343,26 +4104,32 @@ This is line 50 of the test text NetworkSubItem + Wired Network %1 有线网络 %1 + Wired Network 有线网络 + Wireless Network %1 无线网络 %1 + Wireless Network 无线网络 + VPN VPN + Network Details 网络详情 @@ -3370,69 +4137,108 @@ This is line 50 of the test text 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 + 网络已连接 + OutputPage + OutputPage + + Output cards + 输出声卡 + + + Output devices 输出设备 + ComboBoxOutputDevices + Output volume 输出音量 + SlilderVolumeSetting + Left/right balance 左/右平衡 + SliderVolumeBalance + Left + Right + No output device detected 未检测到输出设备 @@ -3440,6 +4246,7 @@ This is line 50 of the test text PanelWindow + Control Panel 控制面板 @@ -3447,74 +4254,94 @@ This is line 50 of the test text PasswordExpirationPolicyPage + PasswordExpirationPolicyPage + User expires 用户过期时间 + SpinBoxUserExpires + yyyy-MM-dd + Last password change 最近一次密码修改时间 + LabelLastPasswdChange + 1990-01-01 + Maximum vaild days of password 密码最大有限天数 + SpinBoxMaximumValidDays + Prompt time before password expiration 密码过期之前提醒的天数 + SpinBoxPromptBeforeExpiration + how many days after password expires will become inactive 密码过期多少天认定为失效 + SpinBoxPasswdInactiveTime + ButtonSave + save 保存 + ButtonReturn + return 返回 + + + day @@ -3522,14 +4349,17 @@ This is line 50 of the test text PluginConnectionList + Other WiFi networks 其它WIFI网络 + Tips 提示 + Please input a network name 请输入网络名称 @@ -3544,14 +4374,17 @@ This is line 50 of the test text PowerPlugin + General Settings 通用设置 + Power Settings 电源设置 + Battery Settings 电池设置 @@ -3559,14 +4392,20 @@ This is line 50 of the test text PowerProfilesWrapper + + power-saver 省电模式 + + balanced 平衡模式 + + performance 性能模式 @@ -3574,42 +4413,52 @@ This is line 50 of the test text PowerSettingsPage + PowerSettingsPage 电源设置页面 + After idle for more than the following time, the computer will execute 空闲超过以下时间后,计算机将执行 + ComboIdleTime + ComboIdleAction + The monitor will turn off when it is idle 显示器空闲以下时间关闭 + ComboMonitorTrunOffIdleTime + Suspend 待机 + Shutdown 关机 + Hibernate 休眠 + Do nothing 不执行操作 @@ -3624,50 +4473,64 @@ This is line 50 of the test text PrefsPage + Authentication type Enabled status 认证类型启用状态 + + fingerprint 指纹 + + fingervein 指静脉 + ... + Return 返回 + login 登录 + unlock 解锁 + empowerment 授权 + Apply the %1 authentication to the following applications 启用%1认证在以下的认证应用中 + ukey UKey + iris 虹膜 + face 人脸 @@ -3691,18 +4554,22 @@ This is line 50 of the test text 加载qss文件失败 + %1Day %1天 + %1Hour %1小时 + %1Minute %1分钟 + never 从不 @@ -3731,28 +4598,39 @@ This is line 50 of the test text 加载qss文件失败! + No search results, please search again... 无搜索结果,请重新搜索... + + + + Tips 提示 + + + + OK(K) 确定(K) + Failed to apply display settings!%1 应用显示设置失败!%1 + Fallback display setting failed! %1 回撤显示设置失败! %1 Failed - 失败 + 失败 Set font failed! @@ -3775,21 +4653,30 @@ This is line 50 of the test text 目前没有主题可以设置! - Set font failed! - + + Spring + 初春 + + + + Summer + 盛夏 SearchEdit + Enter keywords to search 输入关键词进行搜索 + Info 提示 + Failed to find related items, please re-enter! 未能搜索到相关项,请重新输入! @@ -3797,18 +4684,22 @@ This is line 50 of the test text SelectAvatarPage + 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 *.eps *.ai *.raw *.WMF *.webp) @@ -3816,10 +4707,14 @@ This is line 50 of the test text SettingBriefWidget + Form + + + TextLabel @@ -3827,190 +4722,252 @@ This is line 50 of the test text Shortcut + Form + EditSearch + Custom 自定义 + + + Edit 编辑 + ButtonAddShortcut + + + + Add 添加 + ButtonReset + Reset 重置 + Custom Shortcut Name 自定义快捷键名称 + EditCustomShortcutName + Custom Shortcut application 自定义快捷键应用程序 + + EditShortcutApp + Custom Shortcut Key 自定义快捷键 + ButtonAdd + ButtonCancel + Cancel 取消 + Shortcut Name 快捷键名称 + EditShortcutName + Shortcut application 快捷键应用程序 + Shortcut key 快捷键 + ButtonSave + Save 保存 + 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 声音 + + + + + + + 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,请再试一次! @@ -4018,10 +4975,13 @@ This is line 50 of the test text ShortcutItem + Form + + TextLabel @@ -4044,42 +5004,57 @@ This is line 50 of the test text 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" @@ -4087,6 +5062,7 @@ This is line 50 of the test text SystemInfoSubItem + System Information 系统信息 @@ -4094,102 +5070,137 @@ This is line 50 of the test text SystemInformation + Form + Host Name: 主机名: + LabelHostName + + + + + TextLabel + ButtonChangeHostName + Change 更改 + System Version: 系统版本: + LabelSystemVersion + Kernel Version: 内核版本: + LabelKernelVersion + System Architecture: 系统架构: + LabelSystemArch + Activation status: 激活状态: + + + + Show 查看 + EULA: 最终用户许可协议: + ButtonShowEULA + Version License: 版本协议: + ButtonShowVersionLicense + + + + Unknow 未知 + UnActivated 未激活 + Activation code has expired 激活码已过期 + Permanently activated 永久激活 + Activated 已激活 + Error 错误 + Failed to open the license activator 启动激活许可证弹窗失败 @@ -4202,6 +5213,7 @@ This is line 50 of the test text KylinSec.保留所有权利. + Privacy policy: 隐私协议: @@ -4308,14 +5320,17 @@ This is line 50 of the test text TextInputDialog + Tips 提示 + Yes 确认 + Cancel 取消 @@ -4323,42 +5338,53 @@ This is line 50 of the test text ThemePage + Form + Dark and Light Theme 深浅色主题设置 + Themes Settings 主题设置 + Open Window Effects 打开或关闭窗口特效 + + Unknown 未知 + Light Theme 浅色 + Auto 自动 + Dark Theme 深色 + Choose icon Theme 选择图标主题 + Choose cursor Themes 选择光标主题 @@ -4408,10 +5434,12 @@ This is line 50 of the test text ThreadObject + Failed 失败 + List shortcut failed,error: 列出快捷键失败,错误: @@ -4419,18 +5447,22 @@ This is line 50 of the test text TimeDateSubItem + Time Date Settings 日期时间设置 + Chnage time Zone 更改时区 + Set time Manually 手动设置时间 + Time date format setting 日期时间格式设置 @@ -4438,26 +5470,32 @@ This is line 50 of the test text TimezoneSettings + TimezoneSettings + Select Time Zone 选择时区 + ButtonSave + save 保存 + ButtonReturn + reset 重置 @@ -4465,14 +5503,17 @@ This is line 50 of the test text TopBar + ListExpansionSpace + TITLE + FLAG @@ -4480,102 +5521,127 @@ This is line 50 of the test text TouchPadPage + Form + TouchPad Enabled 开启触摸板 + SwitchTouchPadEnable + Select TouchPad Hand 选择触摸板使用模式 + ComboTouchPadHand + TouchPad Motion Acceleration 触摸板移动加速 + SliderTouchPadMotionAcceleration + Slow + Fast + Select Click Method 设置点击触摸板方式 + ComboClickMethod + Select Scroll Method 滚动窗口方式 + ComboScrollMethod + Natural Scroll 是否为自然滚动 + ComboNaturalScroll + Enabled while Typing 打字时触摸板禁用 + SwitchTypingEnable + Tap to Click 轻击(不按下)触摸板功能是否生效 + SwtichTapToClick + Right Hand Mode 右手模式 + Left Hand Mode 左手模式 + Press and Tap 按键和轻触 + Tap 轻触 + Two Finger Scroll 两指滑动 + Edge Scroll 边缘滑动 @@ -4662,6 +5728,7 @@ This is line 50 of the test text TouchPadSubItem + TouchPad Settings 触摸板设置 @@ -4669,6 +5736,7 @@ This is line 50 of the test text TrayConnectionList + Other WiFi networks 其它WIFI网络 @@ -4676,50 +5744,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 请输入网络名称 @@ -4727,18 +5809,22 @@ This is line 50 of the test text TrayPage + TrayPage + TextLabel + Select wired network card 请选择有线网卡 + Select wireless network card 请选择无线网卡 @@ -4746,30 +5832,39 @@ This is line 50 of the test text UKeyPage + Ukey 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码 @@ -4796,82 +5891,102 @@ This is line 50 of the test text UserInfoPage + Form + Account + Change password 修改密码 + User id 用户ID + User type 用户类型 + User status 启用用户 + auth manager 认证管理 + Password expiration policy 密码过期策略 + Confirm 保存 + Delete 删除用户 + Current password 当前密码 + EditCurrentPasswd + New password 新密码 + EditNewPasswd + Enter the new password again 再次输入新密码 + EditNewPasswdAgain + EditPasswdSave + Save 保存 + EditPasswdCancel + Cancel 取消 @@ -4884,58 +5999,77 @@ This is line 50 of the test text 启用帐户 + 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 新密码不能和旧密码相同,请重新输入 + + + + + 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)? 用户目录下的目录和文件会随用户一起删除,确定要删除%1用户吗? + Warning 警告 @@ -4978,6 +6112,7 @@ This is line 50 of the test text VolumeIntputSubItem + VolumeInput 输入 @@ -4985,6 +6120,7 @@ This is line 50 of the test text VolumeOutputSubItem + VolumeOutput 输出 @@ -4992,10 +6128,13 @@ This is line 50 of the test text VolumeSettingPage + VolumeSettingPage + + Volume 音量 @@ -5003,54 +6142,67 @@ This is line 50 of the test text 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 @@ -5058,38 +6210,47 @@ This is line 50 of the test text VpnIpvx + VpnIpvx + IPV4 Method IPV4方法 + ComboBoxVPNIpv4Method + Only applied in corresponding resources 仅用于相对应的网络上的资源 + Preferred DNS 首选DNS + EditVPNIpv4PreferredDNS + Alternate DNS 备选DNS + EditIpv4AlternateDNS + Auto 自动 @@ -5097,10 +6258,12 @@ This is line 50 of the test text VpnL2tpSetting + VpnL2tpSetting + VPN name VPN名称 @@ -5108,34 +6271,43 @@ This is line 50 of the test text VpnManager + + VpnManager + VPN type VPN类型 + Save 保存 + Return 返回 + VPN VPN + L2TP + Tips 提示 + Password required to connect to %1. 连接网络 "%1" 需要密码 @@ -5143,78 +6315,97 @@ This is line 50 of the test text 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回响包 @@ -5222,10 +6413,12 @@ This is line 50 of the test text VpnPptpSetting + VpnPptpSetting + VPN name VPN名称 @@ -5233,86 +6426,109 @@ This is line 50 of the test text 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 密码不能为空 @@ -5320,66 +6536,84 @@ This is line 50 of the test text Wallpaper + Form + Set wallpaper 壁纸设置 + FrameLockScreenPreview + 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! 该壁纸已存在! @@ -5387,45 +6621,52 @@ This is line 50 of the test text WiredManager + WiredManager + ButtonSave + Save 保存 + ButtonReturn + Return 返回 Wired Network Adapter - 有线网络配置 + 有线网络配置 The carrier is pulled out - 网线被拔出 + 网线被拔出 The current device is not available - 当前设备不可用 + 当前设备不可用 WiredSettingPage + WiredSettingPage + Network name 网络名称 @@ -5433,93 +6674,111 @@ 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" 需要密码 + 连接网络 "%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 必填 @@ -5527,10 +6786,12 @@ This is line 50 of the test text WirelessSettingPage + WirelessSettingPage + Wireless name 无线网络名称 @@ -5538,6 +6799,7 @@ This is line 50 of the test text WirelessTrayWidget + the network "%1" not found 未找到网络 "%1" @@ -5545,38 +6807,47 @@ This is line 50 of the test text WirelessWidget + WirelessWidget + SSID + EditSsid + MAC Address Of Device 设备MAC地址 + ComboBoxWirelessMacAddress + Custom MTU 自定义MTU + SpinBoxWirelessCustomMTU + Required 必填 + No device specified 不指定设备 @@ -5584,6 +6855,7 @@ This is line 50 of the test text YearSpinBox + yyyy yyyy年